[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