[Bf-blender-cvs] [5738900] soc-2014-cycles: Cycles: Memory optimization for shader id.

Thomas Dinges noreply at git.blender.org
Tue Jul 22 00:58:23 CEST 2014


Commit: 5738900060e73adf3f2cd00ba48ad815a83baa1b
Author: Thomas Dinges
Date:   Tue Jul 22 00:56:00 2014 +0200
Branches: soc-2014-cycles
https://developer.blender.org/rB5738900060e73adf3f2cd00ba48ad815a83baa1b

Cycles: Memory optimization for shader id.

Pack the shader ID into the vert index float4 (which still had one empty component).
This way we save 1 float per mesh triangle.

As a bonus, this gives 1 GPU image texture slot back to sm_2x users.

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

M	intern/cycles/kernel/geom/geom_bvh_shadow.h
M	intern/cycles/kernel/geom/geom_motion_triangle.h
M	intern/cycles/kernel/geom/geom_triangle.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_textures.h
M	intern/cycles/render/image.h
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/scene.h

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

diff --git a/intern/cycles/kernel/geom/geom_bvh_shadow.h b/intern/cycles/kernel/geom/geom_bvh_shadow.h
index 1f6e494..d0cb480 100644
--- a/intern/cycles/kernel/geom/geom_bvh_shadow.h
+++ b/intern/cycles/kernel/geom/geom_bvh_shadow.h
@@ -252,7 +252,8 @@ ccl_device bool BVH_FUNCTION_NAME
 							if(kernel_tex_fetch(__prim_type, isect_array->prim) & PRIMITIVE_ALL_TRIANGLE)
 #endif
 							{
-								shader =  __float_as_int(kernel_tex_fetch(__tri_shader, prim));
+								float4 vindex = kernel_tex_fetch(__tri_vindex, prim);
+								shader =  __float_as_int(vindex.w);
 							}
 #ifdef __HAIR__
 							else {
diff --git a/intern/cycles/kernel/geom/geom_motion_triangle.h b/intern/cycles/kernel/geom/geom_motion_triangle.h
index 5ab0b73..8fc7383 100644
--- a/intern/cycles/kernel/geom/geom_motion_triangle.h
+++ b/intern/cycles/kernel/geom/geom_motion_triangle.h
@@ -232,9 +232,6 @@ ccl_device_inline float3 motion_triangle_refine_subsurface(KernelGlobals *kg, Sh
 /* return 3 triangle vertex normals */
 ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg, ShaderData *sd, const Intersection *isect, const Ray *ray, bool subsurface)
 {
-	/* get shader */
-	sd->shader =  __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
-
 	/* get motion info */
 	int numsteps, numverts;
 	object_motion_info(kg, sd->object, &numsteps, &numverts, NULL);
@@ -251,7 +248,11 @@ ccl_device_noinline void motion_triangle_shader_setup(KernelGlobals *kg, ShaderD
 
 	/* fetch vertex coordinates */
 	float3 verts[3], next_verts[3];
-	float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, sd->prim));
+	float4 vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
+	float3 tri_vindex = float4_to_float3(vindex);
+
+	/* get shader */
+	sd->shader =  __float_as_int(vindex.w);
 
 	motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, numsteps, step, verts);
 	motion_triangle_verts_for_step(kg, tri_vindex, offset, numverts, numsteps, step+1, next_verts);
diff --git a/intern/cycles/kernel/geom/geom_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h
index df6ddce..696bf97 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -134,21 +134,21 @@ ccl_device_inline float3 triangle_normal(KernelGlobals *kg, int prim)
 ccl_device_inline void triangle_point_normal(KernelGlobals *kg, int prim, float u, float v, float3 *P, float3 *Ng, int *shader)
 {
 	/* load triangle vertices */
-	float3 tri_vindex = float4_to_float3(kernel_tex_fetch(__tri_vindex, prim));
+	float4 tri_vindex = kernel_tex_fetch(__tri_vindex, prim);
 
 	float3 v0 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.x)));
 	float3 v1 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.y)));
 	float3 v2 = float4_to_float3(kernel_tex_fetch(__tri_verts, __float_as_int(tri_vindex.z)));
 
+	/* shader`*/
+	*shader = __float_as_int(tri_vindex.w);
+
 	/* compute point */
 	float t = 1.0f - u - v;
 	*P = (u*v0 + v*v1 + t*v2);
 
 	/* compute normal */
 	*Ng = normalize(cross(v1 - v0, v2 - v0));
-
-	/* shader`*/
-	*shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
 }
 
 /* Triangle vertex locations */
diff --git a/intern/cycles/kernel/kernel_shader.h b/intern/cycles/kernel/kernel_shader.h
index 842b9f6..8fca361 100644
--- a/intern/cycles/kernel/kernel_shader.h
+++ b/intern/cycles/kernel/kernel_shader.h
@@ -87,7 +87,10 @@ ccl_device void shader_setup_from_ray(KernelGlobals *kg, ShaderData *sd,
 	if(sd->type & PRIMITIVE_TRIANGLE) {
 		/* static triangle */
 		float3 Ng = triangle_normal(kg, sd->prim);
-		sd->shader =  __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
+
+		/* shader */
+		float4 vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
+		sd->shader =  __float_as_int(vindex.w);
 
 		/* vectors */
 		sd->P = triangle_refine(kg, sd, isect, ray);
@@ -166,7 +169,8 @@ ccl_device_inline void shader_setup_from_subsurface(KernelGlobals *kg, ShaderDat
 	/* fetch triangle data */
 	if(sd->type == PRIMITIVE_TRIANGLE) {
 		float3 Ng = triangle_normal(kg, sd->prim);
-		sd->shader =  __float_as_int(kernel_tex_fetch(__tri_shader, sd->prim));
+		float4 vindex = kernel_tex_fetch(__tri_vindex, sd->prim);
+		sd->shader =  __float_as_int(vindex.w);
 
 		/* static triangle */
 		sd->P = triangle_refine_subsurface(kg, sd, isect, ray);
@@ -1026,7 +1030,8 @@ ccl_device bool shader_transparent_shadow(KernelGlobals *kg, Intersection *isect
 #ifdef __HAIR__
 	if(kernel_tex_fetch(__prim_type, isect->prim) & PRIMITIVE_ALL_TRIANGLE) {
 #endif
-		shader = __float_as_int(kernel_tex_fetch(__tri_shader, prim));
+		float4 vindex = kernel_tex_fetch(__tri_vindex, prim);
+		shader =  __float_as_int(vindex.w);
 #ifdef __HAIR__
 	}
 	else {
diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
index f60ed8c..81757d2 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -36,7 +36,6 @@ KERNEL_TEX(float4, texture_float4, __objects)
 KERNEL_TEX(float4, texture_float4, __objects_vector)
 
 /* triangles */
-KERNEL_TEX(float, texture_float, __tri_shader)
 KERNEL_TEX(float4, texture_float4, __tri_vnormal)
 KERNEL_TEX(float4, texture_float4, __tri_vindex)
 KERNEL_TEX(float4, texture_float4, __tri_verts)
@@ -173,9 +172,9 @@ KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_095)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_096)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_097)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_098)
+KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_099)
 
 /* Kepler and above */
-KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_099)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_100)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_101)
 KERNEL_IMAGE_TEX(uchar4, texture_image_uchar4, __tex_image_102)
diff --git a/intern/cycles/render/image.h b/intern/cycles/render/image.h
index 535f0ff..54aed1a 100644
--- a/intern/cycles/render/image.h
+++ b/intern/cycles/render/image.h
@@ -29,7 +29,7 @@
 CCL_NAMESPACE_BEGIN
 
 /* generic */
-#define TEX_NUM_IMAGES			94
+#define TEX_NUM_IMAGES			95
 #define TEX_IMAGE_BYTE_START	TEX_NUM_FLOAT_IMAGES
 
 /* extended gpu */
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 2734430..150e170 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -377,32 +377,15 @@ void Mesh::add_vertex_normals()
 	}
 }
 
-void Mesh::pack_normals(Scene *scene, float *tri_shader, float4 *vnormal)
+void Mesh::pack_normals(float4 *vnormal)
 {
 	Attribute *attr_vN = attributes.find(ATTR_STD_VERTEX_NORMAL);
 
 	float3 *vN = attr_vN->data_float3();
-	int shader_id = 0;
-	uint last_shader = -1;
-	bool last_smooth = false;
-
-	size_t triangles_size = triangles.size();
-	uint *shader_ptr = (shader.size())? &shader[0]: NULL;
 
 	bool do_transform = transform_applied;
 	Transform ntfm = transform_normal;
 
-	/* save shader */
-	for(size_t i = 0; i < triangles_size; i++) {
-		if(shader_ptr[i] != last_shader || last_smooth != smooth[i]) {
-			last_shader = shader_ptr[i];
-			last_smooth = smooth[i];
-			shader_id = scene->shader_manager->get_shader_id(last_shader, this, last_smooth);
-		}
-
-		tri_shader[i] = __int_as_float(shader_id);
-	}
-
 	size_t verts_size = verts.size();
 
 	for(size_t i = 0; i < verts_size; i++) {
@@ -415,7 +398,7 @@ void Mesh::pack_normals(Scene *scene, float *tri_shader, float4 *vnormal)
 	}
 }
 
-void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
+void Mesh::pack_verts(Scene *scene, float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
 {
 	size_t verts_size = verts.size();
 
@@ -430,17 +413,28 @@ void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
 
 	size_t triangles_size = triangles.size();
 
+	int shader_id = 0;
+	uint last_shader = -1;
+	bool last_smooth = false;
+	uint *shader_ptr = (shader.size())? &shader[0]: NULL;
+
 	if(triangles_size) {
 		Triangle *triangles_ptr = &triangles[0];
 
 		for(size_t i = 0; i < triangles_size; i++) {
 			Triangle t = triangles_ptr[i];
 
+			if(shader_ptr[i] != last_shader || last_smooth != smooth[i]) {
+				last_shader = shader_ptr[i];
+				last_smooth = smooth[i];
+				shader_id = scene->shader_manager->get_shader_id(last_shader, this, last_smooth);
+			}
+
 			tri_vindex[i] = make_float4(
 				__int_as_float(t.v[0] + vert_offset),
 				__int_as_float(t.v[1] + vert_offset),
 				__int_as_float(t.v[2] + vert_offset),
-				0);
+				__int_as_float(shader_id));
 		}
 	}
 }
@@ -935,14 +929,13 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 		/* normals */
 		progress.set_status("Updating Mesh", "Computing normals");
 
-		float *tri_shader = dscene->tri_shader.resize(tri_size);
 		float4 *vnormal = dscene->tri_vnormal.resize(vert_size);
 		float4 *tri_verts = dscene->tri_verts.resize(vert_size);
 		float4 *tri_vindex = dscene->tri_vindex.resize(tri_size);
 
 		foreach(Mesh *mesh, scene->meshes) {
-			mesh->pack_normals(scene, &tri_shader[mesh->tri_offset], &vnormal[mesh->vert_offset]);
-			mesh->pack_verts(&tri_verts[mesh->vert_offset], &tri_vindex[mesh->tri_offset], mesh->vert_offset);
+			mesh->pack_normals(&vnormal[mesh->vert_offset]);
+			mesh->pack_verts(scene, &tri_verts[mesh->vert_offset], &tri_vindex[mesh->tri_offset], mesh->vert_offset);
 
 			if(progress.get_cancel()) return;
 		}
@@ -950,7 +943,6 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 		/* vertex coordinates */
 		progress.set_status("Updating Mesh", "Copying Mesh to device");
 
-		device->tex_alloc("__tri_shader", dscene->tri_shader);
 		device->tex_alloc("__tri_vnormal", dscene->tri_vnormal);
 		device->tex_alloc("__tri_verts", dscene->tri_verts);
 		device->tex_alloc("__tri_vindex", dscene->tri_vindex);
@@ -1122,7 +1114,6 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene)
 	device->tex_free(dscene->prim_visibility);
 	device->tex_free(dscene->prim_index);
 	device->tex_free(dscene->prim_object);
-	device->tex_free(dscene->tri_shader);
 	device->tex_free(dscene->tri_vnormal);
 	dev

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list