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
diff options
context:
space:
mode:
authorDalai Felinto <dfelinto@gmail.com>2014-08-05 20:50:50 +0400
committerDalai Felinto <dfelinto@gmail.com>2014-08-05 20:50:50 +0400
commita48b372b04421b00644a0660bfdf42229b5ffceb (patch)
tree08d4ebaa6bcf5900db6c111ae2377ed9e8421035 /intern/cycles/device
parent9855edcacf998a01a057a2875a7732489ac858c6 (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/cycles/device')
-rw-r--r--intern/cycles/device/device_cuda.cpp15
-rw-r--r--intern/cycles/device/device_multi.cpp13
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)