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 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& tasks, int max_size) +void DeviceTask::split(list& 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; + } + + num = max(max_size_num, num); } - split(tasks, num); -} - -void DeviceTask::split(list& 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& tasks, int num); - void split_max_size(list& tasks, int max_size); + void split(list& 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 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);