[Bf-blender-cvs] [fc55c41] master: Cycles Bake: show progress bar during bake

Dalai Felinto noreply at git.blender.org
Fri Jul 25 16:53:02 CEST 2014


Commit: fc55c41bba8121bf3db67280c26e840f8b3f4124
Author: Dalai Felinto
Date:   Tue Jul 22 18:41:01 2014 -0300
Branches: master
https://developer.blender.org/rBfc55c41bba8121bf3db67280c26e840f8b3f4124

Cycles Bake: show progress bar during bake

Baking progress preview is not possible, in parts due to the way the API
was designed. But at least you get to see the progress bar while baking.

Reviewers: sergey

Differential Revision: https://developer.blender.org/D656

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/device/device.h
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/device/device_multi.cpp
M	intern/cycles/device/device_opencl.cpp
M	intern/cycles/device/device_task.cpp
M	intern/cycles/device/device_task.h
M	intern/cycles/render/bake.cpp
M	intern/cycles/render/bake.h
M	intern/cycles/util/util_progress.h

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 0f31e55..e57a672 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -554,6 +554,8 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake
 	session->reset(buffer_params, session_params.samples);
 	session->update_scene();
 
+	session->progress.set_update_callback(function_bind(&BlenderSession::update_bake_progress, this));
+
 	scene->bake_manager->bake(scene->device, &scene->dscene, scene, session->progress, shader_type, bake_data, result);
 
 	/* free all memory used (host and device), so we wouldn't leave render
@@ -765,6 +767,26 @@ void BlenderSession::get_progress(float& progress, double& total_time)
 		progress = 0.0;
 }
 
+void BlenderSession::update_bake_progress()
+{
+	float progress;
+	int sample, samples_per_task, parts_total;
+
+	sample = session->progress.get_sample();
+	samples_per_task = scene->bake_manager->num_samples;
+	parts_total = scene->bake_manager->num_parts;
+
+	if(samples_per_task)
+		progress = ((float)sample / (float)(parts_total * samples_per_task));
+	else
+		progress = 0.0;
+
+	if(progress != last_progress) {
+		b_engine.update_progress(progress);
+		last_progress = progress;
+	}
+}
+
 void BlenderSession::update_status_progress()
 {
 	string timestatus, status, substatus;
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 0e44493..5146483 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -73,6 +73,7 @@ public:
 	void get_progress(float& progress, double& total_time);
 	void test_cancel();
 	void update_status_progress();
+	void update_bake_progress();
 
 	bool background;
 	Session *session;
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index bcddd4f..20ebfd3 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -122,6 +122,7 @@ public:
 	virtual bool load_kernels(bool experimental) { return true; }
 
 	/* tasks */
+	virtual int get_split_task_count(DeviceTask& task) = 0;
 	virtual void task_add(DeviceTask& task) = 0;
 	virtual void task_wait() = 0;
 	virtual void task_cancel() = 0;
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 7308d03..4fdeef6 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -185,7 +185,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task.update_progress(tile);
+					task.update_progress(&tile);
 				}
 			}
 			else
@@ -207,7 +207,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task.update_progress(tile);
+					task.update_progress(&tile);
 				}
 			}
 			else
@@ -229,7 +229,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task.update_progress(tile);
+					task.update_progress(&tile);
 				}
 			}
 			else
@@ -251,7 +251,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task.update_progress(tile);
+					task.update_progress(&tile);
 				}
 			}
 			else
@@ -273,7 +273,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task.update_progress(tile);
+					task.update_progress(&tile);
 				}
 			}
 			else
@@ -294,7 +294,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task.update_progress(tile);
+					task.update_progress(&tile);
 				}
 			}
 
@@ -433,71 +433,83 @@ public:
 
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX2
 		if(system_cpu_support_avx2()) {
-			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				for(int sample = 0; sample < task.num_samples; sample++)
+			for(int sample = 0; sample < task.num_samples; sample++) {
+				for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++)
 					kernel_cpu_avx2_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x, sample);
 
 				if(task.get_cancel() || task_pool.canceled())
 					break;
+
+				task.update_progress(NULL);
 			}
 		}
 		else
 #endif
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_AVX
 		if(system_cpu_support_avx()) {
-			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				for(int sample = 0; sample < task.num_samples; sample++)
+			for(int sample = 0; sample < task.num_samples; sample++) {
+				for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++)
 					kernel_cpu_avx_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x, sample);
 
 				if(task.get_cancel() || task_pool.canceled())
 					break;
+
+				task.update_progress(NULL);
 			}
 		}
 		else
 #endif
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE41			
 		if(system_cpu_support_sse41()) {
-			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				for(int sample = 0; sample < task.num_samples; sample++)
+			for(int sample = 0; sample < task.num_samples; sample++) {
+				for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++)
 					kernel_cpu_sse41_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x, sample);
 
 				if(task.get_cancel() || task_pool.canceled())
 					break;
+
+				task.update_progress(NULL);
 			}
 		}
 		else
 #endif
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE3
 		if(system_cpu_support_sse3()) {
-			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				for(int sample = 0; sample < task.num_samples; sample++)
+			for(int sample = 0; sample < task.num_samples; sample++) {
+				for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++)
 					kernel_cpu_sse3_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x, sample);
 
 				if(task.get_cancel() || task_pool.canceled())
 					break;
+
+				task.update_progress(NULL);
 			}
 		}
 		else
 #endif
 #ifdef WITH_CYCLES_OPTIMIZED_KERNEL_SSE2
 		if(system_cpu_support_sse2()) {
-			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				for(int sample = 0; sample < task.num_samples; sample++)
+			for(int sample = 0; sample < task.num_samples; sample++) {
+				for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++)
 					kernel_cpu_sse2_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x, sample);
 
 				if(task.get_cancel() || task_pool.canceled())
 					break;
+
+				task.update_progress(NULL);
 			}
 		}
 		else
 #endif
 		{
-			for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++) {
-				for(int sample = 0; sample < task.num_samples; sample++)
+			for(int sample = 0; sample < task.num_samples; sample++) {
+				for(int x = task.shader_x; x < task.shader_x + task.shader_w; x++)
 					kernel_cpu_shader(&kg, (uint4*)task.shader_input, (float4*)task.shader_output, task.shader_eval_type, x, sample);
 
 				if(task.get_cancel() || task_pool.canceled())
 					break;
+
+				task.update_progress(NULL);
 			}
 		}
 
@@ -506,6 +518,14 @@ public:
 #endif
 	}
 
+	int get_split_task_count(DeviceTask& task)
+	{
+		if (task.type == DeviceTask::SHADER)
+			return task.get_subtask_count(TaskScheduler::num_threads(), 256);
+		else
+			return task.get_subtask_count(TaskScheduler::num_threads());
+	}
+
 	void task_add(DeviceTask& task)
 	{
 		/* split task into smaller ones */
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 022dcd0..1c7f3a0 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -732,13 +732,10 @@ public:
 		const int start = task.shader_x;
 		const int end = task.shader_x + task.shader_w;
 
-		for(int shader_x = start; shader_x < end; shader_x += shader_chunk_size) {
-			if(task.get_cancel())
-				break;
-
-			int shader_w = min(shader_chunk_size, end - shader_x);
-
-			for(int sample = 0; sample < task.num_samples; sample++) {
+		bool cancelled = false;
+		for(int sample = 0; sample < task.num_samples && !cancelled; sample++) {
+			for(int shader_x = start; shader_x < end; shader_x += shader_chunk_size) {
+				int shader_w = min(shader_chunk_size, end - shader_x);
 
 				/* pass in parameters */
 				void *args[] = {&d_input,
@@ -761,7 +758,14 @@ public:
 										   0, 0, args, 0));
 
 				cuda_assert(cuCtxSynchronize());
+
+				if(task.get_cancel()) {
+					cancelled = false;
+					break;
+				}
 			}
+
+			task.update_progress(NULL);
 		}
 
 		cuda_pop_context();
@@ -991,7 +995,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task->update_progress(tile);
+					task->update_progress(&tile);
 				}
 
 				task->release_tile(tile);
@@ -1015,6 +1019,11 @@ public:
 		}
 	};
 
+	int get_split_task_count(DeviceTask& task)
+	{
+		return 1;
+	}
+
 	void task_add(DeviceTask& task)
 	{
 		if(task.type == DeviceTask::FILM_CONVERT) {
diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp
index c866eba..564fbdb 100644
--- a/intern/cycles/device/device_multi.cpp
+++ b/intern/cycles/device/device_multi.cpp
@@ -278,6 +278,11 @@ public:
 		return -1;
 	}
 
+	int get_split_task_count(DeviceTask& task)
+	{
+		return 1;
+	}
+
 	void task_add(DeviceTask& task)
 	{
 		list<DeviceTask> tasks;
diff --git a/intern/cycles/device/device_opencl.cpp b/intern/cycles/device/device_opencl.cpp
index abfe445..3abda6a 100644
--- a/intern/cycles/device/device_opencl.cpp
+++ b/intern/cycles/device/device_opencl.cpp
@@ -1068,7 +1068,11 @@ public:
 			kernel = ckShaderKernel;
 
 		for(int sample = 0; sample < task.num_samples; sample++) {
-			cl_int d_sample = task.sample;
+
+			if(task.get_cancel())
+				break;
+
+			cl_int d_sample = sample;
 
 			opencl_assert(clSetKernelArg(kernel, narg++, sizeof(d_data), (void*)&d_data));
 			opencl_assert(clSetKernelArg(kernel, narg++, sizeof(d_input), (void*)&d_input));
@@ -1084,6 +1088,8 @@ public:
 			opencl_assert(clSetKernelArg(kernel, narg++, sizeof(d_sample), (void*)&d_sample));
 
 			enqueue_kernel(kernel, task.shader_w, 1);
+
+			task.update_progress(NULL);
 		}
 	}
 
@@ -1113,7 +1119,7 @@ public:
 
 					tile.sample = sample + 1;
 
-					task->update_progress(tile);
+					task->update_progress(&tile);
 				}
 
 				task->release_tile(tile);
@@ -1130,6 +1136,11 @@ public:
 		}
 	};
 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list