[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56492] trunk/blender/intern/cycles/kernel : Fix #35207: addition to previous fix to avoid OSL getting uninitialized

Brecht Van Lommel brechtvanlommel at pandora.be
Fri May 3 23:34:52 CEST 2013


Revision: 56492
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56492
Author:   blendix
Date:     2013-05-03 21:34:51 +0000 (Fri, 03 May 2013)
Log Message:
-----------
Fix #35207: addition to previous fix to avoid OSL getting uninitialized
ray differentials for lighting, which could cause bad texture filtering
artifacts or performance.

Modified Paths:
--------------
    trunk/blender/intern/cycles/kernel/kernel_camera.h
    trunk/blender/intern/cycles/kernel/kernel_differential.h
    trunk/blender/intern/cycles/kernel/kernel_displace.h
    trunk/blender/intern/cycles/kernel/kernel_emission.h
    trunk/blender/intern/cycles/kernel/kernel_path.h
    trunk/blender/intern/cycles/kernel/kernel_shader.h
    trunk/blender/intern/cycles/kernel/kernel_subsurface.h

Modified: trunk/blender/intern/cycles/kernel/kernel_camera.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_camera.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_camera.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -76,8 +76,7 @@
 	/* 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 @@
 	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 @@
 
 #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;

Modified: trunk/blender/intern/cycles/kernel/kernel_differential.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_differential.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_differential.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -86,5 +86,23 @@
 	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
 

Modified: trunk/blender/intern/cycles/kernel/kernel_displace.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_displace.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_displace.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -52,10 +52,8 @@
 #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 */

Modified: trunk/blender/intern/cycles/kernel/kernel_emission.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_emission.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_emission.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -36,8 +36,7 @@
 #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 @@
 		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 @@
 			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 */

Modified: trunk/blender/intern/cycles/kernel/kernel_path.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_path.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_path.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -414,6 +414,8 @@
 #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 @@
 #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 @@
 #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);

Modified: trunk/blender/intern/cycles/kernel/kernel_shader.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_shader.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_shader.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -370,14 +370,10 @@
 
 #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 @@
 	/* 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
 }
 

Modified: trunk/blender/intern/cycles/kernel/kernel_subsurface.h
===================================================================
--- trunk/blender/intern/cycles/kernel/kernel_subsurface.h	2013-05-03 14:01:12 UTC (rev 56491)
+++ trunk/blender/intern/cycles/kernel/kernel_subsurface.h	2013-05-03 21:34:51 UTC (rev 56492)
@@ -203,8 +203,7 @@
 		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




More information about the Bf-blender-cvs mailing list