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:
authorStefan Werner <stefan.werner@tangent-animation.com>2020-03-10 10:53:30 +0300
committerStefan Werner <stefan.werner@tangent-animation.com>2020-03-10 10:53:30 +0300
commit811569dc11deba7ccf0570dd8d6235482de3626c (patch)
treeca5727a1f8af2be5a232368440e0ecfe19b43098 /intern/cycles/kernel
parent7b8ac04d86e28ab47fd0863958201079a9c43501 (diff)
Cycles: Using OpenCL popcount() in PMJ sampler.
Diffstat (limited to 'intern/cycles/kernel')
-rw-r--r--intern/cycles/kernel/kernel_random.h5
1 files changed, 4 insertions, 1 deletions
diff --git a/intern/cycles/kernel/kernel_random.h b/intern/cycles/kernel/kernel_random.h
index dae9c8f930c..ec41ef2f0e9 100644
--- a/intern/cycles/kernel/kernel_random.h
+++ b/intern/cycles/kernel/kernel_random.h
@@ -294,12 +294,15 @@ ccl_device_inline bool sample_is_even(int pattern, int sample)
if (pattern == SAMPLING_PATTERN_PMJ) {
/* See Section 10.2.1, "Progressive Multi-Jittered Sample Sequences", Christensen et al.
* We can use this to get divide sample sequence into two classes for easier variance
- * estimation. There must be a more elegant way of writing this? */
+ * estimation. */
#if defined(__GNUC__) && !defined(__KERNEL_GPU__)
return __builtin_popcount(sample & 0xaaaaaaaa) & 1;
#elif defined(__NVCC__)
return __popc(sample & 0xaaaaaaaa) & 1;
+#elif defined(__KERNEL_OPENCL__)
+ return popcount(sample & 0xaaaaaaaa) & 1;
#else
+/* TODO(Stefan): popcnt intrinsic for Windows with fallback for older CPUs. */
int i = sample & 0xaaaaaaaa;
i = i - ((i >> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >> 2) & 0x33333333);