[Bf-blender-cvs] [2e11ab0] cycles_kernel_split: Cycles kernel split: Avoid having temporary variable in shader function in megakernel

Sergey Sharybin noreply at git.blender.org
Fri May 8 14:02:43 CEST 2015


Commit: 2e11ab036653c2db18a929150fb4d57516c54645
Author: Sergey Sharybin
Date:   Fri May 8 17:01:18 2015 +0500
Branches: cycles_kernel_split
https://developer.blender.org/rB2e11ab036653c2db18a929150fb4d57516c54645

Cycles kernel split: Avoid having temporary variable in shader function in megakernel

Those temp variables are only needed in OpenCL split kernel and better be avoided in
other kernels since it's not cheap to create them.

In the future it'll be replaced with generic address space from OpenCL 2.0.

===================================================================

M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_shader.h

===================================================================

diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index 43ff75b..5c11c53 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -520,5 +520,38 @@ ccl_device_inline void bvh_instance_motion_pop_factor(KernelGlobals *kg, int obj
 
 #endif
 
+/* TODO(sergey): This is only for until we've got OpenCL 2.0
+ * on all devices we consider supported. It'll be replaced with
+ * generic address space.
+ */
+
+#ifdef __KERNEL_OPENCL__
+ccl_device_inline void object_dir_transform_addrspace(KernelGlobals *kg,
+                                                      const ShaderData *sd,
+                                                      ccl_addr_space float3 *D)
+{
+	float3 private_D = *D;
+	object_dir_transform(kg, sd, &private_D);
+	*D = private_D;
+}
+
+ccl_device_inline void object_normal_transform_addrspace(KernelGlobals *kg,
+                                                         const ShaderData *sd,
+                                                         ccl_addr_space float3 *N)
+{
+	float3 private_N = *N;
+	object_dir_transform(kg, sd, &private_N);
+	*N = private_N;
+}
+#endif
+
+#ifndef __KERNEL_OPENCL__
+#  define object_dir_transform_auto object_dir_transform
+#  define object_normal_transform_auto object_normal_transform
+#else
+#  define object_dir_transform_auto object_dir_transform_addrspace
+#  define object_normal_transform_auto object_normal_transform_addrspace
+#endif
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index db4955b..8cd281a 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -114,28 +114,12 @@ ccl_device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
 
 #ifdef __INSTANCING__
 	if(isect->object != OBJECT_NONE) {
-		/* Get values of N and Ng */
-		float3 sd_N = sd_fetch(N);
-		float3 sd_Ng = sd_fetch(Ng);
-
 		/* instance transform */
-		object_normal_transform(kg, sd, &sd_N);
-		object_normal_transform(kg, sd, &sd_Ng);
-
-		/* Store values to N and Ng */
-		sd_fetch(N) = sd_N;
-		sd_fetch(Ng) = sd_Ng;
+		object_normal_transform_auto(kg, sd, &sd_fetch(N));
+		object_normal_transform_auto(kg, sd, &sd_fetch(Ng));
 #ifdef __DPDU__
-		/* Get dPdu, dPdv values */
-		float3 sd_dPdu = sd_fetch(dPdu);
-		float3 sd_dPdv = sd_fetch(dPdv);
-
-		object_dir_transform(kg, sd, &sd_dPdu);
-		object_dir_transform(kg, sd, &sd_dPdv);
-
-		/* Store dPdu and dPdv values */
-		sd_fetch(dPdu) = sd_dPdu;
-		sd_fetch(dPdv) = sd_dPdv;
+		object_dir_transform_auto(kg, sd, &sd_fetch(dPdu));
+		object_dir_transform_auto(kg, sd, &sd_fetch(dPdv));
 #endif
 	}
 #endif
@@ -300,11 +284,8 @@ ccl_device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
 			sd_fetch(N) = triangle_smooth_normal(kg, sd_fetch(prim), sd_fetch(u), sd_fetch(v));
 
 #ifdef __INSTANCING__
-			if(instanced) {
-				float3 sd_N = sd_fetch(N);
-				object_normal_transform(kg, sd, &sd_N);
-				sd_fetch(N) = sd_N;
-			}
+			if(instanced)
+				object_normal_transform_auto(kg, sd, &sd_fetch(N));
 #endif
 		}
 
@@ -314,16 +295,8 @@ ccl_device void shader_setup_from_sample(KernelGlobals *kg, ShaderData *sd,
 
 #ifdef __INSTANCING__
 		if(instanced) {
-			/* Get dPdu and dPdv values */
-			float3 sd_dPdu = sd_fetch(dPdu);
-			float3 sd_dPdv = sd_fetch(dPdv);
-
-			object_dir_transform(kg, sd, &sd_dPdu);
-			object_dir_transform(kg, sd, &sd_dPdv);
-
-			/* Store dPdu and dPdv values */
-			sd_fetch(dPdu) = sd_dPdu;
-			sd_fetch(dPdv) = sd_dPdv;
+			object_dir_transform_auto(kg, sd, &sd_fetch(dPdu));
+			object_dir_transform_auto(kg, sd, &sd_fetch(dPdv));
 		}
 #endif
 #endif




More information about the Bf-blender-cvs mailing list