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:
-rw-r--r--source/blender/depsgraph/intern/depsgraph.cc3
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval.cc18
2 files changed, 21 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;
diff --git a/source/blender/depsgraph/intern/eval/deg_eval.cc b/source/blender/depsgraph/intern/eval/deg_eval.cc
index d3b49d275b9..02d286c3bd1 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval.cc
@@ -73,6 +73,7 @@ static void schedule_children(TaskPool *pool,
struct DepsgraphEvalState {
Depsgraph *graph;
bool do_stats;
+ bool is_cow_stage;
};
static void deg_task_run_func(TaskPool *pool,
@@ -214,6 +215,17 @@ static void schedule_node(TaskPool *pool, Depsgraph *graph,
if (node->num_links_pending != 0) {
return;
}
+ /* During the COW stage only schedule COW nodes. */
+ DepsgraphEvalState *state = (DepsgraphEvalState *)BLI_task_pool_userdata(pool);
+ if (state->is_cow_stage) {
+ if (node->owner->type != DEG_NODE_TYPE_COPY_ON_WRITE) {
+ return;
+ }
+ }
+ else {
+ BLI_assert(node->scheduled || node->owner->type != DEG_NODE_TYPE_COPY_ON_WRITE);
+ }
+ /* Actually schedule the node. */
bool is_scheduled = atomic_fetch_and_or_uint8(
(uint8_t *)&node->scheduled, (uint8_t)true);
if (!is_scheduled) {
@@ -312,6 +324,12 @@ void deg_evaluate_on_refresh(Depsgraph *graph)
/* Prepare all nodes for evaluation. */
initialize_execution(&state, graph);
/* Do actual evaluation now. */
+ /* First, process all Copy-On-Write nodes. */
+ state.is_cow_stage = true;
+ schedule_graph(task_pool, graph);
+ BLI_task_pool_work_wait_and_reset(task_pool);
+ /* After that, process all other nodes. */
+ state.is_cow_stage = false;
schedule_graph(task_pool, graph);
BLI_task_pool_work_and_wait(task_pool);
BLI_task_pool_free(task_pool);