[Bf-blender-cvs] [ad02082] depsgraph_refactor: Depsgraph: Change to how id tagging happens

Sergey Sharybin noreply at git.blender.org
Thu Feb 12 13:39:20 CET 2015


Commit: ad0208263c191c6b68ec5e44077688a4ef83456f
Author: Sergey Sharybin
Date:   Thu Feb 12 17:34:24 2015 +0500
Branches: depsgraph_refactor
https://developer.blender.org/rBad0208263c191c6b68ec5e44077688a4ef83456f

Depsgraph: Change to how id tagging happens

Basically the idea is:

- Builder re-sets the LIB_DOIT flag, so it's guaranteed no left over
  flags happened (it's not guaranteed LIB_DOIT is reset everywhere).

- Functions checks this flag directly, without using wrapping the check
  with functions which kinda hides actual logic (that wouldn't be a
  problem if this flag was only used by depsgraph).

- Removed flag check/set wrapping functions. Found them being rather
  obscure and not really necessary from the beginning.

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

M	source/blender/depsgraph/CMakeLists.txt
M	source/blender/depsgraph/intern/depsgraph.cpp
M	source/blender/depsgraph/intern/depsgraph.h
M	source/blender/depsgraph/intern/depsgraph_build.cpp
M	source/blender/depsgraph/intern/depsgraph_build.h
M	source/blender/depsgraph/intern/depsgraph_build_idusers.cpp
M	source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
M	source/blender/depsgraph/intern/depsgraph_build_relations.cpp
D	source/blender/depsgraph/util/depsgraph_util_id.h

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

diff --git a/source/blender/depsgraph/CMakeLists.txt b/source/blender/depsgraph/CMakeLists.txt
index 1de5dc3..951a536 100644
--- a/source/blender/depsgraph/CMakeLists.txt
+++ b/source/blender/depsgraph/CMakeLists.txt
@@ -77,7 +77,6 @@ set(SRC
 
 	util/depsgraph_util_function.h
 	util/depsgraph_util_hash.h
-	util/depsgraph_util_id.h
 	util/depsgraph_util_map.h
 	util/depsgraph_util_pchanmap.h
 	util/depsgraph_util_set.h
diff --git a/source/blender/depsgraph/intern/depsgraph.cpp b/source/blender/depsgraph/intern/depsgraph.cpp
index 035b178..6baf6fb 100644
--- a/source/blender/depsgraph/intern/depsgraph.cpp
+++ b/source/blender/depsgraph/intern/depsgraph.cpp
@@ -303,13 +303,13 @@ IDDepsNode *Depsgraph::find_id_node(const ID *id) const
 	return it != this->id_hash.end() ? it->second : NULL;
 }
 
-IDDepsNode *Depsgraph::add_id_node(const ID *id, const string &name)
+IDDepsNode *Depsgraph::add_id_node(ID *id, const string &name)
 {
 	IDDepsNode *id_node = find_id_node(id);
 	if (!id_node) {
 		DepsNodeFactory *factory = DEG_get_node_factory(DEPSNODE_TYPE_ID_REF);
 		id_node = (IDDepsNode *)factory->create_node(id, "", name);
-
+		id->flag |= LIB_DOIT;
 		/* register */
 		this->id_hash[id] = id_node;
 	}
diff --git a/source/blender/depsgraph/intern/depsgraph.h b/source/blender/depsgraph/intern/depsgraph.h
index 13f3764..11dbf10 100644
--- a/source/blender/depsgraph/intern/depsgraph.h
+++ b/source/blender/depsgraph/intern/depsgraph.h
@@ -132,7 +132,7 @@ struct Depsgraph {
 	void clear_subgraph_nodes();
 
 	IDDepsNode *find_id_node(const ID *id) const;
-	IDDepsNode *add_id_node(const ID *id, const string &name = "");
+	IDDepsNode *add_id_node(ID *id, const string &name = "");
 	void remove_id_node(const ID *id);
 	void clear_id_nodes();
 
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cpp b/source/blender/depsgraph/intern/depsgraph_build.cpp
index 497f42c..f5c5630 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build.cpp
@@ -662,14 +662,6 @@ static void deg_graph_detect_cycles(Depsgraph *graph)
 // XXX: assume that this is called from outside, given the current scene as the "main" scene
 void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
 {
-	/* clear "LIB_DOIT" flag from all materials, etc.
-	 * to prevent infinite recursion problems later [#32017]
-	 */
-	BKE_main_id_tag_idcode(bmain, ID_MA, false);
-	BKE_main_id_tag_idcode(bmain, ID_LA, false);
-	BKE_main_id_tag_idcode(bmain, ID_WO, false);
-	BKE_main_id_tag_idcode(bmain, ID_TE, false);
-
 	/* 1) Generate all the nodes in the graph first */
 	DepsgraphNodeBuilder node_builder(bmain, graph);
 	/* create root node for scene first
@@ -677,14 +669,14 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
 	 *   reflecting its role as the entrypoint
 	 */
 	node_builder.add_root_node();
-	node_builder.build_scene(scene);
+	node_builder.build_scene(bmain, scene);
 
 	/* 2) Generate relationships between ID nodes and/or components, to make it easier to keep track
 	 *    of which datablocks use which ones (e.g. for checking which objects share the same geometry
 	 *    when we only know the shared datablock)
 	 */
 	DepsgraphIDUsersBuilder users_builder(graph);
-	users_builder.build_scene(scene);
+	users_builder.build_scene(bmain, scene);
 
 	/* 3) Hook up relationships between operations - to determine evaluation order */
 	DepsgraphRelationBuilder relation_builder(graph);
@@ -693,7 +685,7 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
 	 * it doesnt add any operations anyway and is not clear what part of the scene is to be connected.
 	 */
 	//relation_builder.add_relation(RootKey(), IDKey(scene), DEPSREL_TYPE_ROOT_TO_ACTIVE, "Root to Active Scene");
-	relation_builder.build_scene(scene);
+	relation_builder.build_scene(bmain, scene);
 
 	/* Detect and solve cycles. */
 	deg_graph_detect_cycles(graph);
diff --git a/source/blender/depsgraph/intern/depsgraph_build.h b/source/blender/depsgraph/intern/depsgraph_build.h
index 96f317f..9a7c9d4 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.h
+++ b/source/blender/depsgraph/intern/depsgraph_build.h
@@ -27,8 +27,6 @@
 #ifndef __DEPSGRAPH_BUILD_H__
 #define __DEPSGRAPH_BUILD_H__
 
-#include "depsgraph_util_id.h"
-
 struct ListBase;
 struct GHash;
 struct ID;
@@ -77,7 +75,7 @@ struct DepsgraphNodeBuilder {
 		return add_operation_node(id, comp_type, "", optype, op, opcode, description);
 	}
 
-	void build_scene(Scene *scene);
+	void build_scene(Main *bmain, Scene *scene);
 	SubgraphDepsNode *build_subgraph(Group *group);
 	void build_group(Group *group);
 	void build_object(Scene *scene, Base *base, Object *ob);
@@ -233,7 +231,7 @@ struct DepsgraphRelationBuilder
 	void add_node_handle_relation(const KeyType &key_from, const DepsNodeHandle *handle,
 	                              eDepsRelation_Type type, const string &description);
 
-	void build_scene(Scene *scene);
+	void build_scene(Main *bmain, Scene *scene);
 	void build_object(Scene *scene, Object *ob);
 	void build_object_parent(Object *ob);
 	void build_constraints(Scene *scene, ID *id, eDepsNode_Type component_type, const char *component_subdata,
@@ -282,7 +280,7 @@ struct DepsgraphIDUsersBuilder {
 	void add_relation(const ID *from_id, const ID *to_id,
 	                  eDepsRelation_Type type, const string &description);
 
-	void build_scene(Scene *scene);
+	void build_scene(Main *bmain, Scene *scene);
 	void build_object(Scene *scene, Object *ob);
 
 private:
diff --git a/source/blender/depsgraph/intern/depsgraph_build_idusers.cpp b/source/blender/depsgraph/intern/depsgraph_build_idusers.cpp
index 821440e..3c03e6f 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_idusers.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_idusers.cpp
@@ -107,7 +107,7 @@ extern "C" {
  *       For example, "ob.data" becomes "obdata -> object"
  */
 
-void DepsgraphIDUsersBuilder::build_scene(Scene *scene)
+void DepsgraphIDUsersBuilder::build_scene(Main *bmain, Scene *scene)
 {
 	/* scene set - do links to other scenes */
 	if (scene->set) {
diff --git a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
index e552839..0c60c18 100644
--- a/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
+++ b/source/blender/depsgraph/intern/depsgraph_build_nodes.cpp
@@ -102,8 +102,15 @@ extern "C" {
 /* ************************************************* */
 /* Node Builder */
 
-void DepsgraphNodeBuilder::build_scene(Scene *scene)
+void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
 {
+	/* LIB_DOIT is used to indicate whether node for given ID was already
+	 * created or not. This flag is being set in add_id_node(), so functions
+	 * shouldn't bother with setting it, they only might query this flag when
+	 * needed.
+	 */
+	BKE_main_id_tag_all(bmain, false);
+
 	/* scene ID block */
 	add_id_node(&scene->id);
 
@@ -114,7 +121,7 @@ void DepsgraphNodeBuilder::build_scene(Scene *scene)
 	// XXX: depending on how this goes, that scene itself could probably store its
 	//      own little partial depsgraph?
 	if (scene->set) {
-		build_scene(scene->set);
+		build_scene(bmain, scene->set);
 	}
 
 	/* scene objects */
@@ -136,17 +143,15 @@ void DepsgraphNodeBuilder::build_scene(Scene *scene)
 		 *       modifications...
 		 */
 		if (ob->dup_group) {
-			id_tag_set(&ob->dup_group->id);
+			ob->dup_group->id.flag |= LIB_DOIT;
 		}
 	}
 
 	/* tagged groups */
 	for (Group *group = (Group *)m_bmain->group.first; group; group = (Group *)group->id.next) {
-		if (id_is_tagged(&group->id)) {
+		if (group->id.flag & LIB_DOIT) {
 			// TODO: we need to make this group reliant on the object that spawned it...
 			build_subgraph(group);
-
-			id_tag_clear(&group->id);
 		}
 	}
 
@@ -405,14 +410,10 @@ OperationDepsNode *DepsgraphNodeBuilder::build_driver(ID *id, FCurve *fcu)
 /* Recursively build graph for world */
 void DepsgraphNodeBuilder::build_world(World *world)
 {
-	/* Prevent infinite recursion by checking (and tagging the world) as having been visited
-	 * already. This assumes wo->id.flag & LIB_DOIT isn't set by anything else
-	 * in the meantime... [#32017]
-	 */
 	ID *world_id = &world->id;
-	if (id_is_tagged(world_id))
+	if (world_id->flag & LIB_DOIT) {
 		return;
-	id_tag_set(world_id);
+	}
 
 	/* world itself */
 	IDDepsNode *world_node = add_id_node(world_id); /* world shading/params? */
@@ -428,8 +429,6 @@ void DepsgraphNodeBuilder::build_world(World *world)
 	if (world->nodetree) {
 		build_nodetree(world_node, world->nodetree);
 	}
-
-	id_tag_clear(world_id);
 }
 
 /* Rigidbody Simulation - Scene Level */
@@ -828,14 +827,9 @@ void DepsgraphNodeBuilder::build_lamp(Object *ob)
 {
 	Lamp *la = (Lamp *)ob->data;
 	ID *lamp_id = &la->id;
-
-	/* Prevent infinite recursion by checking (and tagging the lamp) as having been visited
-	 * already. This assumes la->id.flag & LIB_DOIT isn't set by anything else
-	 * in the meantime... [#32017]
-	 */
-	if (id_is_tagged(lamp_id))
+	if (lamp_id->flag & LIB_DOIT) {
 		return;
-	id_tag_set(lamp_id);
+	}
 
 	/* node for obdata */
 	ComponentDepsNode *param_node = add_component_node(lamp_id, DEPSNODE_TYPE_PARAMETERS);
@@ -847,8 +841,6 @@ void DepsgraphNodeBuilder::build_lamp(Object *ob)
 
 	/* textures */
 	build_texture_stack(param_node, la->mtex);
-
-	id_tag_clear(lamp_id);
 }
 
 void DepsgraphNodeBuilder::build_nodetree(DepsNode *owner_node, bNodeTree *ntree)
@@ -881,14 +873,10 @@ void DepsgraphNodeBuilder::build_nodetree(DepsNode *owner_node, bNodeTree *ntree
 /* Recursively build graph for material */
 void DepsgraphNodeBuilder::build_material(DepsNode *owner_node, Material *ma)
 {
-	/* Prevent infinite recursion by checking (and tagging the material) as having been visited
-	 * already. This assumes ma->id.flag & LIB_DOIT isn't set by anything else
-	 * in the meantime... [#32017]
-	 */
 	ID *ma_id = &ma->id;
-	if (id_is_tagged(ma_id))
+	if (ma_id->flag & LIB_DOIT) {
 		return;
-	id_tag_set(ma_id);
+	}
 
 	/* material itself */
 	add_id_node(ma_id);
@@ -905,8 +893,6 @@ void DepsgraphNodeBuilder::build_material(DepsNode *ow

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list