Fix T41222 Blender gives weird output when baking (4096*4096) resolution on GPU
authorDalai Felinto <dfelinto@gmail.com>
Tue, 5 Aug 2014 16:50:50 +0000 (13:50 -0300)
committerDalai Felinto <dfelinto@gmail.com>
Tue, 5 Aug 2014 16:50:50 +0000 (13:50 -0300)
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

intern/cycles/device/device_cuda.cpp
intern/cycles/device/device_multi.cpp

index 6629069c6c675989c2731ae618224897cdd4c784..d76ffb1078671596609517060b6e420c784f4e70 100644 (file)
@@ -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));
                }
index 564fbdbadf82f030abdb80c0215b5fd4577428d4..7f055c79491c7f28237e4781b3b99200007198d4 100644 (file)
@@ -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)