[Bf-blender-cvs] [9577ebde79c] blender2.8: Fix T53598: OpenGL Render Animation does not update shadows

Sergey Sharybin noreply at git.blender.org
Mon Jan 29 18:02:38 CET 2018


Commit: 9577ebde79cb5deb696f70fd7d218d8b358b0263
Author: Sergey Sharybin
Date:   Mon Jan 29 16:42:04 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB9577ebde79cb5deb696f70fd7d218d8b358b0263

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

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

M	source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/intern/draw_manager.c
M	source/blender/editors/render/render_update.c
M	source/blender/makesdna/DNA_object_types.h

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

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



More information about the Bf-blender-cvs mailing list