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.
This commit is contained in:
Sergey Sharybin
2017-11-24 10:04:20 +01:00
parent a5d763a11e
commit c1f690428c
3 changed files with 23 additions and 22 deletions

View File

@@ -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_;

View File

@@ -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

View File

@@ -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,