Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Gavrilov <angavrilov@gmail.com>2018-12-04 13:58:29 +0300
committerAlexander Gavrilov <angavrilov@gmail.com>2018-12-04 14:08:50 +0300
commitb97cd0e6908b133514232c57509861ca06eca91e (patch)
tree2af01434f1fd5402af1a9ece5ef53286ce0022b3 /source/blender/depsgraph/intern/depsgraph.cc
parent01581d4a1eb595f2bb49d4b87aebfa8bd67ceb38 (diff)
Depsgraph: execute all COPY_ON_WRITE nodes first as a separate stage.
COW nodes in the graph are mostly connected via a relation type that doesn't propagate the update flags. Unfortunately, due to the scheduling implementation that means the relations don't actually guarantee execution order for indirect dependencies. Relations also don't guarantee order in case of cycles. As mentioned in IRC, the simplest way to fix possible problems is to execute all COW nodes as a separate execution stage. This seems to fix crashes with Data Transfer modifier in a cycle. Staging works by simply delaying actual scheduling of tasks for non-COW nodes until the second run of schedule_graph. Reviewers: sergey Differential Revision: https://developer.blender.org/D4027
Diffstat (limited to 'source/blender/depsgraph/intern/depsgraph.cc')
-rw-r--r--source/blender/depsgraph/intern/depsgraph.cc3
1 files changed, 3 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph.cc b/source/blender/depsgraph/intern/depsgraph.cc
index 664d30fdaf6..f3f4d788da2 100644
--- a/source/blender/depsgraph/intern/depsgraph.cc
+++ b/source/blender/depsgraph/intern/depsgraph.cc
@@ -405,6 +405,9 @@ DepsRelation *Depsgraph::add_new_relation(OperationDepsNode *from,
rel->flag |= flags;
return rel;
}
+ /* COW nodes can only depend on other COW nodes. */
+ BLI_assert(to->owner->type != DEG_NODE_TYPE_COPY_ON_WRITE ||
+ from->owner->type == DEG_NODE_TYPE_COPY_ON_WRITE);
/* Create new relation, and add it to the graph. */
rel = OBJECT_GUARDED_NEW(DepsRelation, from, to, description);
rel->flag |= flags;