From bc989497deeaf2ec79ccfbe7b5e43509eb867b06 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 10 Jan 2014 15:39:06 +0600 Subject: Fix T38139: Objects which are in cyclic dependency are not updated Graph traversal which is based on counting parents which are still to be updated fails in cases there are cycles in the graph. If there are cyclic dependencies in the scene all the objects from the cycles will be updated in a single thread now one by one. This makes blender behave the same way as it was before multi-threaded DAG landed to master. This needed to tweak depsgraph a bit so now dag_check_cycle() sets is_acyclic field of DAG forest if there are cycles in the graph. TODO: It might be possible to save some time on evaluation when all the tagged objects were updated in multi-threaded DAG traversal. --- source/blender/blenkernel/intern/depsgraph.c | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'source/blender/blenkernel/intern/depsgraph.c') diff --git a/source/blender/blenkernel/intern/depsgraph.c b/source/blender/blenkernel/intern/depsgraph.c index 01327452831..ea76ff291e5 100644 --- a/source/blender/blenkernel/intern/depsgraph.c +++ b/source/blender/blenkernel/intern/depsgraph.c @@ -1193,6 +1193,8 @@ static void dag_check_cycle(DagForest *dag) DagNode *node; DagAdjList *itA; + dag->is_acyclic = true; + /* debugging print */ if (dag_print_dependencies) for (node = dag->DagNode.first; node; node = node->next) @@ -1213,6 +1215,7 @@ static void dag_check_cycle(DagForest *dag) for (itA = node->parent; itA; itA = itA->next) { if (itA->node->ancestor_count > node->ancestor_count) { if (node->ob && itA->node->ob) { + dag->is_acyclic = false; printf("Dependency cycle detected:\n"); dag_node_print_dependency_cycle(dag, itA->node, node, itA->name); } @@ -2904,3 +2907,7 @@ short DAG_get_eval_flags_for_object(struct Scene *scene, void *object) return node->eval_flags; } +bool DAG_is_acyclic(Scene *scene) +{ + return scene->theDag->is_acyclic; +} -- cgit v1.2.3