[Bf-blender-cvs] [485ed01] temp-cycles-microdisplacement: Adding a geometry cache

Mai Lavelle noreply at git.blender.org
Mon Apr 11 14:54:30 CEST 2016


Commit: 485ed01dc1e992706a703441d24975940948bda8
Author: Mai Lavelle
Date:   Wed Feb 24 12:46:10 2016 -0500
Branches: temp-cycles-microdisplacement
https://developer.blender.org/rB485ed01dc1e992706a703441d24975940948bda8

Adding a geometry cache

Squashed the following 7 commits:

- Add geometry cache ; geom cache

- Add geometry cache ; geom

- Add geometry cache ; bvh

- Add geometry cache ; mesh

- Add geometry cache ; sync

- Add geometry cache ; subd

- Add geometry cache ; geom bvh

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

M	intern/cycles/blender/addon/properties.py
M	intern/cycles/blender/addon/ui.py
M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/bvh/bvh.cpp
M	intern/cycles/bvh/bvh_build.cpp
M	intern/cycles/bvh/bvh_params.h
M	intern/cycles/device/device.h
M	intern/cycles/device/device_cpu.cpp
M	intern/cycles/kernel/CMakeLists.txt
M	intern/cycles/kernel/geom/geom.h
M	intern/cycles/kernel/geom/geom_bvh_shadow.h
M	intern/cycles/kernel/geom/geom_bvh_subsurface.h
M	intern/cycles/kernel/geom/geom_bvh_traversal.h
M	intern/cycles/kernel/geom/geom_bvh_volume.h
M	intern/cycles/kernel/geom/geom_bvh_volume_all.h
A	intern/cycles/kernel/geom/geom_cache.cpp
A	intern/cycles/kernel/geom/geom_cache.h
A	intern/cycles/kernel/geom/geom_cache_triangle.h
M	intern/cycles/kernel/geom/geom_qbvh_shadow.h
M	intern/cycles/kernel/geom/geom_qbvh_subsurface.h
M	intern/cycles/kernel/geom/geom_qbvh_traversal.h
M	intern/cycles/kernel/geom/geom_qbvh_volume.h
M	intern/cycles/kernel/geom/geom_qbvh_volume_all.h
A	intern/cycles/kernel/geom/geom_subpatch.h
M	intern/cycles/kernel/kernel_globals.h
M	intern/cycles/kernel/kernel_shader.h
M	intern/cycles/kernel/kernel_subsurface.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/kernel/osl/osl_services.cpp
M	intern/cycles/kernel/svm/svm_wireframe.h
M	intern/cycles/render/mesh.cpp
M	intern/cycles/render/mesh.h
M	intern/cycles/render/mesh_subdivision.cpp
M	intern/cycles/render/object.cpp
M	intern/cycles/render/scene.h
M	intern/cycles/subd/subd_dice.cpp
M	intern/cycles/subd/subd_dice.h
M	intern/cycles/subd/subd_split.h
M	intern/cycles/util/CMakeLists.txt
A	intern/cycles/util/util_lru.h
M	intern/cycles/util/util_thread.h

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

diff --git a/intern/cycles/blender/addon/properties.py b/intern/cycles/blender/addon/properties.py
index de9481e..ca708bf 100644
--- a/intern/cycles/blender/addon/properties.py
+++ b/intern/cycles/blender/addon/properties.py
@@ -498,6 +498,12 @@ class CyclesRenderSettings(bpy.types.PropertyGroup):
                             "but time can be saved by manually stopping the render when the noise is low enough)",
                 default=False,
                 )
+        cls.geom_cache_max_size = IntProperty(
+                name="Geometry Cache Size",
+                description="Maximum size of the geometry cache in MB",
+                min=128, max=1024*4,
+                default=256,
+                )
 
         cls.bake_type = EnumProperty(
             name="Bake Type",
diff --git a/intern/cycles/blender/addon/ui.py b/intern/cycles/blender/addon/ui.py
index e3c4f21..cc18818 100644
--- a/intern/cycles/blender/addon/ui.py
+++ b/intern/cycles/blender/addon/ui.py
@@ -385,6 +385,11 @@ class CyclesRender_PT_performance(CyclesButtonsPanel, Panel):
         col.label(text="Acceleration structure:")
         col.prop(cscene, "debug_use_spatial_splits")
 
+        col.separator()
+
+        col.label(text="Geometry Cache:")
+        col.prop(cscene, "geom_cache_max_size", text="Max Size")
+
 
 class CyclesRender_PT_layer_options(CyclesButtonsPanel, Panel):
     bl_label = "Layer"
diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index 410d520..b80d474 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -623,19 +623,18 @@ static void create_mesh(Scene *scene,
 				if(is_zero(cross(mesh->verts[vi[1]] - mesh->verts[vi[0]], mesh->verts[vi[2]] - mesh->verts[vi[0]])) ||
 				   is_zero(cross(mesh->verts[vi[2]] - mesh->verts[vi[0]], mesh->verts[vi[3]] - mesh->verts[vi[0]])))
 				{
-					// TODO(mai): order here is probably wrong
-					mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth, true);
-					mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth, true);
+					mesh->set_triangle(ti++, vi[0], vi[1], vi[3], shader, smooth);
+					mesh->set_triangle(ti++, vi[2], vi[3], vi[1], shader, smooth);
 					face_flags[fi] |= FACE_FLAG_DIVIDE_24;
 				}
 				else {
-					mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, true);
-					mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth, true);
+					mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
+					mesh->set_triangle(ti++, vi[0], vi[2], vi[3], shader, smooth);
 					face_flags[fi] |= FACE_FLAG_DIVIDE_13;
 				}
 			}
 			else
-				mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth, false);
+				mesh->set_triangle(ti++, vi[0], vi[1], vi[2], shader, smooth);
 		}
 		else {
 			/* create patches */
@@ -676,11 +675,10 @@ static void create_subd_mesh(Scene *scene,
                              const vector<uint>& used_shaders,
                              bool preview)
 {
-	Mesh *basemesh = new Mesh();
-	basemesh->subdivision_type = (Mesh::SubdivisionType)RNA_enum_get(cmesh, "subdivision_type");
-	create_mesh(scene, basemesh, b_mesh, used_shaders, true);
+	mesh->subdivision_type = (Mesh::SubdivisionType)RNA_enum_get(cmesh, "subdivision_type");
+	create_mesh(scene, mesh, b_mesh, used_shaders, true);
 
-	SubdParams sdparams(mesh, used_shaders[0], true, false);
+	SubdParams sdparams;
 	sdparams.dicing_rate = preview ? RNA_float_get(cmesh, "preview_dicing_rate") : RNA_float_get(cmesh, "dicing_rate");
 	sdparams.max_level = RNA_int_get(cmesh, "max_subdivision_level");
 
@@ -690,9 +688,7 @@ static void create_subd_mesh(Scene *scene,
 
 	/* tesselate */
 	DiagSplit dsplit(sdparams);
-	basemesh->tessellate(&dsplit);
-
-	delete basemesh;
+	mesh->split_patches(&dsplit);
 }
 
 /* Sync */
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 749b8c0..68055a7 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -481,6 +481,8 @@ SceneParams BlenderSync::get_scene_params(BL::Scene& b_scene,
 		params.use_qbvh = false;
 	}
 
+	params.geom_cache_max_size = get_int(cscene, "geom_cache_max_size") * 1024*1024;
+
 	return params;
 }
 
diff --git a/intern/cycles/bvh/bvh.cpp b/intern/cycles/bvh/bvh.cpp
index f78ad3e..bb2a898 100644
--- a/intern/cycles/bvh/bvh.cpp
+++ b/intern/cycles/bvh/bvh.cpp
@@ -205,7 +205,7 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size)
 		if(pack.prim_index[i] != -1) {
 			if(pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
 				pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->curve_offset;
-			else
+			else if(pack.prim_type[i] & PRIMITIVE_ALL_TRIANGLE)
 				pack.prim_index[i] += objects[pack.prim_object[i]]->mesh->tri_offset;
 		}
 
@@ -311,6 +311,8 @@ void BVH::pack_instances(size_t nodes_size, size_t leaf_nodes_size)
 			for(size_t i = 0; i < bvh_prim_index_size; i++) {
 				if(bvh->pack.prim_type[i] & PRIMITIVE_ALL_CURVE)
 					pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_curve_offset;
+				else if(bvh->pack.prim_type[i] & PRIMITIVE_SUBPATCH)
+					pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i];
 				else
 					pack_prim_index[pack_prim_index_offset] = bvh_prim_index[i] + mesh_tri_offset;
 
@@ -534,6 +536,12 @@ void RegularBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility
 						}
 					}
 				}
+				else if(pack.prim_type[prim] & PRIMITIVE_SUBPATCH) {
+					/* Subpatches. */
+					const Mesh::SubPatch& subpatch = mesh->subpatches[pidx];
+
+					subpatch.bounds_grow(bbox);
+				}
 				else {
 					/* triangles */
 					int tri_offset = (params.top_level)? mesh->tri_offset: 0;
@@ -798,6 +806,12 @@ void QBVH::refit_node(int idx, bool leaf, BoundBox& bbox, uint& visibility)
 						}
 					}
 				}
+				else if(pack.prim_type[prim] & PRIMITIVE_SUBPATCH) {
+					/* Subpatches. */
+					const Mesh::SubPatch& subpatch = mesh->subpatches[pidx];
+
+					subpatch.bounds_grow(bbox);
+				}
 				else {
 					/* Triangles. */
 					int tri_offset = (params.top_level)? mesh->tri_offset: 0;
diff --git a/intern/cycles/bvh/bvh_build.cpp b/intern/cycles/bvh/bvh_build.cpp
index 255051c..e2b2a64 100644
--- a/intern/cycles/bvh/bvh_build.cpp
+++ b/intern/cycles/bvh/bvh_build.cpp
@@ -177,6 +177,20 @@ void BVHBuild::add_reference_mesh(BoundBox& root, BoundBox& center, Mesh *mesh,
 			}
 		}
 	}
+
+	for(uint j = 0; j < mesh->subpatches.size(); j++) {
+		Mesh::SubPatch& subpatch = mesh->subpatches[j];
+		BoundBox bounds = BoundBox::empty;
+		PrimitiveType type = PRIMITIVE_SUBPATCH;
+
+		subpatch.bounds_grow(bounds);
+
+		if(bounds.valid()) {
+			references.push_back(BVHReference(bounds, j, i, type));
+			root.grow(bounds);
+			center.grow(bounds.center2());
+		}
+	}
 }
 
 void BVHBuild::add_reference_object(BoundBox& root, BoundBox& center, Object *ob, int i)
@@ -206,6 +220,7 @@ void BVHBuild::add_references(BVHRange& root)
 			if(!ob->mesh->is_instanced()) {
 				num_alloc_references += ob->mesh->triangles.size();
 				num_alloc_references += count_curve_segments(ob->mesh);
+				num_alloc_references += ob->mesh->subpatches.size();
 			}
 			else
 				num_alloc_references++;
@@ -213,6 +228,7 @@ void BVHBuild::add_references(BVHRange& root)
 		else {
 			num_alloc_references += ob->mesh->triangles.size();
 			num_alloc_references += count_curve_segments(ob->mesh);
+			num_alloc_references += ob->mesh->subpatches.size();
 		}
 	}
 
@@ -412,6 +428,7 @@ bool BVHBuild::range_within_max_leaf_size(const BVHRange& range,
 	size_t num_triangles = 0;
 	size_t num_curves = 0;
 	size_t num_motion_curves = 0;
+	size_t num_subpatches = 0;
 
 	for(int i = 0; i < size; i++) {
 		const BVHReference& ref = references[range.start() + i];
@@ -422,11 +439,14 @@ bool BVHBuild::range_within_max_leaf_size(const BVHRange& range,
 			num_motion_curves++;
 		else if(ref.prim_type() & PRIMITIVE_ALL_TRIANGLE)
 			num_triangles++;
+		else if(ref.prim_type() & PRIMITIVE_SUBPATCH)
+			num_subpatches++;
 	}
 
 	return (num_triangles < params.max_triangle_leaf_size) &&
 	       (num_curves < params.max_curve_leaf_size) &&
-	       (num_motion_curves < params.max_curve_leaf_size);
+	       (num_motion_curves < params.max_curve_leaf_size) &&
+	       (num_subpatches < params.max_subpatch_leaf_size);
 }
 
 /* multithreaded binning builder */
@@ -615,6 +635,8 @@ BVHNode* BVHBuild::create_leaf_node(const BVHRange& range,
 	BoundBox bounds[PRIMITIVE_NUM_TOTAL] = {BoundBox::empty,
 	                                        BoundBox::empty,
 	                                        BoundBox::empty,
+	                                        BoundBox::empty,
+	                                        BoundBox::empty,
 	                                        BoundBox::empty};
 	int ob_num = 0;
 
diff --git a/intern/cycles/bvh/bvh_params.h b/intern/cycles/bvh/bvh_params.h
index cf683df..3969749 100644
--- a/intern/cycles/bvh/bvh_params.h
+++ b/intern/cycles/bvh/bvh_params.h
@@ -39,6 +39,7 @@ public:
 	int min_leaf_size;
 	int max_triangle_leaf_size;
 	int max_curve_leaf_size;
+	int max_subpatch_leaf_size;
 
 	/* object or mesh level bvh */
 	bool top_level;
@@ -66,6 +67,7 @@ public:
 		min_leaf_size = 1;
 		max_triangle_leaf_size = 8;
 		max_curve_leaf_size = 2;
+		max_subpatch_leaf_size = 1;
 
 		top_level = false;
 		use_qbvh = false;
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index 30d0003..460cc18 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -34,6 +34,8 @@ CCL_NAMESPACE_BEGIN
 class Progress;
 class RenderTile;
 
+struct GeomCache;
+
 /* Device Types */
 
 enum DeviceType {
@@ -232,6 +234,8 @@ public:
 	/* open shading language, only for CPU device */
 	virtual void *osl_memory() { return NULL; }
 
+	virtual GeomCache *get_geom_cache() { return NULL; }
+
 	/* load/compile kernels, must be called before adding tasks */ 
 	virtual bool load_kernels(
 	        const DeviceRequestedFeatures& /*requested_features*/)
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 676b1279..5a9b26d 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list