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);
                }
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to