Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/intern
diff options
context:
space:
mode:
authorBrecht van Lommel <brechtvanlommel@gmail.com>2014-05-26 15:40:16 +0400
committerBrecht van Lommel <brechtvanlommel@gmail.com>2014-05-26 15:51:11 +0400
commit0075efc4d201da992d590ef6c6462cd957955068 (patch)
tree875f90577f22120f09b45d5770a22b1c083ddaba /intern
parent3b4f792ce102f5c892e4108c19512dd3b9968335 (diff)
Fix T40306: cycles baking not distributing work among CPU cores well.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/device/device_cpu.cpp6
-rw-r--r--intern/cycles/device/device_task.cpp25
-rw-r--r--intern/cycles/device/device_task.h3
-rw-r--r--intern/cycles/render/light.cpp2
4 files changed, 19 insertions, 17 deletions
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index c9cc7592028..b0739dd20b4 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -452,7 +452,11 @@ public:
{
/* split task into smaller ones */
list<DeviceTask> tasks;
- task.split(tasks, TaskScheduler::num_threads());
+
+ if(task.type == DeviceTask::SHADER)
+ task.split(tasks, TaskScheduler::num_threads(), 256);
+ else
+ task.split(tasks, TaskScheduler::num_threads());
foreach(DeviceTask& task, tasks)
task_pool.push(new CPUDeviceTask(this, task));
diff --git a/intern/cycles/device/device_task.cpp b/intern/cycles/device/device_task.cpp
index 7d0eeab780d..f436b54df68 100644
--- a/intern/cycles/device/device_task.cpp
+++ b/intern/cycles/device/device_task.cpp
@@ -35,23 +35,22 @@ DeviceTask::DeviceTask(Type type_)
last_update_time = time_dt();
}
-void DeviceTask::split_max_size(list<DeviceTask>& tasks, int max_size)
+void DeviceTask::split(list<DeviceTask>& tasks, int num, int max_size)
{
- int num;
+ if(max_size != 0) {
+ int max_size_num;
- if(type == SHADER) {
- num = (shader_w + max_size - 1)/max_size;
- }
- else {
- max_size = max(1, max_size/w);
- num = (h + max_size - 1)/max_size;
- }
+ if(type == SHADER) {
+ max_size_num = (shader_w + max_size - 1)/max_size;
+ }
+ else {
+ max_size = max(1, max_size/w);
+ max_size_num = (h + max_size - 1)/max_size;
+ }
- split(tasks, num);
-}
+ num = max(max_size_num, num);
+ }
-void DeviceTask::split(list<DeviceTask>& tasks, int num)
-{
if(type == SHADER) {
num = min(shader_w, num);
diff --git a/intern/cycles/device/device_task.h b/intern/cycles/device/device_task.h
index c1bd39b70ca..91390674286 100644
--- a/intern/cycles/device/device_task.h
+++ b/intern/cycles/device/device_task.h
@@ -52,8 +52,7 @@ public:
DeviceTask(Type type = PATH_TRACE);
- void split(list<DeviceTask>& tasks, int num);
- void split_max_size(list<DeviceTask>& tasks, int max_size);
+ void split(list<DeviceTask>& tasks, int num, int max_size = 0);
void update_progress(RenderTile &rtile);
diff --git a/intern/cycles/render/light.cpp b/intern/cycles/render/light.cpp
index 7bdb1fbf8af..1325627ef05 100644
--- a/intern/cycles/render/light.cpp
+++ b/intern/cycles/render/light.cpp
@@ -70,7 +70,7 @@ static void shade_background_pixels(Device *device, DeviceScene *dscene, int res
/* disabled splitting for now, there's an issue with multi-GPU mem_copy_from */
list<DeviceTask> split_tasks;
- main_task.split_max_size(split_tasks, 128*128);
+ main_task.split(split_tasks, 1, 128*128);
foreach(DeviceTask& task, split_tasks) {
device->task_add(task);