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:
authorMai Lavelle <mai.lavelle@gmail.com>2017-03-03 12:07:26 +0300
committerMai Lavelle <mai.lavelle@gmail.com>2017-03-08 09:31:09 +0300
commit223f45818ec216a76d89de0efcb3b0292eabf71e (patch)
tree7b7cc73967c5f77eb5f5613c657654bcceb5e4ed /intern/cycles/kernel/split
parentcd7d5669d17070799e2d2a2b28f58a06c3417d7b (diff)
Cycles: Initialize rng_state for split kernel
Because the split kernel can render multiple samples in parallel it is necessary to have everything initialized before rendering of any samples begins. The code that normally handles initialization of `rng_state` (`kernel_path_trace_setup()`) only does so for the first sample, which was causing artifacts in the split kernel due to uninitialized `rng_state` for some samples. Note that because the split kernel can render samples in parallel this means that the split kernel is incompatible with the LCG.
Diffstat (limited to 'intern/cycles/kernel/split')
-rw-r--r--intern/cycles/kernel/split/kernel_data_init.h10
1 files changed, 9 insertions, 1 deletions
diff --git a/intern/cycles/kernel/split/kernel_data_init.h b/intern/cycles/kernel/split/kernel_data_init.h
index c22703e5abd..785103a79ac 100644
--- a/intern/cycles/kernel/split/kernel_data_init.h
+++ b/intern/cycles/kernel/split/kernel_data_init.h
@@ -126,7 +126,7 @@ void KERNEL_FUNCTION_FULL_NAME(data_init)(
*use_queues_flag = 0;
}
- /* zero the tiles pixels if this is the first sample */
+ /* zero the tiles pixels and initialize rng_state if this is the first sample */
if(start_sample == 0) {
parallel_for(kg, i, sw * sh * kernel_data.film.pass_stride) {
int pixel = i / kernel_data.film.pass_stride;
@@ -139,6 +139,14 @@ void KERNEL_FUNCTION_FULL_NAME(data_init)(
*(buffer + index) = 0.0f;
}
+
+ parallel_for(kg, i, sw * sh) {
+ int x = sx + i % sw;
+ int y = sy + i / sw;
+
+ int index = (offset + x + y*stride);
+ *(rng_state + index) = hash_int_2d(x, y);
+ }
}
}