diff options
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph.cc | 3 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval.cc | 18 |
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); |