diff options
Diffstat (limited to 'intern/cycles/kernel/integrator/integrator_shade_shadow.h')
-rw-r--r-- | intern/cycles/kernel/integrator/integrator_shade_shadow.h | 79 |
1 files changed, 43 insertions, 36 deletions
diff --git a/intern/cycles/kernel/integrator/integrator_shade_shadow.h b/intern/cycles/kernel/integrator/integrator_shade_shadow.h index 3857b522b25..a82254e1dea 100644 --- a/intern/cycles/kernel/integrator/integrator_shade_shadow.h +++ b/intern/cycles/kernel/integrator/integrator_shade_shadow.h @@ -23,13 +23,15 @@ CCL_NAMESPACE_BEGIN -ccl_device_inline bool shadow_intersections_has_remaining(const int num_hits) +ccl_device_inline bool shadow_intersections_has_remaining(const uint num_hits) { return num_hits >= INTEGRATOR_SHADOW_ISECT_SIZE; } #ifdef __TRANSPARENT_SHADOWS__ -ccl_device_inline float3 integrate_transparent_surface_shadow(INTEGRATOR_STATE_ARGS, const int hit) +ccl_device_inline float3 integrate_transparent_surface_shadow(KernelGlobals kg, + IntegratorShadowState state, + const int hit) { PROFILING_INIT(kg, PROFILING_SHADE_SHADOW_SURFACE); @@ -43,22 +45,22 @@ ccl_device_inline float3 integrate_transparent_surface_shadow(INTEGRATOR_STATE_A /* Setup shader data at surface. */ Intersection isect ccl_optional_struct_init; - integrator_state_read_shadow_isect(INTEGRATOR_STATE_PASS, &isect, hit); + integrator_state_read_shadow_isect(state, &isect, hit); Ray ray ccl_optional_struct_init; - integrator_state_read_shadow_ray(INTEGRATOR_STATE_PASS, &ray); + integrator_state_read_shadow_ray(kg, state, &ray); shader_setup_from_ray(kg, shadow_sd, &ray, &isect); /* Evaluate shader. */ if (!(shadow_sd->flag & SD_HAS_ONLY_VOLUME)) { shader_eval_surface<KERNEL_FEATURE_NODE_MASK_SURFACE_SHADOW>( - INTEGRATOR_STATE_PASS, shadow_sd, NULL, PATH_RAY_SHADOW); + kg, state, shadow_sd, NULL, PATH_RAY_SHADOW); } # ifdef __VOLUME__ /* Exit/enter volume. */ - shadow_volume_stack_enter_exit(INTEGRATOR_STATE_PASS, shadow_sd); + shadow_volume_stack_enter_exit(kg, state, shadow_sd); # endif /* Compute transparency from closures. */ @@ -66,7 +68,8 @@ ccl_device_inline float3 integrate_transparent_surface_shadow(INTEGRATOR_STATE_A } # ifdef __VOLUME__ -ccl_device_inline void integrate_transparent_volume_shadow(INTEGRATOR_STATE_ARGS, +ccl_device_inline void integrate_transparent_volume_shadow(KernelGlobals kg, + IntegratorShadowState state, const int hit, const int num_recorded_hits, ccl_private float3 *ccl_restrict @@ -80,57 +83,60 @@ ccl_device_inline void integrate_transparent_volume_shadow(INTEGRATOR_STATE_ARGS /* Setup shader data. */ Ray ray ccl_optional_struct_init; - integrator_state_read_shadow_ray(INTEGRATOR_STATE_PASS, &ray); + integrator_state_read_shadow_ray(kg, state, &ray); /* Modify ray position and length to match current segment. */ - const float start_t = (hit == 0) ? 0.0f : INTEGRATOR_STATE_ARRAY(shadow_isect, hit - 1, t); - const float end_t = (hit < num_recorded_hits) ? INTEGRATOR_STATE_ARRAY(shadow_isect, hit, t) : - ray.t; + const float start_t = (hit == 0) ? 0.0f : + INTEGRATOR_STATE_ARRAY(state, shadow_isect, hit - 1, t); + const float end_t = (hit < num_recorded_hits) ? + INTEGRATOR_STATE_ARRAY(state, shadow_isect, hit, t) : + ray.t; ray.P += start_t * ray.D; ray.t = end_t - start_t; shader_setup_from_volume(kg, shadow_sd, &ray); - const float step_size = volume_stack_step_size(INTEGRATOR_STATE_PASS, [=](const int i) { - return integrator_state_read_shadow_volume_stack(INTEGRATOR_STATE_PASS, i); - }); + const float step_size = volume_stack_step_size( + kg, [=](const int i) { return integrator_state_read_shadow_volume_stack(state, i); }); - volume_shadow_heterogeneous(INTEGRATOR_STATE_PASS, &ray, shadow_sd, throughput, step_size); + volume_shadow_heterogeneous(kg, state, &ray, shadow_sd, throughput, step_size); } # endif -ccl_device_inline bool integrate_transparent_shadow(INTEGRATOR_STATE_ARGS, const int num_hits) +ccl_device_inline bool integrate_transparent_shadow(KernelGlobals kg, + IntegratorShadowState state, + const uint num_hits) { /* Accumulate shadow for transparent surfaces. */ - const int num_recorded_hits = min(num_hits, INTEGRATOR_SHADOW_ISECT_SIZE); + const uint num_recorded_hits = min(num_hits, INTEGRATOR_SHADOW_ISECT_SIZE); - for (int hit = 0; hit < num_recorded_hits + 1; hit++) { + for (uint hit = 0; hit < num_recorded_hits + 1; hit++) { /* Volume shaders. */ if (hit < num_recorded_hits || !shadow_intersections_has_remaining(num_hits)) { # ifdef __VOLUME__ - if (!integrator_state_shadow_volume_stack_is_empty(INTEGRATOR_STATE_PASS)) { - float3 throughput = INTEGRATOR_STATE(shadow_path, throughput); - integrate_transparent_volume_shadow( - INTEGRATOR_STATE_PASS, hit, num_recorded_hits, &throughput); + if (!integrator_state_shadow_volume_stack_is_empty(kg, state)) { + float3 throughput = INTEGRATOR_STATE(state, shadow_path, throughput); + integrate_transparent_volume_shadow(kg, state, hit, num_recorded_hits, &throughput); if (is_zero(throughput)) { return true; } - INTEGRATOR_STATE_WRITE(shadow_path, throughput) = throughput; + INTEGRATOR_STATE_WRITE(state, shadow_path, throughput) = throughput; } # endif } /* Surface shaders. */ if (hit < num_recorded_hits) { - const float3 shadow = integrate_transparent_surface_shadow(INTEGRATOR_STATE_PASS, hit); - const float3 throughput = INTEGRATOR_STATE(shadow_path, throughput) * shadow; + const float3 shadow = integrate_transparent_surface_shadow(kg, state, hit); + const float3 throughput = INTEGRATOR_STATE(state, shadow_path, throughput) * shadow; if (is_zero(throughput)) { return true; } - INTEGRATOR_STATE_WRITE(shadow_path, throughput) = throughput; - INTEGRATOR_STATE_WRITE(shadow_path, transparent_bounce) += 1; + INTEGRATOR_STATE_WRITE(state, shadow_path, throughput) = throughput; + INTEGRATOR_STATE_WRITE(state, shadow_path, transparent_bounce) += 1; + INTEGRATOR_STATE_WRITE(state, shadow_path, rng_offset) += PRNG_BOUNCE_NUM; } /* Note we do not need to check max_transparent_bounce here, the number @@ -141,26 +147,27 @@ ccl_device_inline bool integrate_transparent_shadow(INTEGRATOR_STATE_ARGS, const if (shadow_intersections_has_remaining(num_hits)) { /* There are more hits that we could not recorded due to memory usage, * adjust ray to intersect again from the last hit. */ - const float last_hit_t = INTEGRATOR_STATE_ARRAY(shadow_isect, num_recorded_hits - 1, t); - const float3 ray_P = INTEGRATOR_STATE(shadow_ray, P); - const float3 ray_D = INTEGRATOR_STATE(shadow_ray, D); - INTEGRATOR_STATE_WRITE(shadow_ray, P) = ray_offset(ray_P + last_hit_t * ray_D, ray_D); - INTEGRATOR_STATE_WRITE(shadow_ray, t) -= last_hit_t; + const float last_hit_t = INTEGRATOR_STATE_ARRAY(state, shadow_isect, num_recorded_hits - 1, t); + const float3 ray_P = INTEGRATOR_STATE(state, shadow_ray, P); + const float3 ray_D = INTEGRATOR_STATE(state, shadow_ray, D); + INTEGRATOR_STATE_WRITE(state, shadow_ray, P) = ray_offset(ray_P + last_hit_t * ray_D, ray_D); + INTEGRATOR_STATE_WRITE(state, shadow_ray, t) -= last_hit_t; } return false; } #endif /* __TRANSPARENT_SHADOWS__ */ -ccl_device void integrator_shade_shadow(INTEGRATOR_STATE_ARGS, +ccl_device void integrator_shade_shadow(KernelGlobals kg, + IntegratorShadowState state, ccl_global float *ccl_restrict render_buffer) { PROFILING_INIT(kg, PROFILING_SHADE_SHADOW_SETUP); - const int num_hits = INTEGRATOR_STATE(shadow_path, num_hits); + const uint num_hits = INTEGRATOR_STATE(state, shadow_path, num_hits); #ifdef __TRANSPARENT_SHADOWS__ /* Evaluate transparent shadows. */ - const bool opaque = integrate_transparent_shadow(INTEGRATOR_STATE_PASS, num_hits); + const bool opaque = integrate_transparent_shadow(kg, state, num_hits); if (opaque) { INTEGRATOR_SHADOW_PATH_TERMINATE(DEVICE_KERNEL_INTEGRATOR_SHADE_SHADOW); return; @@ -174,7 +181,7 @@ ccl_device void integrator_shade_shadow(INTEGRATOR_STATE_ARGS, return; } else { - kernel_accum_light(INTEGRATOR_STATE_PASS, render_buffer); + kernel_accum_light(kg, state, render_buffer); INTEGRATOR_SHADOW_PATH_TERMINATE(DEVICE_KERNEL_INTEGRATOR_SHADE_SHADOW); return; } |