Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-01-29 18:42:04 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-01-29 19:54:20 +0300
commit9577ebde79cb5deb696f70fd7d218d8b358b0263 (patch)
treee23f22ba835578dc6753848b9ef2ce8d7ab3bd6f /source
parent006c66b1ff5972c5badff7a7f53f638e27e24cd4 (diff)
Fix T53598: OpenGL Render Animation does not update shadows
General idea of the fix: skip the whole draw manager callback madness which was used to tag object's engine specific data as dirty. Use generic recalc flag in ObjectEngineData structure instead. This gives us the following benefits; - Sovles mentioned bug report. - Avoids whole interface lookup for opened viewports for EVERY changed ID. - Fixes missing updates when viewport is temporarily invisible. Reviewers: dfelinto, fclem Differential Revision: https://developer.blender.org/D3028
Diffstat (limited to 'source')
-rw-r--r--source/blender/depsgraph/intern/eval/deg_eval_flush.cc20
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c46
-rw-r--r--source/blender/draw/intern/draw_manager.c4
-rw-r--r--source/blender/editors/render/render_update.c38
-rw-r--r--source/blender/makesdna/DNA_object_types.h2
5 files changed, 50 insertions, 60 deletions
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index 04bfb200743..c0d5e08b80f 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -36,6 +36,7 @@
#include <deque>
#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
#include "BLI_task.h"
#include "BLI_ghash.h"
@@ -207,10 +208,21 @@ BLI_INLINE OperationDepsNode *flush_schedule_children(
return result;
}
+void flush_engine_data_update(ID *id)
+{
+ if (GS(id->name) != ID_OB) {
+ return;
+ }
+ Object *object = (Object *)id;
+ BLI_LISTBASE_FOREACH(ObjectEngineData *, engine_data, &object->drawdata) {
+ engine_data->recalc |= id->recalc;
+ }
+}
+
/* NOTE: It will also accumulate flags from changed components. */
-BLI_INLINE void flush_editors_id_update(Main *bmain,
- Depsgraph *graph,
- const DEGEditorUpdateContext *update_ctx)
+void flush_editors_id_update(Main *bmain,
+ Depsgraph *graph,
+ const DEGEditorUpdateContext *update_ctx)
{
foreach (IDDepsNode *id_node, graph->id_nodes) {
if (id_node->done != ID_STATE_MODIFIED) {
@@ -241,6 +253,8 @@ BLI_INLINE void flush_editors_id_update(Main *bmain,
/* Inform editors. */
if (deg_copy_on_write_is_expanded(id_cow)) {
deg_editors_id_update(update_ctx, id_cow);
+ /* Inform draw engines that something was changed. */
+ flush_engine_data_update(id_cow);
}
}
}
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index fe2beb4b557..d06aac18877 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -294,30 +294,38 @@ static void eevee_view_update(void *vedata)
}
}
-static void eevee_id_update(void *UNUSED(vedata), ID *id)
+static void eevee_id_object_update(void *UNUSED(vedata), Object *object)
{
/* This is a bit mask of components which update is to be ignored. */
const int ignore_updates = ID_RECALC_COLLECTIONS;
- /* Check whether we have to do anything here. */
- if ((id->recalc & ~ignore_updates) == 0) {
- return;
+ const int allowed_updates = ~ignore_updates;
+ EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_get(object);
+ if (ped != NULL && (ped->engine_data.recalc & allowed_updates) != 0) {
+ ped->need_full_update = true;
+ ped->engine_data.recalc = 0;
+ }
+ EEVEE_LampEngineData *led = EEVEE_lamp_data_get(object);
+ if (led != NULL && (led->engine_data.recalc & allowed_updates) != 0) {
+ led->need_update = true;
+ led->engine_data.recalc = 0;
+ }
+ EEVEE_ObjectEngineData *oedata = EEVEE_object_data_get(object);
+ if (oedata != NULL && (oedata->engine_data.recalc & allowed_updates) != 0) {
+ oedata->need_update = true;
+ oedata->engine_data.recalc = 0;
}
+}
+
+static void eevee_id_update(void *vedata, ID *id)
+{
/* Handle updates based on ID type. */
- const ID_Type id_type = GS(id->name);
- if (id_type == ID_OB) {
- Object *object = (Object *)id;
- EEVEE_LightProbeEngineData *ped = EEVEE_lightprobe_data_get(object);
- if (ped != NULL) {
- ped->need_full_update = true;
- }
- EEVEE_LampEngineData *led = EEVEE_lamp_data_get(object);
- if (led != NULL) {
- led->need_update = true;
- }
- EEVEE_ObjectEngineData *oedata = EEVEE_object_data_get(object);
- if (oedata != NULL) {
- oedata->need_update = true;
- }
+ switch (GS(id->name)) {
+ case ID_OB:
+ eevee_id_object_update(vedata, (Object *)id);
+ break;
+ default:
+ /* pass */
+ break;
}
}
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index a9cb3ad77f5..70b246047a9 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -2868,6 +2868,10 @@ static void drw_engines_cache_populate(Object *ob)
DrawEngineType *engine = link->data;
ViewportEngineData *data = DRW_viewport_engine_data_ensure(engine);
+ if (engine->id_update) {
+ engine->id_update(data, &ob->id);
+ }
+
if (engine->cache_populate) {
engine->cache_populate(data, ob);
}
diff --git a/source/blender/editors/render/render_update.c b/source/blender/editors/render/render_update.c
index eebe69b7a19..4943222f038 100644
--- a/source/blender/editors/render/render_update.c
+++ b/source/blender/editors/render/render_update.c
@@ -542,8 +542,6 @@ void ED_render_id_flush_update(const DEGEditorUpdateContext *update_ctx, ID *id)
return;
}
Main *bmain = update_ctx->bmain;
- Scene *scene = update_ctx->scene;
- ViewLayer *view_layer = update_ctx->view_layer;
/* Internal ID update handlers. */
switch (GS(id->name)) {
case ID_MA:
@@ -570,42 +568,6 @@ void ED_render_id_flush_update(const DEGEditorUpdateContext *update_ctx, ID *id)
render_engine_flag_changed(bmain, RE_ENGINE_UPDATE_OTHER);
break;
}
- /* Inform all draw managers about changes.
- *
- * TODO(sergey): This code is run for every updated ID, via flushing
- * mechanism. How can we avoid iterating over the whole interface for
- * every of those IDs? One of the ideas would be to call draw manager's
- * ID update which is not bound to any of contexts.
- */
- {
- wmWindowManager *wm = bmain->wm.first;
- for (wmWindow *win = wm->windows.first; win; win = win->next) {
- bScreen *sc = WM_window_get_active_screen(win);
- WorkSpace *workspace = BKE_workspace_active_get(win->workspace_hook);
- ViewRender *view_render = BKE_viewrender_get(win->scene, workspace);
- for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {
- if (sa->spacetype != SPACE_VIEW3D) {
- continue;
- }
- for (ARegion *ar = sa->regionbase.first; ar; ar = ar->next) {
- if (ar->regiontype != RGN_TYPE_WINDOW) {
- continue;
- }
- RenderEngineType *engine_type = RE_engines_find(view_render->engine_id);
- DRW_notify_id_update(
- (&(DRWUpdateContext){
- .bmain = bmain,
- .scene = scene,
- .view_layer = view_layer,
- .ar = ar,
- .v3d = (View3D *)sa->spacedata.first,
- .engine_type = engine_type
- }),
- id);
- }
- }
- }
- }
}
diff --git a/source/blender/makesdna/DNA_object_types.h b/source/blender/makesdna/DNA_object_types.h
index d62ec746309..7c3ef5e72be 100644
--- a/source/blender/makesdna/DNA_object_types.h
+++ b/source/blender/makesdna/DNA_object_types.h
@@ -86,6 +86,8 @@ typedef struct ObjectEngineData {
struct DrawEngineType *engine_type;
/* Only nested data, NOT the engine data itself. */
ObjectEngineDataFreeCb free;
+ /* Accumulated recalc flags, which corresponds to ID->recalc flags. */
+ int recalc;
} ObjectEngineData;
#define MAX_VGROUP_NAME 64