[Bf-blender-cvs] [38cfd7b9e75] blender2.8: Depsgraph: Fix crash with copy-on-write enabled after recent changes

Sergey Sharybin noreply at git.blender.org
Thu Jul 13 15:24:44 CEST 2017


Commit: 38cfd7b9e75b6c93888c80979b91896df1de3b30
Author: Sergey Sharybin
Date:   Thu Jul 13 14:57:19 2017 +0200
Branches: blender2.8
https://developer.blender.org/rB38cfd7b9e75b6c93888c80979b91896df1de3b30

Depsgraph: Fix crash with copy-on-write enabled after recent changes

The issue was caused by original datablock being returned where we
were expecting copy-on-written one to be returned.

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

M	source/blender/blenkernel/intern/layer.c

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

diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c
index 6d131810216..a0250ac8dfc 100644
--- a/source/blender/blenkernel/intern/layer.c
+++ b/source/blender/blenkernel/intern/layer.c
@@ -81,7 +81,7 @@ SceneLayer *BKE_scene_layer_render_active(const Scene *scene)
 /**
  * Returns the SceneLayer to be used for drawing, outliner, and other context related areas.
  */
-SceneLayer *BKE_scene_layer_context_active_ex(const Main *bmain, const Scene *UNUSED(scene))
+SceneLayer *BKE_scene_layer_context_active_ex(const Main *bmain, const Scene *scene)
 {
 	/* XXX We should really pass the workspace as argument, but would require
 	 * some bigger changes since it's often not available where we call this.
@@ -90,7 +90,21 @@ SceneLayer *BKE_scene_layer_context_active_ex(const Main *bmain, const Scene *UN
 		/* Called on startup, so 'winactive' may not be set, in that case fall back to first window. */
 		wmWindow *win = wm->winactive ? wm->winactive : wm->windows.first;
 		const WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook);
-		return BKE_workspace_render_layer_get(workspace);
+		SceneLayer *scene_layer = BKE_workspace_render_layer_get(workspace);
+		if (scene_layer != NULL) {
+			/* NOTE: We never have copy-on-written main database, but we might
+			 * be passing copy-on-write version of scene here. For that case
+			 * we always ensure we are returning copy-on-write version of scene
+			 * layer as well.
+			 */
+
+			/* TODO(sergey): This will make an extra lookup for case when we
+			 * pass original scene, but this function is to be rewritten
+			 * anyway.
+			 */
+			scene_layer = BLI_findstring(&scene->render_layers, scene_layer->name, offsetof(SceneLayer, name));
+		}
+		return scene_layer;
 	}
 
 	return NULL;




More information about the Bf-blender-cvs mailing list