[Bf-blender-cvs] [cf38371155e] blender2.8: Depsgraph: Create ID nodes on build-time expansion using node builder

Sergey Sharybin noreply at git.blender.org
Thu Jul 27 15:23:07 CEST 2017


Commit: cf38371155e188043bac68831977fbc958824d38
Author: Sergey Sharybin
Date:   Thu Jul 27 14:57:47 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBcf38371155e188043bac68831977fbc958824d38

Depsgraph: Create ID nodes on build-time expansion using node builder

This will allow us to do some builder-specific trickery when ID nodes are
requested to be created from build-time expansion.

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

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/depsgraph.cc
M	source/blender/depsgraph/intern/depsgraph.h
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
M	source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h

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

diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index bd03cb9ef48..30fbe809236 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -295,6 +295,16 @@ ID *DepsgraphNodeBuilder::get_cow_id(const ID *id_orig) const
 	return m_graph->get_cow_id(id_orig);
 }
 
+ID *DepsgraphNodeBuilder::ensure_cow_id(ID *id_orig)
+{
+	if (id_orig->tag & LIB_TAG_COPY_ON_WRITE) {
+		/* ID is already remapped to copy-on-write. */
+		return id_orig;
+	}
+	IDDepsNode *id_node = m_graph->add_id_node(id_orig, false);
+	return id_node->id_cow;
+}
+
 /* **** Build functions for entity nodes **** */
 
 void DepsgraphNodeBuilder::begin_build(Main *bmain) {
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index 8be5f85ab13..b1d9ff52359 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -72,11 +72,20 @@ struct DepsgraphNodeBuilder {
 	DepsgraphNodeBuilder(Main *bmain, Depsgraph *graph);
 	~DepsgraphNodeBuilder();
 
+	/* For given original ID get ID which is created by CoW system. */
 	ID *get_cow_id(const ID *id_orig) const;
+	/* Similar to above, but for the cases when there is no ID node we create
+	 * one.
+	 */
+	ID *ensure_cow_id(ID *id_orig);
+
+	/* Helper wrapper function which wraps get_cow_id with a needed type cast. */
 	template<typename T>
 	T *get_cow_datablock(const T *orig) const {
 		return (T *)get_cow_id(&orig->id);
 	}
+
+	/* 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
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
index 861c2377567..80111840b6c 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer.cc
@@ -99,9 +99,8 @@ void DepsgraphNodeBuilder::build_scene_layer_collections(Scene *scene)
 #ifdef WITH_COPY_ON_WRITE
 	/* Make sure we've got ID node, so we can get pointer to CoW datablock. */
 	IDDepsNode *id_node = add_id_node(&scene->id);
-	Scene *scene_cow = (Scene *)deg_expand_copy_on_write_datablock(m_graph,
-	                                                               id_node,
-	                                                               true);
+	Scene *scene_cow = (Scene *)deg_expand_copy_on_write_datablock(
+	        m_graph, id_node, this, true);
 #else
 	Scene *scene_cow = scene;
 #endif
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
index 20374d6ec70..9fb94a8cd91 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
@@ -142,10 +142,10 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *object)
 	Scene *scene_cow = get_cow_datablock(scene);
 	IDDepsNode *object_id_node = add_id_node(&object->id);
 	Object *object_cow = (Object *)deg_expand_copy_on_write_datablock(
-	        m_graph, object_id_node, true);
+	        m_graph, object_id_node, this, true);
 	IDDepsNode *armature_id_node = add_id_node(&armature->id);
 	bArmature *armature_cow = (bArmature *)deg_expand_copy_on_write_datablock(
-	        m_graph, armature_id_node, true);
+	        m_graph, armature_id_node, this, true);
 #else
 	Scene *scene_cow = scene;
 	Object *object_cow = object;
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 322a561b4d8..868e7c0e3e5 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -466,16 +466,6 @@ ID *Depsgraph::get_cow_id(const ID *id_orig) const
 	return id_node->id_cow;
 }
 
-ID *Depsgraph::ensure_cow_id(ID *id_orig)
-{
-	if (id_orig->tag & LIB_TAG_COPY_ON_WRITE) {
-		/* ID is already remapped to copy-on-write. */
-		return id_orig;
-	}
-	IDDepsNode *id_node = add_id_node(id_orig, false);
-	return id_node->id_cow;
-}
-
 void deg_editors_id_update(Main *bmain, ID *id)
 {
 	if (deg_editor_update_id_cb != NULL) {
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index 94b729812cb..6290dbe4ba7 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -137,11 +137,6 @@ struct Depsgraph {
 	/* For given original ID get ID which is created by CoW system. */
 	ID *get_cow_id(const ID *id_orig) const;
 
-	/* Similar to above, but for the cases when there is no ID node we create
-	 * one.
-	 */
-	ID *ensure_cow_id(ID *id_orig);
-
 	/* Core Graph Functionality ........... */
 
 	/* <ID : IDDepsNode> mapping from ID blocks to nodes representing these blocks
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
index f74e3deb9fb..198f6003c14 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.cc
@@ -79,6 +79,7 @@ extern "C" {
 }
 
 #include "intern/depsgraph.h"
+#include "intern/builder/deg_builder_nodes.h"
 #include "intern/nodes/deg_node.h"
 
 namespace DEG {
@@ -378,7 +379,7 @@ static bool check_datablocks_copy_on_writable(const ID *id_orig)
 
 struct RemapCallbackUserData {
 	/* Dependency graph for which remapping is happening. */
-	Depsgraph *depsgraph;
+	const Depsgraph *depsgraph;
 	/* Temporarily allocated memory for copying purposes. This ID will
 	 * be discarded after expanding is done, so need to make sure temp_id
 	 * is replaced with proper real_id.
@@ -395,6 +396,7 @@ struct RemapCallbackUserData {
 	 *
 	 * This happens when expansion happens a ta construction time.
 	 */
+	DepsgraphNodeBuilder *node_builder;
 	bool create_placeholders;
 };
 
@@ -404,7 +406,7 @@ int foreach_libblock_remap_callback(void *user_data_v,
                                     int /*cb_flag*/)
 {
 	RemapCallbackUserData *user_data = (RemapCallbackUserData *)user_data_v;
-	Depsgraph *depsgraph = user_data->depsgraph;
+	const Depsgraph *depsgraph = user_data->depsgraph;
 	if (*id_p != NULL) {
 		ID *id_orig = *id_p;
 		if (id_orig == user_data->temp_id) {
@@ -435,7 +437,7 @@ int foreach_libblock_remap_callback(void *user_data_v,
 					}
 				}
 				else {
-					id_cow = depsgraph->ensure_cow_id(id_orig);
+					id_cow = user_data->node_builder->ensure_cow_id(id_orig);
 				}
 			}
 			else {
@@ -641,8 +643,9 @@ int foreach_libblock_validate_callback(void *user_data,
  *
  * NOTE: Expects that CoW datablock is empty.
  */
-ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
+ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph,
                                        const IDDepsNode *id_node,
+                                       DepsgraphNodeBuilder *node_builder,
                                        bool create_placeholders)
 {
 	BLI_assert(!create_placeholders ||
@@ -731,6 +734,7 @@ ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
 	user_data.depsgraph = depsgraph;
 	user_data.temp_id = newid;
 	user_data.real_id = id_cow;
+	user_data.node_builder = node_builder;
 	user_data.create_placeholders = create_placeholders;
 	BKE_library_foreach_ID_link(NULL,
 	                            id_cow,
@@ -749,18 +753,20 @@ ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
 }
 
 /* NOTE: Depsgraph is supposed to have ID node already. */
-ID *deg_expand_copy_on_write_datablock(Depsgraph *depsgraph,
+ID *deg_expand_copy_on_write_datablock(const Depsgraph *depsgraph,
                                        ID *id_orig,
+                                       DepsgraphNodeBuilder *node_builder,
                                        bool create_placeholders)
 {
 	DEG::IDDepsNode *id_node = depsgraph->find_id_node(id_orig);
 	BLI_assert(id_node != NULL);
 	return deg_expand_copy_on_write_datablock(depsgraph,
 	                                          id_node,
+	                                          node_builder,
 	                                          create_placeholders);
 }
 
-ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
+ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
                                        const IDDepsNode *id_node)
 {
 	const ID *id_orig = id_node->id_orig;
@@ -808,7 +814,7 @@ ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
 		}
 	}
 	deg_free_copy_on_write_datablock(id_cow);
-	deg_expand_copy_on_write_datablock(depsgraph, id_node, false);
+	deg_expand_copy_on_write_datablock(depsgraph, id_node);
 	/* Restore GPU materials. */
 	if (gpumaterial_ptr != NULL) {
 		*gpumaterial_ptr = gpumaterial_backup;
@@ -817,7 +823,7 @@ ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
 }
 
 /* NOTE: Depsgraph is supposed to have ID node already. */
-ID *deg_update_copy_on_write_datablock(/*const*/ Depsgraph *depsgraph,
+ID *deg_update_copy_on_write_datablock(const Depsgraph *depsgraph,
                                        ID *id_orig)
 {
 	DEG::IDDepsNode *id_node = depsgraph->find_id_node(id_orig);
@@ -882,7 +888,7 @@ void deg_free_copy_on_write_datablock(ID *id_cow)
 }
 
 void deg_evaluate_copy_on_write(const EvaluationContext * /*eval_ctx*/,
-                                /*const*/ Depsgraph *depsgraph,
+                                const Depsgraph *depsgraph,
                                 const IDDepsNode *id_node)
 {
 	DEBUG_PRINT("%s on %s\n", __func__, id_node->id_orig->name);
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h b/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
index 52fe58e3391..a2b57cb7198 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_copy_on_write.h
+++ b/source/blender/depsgraph/intern/eval/deg_eval_copy_

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list