[Bf-blender-cvs] [f70010fd40] temp-cycles-denoising: Cycles Denoising: Implement support in the split kernel

Lukas Stockner noreply at git.blender.org
Fri Mar 24 20:18:27 CET 2017


Commit: f70010fd40060b8c3be38e2831356bbb36ee7219
Author: Lukas Stockner
Date:   Tue Mar 14 03:45:06 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rBf70010fd40060b8c3be38e2831356bbb36ee7219

Cycles Denoising: Implement support in the split kernel

===================================================================

M	intern/cycles/kernel/kernel_accumulate.h
M	intern/cycles/kernel/kernel_passes.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/split/kernel_buffer_update.h
M	intern/cycles/kernel/split/kernel_next_iteration_setup.h

===================================================================

diff --git a/intern/cycles/kernel/kernel_accumulate.h b/intern/cycles/kernel/kernel_accumulate.h
index 8a47ec2f82..62594f4a88 100644
--- a/intern/cycles/kernel/kernel_accumulate.h
+++ b/intern/cycles/kernel/kernel_accumulate.h
@@ -283,7 +283,7 @@ ccl_device_inline void path_radiance_accum_emission(PathRadiance *L, float3 thro
 }
 
 ccl_device_inline void path_radiance_accum_ao(PathRadiance *L,
-                                              PathState *state,
+                                              ccl_addr_space PathState *state,
                                               float3 throughput,
                                               float3 alpha,
                                               float3 bsdf,
@@ -318,7 +318,7 @@ ccl_device_inline void path_radiance_accum_ao(PathRadiance *L,
 
 ccl_device_inline void path_radiance_accum_total_ao(
         PathRadiance *L,
-        PathState *state,
+        ccl_addr_space PathState *state,
         float3 throughput,
         float3 bsdf)
 {
@@ -335,7 +335,7 @@ ccl_device_inline void path_radiance_accum_total_ao(
 }
 
 ccl_device_inline void path_radiance_accum_light(PathRadiance *L,
-                                                 PathState *state,
+                                                 ccl_addr_space PathState *state,
                                                  float3 throughput,
                                                  BsdfEval *bsdf_eval,
                                                  float3 shadow,
@@ -380,7 +380,7 @@ ccl_device_inline void path_radiance_accum_light(PathRadiance *L,
 
 ccl_device_inline void path_radiance_accum_total_light(
         PathRadiance *L,
-        PathState *state,
+        ccl_addr_space PathState *state,
         float3 throughput,
         const BsdfEval *bsdf_eval)
 {
diff --git a/intern/cycles/kernel/kernel_passes.h b/intern/cycles/kernel/kernel_passes.h
index d4e648429c..5cdc64f6bf 100644
--- a/intern/cycles/kernel/kernel_passes.h
+++ b/intern/cycles/kernel/kernel_passes.h
@@ -132,7 +132,7 @@ ccl_device_inline void kernel_write_denoising_shadow(KernelGlobals *kg, ccl_glob
 
 ccl_device_inline void kernel_update_denoising_features(KernelGlobals *kg,
                                                         ShaderData *sd,
-                                                        PathState *state,
+                                                        ccl_global PathState *state,
                                                         PathRadiance *L)
 {
 #ifdef __DENOISING_FEATURES__
@@ -357,9 +357,12 @@ ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *
 		kernel_write_light_passes(kg, buffer, L, sample);
 
 #ifdef __DENOISING_FEATURES__
-		kernel_write_denoising_shadow(kg, buffer, sample, average(L->path_total), average(L->path_total_shaded));
-
 		if(kernel_data.film.pass_denoising_data) {
+#  ifdef __SHADOW_TRICKS__
+			kernel_write_denoising_shadow(kg, buffer, sample, average(L->path_total), average(L->path_total_shaded));
+#  else
+			kernel_write_denoising_shadow(kg, buffer, sample, 0.0f, 0.0f);
+#  endif
 			if(kernel_data.film.pass_denoising_clean) {
 				float3 noisy, clean;
 				path_radiance_split_denoising(kg, L, &noisy, &clean);
@@ -386,9 +389,9 @@ ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *
 		kernel_write_pass_float4(buffer, sample, make_float4(0.0f, 0.0f, 0.0f, 0.0f));
 
 #ifdef __DENOISING_FEATURES__
-		kernel_write_denoising_shadow(kg, buffer, sample, 0.0f, 0.0f);
-
 		if(kernel_data.film.pass_denoising_data) {
+			kernel_write_denoising_shadow(kg, buffer, sample, 0.0f, 0.0f);
+
 			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 20, sample, make_float3(0.0f, 0.0f, 0.0f));
 			if(split_passes && !(sample & 1)) {
 				kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 26, sample, make_float3(0.0f, 0.0f, 0.0f));
@@ -397,9 +400,10 @@ ccl_device_inline void kernel_write_result(KernelGlobals *kg, ccl_global float *
 			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data, sample, make_float3(0.0f, 0.0f, 0.0f));
 			kernel_write_pass_float3_var(buffer + kernel_data.film.pass_denoising_data + 6, sample, make_float3(0.0f, 0.0f, 0.0f));
 			kernel_write_pass_float_var(buffer + kernel_data.film.pass_denoising_data + 12, sample, 0.0f);
-		}
-		if(kernel_data.film.pass_denoising_clean) {
-			kernel_write_pass_float3_nopad(buffer + kernel_data.film.pass_denoising_clean, sample, make_float3(0.0f, 0.0f, 0.0f));
+
+			if(kernel_data.film.pass_denoising_clean) {
+				kernel_write_pass_float3_nopad(buffer + kernel_data.film.pass_denoising_clean, sample, make_float3(0.0f, 0.0f, 0.0f));
+			}
 		}
 #endif  /* __DENOISING_FEATURES__ */
 	}
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index d84e8938a9..aace9594a4 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -158,7 +158,8 @@ CCL_NAMESPACE_BEGIN
 #define __CLAMP_SAMPLE__
 #define __PATCH_EVAL__
 #define __SHADOW_TRICKS__
-#  define __DENOISING_FEATURES__
+
+#define __DENOISING_FEATURES__
 
 #ifdef __KERNEL_SHADING__
 #  define __SVM__
diff --git a/intern/cycles/kernel/split/kernel_buffer_update.h b/intern/cycles/kernel/split/kernel_buffer_update.h
index b20024cbc9..1f6dce0253 100644
--- a/intern/cycles/kernel/split/kernel_buffer_update.h
+++ b/intern/cycles/kernel/split/kernel_buffer_update.h
@@ -111,28 +111,15 @@ ccl_device void kernel_buffer_update(KernelGlobals *kg,
 	buffer += (kernel_split_params.offset + pixel_x + pixel_y*stride) * kernel_data.film.pass_stride;
 
 	if(IS_STATE(ray_state, ray_index, RAY_UPDATE_BUFFER)) {
-		float3 L_sum;
-#ifdef __SHADOW_TRICKS__
-		if(state->flag & PATH_RAY_SHADOW_CATCHER) {
-			float shadow = path_radiance_sum_shadow(L);
-			L_sum = L->shadow_color * shadow;
-			if(kernel_data.background.transparent) {
-				*L_transparent = shadow;
-			}
-		}
-		else
-#endif  /* __SHADOW_TRICKS__ */
-		{
-			L_sum = path_radiance_clamp_and_sum(kg, L);
-		}
 		kernel_write_light_passes(kg, buffer, L, sample);
 #ifdef __KERNEL_DEBUG__
 		kernel_write_debug_passes(kg, buffer, state, debug_data, sample);
 #endif
-		float4 L_rad = make_float4(L_sum.x, L_sum.y, L_sum.z, 1.0f - (*L_transparent));
 
 		/* accumulate result in output buffer */
-		kernel_write_pass_float4(buffer, sample, L_rad);
+		bool is_shadow_catcher = (state->flag & PATH_RAY_SHADOW_CATCHER);
+		kernel_write_result(kg, buffer, sample, L, 1.0f - (*L_transparent), is_shadow_catcher);
+
 		path_rng_end(kg, rng_state, rng);
 
 		ASSIGN_RAY_STATE(ray_state, ray_index, RAY_TO_REGENERATE);
diff --git a/intern/cycles/kernel/split/kernel_next_iteration_setup.h b/intern/cycles/kernel/split/kernel_next_iteration_setup.h
index 21d3d50a45..b685d52ac8 100644
--- a/intern/cycles/kernel/split/kernel_next_iteration_setup.h
+++ b/intern/cycles/kernel/split/kernel_next_iteration_setup.h
@@ -118,7 +118,8 @@ ccl_device void kernel_next_iteration_setup(KernelGlobals *kg,
 				                       shadow);
 			}
 			else {
-				path_radiance_accum_total_ao(L, state, _throughput, kernel_split_state.ao_bsdf[ray_index]);
+				path_radiance_accum_total_ao(L, state, _throughput,
+				                             kernel_split_state.ao_bsdf[ray_index]);
 			}
 			REMOVE_RAY_FLAG(ray_state, ray_index, RAY_SHADOW_RAY_CAST_AO);
 		}
@@ -127,8 +128,8 @@ ccl_device void kernel_next_iteration_setup(KernelGlobals *kg,
 			float3 shadow = kernel_split_state.light_ray[ray_index].P;
 			// TODO(mai): investigate correctness here
 			char update_path_radiance = (char)kernel_split_state.light_ray[ray_index].t;
+			BsdfEval L_light = kernel_split_state.bsdf_eval[ray_index];
 			if(update_path_radiance) {
-				BsdfEval L_light = kernel_split_state.bsdf_eval[ray_index];
 				path_radiance_accum_light(L,
 				                          state,
 				                          _throughput,
@@ -137,6 +138,9 @@ ccl_device void kernel_next_iteration_setup(KernelGlobals *kg,
 				                          1.0f,
 				                          kernel_split_state.is_lamp[ray_index]);
 			}
+			else {
+				path_radiance_accum_total_light(L, state, _throughput, &L_light);
+			}
 			REMOVE_RAY_FLAG(ray_state, ray_index, RAY_SHADOW_RAY_CAST_DL);
 		}
 	}
@@ -147,9 +151,12 @@ ccl_device void kernel_next_iteration_setup(KernelGlobals *kg,
 		RNG rng = kernel_split_state.rng[ray_index];
 		state = &kernel_split_state.path_state[ray_index];
 		L = &kernel_split_state.path_radiance[ray_index];
+		ShaderData *sd = &kernel_split_state.sd[ray_index];
+
+		kernel_update_denoising_features(kg, sd, state, L);
 
 		/* Compute direct lighting and next bounce. */
-		if(!kernel_path_surface_bounce(kg, &rng, &kernel_split_state.sd[ray_index], throughput, state, L, ray)) {
+		if(!kernel_path_surface_bounce(kg, &rng, sd, throughput, state, L, ray)) {
 			ASSIGN_RAY_STATE(ray_state, ray_index, RAY_UPDATE_BUFFER);
 			enqueue_flag = 1;
 		}




More information about the Bf-blender-cvs mailing list