Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/kernel/integrator/integrator_shade_shadow.h')
-rw-r--r--intern/cycles/kernel/integrator/integrator_shade_shadow.h79
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;
}