[Bf-blender-cvs] [06af96c5556] temp-cycles-opencl-staging: Cycles: Add function to accumulate samples with atomics for split kernel
Mai Lavelle
noreply at git.blender.org
Thu Jun 8 11:40:06 CEST 2017
Commit: 06af96c55564e0133e00b120b1153d2709b24886
Author: Mai Lavelle
Date: Mon May 29 21:34:05 2017 -0400
Branches: temp-cycles-opencl-staging
https://developer.blender.org/rB06af96c55564e0133e00b120b1153d2709b24886
Cycles: Add function to accumulate samples with atomics for split kernel
Samples ran in parallel need a safe way to accumulate their results
with the results of other threads.
===================================================================
M intern/cycles/kernel/kernel_accumulate.h
===================================================================
diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index 06728415c15..935d3d160cd 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -642,6 +642,43 @@ ccl_device_inline void path_radiance_accum_sample(PathRadiance *L, PathRadiance
L->emission += L_sample->emission * fac;
}
+#ifdef __SPLIT_KERNEL__
+ccl_device_inline void path_radiance_accum_sample_thread_safe(PathRadiance *L, PathRadiance *L_sample, int num_samples)
+{
+ float fac = 1.0f/num_samples;
+
+#define safe_float3_add(p, v) \
+ { \
+ ccl_global float *f = (ccl_global float*)(p); \
+ atomic_add_and_fetch_float(f+0, (v).x); \
+ atomic_add_and_fetch_float(f+1, (v).y); \
+ atomic_add_and_fetch_float(f+2, (v).z); \
+ }
+
+#ifdef __PASSES__
+ safe_float3_add(&L->direct_diffuse, L_sample->direct_diffuse*fac);
+ safe_float3_add(&L->direct_glossy, L_sample->direct_glossy*fac);
+ safe_float3_add(&L->direct_transmission, L_sample->direct_transmission*fac);
+ safe_float3_add(&L->direct_subsurface, L_sample->direct_subsurface*fac);
+ safe_float3_add(&L->direct_scatter, L_sample->direct_scatter*fac);
+
+ safe_float3_add(&L->indirect_diffuse, L_sample->indirect_diffuse*fac);
+ safe_float3_add(&L->indirect_glossy, L_sample->indirect_glossy*fac);
+ safe_float3_add(&L->indirect_transmission, L_sample->indirect_transmission*fac);
+ safe_float3_add(&L->indirect_subsurface, L_sample->indirect_subsurface*fac);
+ safe_float3_add(&L->indirect_scatter, L_sample->indirect_scatter*fac);
+
+ safe_float3_add(&L->background, L_sample->background*fac);
+ safe_float3_add(&L->ao, L_sample->ao*fac);
+ safe_float3_add(&L->shadow, L_sample->shadow*fac);
+ atomic_add_and_fetch_float(&L->mist, L_sample->mist*fac);
+#endif
+ safe_float3_add(&L->emission, L_sample->emission * fac);
+
+#undef safe_float3_add
+}
+#endif /* __SPLIT_KERNEL__ */
+
#ifdef __SHADOW_TRICKS__
/* Calculate current shadow of the path. */
ccl_device_inline float path_radiance_sum_shadow(const PathRadiance *L)
More information about the Bf-blender-cvs
mailing list