[Bf-blender-cvs] [c1f690428cc] blender2.8: Depsgraph: Create CoW copy of scene early on

Sergey Sharybin noreply at git.blender.org
Fri Nov 24 10:45:26 CET 2017


Commit: c1f690428ccf3e602cbee72308e7f42477d8bf41
Author: Sergey Sharybin
Date:   Fri Nov 24 10:04:20 2017 +0100
Branches: blender2.8
https://developer.blender.org/rBc1f690428ccf3e602cbee72308e7f42477d8bf41

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.

===================================================================

M	source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc
M	source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc

===================================================================

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,



More information about the Bf-blender-cvs mailing list