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
path: root/intern
diff options
context:
space:
mode:
authorMai Lavelle <mai.lavelle@gmail.com>2017-04-11 10:02:43 +0300
committerMai Lavelle <mai.lavelle@gmail.com>2017-04-11 10:26:18 +0300
commitd097c72f81a7a61ac5b96ca691114ac2765823d0 (patch)
tree20858370091642b48743bfd198b340b4a0e3c71b /intern
parent1e6038a426b992bf991040eac18ae7d83ae6a8bb (diff)
Cycles: Only calculate global size of split kernel once to avoid changes
Global size depends on memory usage which might change during rendering. Havent seen it happen but seems possible that this could cause the global size to be different than what was used for allocating buffers.
Diffstat (limited to 'intern')
-rw-r--r--intern/cycles/device/device_split_kernel.cpp27
-rw-r--r--intern/cycles/device/device_split_kernel.h3
2 files changed, 17 insertions, 13 deletions
diff --git a/intern/cycles/device/device_split_kernel.cpp b/intern/cycles/device/device_split_kernel.cpp
index fa641161c05..981ec74fe56 100644
--- a/intern/cycles/device/device_split_kernel.cpp
+++ b/intern/cycles/device/device_split_kernel.cpp
@@ -128,26 +128,27 @@ bool DeviceSplitKernel::path_trace(DeviceTask *task,
local_size[1] = lsize[1];
}
- /* Set gloabl size */
- size_t global_size[2];
- {
- int2 gsize = split_kernel_global_size(kgbuffer, kernel_data, task);
-
- /* Make sure that set work size is a multiple of local
- * work size dimensions.
- */
- global_size[0] = round_up(gsize[0], local_size[0]);
- global_size[1] = round_up(gsize[1], local_size[1]);
- }
-
/* Number of elements in the global state buffer */
int num_global_elements = global_size[0] * global_size[1];
- assert(num_global_elements % WORK_POOL_SIZE == 0);
/* Allocate all required global memory once. */
if(first_tile) {
first_tile = false;
+ /* Set gloabl size */
+ {
+ int2 gsize = split_kernel_global_size(kgbuffer, kernel_data, task);
+
+ /* Make sure that set work size is a multiple of local
+ * work size dimensions.
+ */
+ global_size[0] = round_up(gsize[0], local_size[0]);
+ global_size[1] = round_up(gsize[1], local_size[1]);
+ }
+
+ num_global_elements = global_size[0] * global_size[1];
+ assert(num_global_elements % WORK_POOL_SIZE == 0);
+
/* Calculate max groups */
/* Denotes the maximum work groups possible w.r.t. current requested tile size. */
diff --git a/intern/cycles/device/device_split_kernel.h b/intern/cycles/device/device_split_kernel.h
index 15a94953a11..55548122c0c 100644
--- a/intern/cycles/device/device_split_kernel.h
+++ b/intern/cycles/device/device_split_kernel.h
@@ -95,6 +95,9 @@ private:
/* Marked True in constructor and marked false at the end of path_trace(). */
bool first_tile;
+ /* Cached global size */
+ size_t global_size[2];
+
public:
explicit DeviceSplitKernel(Device* device);
virtual ~DeviceSplitKernel();