[Bf-blender-cvs] [2724a95] temp-cycles-microdisplacement: Copy patches to device memory

Mai Lavelle noreply at git.blender.org
Thu Jun 9 12:11:33 CEST 2016


Commit: 2724a95f0609300957ea16f24d067d4254ddd80e
Author: Mai Lavelle
Date:   Wed Jun 8 05:17:48 2016 -0400
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB2724a95f0609300957ea16f24d067d4254ddd80e

Copy patches to device memory

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

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/kernel_textures.h b/intern/cycles/kernel/kernel_textures.h
index 245d236..c7f1433 100644
--- a/intern/cycles/kernel/kernel_textures.h
+++ b/intern/cycles/kernel/kernel_textures.h
@@ -46,6 +46,9 @@ KERNEL_TEX(float4, texture_float4, __tri_verts)
 KERNEL_TEX(float4, texture_float4, __curves)
 KERNEL_TEX(float4, texture_float4, __curve_keys)
 
+/* patches */
+KERNEL_TEX(uint4, texture_uint4, __patches)
+
 /* attributes */
 KERNEL_TEX(uint4, texture_uint4, __attributes_map)
 KERNEL_TEX(float, texture_float, __attributes_float)
diff --git a/intern/cycles/render/mesh.cpp b/intern/cycles/render/mesh.cpp
index f2722c6..79f172a 100644
--- a/intern/cycles/render/mesh.cpp
+++ b/intern/cycles/render/mesh.cpp
@@ -130,6 +130,8 @@ Mesh::Mesh()
 	curve_offset = 0;
 	curvekey_offset = 0;
 
+	patch_offset = 0;
+
 	attributes.triangle_mesh = this;
 	curve_attributes.curve_mesh = this;
 
@@ -537,7 +539,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);
-			int patch_index = (!patches.size()) ? -1 : triangle_patch[i];
+			uint patch_index = (!patches.size()) ? -1 : (triangle_patch[i] + patch_offset);
 
 			tri_vindex[i] = make_float4(
 				__int_as_float(t.v[0] + vert_offset),
@@ -581,6 +583,22 @@ void Mesh::pack_curves(Scene *scene, float4 *curve_key_co, float4 *curve_data, s
 	}
 }
 
+void Mesh::pack_patches(uint4 *patch_data, uint vert_offset)
+{
+	size_t patches_size = patches.size();
+
+	if(patches_size) {
+		for(size_t i = 0; i < patches_size; i++) {
+			Patch p = patches[i];
+
+			patch_data[i] = {p.v[0] + vert_offset,
+				             p.v[1] + vert_offset,
+				             p.v[2] + vert_offset,
+				             p.v[3] >= 0 ? p.v[3] + vert_offset : -1};
+		}
+	}
+}
+
 void Mesh::compute_bvh(SceneParams *params, Progress *progress, int n, int total)
 {
 	if(progress->get_cancel())
@@ -1127,6 +1145,8 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 	size_t curve_key_size = 0;
 	size_t curve_size = 0;
 
+	size_t patch_size = 0;
+
 	foreach(Mesh *mesh, scene->meshes) {
 		mesh->vert_offset = vert_size;
 		mesh->tri_offset = tri_size;
@@ -1134,11 +1154,15 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 		mesh->curvekey_offset = curve_key_size;
 		mesh->curve_offset = curve_size;
 
+		mesh->patch_offset = patch_size;
+
 		vert_size += mesh->verts.size();
 		tri_size += mesh->num_triangles();
 
 		curve_key_size += mesh->curve_keys.size();
 		curve_size += mesh->num_curves();
+
+		patch_size += mesh->patches.size();
 	}
 
 	if(tri_size != 0) {
@@ -1180,6 +1204,19 @@ void MeshManager::device_update_mesh(Device *device, DeviceScene *dscene, Scene
 		device->tex_alloc("__curve_keys", dscene->curve_keys);
 		device->tex_alloc("__curves", dscene->curves);
 	}
+
+	if(patch_size != 0) {
+		progress.set_status("Updating Mesh", "Copying Patches to device");
+
+		uint4 *patch_data = dscene->patches.resize(patch_size);
+
+		foreach(Mesh *mesh, scene->meshes) {
+			mesh->pack_patches(&patch_data[mesh->patch_offset], mesh->vert_offset);
+			if(progress.get_cancel()) return;
+		}
+
+		device->tex_alloc("__patches", dscene->patches);
+	}
 }
 
 void MeshManager::device_update_bvh(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
@@ -1464,6 +1501,7 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene)
 	device->tex_free(dscene->tri_verts);
 	device->tex_free(dscene->curves);
 	device->tex_free(dscene->curve_keys);
+	device->tex_free(dscene->patches);
 	device->tex_free(dscene->attributes_map);
 	device->tex_free(dscene->attributes_float);
 	device->tex_free(dscene->attributes_float3);
@@ -1482,6 +1520,7 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene)
 	dscene->tri_verts.clear();
 	dscene->curves.clear();
 	dscene->curve_keys.clear();
+	dscene->patches.clear();
 	dscene->attributes_map.clear();
 	dscene->attributes_float.clear();
 	dscene->attributes_float3.clear();
diff --git a/intern/cycles/render/mesh.h b/intern/cycles/render/mesh.h
index 3cff3e2..c8d07aa 100644
--- a/intern/cycles/render/mesh.h
+++ b/intern/cycles/render/mesh.h
@@ -161,6 +161,8 @@ public:
 	size_t curve_offset;
 	size_t curvekey_offset;
 
+	size_t patch_offset;
+
 	/* Functions */
 	Mesh();
 	~Mesh();
@@ -188,6 +190,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);
 	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 b34d612..8b7b2f9 100644
--- a/intern/cycles/render/scene.h
+++ b/intern/cycles/render/scene.h
@@ -78,6 +78,8 @@ public:
 	device_vector<float4> curves;
 	device_vector<float4> curve_keys;
 
+	device_vector<uint4> patches;
+
 	/* objects */
 	device_vector<float4> objects;
 	device_vector<float4> objects_vector;




More information about the Bf-blender-cvs mailing list