[Bf-blender-cvs] [20988ed5dce] blender2.8: Depsgraph: Move storage from single per-scene depsgraph to a hash storage

Sergey Sharybin noreply at git.blender.org
Wed Nov 8 15:15:16 CET 2017


Commit: 20988ed5dcec977c641a29f2cc948d4bdb6f86cd
Author: Sergey Sharybin
Date:   Tue Nov 7 17:01:14 2017 +0100
Branches: blender2.8
https://developer.blender.org/rB20988ed5dcec977c641a29f2cc948d4bdb6f86cd

Depsgraph: Move storage from single per-scene depsgraph to a hash storage

Depsgraph itself is still created fer the whole scene rather than for a
single layer, this is to be addressed next.

The storage for those dependency graphs is in scene, but now it is a hash
indexed by layer. In the future we can extend hash key to include extra
information (workspace? window?).

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

M	source/blender/blenkernel/BKE_workspace.h
M	source/blender/blenkernel/intern/scene.c
M	source/blender/blenkernel/intern/workspace.c
M	source/blender/depsgraph/intern/depsgraph_eval.cc
M	source/blender/windowmanager/intern/wm_event_system.c

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

diff --git a/source/blender/blenkernel/BKE_workspace.h b/source/blender/blenkernel/BKE_workspace.h
index bff40d7c85b..b48fa678531 100644
--- a/source/blender/blenkernel/BKE_workspace.h
+++ b/source/blender/blenkernel/BKE_workspace.h
@@ -28,6 +28,9 @@
 #include "BLI_compiler_attrs.h"
 
 struct bScreen;
+struct EvaluationContext;
+struct Main;
+struct Scene;
 struct TransformOrientation;
 
 /**
@@ -121,6 +124,12 @@ struct ViewRender *BKE_workspace_view_render_get(struct WorkSpace *workspace) GE
 bool BKE_workspace_use_scene_settings_get(const struct WorkSpace *workspace) GETTER_ATTRS;
 void BKE_workspace_use_scene_settings_set(struct WorkSpace *workspace, bool value) SETTER_ATTRS;
 
+/* Update / evaluate */
+void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
+                                 struct Main *bmain,
+                                 struct WorkSpace *workspace,
+                                 struct Scene *scene);
+
 #undef GETTER_ATTRS
 #undef SETTER_ATTRS
 
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index f5aa6223d5d..dfa9227b679 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -1587,6 +1587,9 @@ static void prepare_mesh_for_viewport_render(Main *bmain, Scene *scene)
 	}
 }
 
+/* TODO(sergey): This actually should become scene_layer_graph or so.
+ * Same applies to update_for_newframe.
+ */
 void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx,
                                    Depsgraph *depsgraph,
                                    Main *bmain,
@@ -2436,10 +2439,37 @@ Depsgraph *BKE_scene_get_depsgraph(Scene *scene,
                                    SceneLayer *scene_layer,
                                    bool allocate)
 {
-	(void) scene_layer;
-	Depsgraph *depsgraph = scene->depsgraph_legacy;
-	if (depsgraph == NULL && allocate) {
-		scene->depsgraph_legacy = depsgraph = DEG_graph_new();
+	BLI_assert(scene != NULL);
+	BLI_assert(scene_layer != NULL);
+	/* Make sure hash itself exists. */
+	if (allocate) {
+		BKE_scene_ensure_depsgraph_hash(scene);
+	}
+	if (scene->depsgraph_hash == NULL) {
+		return NULL;
+	}
+	/* Either ensure item is in the hash or simply return NULL if it's not,
+	 * depending on whether caller wants us to create depsgraph or not.
+	 */
+	DepsgraphKey key;
+	key.scene_layer = scene_layer;
+	Depsgraph *depsgraph;
+	if (allocate) {
+		DepsgraphKey **key_ptr;
+		Depsgraph **depsgraph_ptr;
+		if (!BLI_ghash_ensure_p_ex(scene->depsgraph_hash,
+		                           &key,
+		                           (void***)&key_ptr,
+		                           (void***)&depsgraph_ptr))
+		{
+			*key_ptr = MEM_mallocN(sizeof(DepsgraphKey), __func__);
+			**key_ptr = key;
+			*depsgraph_ptr = DEG_graph_new();
+		}
+		depsgraph = *depsgraph_ptr;
+	}
+	else {
+		depsgraph = BLI_ghash_lookup(scene->depsgraph_hash, &key);
 	}
 	return depsgraph;
 }
diff --git a/source/blender/blenkernel/intern/workspace.c b/source/blender/blenkernel/intern/workspace.c
index 04b18e6ecdb..79e1af810a5 100644
--- a/source/blender/blenkernel/intern/workspace.c
+++ b/source/blender/blenkernel/intern/workspace.c
@@ -469,3 +469,17 @@ void BKE_workspace_use_scene_settings_set(WorkSpace *workspace, bool value)
 		workspace->flags &= ~WORKSPACE_USE_SCENE_SETTINGS;
 	}
 }
+
+/* Update / evaluate */
+
+void BKE_workspace_update_tagged(struct EvaluationContext *eval_ctx,
+                                 Main *bmain,
+                                 WorkSpace *workspace,
+                                 Scene *scene)
+{
+	SceneLayer *scene_layer = BKE_workspace_render_layer_get(workspace);
+	struct Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene,
+	                                                      scene_layer,
+	                                                      true);
+	BKE_scene_graph_update_tagged(eval_ctx, depsgraph, bmain, scene);
+}
diff --git a/source/blender/depsgraph/intern/depsgraph_eval.cc b/source/blender/depsgraph/intern/depsgraph_eval.cc
index 6dbbba0391b..00b07307933 100644
--- a/source/blender/depsgraph/intern/depsgraph_eval.cc
+++ b/source/blender/depsgraph/intern/depsgraph_eval.cc
@@ -89,6 +89,7 @@ void DEG_evaluation_context_init_from_scene(EvaluationContext *eval_ctx,
 	eval_ctx->scene_layer = scene_layer;
 	eval_ctx->engine = engine;
 	eval_ctx->ctime = BKE_scene_frame_get(scene);
+	BLI_assert(eval_ctx->depsgraph != NULL);
 }
 
 /* Free evaluation context. */
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index ba3dab60972..7701e501591 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -311,13 +311,8 @@ void wm_event_do_refresh_wm_and_depsgraph(bContext *C)
 			/* XXX, hack so operators can enforce datamasks [#26482], gl render */
 			scene->customdata_mask |= scene->customdata_mask_modal;
 
-			for (SceneLayer *scene_layer = scene->render_layers.first;
-			     scene_layer != NULL;
-			     scene_layer = scene_layer->next)
-			{
-				Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, scene_layer, true);
-				BKE_scene_graph_update_tagged(bmain->eval_ctx, depsgraph, bmain, scene);
-			}
+			WorkSpace *workspace = WM_window_get_active_workspace(win);
+			BKE_workspace_update_tagged(bmain->eval_ctx, bmain, workspace, scene);
 		}
 	}



More information about the Bf-blender-cvs mailing list