[Bf-blender-cvs] [c97c0e8] temp-cycles-microdisplacement: Change type of __patches array from uint4 to uint

Mai Lavelle noreply at git.blender.org
Sun Jul 10 05:31:27 CEST 2016


Commit: c97c0e89ea04d45c8802b64663079c4d7ef5a731
Author: Mai Lavelle
Date:   Wed Jul 6 21:10:52 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rBc97c0e89ea04d45c8802b64663079c4d7ef5a731

Change type of __patches array from uint4 to uint

Will need finer indexing granularity when patch tables are added and packed
into __patches.

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

M	intern/cycles/kernel/geom/geom_triangle.h
M	intern/cycles/kernel/kernel_textures.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_triangle.h b/intern/cycles/kernel/geom/geom_triangle.h
index f4e9ed8..67b4d07 100644
--- a/intern/cycles/kernel/geom/geom_triangle.h
+++ b/intern/cycles/kernel/geom/geom_triangle.h
@@ -232,28 +232,41 @@ ccl_device_inline void subd_triangle_patch_uv(KernelGlobals *kg, const ShaderDat
 
 ccl_device_inline uint4 subd_triangle_patch_indices(KernelGlobals *kg, int patch)
 {
-	return kernel_tex_fetch(__patches, patch);
+	uint4 indices;
+
+	indices.x = kernel_tex_fetch(__patches, patch+0);
+	indices.y = kernel_tex_fetch(__patches, patch+1);
+	indices.z = kernel_tex_fetch(__patches, patch+2);
+	indices.w = kernel_tex_fetch(__patches, patch+3);
+
+	return indices;
 }
 
 /* Originating face for patch */
 
 ccl_device_inline uint subd_triangle_patch_face(KernelGlobals *kg, int patch)
 {
-	return kernel_tex_fetch(__patches, patch+1).x;
+	return kernel_tex_fetch(__patches, patch+4);
 }
 
 /* Number of corners on originating face */
 
 ccl_device_inline uint subd_triangle_patch_num_corners(KernelGlobals *kg, int patch)
 {
-	return kernel_tex_fetch(__patches, patch+1).y & 0xffff;
+	return kernel_tex_fetch(__patches, patch+5) & 0xffff;
 }
 
 /* Indices of the four corners that are used by the patch */
 
 ccl_device_inline void subd_triangle_patch_corners(KernelGlobals *kg, int patch, int corners[4])
 {
-	uint4 data = kernel_tex_fetch(__patches, patch+1);
+	uint4 data;
+
+	data.x = kernel_tex_fetch(__patches, patch+4);
+	data.y = kernel_tex_fetch(__patches, patch+5);
+	data.z = kernel_tex_fetch(__patches, patch+6);
+	data.w = kernel_tex_fetch(__patches, patch+7);
+
 	int num_corners = data.y & 0xffff;
 
 	if(num_corners == 4) {
diff --git a/intern/cycles/kernel/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
index ae4bb39..3a43658 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -47,7 +47,7 @@ KERNEL_TEX(float4, texture_float4, __curves)
 KERNEL_TEX(float4, texture_float4, __curve_keys)
 
 /* patches */
-KERNEL_TEX(uint4, texture_uint4, __patches)
+KERNEL_TEX(uint, texture_uint, __patches)
 
 /* attributes */
 KERNEL_TEX(uint4, texture_uint4, __attributes_map)
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index 1cf09e1..87896ea 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -583,7 +583,7 @@ void Mesh::pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset)
 	if(triangles_size) {
 		for(size_t i = 0; i < triangles_size; i++) {
 			Triangle t = get_triangle(i);
-			uint patch_index = (!subd_faces.size()) ? -1 : (triangle_patch[i]*2 + patch_offset);
+			uint patch_index = (!subd_faces.size()) ? -1 : (triangle_patch[i]*8 + patch_offset);
 
 			tri_vindex[i] = make_float4(
 				__int_as_float(t.v[0] + vert_offset),
@@ -627,7 +627,7 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s
 	}
 }
 
-void Mesh::pack_patches(uint4 *patch_data, uint vert_offset, uint face_offset, uint corner_offset)
+void Mesh::pack_patches(uint *patch_data, uint vert_offset, uint face_offset, uint corner_offset)
 {
 	size_t num_faces = subd_faces.size();
 	int ngons = 0;
@@ -640,15 +640,15 @@ void Mesh::pack_patches(uint4 *patch_data, uint vert_offset, uint face_offset, u
 				int c[4];
 				memcpy(c, &subd_face_corners[face.start_corner], sizeof(int)*4);
 
-				*(patch_data++) = {c[0] + vert_offset,
-					               c[1] + vert_offset,
-					               c[2] + vert_offset,
-					               c[3] + vert_offset};
+				*(patch_data++) = c[0] + vert_offset;
+				*(patch_data++) = c[1] + vert_offset;
+				*(patch_data++) = c[2] + vert_offset;
+				*(patch_data++) = c[3] + vert_offset;
 
-				*(patch_data++) = {f+face_offset,
-						           face.num_corners,
-						           face.start_corner + corner_offset,
-						           0};
+				*(patch_data++) = f+face_offset;
+				*(patch_data++) = face.num_corners;
+				*(patch_data++) = face.start_corner + corner_offset;
+				*(patch_data++) = 0;
 			}
 			else {
 				for(int i = 0; i < face.num_corners; i++) {
@@ -658,15 +658,15 @@ void Mesh::pack_patches(uint4 *patch_data, uint vert_offset, uint face_offset, u
 					c[2] = verts.size() - num_subd_verts + ngons;
 					c[3] = subd_face_corners[face.start_corner + mod(i - 1, face.num_corners)];
 
-					*(patch_data++) = {c[0] + vert_offset,
-							           c[1] + vert_offset,
-							           c[2] + vert_offset,
-							           c[3] + vert_offset};
+					*(patch_data++) = c[0] + vert_offset;
+					*(patch_data++) = c[1] + vert_offset;
+					*(patch_data++) = c[2] + vert_offset;
+					*(patch_data++) = c[3] + vert_offset;
 
-					*(patch_data++) = {f+face_offset,
-								       face.num_corners | (i << 16),
-								       face.start_corner + corner_offset,
-							           subd_face_corners.size() + ngons + corner_offset};
+					*(patch_data++) = f+face_offset;
+					*(patch_data++) = face.num_corners | (i << 16);
+					*(patch_data++) = face.start_corner + corner_offset;
+					*(patch_data++) = subd_face_corners.size() + ngons + corner_offset;
 				}
 
 				ngons++;
@@ -1294,7 +1294,7 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 
 		if(mesh->subd_faces.size()) {
 			Mesh::SubdFace& last = mesh->subd_faces[mesh->subd_faces.size()-1];
-			patch_size += (last.ptex_offset + last.num_ptex_faces()) * 2;
+			patch_size += (last.ptex_offset + last.num_ptex_faces()) * 8;
 		}
 		face_size += mesh->subd_faces.size();
 		corner_size += mesh->subd_face_corners.size();
@@ -1343,7 +1343,7 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 	if(patch_size != 0) {
 		progress.set_status("Updating Mesh", "Copying Patches to device");
 
-		uint4 *patch_data = dscene->patches.resize(patch_size);
+		uint *patch_data = dscene->patches.resize(patch_size);
 
 		foreach(Mesh *mesh, scene->meshes) {
 			mesh->pack_patches(&patch_data[mesh->patch_offset], mesh->vert_offset, mesh->face_offset, mesh->corner_offset);
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 559c77b..af77027 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -214,7 +214,7 @@ public:
 	void pack_normals(Scene *scene, uint *shader, float4 *vnormal);
 	void pack_verts(float4 *tri_verts, float4 *tri_vindex, size_t vert_offset);
 	void pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, size_t curvekey_offset);
-	void pack_patches(uint4 *patch_data, uint vert_offset, uint face_offset, uint corner_offset);
+	void pack_patches(uint *patch_data, uint vert_offset, uint face_offset, uint corner_offset);
 	void compute_bvh(SceneParams *params, Progress *progress, int n, int total);
 
 	bool need_attribute(Scene *scene, AttributeStandard std);
diff --git a/intern/cycles/render/scene.h b/intern/cycles/render/scene.h
index a61fbd5..ec1903a 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -78,7 +78,7 @@ public:
 	device_vector<float4> curves;
 	device_vector<float4> curve_keys;
 
-	device_vector<uint4> patches;
+	device_vector<uint> patches;
 
 	/* objects */
 	device_vector<float4> objects;




More information about the Bf-blender-cvs mailing list