[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