[Bf-blender-cvs] [3e8abc0535a] blender2.8: Depsgraph: Make Copy-on-Write a command line option

Sergey Sharybin noreply at git.blender.org
Wed Oct 18 14:39:32 CEST 2017


Commit: 3e8abc0535aaeb736310a1b7a5447df1721ff349
Author: Sergey Sharybin
Date:   Wed Oct 18 14:35:34 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB3e8abc0535aaeb736310a1b7a5447df1721ff349

Depsgraph: Make Copy-on-Write a command line option

Before it was a compile time option which was not very easy to use or test. Now
the project is getting more mature, so very soon we will be able to call for a
public tests of limited features.

The copy-on-write (which includes animation, modifiers) is enabled using
--enable-copy-on-write command line argument.

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

M	CMakeLists.txt
M	source/blender/blenkernel/CMakeLists.txt
M	source/blender/blenkernel/intern/object_update.c
M	source/blender/depsgraph/CMakeLists.txt
M	source/blender/depsgraph/DEG_depsgraph.h
M	source/blender/depsgraph/intern/builder/deg_builder.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
M	source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M	source/blender/depsgraph/intern/depsgraph.cc
M	source/blender/depsgraph/intern/depsgraph_build.cc
M	source/blender/depsgraph/intern/depsgraph_tag.cc
M	source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M	source/blender/depsgraph/intern/nodes/deg_node.cc
M	source/creator/creator_args.c

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

diff --git a/CMakeLists.txt b/CMakeLists.txt
index ad5fb57db44..62c745b26a2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -517,10 +517,6 @@ if(CMAKE_COMPILER_IS_GNUCC)
 	mark_as_advanced(WITH_LINKER_GOLD)
 endif()
 
-# Dependency graph
-option(WITH_DEPSGRAPH_COPY_ON_WRITE "Build Blender with copy-on-write support for dependency graph" OFF)
-mark_as_advanced(WITH_DEPSGRAPH_COPY_ON_WRITE)
-
 if(WIN32)
 	# Use hardcoded paths or find_package to find externals
 	option(WITH_WINDOWS_FIND_MODULES "Use find_package to locate libraries" OFF)
diff --git a/source/blender/blenkernel/CMakeLists.txt b/source/blender/blenkernel/CMakeLists.txt
index dad862b87e7..b2883735343 100644
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@ -541,8 +541,4 @@ endif()
 #	set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /WX")
 #endif()
 
-if(WITH_DEPSGRAPH_COPY_ON_WRITE)
-	add_definitions(-DWITH_COPY_ON_WRITE)
-endif()
-
 blender_add_lib(bf_blenkernel "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/blenkernel/intern/object_update.c b/source/blender/blenkernel/intern/object_update.c
index c5d267ace9d..3495804f743 100644
--- a/source/blender/blenkernel/intern/object_update.c
+++ b/source/blender/blenkernel/intern/object_update.c
@@ -349,55 +349,55 @@ void BKE_object_eval_uber_data(const EvaluationContext *eval_ctx,
 			break;
 	}
 
-#ifdef WITH_COPY_ON_WRITE
-	if (ob->type == OB_MESH) {
-		/* Quick hack to convert evaluated derivedMesh to Mesh. */
-		DerivedMesh *dm = ob->derivedFinal;
-		if (dm != NULL) {
-			Mesh *mesh = (Mesh *)ob->data;
-			Mesh *new_mesh = BKE_libblock_alloc_notest(ID_ME);
-			BKE_mesh_init(new_mesh);
-			/* Copy ID name so GS(new_mesh->id) works correct later on. */
-			BLI_strncpy(new_mesh->id.name, mesh->id.name, sizeof(new_mesh->id.name));
-			/* Copy materials so render engines can access them. */
-			new_mesh->mat = MEM_dupallocN(mesh->mat);
-			new_mesh->totcol = mesh->totcol;
-			DM_to_mesh(dm, new_mesh, ob, CD_MASK_MESH, true);
-			new_mesh->edit_btmesh = mesh->edit_btmesh;
-			/* Store result mesh as derived_mesh of object. This way we have
-			 * explicit  way to query final object evaluated data and know for sure
-			 * who owns the newly created mesh datablock.
-			 */
-			ob->mesh_evaluated = new_mesh;
-			/* TODO(sergey): This is kind of compatibility thing, so all render
-			 * engines can use object->data for mesh data for display. This is
-			 * something what we might want to change in the future.
-			 */
-			ob->data = new_mesh;
-			/* Save some memory by throwing DerivedMesh away. */
-			/* NOTE: Watch out, some tools might need it!
-			 * So keep around for now..
-			 */
-			/* Store original ID as a pointer in evaluated ID.
-			 * This way we can restore original object data when we are freeing
-			 * evaluated mesh.
-			 */
-			new_mesh->id.newid = &mesh->id;
-		}
+	if (DEG_depsgraph_use_copy_on_write()) {
+		if (ob->type == OB_MESH) {
+			/* Quick hack to convert evaluated derivedMesh to Mesh. */
+			DerivedMesh *dm = ob->derivedFinal;
+			if (dm != NULL) {
+				Mesh *mesh = (Mesh *)ob->data;
+				Mesh *new_mesh = BKE_libblock_alloc_notest(ID_ME);
+				BKE_mesh_init(new_mesh);
+				/* Copy ID name so GS(new_mesh->id) works correct later on. */
+				BLI_strncpy(new_mesh->id.name, mesh->id.name, sizeof(new_mesh->id.name));
+				/* Copy materials so render engines can access them. */
+				new_mesh->mat = MEM_dupallocN(mesh->mat);
+				new_mesh->totcol = mesh->totcol;
+				DM_to_mesh(dm, new_mesh, ob, CD_MASK_MESH, true);
+				new_mesh->edit_btmesh = mesh->edit_btmesh;
+				/* Store result mesh as derived_mesh of object. This way we have
+				 * explicit  way to query final object evaluated data and know for sure
+				 * who owns the newly created mesh datablock.
+				 */
+				ob->mesh_evaluated = new_mesh;
+				/* TODO(sergey): This is kind of compatibility thing, so all render
+				 * engines can use object->data for mesh data for display. This is
+				 * something what we might want to change in the future.
+				 */
+				ob->data = new_mesh;
+				/* Save some memory by throwing DerivedMesh away. */
+				/* NOTE: Watch out, some tools might need it!
+				 * So keep around for now..
+				 */
+				/* Store original ID as a pointer in evaluated ID.
+				 * This way we can restore original object data when we are freeing
+				 * evaluated mesh.
+				 */
+				new_mesh->id.newid = &mesh->id;
+			}
 #if 0
-		if (ob->derivedFinal != NULL) {
-			ob->derivedFinal->needsFree = 1;
-			ob->derivedFinal->release(ob->derivedFinal);
-			ob->derivedFinal = NULL;
-		}
-		if (ob->derivedDeform != NULL) {
-			ob->derivedDeform->needsFree = 1;
-			ob->derivedDeform->release(ob->derivedDeform);
-			ob->derivedDeform = NULL;
-		}
+			if (ob->derivedFinal != NULL) {
+				ob->derivedFinal->needsFree = 1;
+				ob->derivedFinal->release(ob->derivedFinal);
+				ob->derivedFinal = NULL;
+			}
+			if (ob->derivedDeform != NULL) {
+				ob->derivedDeform->needsFree = 1;
+				ob->derivedDeform->release(ob->derivedDeform);
+				ob->derivedDeform = NULL;
+			}
 #endif
+		}
 	}
-#endif
 
 	ob->recalc &= ~(OB_RECALC_DATA | OB_RECALC_TIME);
 }
diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 17a13b66aaa..b4509c7a61a 100644
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@ -128,8 +128,4 @@ if(WITH_OPENSUBDIV)
 	add_definitions(-DWITH_OPENSUBDIV)
 endif()
 
-if(WITH_DEPSGRAPH_COPY_ON_WRITE)
-	add_definitions(-DWITH_COPY_ON_WRITE)
-endif()
-
 blender_add_lib(bf_depsgraph "${SRC}" "${INC}" "${INC_SYS}")
diff --git a/source/blender/depsgraph/DEG_depsgraph.h b/source/blender/depsgraph/DEG_depsgraph.h
index f925c37e23e..894adbee8c9 100644
--- a/source/blender/depsgraph/DEG_depsgraph.h
+++ b/source/blender/depsgraph/DEG_depsgraph.h
@@ -105,6 +105,9 @@ enum {
 extern "C" {
 #endif
 
+bool DEG_depsgraph_use_copy_on_write(void);
+void DEG_depsgraph_enable_copy_on_write(void);
+
 /* ************************************************ */
 /* Depsgraph API */
 
diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc
index deee2227f81..587d2021b52 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder.cc
@@ -47,6 +47,7 @@ namespace DEG {
 
 void deg_graph_build_finalize(Depsgraph *graph)
 {
+	const bool use_copy_on_write = DEG_depsgraph_use_copy_on_write();
 	/* Re-tag IDs for update if it was tagged before the relations
 	 * update tag.
 	 */
@@ -63,9 +64,12 @@ void deg_graph_build_finalize(Depsgraph *graph)
 				id_node->tag_update(graph);
 			}
 		}
-#ifdef WITH_COPY_ON_WRITE
-		DEG_id_tag_update_ex(graph->bmain, id_node->id_orig, DEG_TAG_COPY_ON_WRITE);
-#endif
+		/* TODO(sergey): This is not ideal at all, since this forces
+		 * re-evaluaiton of the whole tree.
+		 */
+		if (use_copy_on_write) {
+			DEG_id_tag_update_ex(graph->bmain, id_node->id_orig, DEG_TAG_COPY_ON_WRITE);
+		}
 	}
 	GHASH_FOREACH_END();
 }
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 02d20913177..a4c3c11d922 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -174,7 +174,9 @@ DepsgraphNodeBuilder::~DepsgraphNodeBuilder()
 
 IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id, bool do_tag)
 {
-#ifdef WITH_COPY_ON_WRITE
+	if (!DEG_depsgraph_use_copy_on_write()) {
+		return m_graph->add_id_node(id);
+	}
 	IDDepsNode *id_node = NULL;
 	ID *id_cow = (ID *)BLI_ghash_lookup(m_cow_id_hash, id);
 	if (id_cow != NULL) {
@@ -197,10 +199,6 @@ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id, bool do_tag)
 		    "", -1);
 		m_graph->operations.push_back(op_cow);
 	}
-#else
-	IDDepsNode *id_node = m_graph->add_id_node(id);
-	UNUSED_VARS(do_tag);
-#endif
 	return id_node;
 }
 
@@ -358,23 +356,25 @@ void DepsgraphNodeBuilder::begin_build(Main *bmain) {
 	}
 	FOREACH_NODETREE_END;
 
-#ifdef WITH_COPY_ON_WRITE
-	/* Store existing copy-on-write versions of datablock, so we can re-use
-	 * them for new ID nodes.
-	 */
-	m_cow_id_hash = BLI_ghash_ptr_new("Depsgraph id hash");
-	GHASH_FOREACH_BEGIN(IDDepsNode *, id_node, m_graph->id_hash)
-	{
-		if (GS(id_node->id_orig->name) != ID_SCE) {
-			continue;
-		}
-		if (deg_copy_on_write_is_expanded(id_node->id_cow)) {
-			BLI_ghash_insert(m_cow_id_hash, id_node->id_orig, id_node->id_cow);
-			id_node->id_cow = NULL;
+	if (DEG_depsgraph_use_copy_on_write()) {
+		/* Store existing copy-on-write versions of datablock, so we can re-use
+		 * them for new ID nodes.
+		 */
+		m_cow_id_hash = BLI_ghash_ptr_new("Depsgraph id hash");
+		GHASH_FOREACH_BEGIN(IDDepsNode *, id_node, m_graph->id_hash)
+		{
+			if (GS(id_node->id_orig->name) != ID_SCE) {
+				continue;
+			}
+			if (deg_copy_on_write_is_expanded(id_node->id_cow)) {
+				BLI_ghash_insert(m_cow_id_hash,
+				                 id_node->id_orig,
+				                 id_node->id_cow);
+				id_node->id_cow = NULL;
+			}
 		}
+		GHASH_FOREACH_END();
 	}
-	GHASH_FOREACH_END();
-#endif
 
 	/* Make sure graph has no nodes left from previous state. */
 	m_graph->clear_all_nodes();
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 7e28df1276d..dbb126e2078 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -32,6 +32,8 @@
 
 #include "intern/depsgraph_types.h"
 
+#include "DEG_depsgraph.h"  /* used for DEG_depsgraph_use_copy_on_write() */
+
 struct CacheFile;
 struct bGPdata;
 struct ListBase;
@@ -98,11 +100,12 @@ struct DepsgraphNodeBuilder {
 	/* For a given COW datablock get corresponding original one. */
 	template<typename T>
 	T *get_orig_datablock(const T *cow) const {
-#ifdef WITH_COPY_ON_WRITE
-		return (T *)cow->id.newid;
-#else
-		return (T *)cow;
-#endif
+		if (DEG_depsgraph_use_copy_on_write()) {
+			return (T *)cow->id.newid;
+		}
+		else {
+			return (T *)cow;
+		}
 	}
 
 	void begi

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list