diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp index 6629069c6c6..d76ffb10786 100644 --- a/intern/cycles/device/device_cuda.cpp +++ b/intern/cycles/device/device_cuda.cpp @@ -25,6 +25,7 @@ #include "cuew.h" #include "util_debug.h" +#include "util_foreach.h" #include "util_map.h" #include "util_opengl.h" #include "util_path.h" @@ -966,7 +967,10 @@ public: int get_split_task_count(DeviceTask& task) { - return 1; + if (task.type == DeviceTask::SHADER) + return task.get_subtask_count(TaskScheduler::num_threads(), 1024 * 1024); + else + return 1; } void task_add(DeviceTask& task) @@ -979,6 +983,15 @@ public: cuda_assert(cuCtxSynchronize()); cuda_pop_context(); } + else if(task.type == DeviceTask::SHADER) { + /* split task into smaller ones */ + list tasks; + + task.split(tasks, TaskScheduler::num_threads(), 1024 * 1024); + + foreach(DeviceTask& task, tasks) + task_pool.push(new CUDADeviceTask(this, task)); + } else { task_pool.push(new CUDADeviceTask(this, task)); } diff --git a/intern/cycles/device/device_multi.cpp b/intern/cycles/device/device_multi.cpp index 564fbdbadf8..7f055c79491 100644 --- a/intern/cycles/device/device_multi.cpp +++ b/intern/cycles/device/device_multi.cpp @@ -280,7 +280,18 @@ public: int get_split_task_count(DeviceTask& task) { - return 1; + int total_tasks = 0; + list tasks; + task.split(tasks, devices.size()); + foreach(SubDevice& sub, devices) { + if(!tasks.empty()) { + DeviceTask subtask = tasks.front(); + tasks.pop_front(); + + total_tasks += sub.device->get_split_task_count(subtask); + } + } + return total_tasks; } void task_add(DeviceTask& task)