diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-04-12 12:03:24 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-04-12 12:05:18 +0300 |
commit | 31067c975759255c013a2b4d872082155d41479e (patch) | |
tree | e0a99168cf06933404e2fe892719b24d4e5c4b29 /source/blender/depsgraph/intern | |
parent | 15698f99070f4d196dbfbac63d3634019c4d1ca9 (diff) |
Depsgraph: Move CoW tag to ID datablock tag
Unless there is an external action from an user, there should not
be need in re-copying original datablock to a copied one.
This brings performance up from 5fps to 11fps with Spring runcycle
(performance in master is 14fps).
Diffstat (limited to 'source/blender/depsgraph/intern')
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_tag.cc | 7 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/eval/deg_eval_flush.cc | 20 |
2 files changed, 9 insertions, 18 deletions
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index a230732291c..d1de12f4591 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -280,6 +280,13 @@ void depsgraph_tag_component(Depsgraph *graph, operation_node->tag_update(graph); } } + /* If component depends on copy-on-write, tag it as well. */ + if (DEG_depsgraph_use_copy_on_write() && component_node->depends_on_cow()) { + ComponentDepsNode *cow_comp = + id_node->find_component(DEG_NODE_TYPE_COPY_ON_WRITE); + cow_comp->tag_update(graph); + id_node->id_orig->recalc |= ID_RECALC_COPY_ON_WRITE; + } } /* This is a tag compatibility with legacy code. diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc index c22d27c118b..f7f55610d22 100644 --- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc +++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc @@ -135,10 +135,8 @@ BLI_INLINE void flush_handle_id_node(IDDepsNode *id_node) } /* TODO(sergey): We can reduce number of arguments here. */ -BLI_INLINE void flush_handle_component_node(Depsgraph *graph, - IDDepsNode *id_node, +BLI_INLINE void flush_handle_component_node(IDDepsNode *id_node, ComponentDepsNode *comp_node, - bool use_copy_on_write, FlushQueue *queue) { /* We only handle component once. */ @@ -146,17 +144,6 @@ BLI_INLINE void flush_handle_component_node(Depsgraph *graph, return; } comp_node->done = COMPONENT_STATE_DONE; - /* Currently this is needed to get object->mesh to be replaced with - * original mesh (rather than being evaluated_mesh). - * - * TODO(sergey): This is something we need to avoid. - */ - if (use_copy_on_write && comp_node->depends_on_cow()) { - ComponentDepsNode *cow_comp = - id_node->find_component(DEG_NODE_TYPE_COPY_ON_WRITE); - cow_comp->tag_update(graph); - id_node->id_orig->recalc |= ID_RECALC_COPY_ON_WRITE; - } /* Tag all required operations in component for update. */ foreach (OperationDepsNode *op, comp_node->operations) { /* We don't want to flush tags in "upstream" direction for @@ -267,7 +254,6 @@ void flush_editors_id_update(Main *bmain, */ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph) { - const bool use_copy_on_write = DEG_depsgraph_use_copy_on_write(); /* Sanity checks. */ BLI_assert(bmain != NULL); BLI_assert(graph != NULL); @@ -297,10 +283,8 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph) ComponentDepsNode *comp_node = op_node->owner; IDDepsNode *id_node = comp_node->owner; flush_handle_id_node(id_node); - flush_handle_component_node(graph, - id_node, + flush_handle_component_node(id_node, comp_node, - use_copy_on_write, &queue); /* Flush to nodes along links. */ op_node = flush_schedule_children(op_node, &queue); |