[Bf-blender-cvs] [a9861097b07] cycles_refactor: Cycles: Refactored kernel object structures from float4 array to a actual struct with named and typed members.

Stefan Werner noreply at git.blender.org
Sat Dec 2 13:35:02 CET 2017


Commit: a9861097b0776a2ebf13065c345c81ee307a5540
Author: Stefan Werner
Date:   Sat Dec 2 13:35:00 2017 +0100
Branches: cycles_refactor
https://developer.blender.org/rBa9861097b0776a2ebf13065c345c81ee307a5540

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

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

M	intern/cycles/kernel/geom/geom_attribute.h
M	intern/cycles/kernel/geom/geom_object.h
M	intern/cycles/kernel/kernel_textures.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/object.cpp
M	intern/cycles/render/object.h
M	intern/cycles/render/scene.h

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

diff --git a/intern/cycles/kernel/geom/geom_attribute.h b/intern/cycles/kernel/geom/geom_attribute.h
index 18f5c813cc8..6e2ee3b62d7 100644
--- a/intern/cycles/kernel/geom/geom_attribute.h
+++ b/intern/cycles/kernel/geom/geom_attribute.h
@@ -53,9 +53,7 @@ ccl_device_inline AttributeDescriptor attribute_not_found()
 
 ccl_device_inline uint object_attribute_map_offset(KernelGlobals *kg, int object)
 {
-	int offset = object*OBJECT_SIZE + 11;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return __float_as_uint(f.y);
+	return kernel_tex_fetch(__objects, object).attribute_map_offset;
 }
 
 ccl_device_inline AttributeDescriptor find_attribute(KernelGlobals *kg, const ShaderData *sd, uint id)
diff --git a/intern/cycles/kernel/geom/geom_object.h b/intern/cycles/kernel/geom/geom_object.h
index a276096a745..21c448d78ec 100644
--- a/intern/cycles/kernel/geom/geom_object.h
+++ b/intern/cycles/kernel/geom/geom_object.h
@@ -44,12 +44,17 @@ enum ObjectVectorTransform {
 
 ccl_device_inline Transform object_fetch_transform(KernelGlobals *kg, int object, enum ObjectTransform type)
 {
-	int offset = object*OBJECT_SIZE + (int)type;
-
 	Transform tfm;
-	tfm.x = kernel_tex_fetch(__objects, offset + 0);
-	tfm.y = kernel_tex_fetch(__objects, offset + 1);
-	tfm.z = kernel_tex_fetch(__objects, offset + 2);
+	if(type == OBJECT_INVERSE_TRANSFORM) {
+		tfm.x = kernel_tex_fetch(__objects, object).itfm[0];
+		tfm.y = kernel_tex_fetch(__objects, object).itfm[1];
+		tfm.z = kernel_tex_fetch(__objects, object).itfm[2];
+	}
+	else {
+		tfm.x = kernel_tex_fetch(__objects, object).tfm[0];
+		tfm.y = kernel_tex_fetch(__objects, object).tfm[1];
+		tfm.z = kernel_tex_fetch(__objects, object).tfm[2];
+	}
 	tfm.w = make_float4(0.0f, 0.0f, 0.0f, 1.0f);
 
 	return tfm;
@@ -92,17 +97,15 @@ ccl_device_inline Transform object_fetch_transform_motion(KernelGlobals *kg, int
 {
 	DecompMotionTransform motion;
 
-	int offset = object*OBJECT_SIZE + (int)OBJECT_TRANSFORM_MOTION_PRE;
-
-	motion.mid.x = kernel_tex_fetch(__objects, offset + 0);
-	motion.mid.y = kernel_tex_fetch(__objects, offset + 1);
-	motion.mid.z = kernel_tex_fetch(__objects, offset + 2);
-	motion.mid.w = kernel_tex_fetch(__objects, offset + 3);
+	motion.mid.x = kernel_tex_fetch(__objects, object).tfm[0];
+	motion.mid.y = kernel_tex_fetch(__objects, object).tfm[1];
+	motion.mid.z = kernel_tex_fetch(__objects, object).tfm[2];
+	motion.mid.w = kernel_tex_fetch(__objects, object).tfm[3];
 
-	motion.pre_x = kernel_tex_fetch(__objects, offset + 4);
-	motion.pre_y = kernel_tex_fetch(__objects, offset + 5);
-	motion.post_x = kernel_tex_fetch(__objects, offset + 6);
-	motion.post_y = kernel_tex_fetch(__objects, offset + 7);
+	motion.pre_x = kernel_tex_fetch(__objects, object).itfm[0];
+	motion.pre_y = kernel_tex_fetch(__objects, object).itfm[1];
+	motion.post_x = kernel_tex_fetch(__objects, object).itfm[2];
+	motion.post_y = kernel_tex_fetch(__objects, object).itfm[3];
 
 	Transform tfm;
 	transform_motion_interpolate(&tfm, &motion, time);
@@ -227,9 +230,7 @@ ccl_device_inline float3 object_location(KernelGlobals *kg, const ShaderData *sd
 
 ccl_device_inline float object_surface_area(KernelGlobals *kg, int object)
 {
-	int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return f.x;
+	return kernel_tex_fetch(__objects, object).surface_area;
 }
 
 /* Pass ID number of object */
@@ -239,9 +240,7 @@ ccl_device_inline float object_pass_id(KernelGlobals *kg, int object)
 	if(object == OBJECT_NONE)
 		return 0.0f;
 
-	int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return f.y;
+	return kernel_tex_fetch(__objects, object).pass_id;
 }
 
 /* Per lamp random number for shader variation */
@@ -262,9 +261,7 @@ ccl_device_inline float object_random_number(KernelGlobals *kg, int object)
 	if(object == OBJECT_NONE)
 		return 0.0f;
 
-	int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return f.z;
+	return kernel_tex_fetch(__objects, object).random_number;
 }
 
 /* Particle ID from which this object was generated */
@@ -274,9 +271,7 @@ ccl_device_inline int object_particle_id(KernelGlobals *kg, int object)
 	if(object == OBJECT_NONE)
 		return 0;
 
-	int offset = object*OBJECT_SIZE + OBJECT_PROPERTIES;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return __float_as_uint(f.w);
+	return kernel_tex_fetch(__objects, object).particle_index;
 }
 
 /* Generated texture coordinate on surface from where object was instanced */
@@ -286,9 +281,9 @@ ccl_device_inline float3 object_dupli_generated(KernelGlobals *kg, int object)
 	if(object == OBJECT_NONE)
 		return make_float3(0.0f, 0.0f, 0.0f);
 
-	int offset = object*OBJECT_SIZE + OBJECT_DUPLI;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return make_float3(f.x, f.y, f.z);
+	return make_float3(kernel_tex_fetch(__objects, object).dupli_generated[0],
+	                   kernel_tex_fetch(__objects, object).dupli_generated[1],
+	                   kernel_tex_fetch(__objects, object).dupli_generated[2]);
 }
 
 /* UV texture coordinate on surface from where object was instanced */
@@ -298,27 +293,21 @@ ccl_device_inline float3 object_dupli_uv(KernelGlobals *kg, int object)
 	if(object == OBJECT_NONE)
 		return make_float3(0.0f, 0.0f, 0.0f);
 
-	int offset = object*OBJECT_SIZE + OBJECT_DUPLI;
-	float4 f = kernel_tex_fetch(__objects, offset + 1);
-	return make_float3(f.x, f.y, 0.0f);
+	return make_float3(kernel_tex_fetch(__objects, object).ob_dupli_uv[0], kernel_tex_fetch(__objects, object).ob_dupli_uv[0], 0.0f);
 }
 
 /* Information about mesh for motion blurred triangles and curves */
 
 ccl_device_inline void object_motion_info(KernelGlobals *kg, int object, int *numsteps, int *numverts, int *numkeys)
 {
-	int offset = object*OBJECT_SIZE + OBJECT_DUPLI;
-
 	if(numkeys) {
-		float4 f = kernel_tex_fetch(__objects, offset);
-		*numkeys = __float_as_int(f.w);
+		*numkeys = kernel_tex_fetch(__objects, object).numkeys;
 	}
 
-	float4 f = kernel_tex_fetch(__objects, offset + 1);
 	if(numsteps)
-		*numsteps = __float_as_int(f.z);
+		*numsteps = kernel_tex_fetch(__objects, object).numsteps;
 	if(numverts)
-		*numverts = __float_as_int(f.w);
+		*numverts = kernel_tex_fetch(__objects, object).numverts;
 }
 
 /* Offset to an objects patch map */
@@ -328,9 +317,7 @@ ccl_device_inline uint object_patch_map_offset(KernelGlobals *kg, int object)
 	if(object == OBJECT_NONE)
 		return 0;
 
-	int offset = object*OBJECT_SIZE + 11;
-	float4 f = kernel_tex_fetch(__objects, offset);
-	return __float_as_uint(f.x);
+	return kernel_tex_fetch(__objects, object).patch_map_offset;
 }
 
 /* Pass ID for shader */
diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
index 344b2223573..3016dc552e6 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -35,7 +35,7 @@ KERNEL_TEX(uint, __object_node)
 KERNEL_TEX(float2, __prim_time)
 
 /* objects */
-KERNEL_TEX(float4, __objects)
+KERNEL_TEX(KernelObject, __objects)
 KERNEL_TEX(float4, __objects_vector)
 
 /* triangles */
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index c4a9b3f4aa3..721fac807e3 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -35,7 +35,6 @@
 CCL_NAMESPACE_BEGIN
 
 /* Constants */
-#define OBJECT_SIZE 		12
 #define OBJECT_VECTOR_SIZE	6
 #define LIGHT_SIZE		11
 #define FILTER_TABLE_SIZE	1024
@@ -1512,6 +1511,24 @@ typedef struct WorkTile {
 	ccl_global float *buffer;
 } WorkTile;
 
+typedef struct KernelObject
+{
+	float4 tfm[4];
+	float4 itfm[4];
+	float surface_area;
+	float pass_id;
+	float random_number;
+	float particle_index;
+	float dupli_generated[3];
+	int numkeys;
+	float ob_dupli_uv[2];
+	int numsteps;
+	int numverts;
+	uint patch_map_offset;
+	uint attribute_map_offset;
+	float pad2, pad3;
+} KernelObject;
+
 CCL_NAMESPACE_END
 
 #endif /*  __KERNEL_TYPES_H__ */
diff --git a/intern/cycles/render/object.cpp b/intern/cycles/render/object.cpp
index aef7fc29573..aa258b4e3e2 100644
--- a/intern/cycles/render/object.cpp
+++ b/intern/cycles/render/object.cpp
@@ -289,7 +289,7 @@ void ObjectManager::device_update_object_transform(UpdateObejctTransformState *s
                                                    Object *ob,
                                                    int object_index)
 {
-	float4 *objects = state->objects;
+	KernelObject &object = state->objects[object_index];
 	float4 *objects_vector = state->objects_vector;
 
 	Mesh *mesh = ob->mesh;
@@ -357,15 +357,15 @@ void ObjectManager::device_update_object_transform(UpdateObejctTransformState *s
 		}
 	}
 
-	/* Pack in texture. */
-	int offset = object_index*OBJECT_SIZE;
-
 	/* OBJECT_TRANSFORM */
-	memcpy(&objects[offset], &tfm, sizeof(float4)*3);
+	memcpy(&object.tfm, &tfm, sizeof(float4)*3);
 	/* OBJECT_INVERSE_TRANSFORM */
-	memcpy(&objects[offset+4], &itfm, sizeof(float4)*3);
+	memcpy(&object.itfm, &itfm, sizeof(float4)*3);
 	/* OBJECT_PROPERTIES */
-	objects[offset+8] = make_float4(surface_area, pass_id, random_number, __int_as_float(particle_index));
+	object.surface_area = surface_area;
+	object.pass_id = pass_id;
+	object.random_number = random_number;
+	object.particle_index = particle_index;
 
 	if(mesh->use_motion_blur) {
 		state->have_motion = true;
@@ -395,8 +395,8 @@ void ObjectManager::device_update_object_transform(UpdateObejctTransformState *s
 			mtfm.post = mtfm.post * itfm;
 		}
 
-		memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+0], &mtfm.pre, sizeof(float4)*3);
-		memcpy(&objects_vector[object_index*OBJECT_VECTOR_SIZE+3], &mtfm.post, sizeof(float4)*3);
+		memcpy(&object.tfm, &mtfm.pre, sizeof(float4)*3);
+		memcpy(&object.itfm, &mtfm.post, sizeof(float4)*3);
 	}
 #ifdef __OBJECT_MOTION__
 	else if(state->need_motion == Scene::MOTION_BLUR) {
@@ -405,7 +405,7 @@ void ObjectManager::device_update_object_transform(UpdateObejctTransformState *s
 			DecompMotionTransform decomp;
 
 			transform_motion_decompose(&decomp, &ob->motion, &ob->tfm);
-			memcpy(&objects[offset], &decomp, sizeof(float4)*8);
+			memcpy(&object.tfm, &decomp, sizeof(float4)*

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list