From 838949c3e76eb140bb0f776fbbd0fd61fac08f49 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Fri, 3 May 2013 21:34:51 +0000 Subject: Fix #35207: addition to previous fix to avoid OSL getting uninitialized ray differentials for lighting, which could cause bad texture filtering artifacts or performance. --- intern/cycles/kernel/kernel_camera.h | 9 +++------ intern/cycles/kernel/kernel_differential.h | 18 ++++++++++++++++++ intern/cycles/kernel/kernel_displace.h | 6 ++---- intern/cycles/kernel/kernel_emission.h | 10 +++++----- intern/cycles/kernel/kernel_path.h | 6 ++++++ intern/cycles/kernel/kernel_shader.h | 18 ++++++------------ intern/cycles/kernel/kernel_subsurface.h | 3 +-- 7 files changed, 41 insertions(+), 29 deletions(-) diff --git a/intern/cycles/kernel/kernel_camera.h b/intern/cycles/kernel/kernel_camera.h index fe31419b11e..13f2f84691d 100644 --- a/intern/cycles/kernel/kernel_camera.h +++ b/intern/cycles/kernel/kernel_camera.h @@ -76,8 +76,7 @@ __device void camera_sample_perspective(KernelGlobals *kg, float raster_x, float /* ray differential */ float3 Ddiff = transform_direction(&cameratoworld, Pcamera); - ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f); - ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f); + ray->dP = differential3_zero(); ray->dD.dx = normalize(Ddiff + float4_to_float3(kernel_data.cam.dx)) - normalize(Ddiff); ray->dD.dy = normalize(Ddiff + float4_to_float3(kernel_data.cam.dy)) - normalize(Ddiff); @@ -138,8 +137,7 @@ __device void camera_sample_orthographic(KernelGlobals *kg, float raster_x, floa ray->dP.dx = float4_to_float3(kernel_data.cam.dx); ray->dP.dy = float4_to_float3(kernel_data.cam.dy); - ray->dD.dx = make_float3(0.0f, 0.0f, 0.0f); - ray->dD.dy = make_float3(0.0f, 0.0f, 0.0f); + ray->dD = differential3_zero(); #endif #ifdef __CAMERA_CLIPPING__ @@ -209,8 +207,7 @@ __device void camera_sample_panorama(KernelGlobals *kg, float raster_x, float ra #ifdef __RAY_DIFFERENTIALS__ /* ray differential */ - ray->dP.dx = make_float3(0.0f, 0.0f, 0.0f); - ray->dP.dy = make_float3(0.0f, 0.0f, 0.0f); + ray->dP = differential3_zero(); Pcamera = transform_perspective(&rastertocamera, make_float3(raster_x + 1.0f, raster_y, 0.0f)); ray->dD.dx = normalize(transform_direction(&cameratoworld, panorama_to_direction(kg, Pcamera.x, Pcamera.y))) - ray->D; diff --git a/intern/cycles/kernel/kernel_differential.h b/intern/cycles/kernel/kernel_differential.h index 2190e04e231..c5332786f8b 100644 --- a/intern/cycles/kernel/kernel_differential.h +++ b/intern/cycles/kernel/kernel_differential.h @@ -86,5 +86,23 @@ __device void differential_dudv(differential *du, differential *dv, float3 dPdu, dv->dy = (dP.dy.y*dPdu.x - dP.dy.x*dPdu.y)*det; } +__device differential differential_zero() +{ + differential d; + d.dx = 0.0f; + d.dy = 0.0f; + + return d; +} + +__device differential3 differential3_zero() +{ + differential3 d; + d.dx = make_float3(0.0f, 0.0f, 0.0f); + d.dy = make_float3(0.0f, 0.0f, 0.0f); + + return d; +} + CCL_NAMESPACE_END diff --git a/intern/cycles/kernel/kernel_displace.h b/intern/cycles/kernel/kernel_displace.h index 5f95e0c2e3b..8b95e413b3f 100644 --- a/intern/cycles/kernel/kernel_displace.h +++ b/intern/cycles/kernel/kernel_displace.h @@ -52,10 +52,8 @@ __device void kernel_shader_evaluate(KernelGlobals *kg, uint4 *input, float4 *ou #endif #ifdef __RAY_DIFFERENTIALS__ - ray.dD.dx = make_float3(0.0f, 0.0f, 0.0f); - ray.dD.dy = make_float3(0.0f, 0.0f, 0.0f); - ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f); - ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f); + ray.dD = differential3_zero(); + ray.dP = differential3_zero(); #endif /* setup shader data */ diff --git a/intern/cycles/kernel/kernel_emission.h b/intern/cycles/kernel/kernel_emission.h index 0553ac7a4ee..6f7a3e71d27 100644 --- a/intern/cycles/kernel/kernel_emission.h +++ b/intern/cycles/kernel/kernel_emission.h @@ -36,8 +36,7 @@ __device_noinline float3 direct_emissive_eval(KernelGlobals *kg, float rando, #ifdef __OBJECT_MOTION__ ray.time = time; #endif - ray.dP.dx = make_float3(0.0f, 0.0f, 0.0f); - ray.dP.dy = make_float3(0.0f, 0.0f, 0.0f); + ray.dP = differential3_zero(); ray.dD = dI; #ifdef __CAMERA_MOTION__ ray.time = time; @@ -95,9 +94,7 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li return false; /* todo: implement */ - differential3 dD; - dD.dx = make_float3(0.0f, 0.0f, 0.0f); - dD.dy = make_float3(0.0f, 0.0f, 0.0f); + differential3 dD = differential3_zero(); /* evaluate closure */ float3 light_eval = direct_emissive_eval(kg, rando, &ls, randu, randv, -ls.D, dD, ls.t, sd->time); @@ -138,6 +135,9 @@ __device_noinline bool direct_emission(KernelGlobals *kg, ShaderData *sd, int li ray->D = ray_offset(ls.P, ls.Ng) - ray->P; ray->D = normalize_len(ray->D, &ray->t); } + + ray->dP = sd->dP; + ray->dD = differential3_zero(); } else { /* signal to not cast shadow ray */ diff --git a/intern/cycles/kernel/kernel_path.h b/intern/cycles/kernel/kernel_path.h index 4e50b84291a..faf0ac6035c 100644 --- a/intern/cycles/kernel/kernel_path.h +++ b/intern/cycles/kernel/kernel_path.h @@ -414,6 +414,8 @@ __device float4 kernel_path_progressive(KernelGlobals *kg, RNG *rng, int sample, #ifdef __OBJECT_MOTION__ light_ray.time = sd.time; #endif + light_ray.dP = sd.dP; + light_ray.dD = differential3_zero(); if(!shadow_blocked(kg, &state, &light_ray, &ao_shadow)) path_radiance_accum_ao(&L, throughput, ao_bsdf, ao_shadow, state.bounce); @@ -640,6 +642,8 @@ __device void kernel_path_indirect(KernelGlobals *kg, RNG *rng, int sample, Ray #ifdef __OBJECT_MOTION__ light_ray.time = sd.time; #endif + light_ray.dP = sd.dP; + light_ray.dD = differential3_zero(); if(!shadow_blocked(kg, &state, &light_ray, &ao_shadow)) path_radiance_accum_ao(L, throughput, ao_bsdf, ao_shadow, state.bounce); @@ -757,6 +761,8 @@ __device_noinline void kernel_path_non_progressive_lighting(KernelGlobals *kg, R #ifdef __OBJECT_MOTION__ light_ray.time = sd->time; #endif + light_ray.dP = sd->dP; + light_ray.dD = differential3_zero(); if(!shadow_blocked(kg, &state, &light_ray, &ao_shadow)) path_radiance_accum_ao(L, throughput*num_samples_inv, ao_bsdf, ao_shadow, state.bounce); diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h index ec532858c8d..21152efff4c 100644 --- a/intern/cycles/kernel/kernel_shader.h +++ b/intern/cycles/kernel/kernel_shader.h @@ -370,14 +370,10 @@ __device_noinline void shader_setup_from_sample(KernelGlobals *kg, ShaderData *s #ifdef __RAY_DIFFERENTIALS__ /* no ray differentials here yet */ - sd->dP.dx = make_float3(0.0f, 0.0f, 0.0f); - sd->dP.dy = make_float3(0.0f, 0.0f, 0.0f); - sd->dI.dx = make_float3(0.0f, 0.0f, 0.0f); - sd->dI.dy = make_float3(0.0f, 0.0f, 0.0f); - sd->du.dx = 0.0f; - sd->du.dy = 0.0f; - sd->dv.dx = 0.0f; - sd->dv.dy = 0.0f; + sd->dP = differential3_zero(); + sd->dI = differential3_zero(); + sd->du = differential_zero(); + sd->dv = differential_zero(); #endif } @@ -438,10 +434,8 @@ __device_inline void shader_setup_from_background(KernelGlobals *kg, ShaderData /* differentials */ sd->dP = ray->dD; differential_incoming(&sd->dI, sd->dP); - sd->du.dx = 0.0f; - sd->du.dy = 0.0f; - sd->dv.dx = 0.0f; - sd->dv.dy = 0.0f; + sd->du = differential_zero(); + sd->dv = differential_zero(); #endif } diff --git a/intern/cycles/kernel/kernel_subsurface.h b/intern/cycles/kernel/kernel_subsurface.h index f503c488a34..f7bccf71976 100644 --- a/intern/cycles/kernel/kernel_subsurface.h +++ b/intern/cycles/kernel/kernel_subsurface.h @@ -203,8 +203,7 @@ __device void subsurface_scatter_step(KernelGlobals *kg, ShaderData *sd, int sta ray.P = p1; ray.D = normalize_len(p2 - p1, &ray.t); ray.dP = sd->dP; - ray.dD.dx = make_float3(0.0f, 0.0f, 0.0f); - ray.dD.dy = make_float3(0.0f, 0.0f, 0.0f); + ray.dD = differential3_zero(); ray.time = sd->time; /* intersect with the same object. if multiple intersections are -- cgit v1.2.3