[Bf-blender-cvs] [3dde21f97ef] blender2.8: Depsgraph: Fix broken copy-on-write draw after ownership changes

Sergey Sharybin noreply at git.blender.org
Thu Nov 9 16:43:34 CET 2017


Commit: 3dde21f97ef6a7b4c2dfb1dc196530de04a1576a
Author: Sergey Sharybin
Date:   Thu Nov 9 16:42:10 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB3dde21f97ef6a7b4c2dfb1dc196530de04a1576a

Depsgraph: Fix broken copy-on-write draw after ownership changes

Need to build layer collections callbacks using proper CoW pointer.

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

M	source/blender/depsgraph/intern/builder/deg_builder_nodes_layer_collection.cc
M	source/blender/depsgraph/intern/depsgraph_query.cc

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

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 b3dc293b13b..3d099416d1e 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
@@ -99,13 +99,19 @@ void DepsgraphNodeBuilder::build_scene_layer_collections(
         SceneLayer *scene_layer)
 {
 	Scene *scene_cow;
+	SceneLayer *scene_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_);
+		scene_layer_cow = (SceneLayer *)BLI_findstring(
+		        &scene_cow->render_layers,
+		        scene_layer->name,
+		        offsetof(SceneLayer, name));
 	}
 	else {
 		scene_cow = scene_;
+		scene_layer_cow = scene_layer;
 	}
 
 	LayerCollectionState state;
@@ -117,17 +123,17 @@ void DepsgraphNodeBuilder::build_scene_layer_collections(
 	                   function_bind(BKE_layer_eval_layer_collection_pre,
 	                                 _1,
 	                                 scene_cow,
-	                                 scene_layer),
+	                                 scene_layer_cow),
 	                   DEG_OPCODE_SCENE_LAYER_INIT,
 	                   scene_layer->name);
 	add_operation_node(comp,
 	                   function_bind(BKE_layer_eval_layer_collection_post,
 	                                 _1,
-	                                 scene_layer),
+	                                 scene_layer_cow),
 	                   DEG_OPCODE_SCENE_LAYER_DONE,
 	                   scene_layer->name);
 	state.parent = NULL;
-	build_layer_collections(&scene_layer->layer_collections, &state);
+	build_layer_collections(&scene_layer_cow->layer_collections, &state);
 }
 
 }  // namespace DEG
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc
index 8b451ccee32..940cadba872 100644
--- a/source/blender/depsgraph/intern/depsgraph_query.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query.cc
@@ -92,7 +92,13 @@ Scene *DEG_get_evaluated_scene(Depsgraph *graph)
 SceneLayer *DEG_get_evaluated_scene_layer(Depsgraph *graph)
 {
 	DEG::Depsgraph *deg_graph = reinterpret_cast<DEG::Depsgraph *>(graph);
-	return deg_graph->scene_layer;
+	Scene *scene_cow = DEG_get_evaluated_scene(graph);
+	SceneLayer *scene_layer_orig = deg_graph->scene_layer;
+	SceneLayer *scene_layer_cow =
+	        (SceneLayer *)BLI_findstring(&scene_cow->render_layers,
+	                                     scene_layer_orig->name,
+	                                     offsetof(SceneLayer, name));
+	return scene_layer_cow;
 }
 
 Object *DEG_get_evaluated_object(Depsgraph *depsgraph, Object *object)



More information about the Bf-blender-cvs mailing list