diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-07 19:01:14 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2017-11-08 17:02:19 +0300 |
commit | 20988ed5dcec977c641a29f2cc948d4bdb6f86cd (patch) | |
tree | 55615ab40db56e1ba5a5a55f7f78de540ee84926 /source/blender | |
parent | 3750dfaa0a23130f1fc5200b67443ce68fa4d930 (diff) |
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?).
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/BKE_workspace.h | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 38 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/workspace.c | 14 | ||||
-rw-r--r-- | source/blender/depsgraph/intern/depsgraph_eval.cc | 1 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 9 |
5 files changed, 60 insertions, 11 deletions
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); } } |