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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-05-04 01:34:51 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-05-04 01:34:51 +0400
commit838949c3e76eb140bb0f776fbbd0fd61fac08f49 (patch)
tree5f59c6410a1ad65d9dee684368676f499907cf65
parent879859e0cc4e0176e1a054fa63e94c3e506a0a7c (diff)
Fix #35207: addition to previous fix to avoid OSL getting uninitialized
ray differentials for lighting, which could cause bad texture filtering artifacts or performance.
-rw-r--r--intern/cycles/kernel/kernel_camera.h9
-rw-r--r--intern/cycles/kernel/kernel_differential.h18
-rw-r--r--intern/cycles/kernel/kernel_displace.h6
-rw-r--r--intern/cycles/kernel/kernel_emission.h10
-rw-r--r--intern/cycles/kernel/kernel_path.h6
-rw-r--r--intern/cycles/kernel/kernel_shader.h18
-rw-r--r--intern/cycles/kernel/kernel_subsurface.h3
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