diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2014-07-23 01:41:01 +0400 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2014-07-25 18:42:53 +0400 |
commit | fc55c41bba8121bf3db67280c26e840f8b3f4124 (patch) | |
tree | 181abfb43fbbdf84b85206ddc1c2de7635a0dbaf /intern/cycles/device | |
parent | 2e50b4dc511567a3dfb280e30b5606873fc62d31 (diff) |
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
Diffstat (limited to 'intern/cycles/device')
-rw-r--r-- | intern/cycles/device/device.h | 1 | ||||
-rw-r--r-- | intern/cycles/device/device_cpu.cpp | 56 | ||||
-rw-r--r-- | intern/cycles/device/device_cuda.cpp | 25 | ||||
-rw-r--r-- | intern/cycles/device/device_multi.cpp | 5 | ||||
-rw-r--r-- | intern/cycles/device/device_opencl.cpp | 15 | ||||
-rw-r--r-- | intern/cycles/device/device_task.cpp | 25 | ||||
-rw-r--r-- | intern/cycles/device/device_task.h | 3 |
7 files changed, 95 insertions, 35 deletions
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h index bcddd4f73e2..20ebfd391d6 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 7308d036fe3..4fdeef6bdcb 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 022dcd0275c..1c7f3a05b0b 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 c866ebaaea2..564fbdbadf8 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 abfe445414a..3abda6a54c1 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: } }; + int get_split_task_count(DeviceTask& task) + { + return 1; + } + void task_add(DeviceTask& task) { task_pool.push(new OpenCLDeviceTask(this, task)); diff --git a/intern/cycles/device/device_task.cpp b/intern/cycles/device/device_task.cpp index f436b54df68..dc124f8cf37 100644 --- a/intern/cycles/device/device_task.cpp +++ b/intern/cycles/device/device_task.cpp @@ -35,7 +35,7 @@ DeviceTask::DeviceTask(Type type_) last_update_time = time_dt(); } -void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) +int DeviceTask::get_subtask_count(int num, int max_size) { if(max_size != 0) { int max_size_num; @@ -53,7 +53,21 @@ void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) if(type == SHADER) { num = min(shader_w, num); + } + else if(type == PATH_TRACE) { + } + else { + num = min(h, num); + } + return num; +} + +void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) +{ + num = get_subtask_count(num, max_size); + + if(type == SHADER) { for(int i = 0; i < num; i++) { int tx = shader_x + (shader_w/num)*i; int tw = (i == num-1)? shader_w - i*(shader_w/num): shader_w/num; @@ -71,8 +85,6 @@ void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) tasks.push_back(*this); } else { - num = min(h, num); - for(int i = 0; i < num; i++) { int ty = y + (h/num)*i; int th = (i == num-1)? h - i*(h/num): h/num; @@ -87,9 +99,10 @@ void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size) } } -void DeviceTask::update_progress(RenderTile &rtile) +void DeviceTask::update_progress(RenderTile *rtile) { - if (type != PATH_TRACE) + if((type != PATH_TRACE) && + (type != SHADER)) return; if(update_progress_sample) @@ -99,7 +112,7 @@ void DeviceTask::update_progress(RenderTile &rtile) double current_time = time_dt(); if (current_time - last_update_time >= 1.0) { - update_tile_sample(rtile); + update_tile_sample(*rtile); last_update_time = current_time; } diff --git a/intern/cycles/device/device_task.h b/intern/cycles/device/device_task.h index 91390674286..50216adefe2 100644 --- a/intern/cycles/device/device_task.h +++ b/intern/cycles/device/device_task.h @@ -52,9 +52,10 @@ public: DeviceTask(Type type = PATH_TRACE); + int get_subtask_count(int num, int max_size = 0); void split(list<DeviceTask>& tasks, int num, int max_size = 0); - void update_progress(RenderTile &rtile); + void update_progress(RenderTile *rtile); boost::function<bool(Device *device, RenderTile&)> acquire_tile; boost::function<void(void)> update_progress_sample; |