[Bf-blender-cvs] [8c371e99b14] cycles_refactor: Cycles: Refactored kernel light structures from float4 array to an actual struct with named and typed members.

Stefan Werner noreply at git.blender.org
Mon Dec 4 13:15:15 CET 2017


Commit: 8c371e99b1462d86db2f7d05bd61ef90afc2fdb1
Author: Stefan Werner
Date:   Sat Dec 2 22:36:47 2017 +0100
Branches: cycles_refactor
https://developer.blender.org/rB8c371e99b1462d86db2f7d05bd61ef90afc2fdb1

Cycles: Refactored kernel light structures from float4 array to an actual struct with named and typed members.

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

M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_light.h
M	intern/cycles/kernel/kernel_textures.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/light.cpp
M	intern/cycles/render/scene.h

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

diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index 21c448d78ec..db7f2d278be 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -64,12 +64,18 @@ ccl_device_inline Transform object_fetch_transform(KernelGlobals *kg, int object
 
 ccl_device_inline Transform lamp_fetch_transform(KernelGlobals *kg, int lamp, bool inverse)
 {
-	int offset = lamp*LIGHT_SIZE + (inverse? 8 : 5);
 
 	Transform tfm;
-	tfm.x = kernel_tex_fetch(__light_data, offset + 0);
-	tfm.y = kernel_tex_fetch(__light_data, offset + 1);
-	tfm.z = kernel_tex_fetch(__light_data, offset + 2);
+	if(inverse) {
+		tfm.x = kernel_tex_fetch(__light_data, lamp).itfm[0];
+		tfm.y = kernel_tex_fetch(__light_data, lamp).itfm[1];
+		tfm.z = kernel_tex_fetch(__light_data, lamp).itfm[2];
+	}
+	else {
+		tfm.x = kernel_tex_fetch(__light_data, lamp).tfm[0];
+		tfm.y = kernel_tex_fetch(__light_data, lamp).tfm[1];
+		tfm.z = kernel_tex_fetch(__light_data, lamp).tfm[2];
+	}
 	tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
 
 	return tfm;
@@ -250,8 +256,7 @@ ccl_device_inline float lamp_random_number(KernelGlobals *kg, int lamp)
 	if(lamp == LAMP_NONE)
 		return 0.0f;
 
-	float4 f = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 4);
-	return f.y;
+	return kernel_tex_fetch(__light_data, lamp).random;
 }
 
 /* Per object random number for shader variation */
diff --git a/intern/cycles/kernel/kernel_light.h b/intern/cycles/kernel/kernel_light.h
index dfa3150dc92..807582d58b5 100644
--- a/intern/cycles/kernel/kernel_light.h
+++ b/intern/cycles/kernel/kernel_light.h
@@ -255,11 +255,14 @@ ccl_device_inline bool background_portal_data_fetch_and_check_side(KernelGlobals
                                                                    float3 *lightpos,
                                                                    float3 *dir)
 {
-	float4 data0 = kernel_tex_fetch(__light_data, (index + kernel_data.integrator.portal_offset)*LIGHT_SIZE + 0);
-	float4 data3 = kernel_tex_fetch(__light_data, (index + kernel_data.integrator.portal_offset)*LIGHT_SIZE + 3);
+	int io = index + kernel_data.integrator.portal_offset;
 
-	*lightpos = make_float3(data0.y, data0.z, data0.w);
-	*dir = make_float3(data3.y, data3.z, data3.w);
+	*lightpos = make_float3(kernel_tex_fetch(__light_data, io).co[0],
+	                        kernel_tex_fetch(__light_data, io).co[1],
+	                        kernel_tex_fetch(__light_data, io).co[2]);
+	*dir = make_float3(kernel_tex_fetch(__light_data, io).area.dir[0],
+	                   kernel_tex_fetch(__light_data, io).area.dir[1],
+	                   kernel_tex_fetch(__light_data, io).area.dir[2]);
 
 	/* Check whether portal is on the right side. */
 	if(dot(*dir, P - *lightpos) > 1e-4f)
@@ -291,11 +294,13 @@ ccl_device_inline float background_portal_pdf(KernelGlobals *kg,
 		}
 		num_possible++;
 
-		float4 data1 = kernel_tex_fetch(__light_data, (p + kernel_data.integrator.portal_offset)*LIGHT_SIZE + 1);
-		float4 data2 = kernel_tex_fetch(__light_data, (p + kernel_data.integrator.portal_offset)*LIGHT_SIZE + 2);
-
-		float3 axisu = make_float3(data1.y, data1.z, data1.w);
-		float3 axisv = make_float3(data2.y, data2.z, data2.w);
+		int po = p + kernel_data.integrator.portal_offset;
+		float3 axisu = make_float3(kernel_tex_fetch(__light_data, po).area.axisu[0],
+		                           kernel_tex_fetch(__light_data, po).area.axisu[1],
+		                           kernel_tex_fetch(__light_data, po).area.axisu[2]);
+		float3 axisv = make_float3(kernel_tex_fetch(__light_data, po).area.axisv[0],
+		                           kernel_tex_fetch(__light_data, po).area.axisv[1],
+		                           kernel_tex_fetch(__light_data, po).area.axisv[2]);
 
 		if(!ray_quad_intersect(P, direction, 1e-4f, FLT_MAX, lightpos, axisu, axisv, dir, NULL, NULL, NULL, NULL))
 			continue;
@@ -346,10 +351,13 @@ ccl_device float3 background_portal_sample(KernelGlobals *kg,
 
 		if(portal == 0) {
 			/* p is the portal to be sampled. */
-			float4 data1 = kernel_tex_fetch(__light_data, (p + kernel_data.integrator.portal_offset)*LIGHT_SIZE + 1);
-			float4 data2 = kernel_tex_fetch(__light_data, (p + kernel_data.integrator.portal_offset)*LIGHT_SIZE + 2);
-			float3 axisu = make_float3(data1.y, data1.z, data1.w);
-			float3 axisv = make_float3(data2.y, data2.z, data2.w);
+			int po = p + kernel_data.integrator.portal_offset;
+			float3 axisu = make_float3(kernel_tex_fetch(__light_data, po).area.axisu[0],
+			                           kernel_tex_fetch(__light_data, po).area.axisu[1],
+			                           kernel_tex_fetch(__light_data, po).area.axisu[2]);
+			float3 axisv = make_float3(kernel_tex_fetch(__light_data, po).area.axisv[0],
+			                           kernel_tex_fetch(__light_data, po).area.axisv[1],
+			                           kernel_tex_fetch(__light_data, po).area.axisv[2]);
 
 			*pdf = area_light_sample(P, &lightpos,
 			                         axisu, axisv,
@@ -479,14 +487,10 @@ ccl_device float3 sphere_light_sample(float3 P, float3 center, float radius, flo
 	return disk_light_sample(normalize(P - center), randu, randv)*radius;
 }
 
-ccl_device float spot_light_attenuation(float4 data1, float4 data2, LightSample *ls)
+ccl_device float spot_light_attenuation(float3 dir, float spot_angle, float spot_smooth, LightSample *ls)
 {
-	float3 dir = make_float3(data2.y, data2.z, data2.w);
 	float3 I = ls->Ng;
 
-	float spot_angle = data1.w;
-	float spot_smooth = data2.x;
-
 	float attenuation = dot(dir, I);
 
 	if(attenuation <= spot_angle) {
@@ -518,12 +522,9 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
                                          float3 P,
                                          LightSample *ls)
 {
-	float4 data0 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 0);
-	float4 data1 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 1);
-
-	LightType type = (LightType)__float_as_int(data0.x);
+	LightType type = (LightType)kernel_tex_fetch(__light_data, lamp).type;
 	ls->type = type;
-	ls->shader = __float_as_int(data1.x);
+	ls->shader = kernel_tex_fetch(__light_data, lamp).shader_id;
 	ls->object = PRIM_NONE;
 	ls->prim = PRIM_NONE;
 	ls->lamp = lamp;
@@ -532,10 +533,12 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
 
 	if(type == LIGHT_DISTANT) {
 		/* distant light */
-		float3 lightD = make_float3(data0.y, data0.z, data0.w);
+		float3 lightD = make_float3(kernel_tex_fetch(__light_data, lamp).co[0],
+		                            kernel_tex_fetch(__light_data, lamp).co[1],
+		                            kernel_tex_fetch(__light_data, lamp).co[2]);
 		float3 D = lightD;
-		float radius = data1.y;
-		float invarea = data1.w;
+		float radius = kernel_tex_fetch(__light_data, lamp).distant.radius;
+		float invarea = kernel_tex_fetch(__light_data, lamp).distant.invarea;
 
 		if(radius > 0.0f)
 			D = distant_light_sample(D, radius, randu, randv);
@@ -562,10 +565,12 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
 	}
 #endif
 	else {
-		ls->P = make_float3(data0.y, data0.z, data0.w);
+		ls->P = make_float3(kernel_tex_fetch(__light_data, lamp).co[0],
+		                    kernel_tex_fetch(__light_data, lamp).co[1],
+		                    kernel_tex_fetch(__light_data, lamp).co[2]);
 
 		if(type == LIGHT_POINT || type == LIGHT_SPOT) {
-			float radius = data1.y;
+			float radius = kernel_tex_fetch(__light_data, lamp).spot.radius;
 
 			if(radius > 0.0f)
 				/* sphere light */
@@ -574,14 +579,18 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
 			ls->D = normalize_len(ls->P - P, &ls->t);
 			ls->Ng = -ls->D;
 
-			float invarea = data1.z;
+			float invarea = kernel_tex_fetch(__light_data, lamp).spot.invarea;
 			ls->eval_fac = (0.25f*M_1_PI_F)*invarea;
 			ls->pdf = invarea;
 
 			if(type == LIGHT_SPOT) {
 				/* spot light attenuation */
-				float4 data2 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 2);
-				ls->eval_fac *= spot_light_attenuation(data1, data2, ls);
+				float3 dir = make_float3(kernel_tex_fetch(__light_data, lamp).spot.dir[0],
+                                         kernel_tex_fetch(__light_data, lamp).spot.dir[1],
+										 kernel_tex_fetch(__light_data, lamp).spot.dir[2]);
+				ls->eval_fac *= spot_light_attenuation(dir,
+				                                       kernel_tex_fetch(__light_data, lamp).spot.spot_angle,
+				                                       kernel_tex_fetch(__light_data, lamp).spot.spot_smooth, ls);
 				if(ls->eval_fac == 0.0f) {
 					return false;
 				}
@@ -594,12 +603,15 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
 		}
 		else {
 			/* area light */
-			float4 data2 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 2);
-			float4 data3 = kernel_tex_fetch(__light_data, lamp*LIGHT_SIZE + 3);
-
-			float3 axisu = make_float3(data1.y, data1.z, data1.w);
-			float3 axisv = make_float3(data2.y, data2.z, data2.w);
-			float3 D = make_float3(data3.y, data3.z, data3.w);
+			float3 axisu = make_float3(kernel_tex_fetch(__light_data, lamp).area.axisu[0],
+			                           kernel_tex_fetch(__light_data, lamp).area.axisu[1],
+			                           kernel_tex_fetch(__light_data, lamp).area.axisu[2]);
+			float3 axisv = make_float3(kernel_tex_fetch(__light_data, lamp).area.axisv[0],
+			                           kernel_tex_fetch(__light_data, lamp).area.axisv[1],
+			                           kernel_tex_fetch(__light_data, lamp).area.axisv[2]);
+			float3 D = make_float3(kernel_tex_fetch(__light_data, lamp).area.dir[0],
+			                       kernel_tex_fetch(__light_data, lamp).area.dir[1],
+			                       kernel_tex_fetch(__light_data, lamp).area.dir[2]);
 
 			if(dot(ls->P - P, D) > 0.0f) {
 				return false;
@@ -618,7 +630,7 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
 			ls->Ng = D;
 			ls->D = normalize_len(ls->P - P, &ls->t);
 
-			float invarea = data2.x;
+			float invarea = kernel_tex_fetch(__light_data, lamp).area.invarea;
 			ls->eval_fac = 0.25f*invarea;
 		}
 	}
@@ -630,12 +642,9 @@ ccl_device_inline bool lamp_light_sample(KernelGlobals *kg,
 
 ccl_device bool lamp_light_eval(KernelGlob

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list