diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2014-08-05 20:50:50 +0400 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2014-08-05 20:50:50 +0400 |
commit | a48b372b04421b00644a0660bfdf42229b5ffceb (patch) | |
tree | 08d4ebaa6bcf5900db6c111ae2377ed9e8421035 /intern | |
parent | 9855edcacf998a01a057a2875a7732489ac858c6 (diff) |
Fix T41222 Blender gives weird output when baking (4096*4096) resolution on GPU
In collaboration with Sergey Sharybin.
Also thanks to Wolfgang Faehnle (mib2berlin) for help testing the
solutions.
Reviewers: sergey
Differential Revision: https://developer.blender.org/D690
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/device/device_cuda.cpp | 15 | ||||
-rw-r--r-- | intern/cycles/device/device_multi.cpp | 13 |
2 files changed, 26 insertions, 2 deletions
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<DeviceTask> 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<DeviceTask> 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) |