diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-24 12:04:20 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-24 12:19:48 +0300 |
commit | c1f690428ccf3e602cbee72308e7f42477d8bf41 (patch) | |
tree | 292002aba7ee09693f5ff8ceb7fdba62760e370f /source | |
parent | a5d763a11ee46fff12d53e8cb21b3ab45fa2c64d (diff) |
Depsgraph: Create CoW copy of scene early on
Originally this only needed for view collections, but it will be needed for
bases really soon as well.
Diffstat (limited to 'source')
3 files changed, 23 insertions, 22 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 00109eeafcc..84ae993ba17 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -206,7 +206,7 @@ struct DepsgraphNodeBuilder { LayerCollectionState *state); void build_layer_collections(ListBase *layer_collections, LayerCollectionState *state); - void build_view_layer_collections(ViewLayer *view_layer); + void build_view_layer_collections(Scene *scene, ViewLayer *view_layer); protected: /* State which never changes, same for the whole builder time. */ Main *bmain_; diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc index 71303db54ef..4d4bf2e4ffe 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc @@ -98,24 +98,9 @@ void DepsgraphNodeBuilder::build_layer_collections(ListBase *layer_collections, } void DepsgraphNodeBuilder::build_view_layer_collections( + Scene *scene, ViewLayer *view_layer) { - Scene *scene_cow; - ViewLayer *view_layer_cow; - if (DEG_depsgraph_use_copy_on_write()) { - /* Make sure we've got ID node, so we can get pointer to CoW datablock. - */ - scene_cow = expand_cow_datablock(scene_); - view_layer_cow = (ViewLayer *)BLI_findstring( - &scene_cow->view_layers, - view_layer->name, - offsetof(ViewLayer, name)); - } - else { - scene_cow = scene_; - view_layer_cow = view_layer; - } - LayerCollectionState state; state.index = 0; ComponentDepsNode *comp = add_component_node( @@ -124,16 +109,16 @@ void DepsgraphNodeBuilder::build_view_layer_collections( add_operation_node(comp, function_bind(BKE_layer_eval_layer_collection_pre, _1, - scene_cow, - view_layer_cow), + scene, + view_layer), DEG_OPCODE_VIEW_LAYER_INIT); add_operation_node(comp, function_bind(BKE_layer_eval_layer_collection_post, _1, - view_layer_cow), + view_layer), DEG_OPCODE_VIEW_LAYER_DONE); state.parent = NULL; - build_layer_collections(&view_layer_cow->layer_collections, &state); + build_layer_collections(&view_layer->layer_collections, &state); } } // namespace DEG diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc index 20dc239c6d0..96a7108d153 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc @@ -69,6 +69,22 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, ViewLayer *view_layer, eDepsNode_LinkedState_Type linked_state) { + Scene *scene_cow; + ViewLayer *view_layer_cow; + if (DEG_depsgraph_use_copy_on_write()) { + /* Make sure we've got ID node, so we can get pointer to CoW datablock. + */ + scene_cow = expand_cow_datablock(scene); + view_layer_cow = (ViewLayer *)BLI_findstring( + &scene_cow->view_layers, + view_layer->name, + offsetof(ViewLayer, name)); + } + else { + scene_cow = scene; + view_layer_cow = view_layer; + } + /* scene ID block */ add_id_node(&scene->id); @@ -141,7 +157,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, } /* Collections. */ - build_view_layer_collections(view_layer); + build_view_layer_collections(scene_cow, view_layer_cow); /* Parameters evaluation for scene relations mainly. */ add_operation_node(&scene->id, |