[Bf-blender-cvs] [5c9754c3aa3] blender2.8: Eevee: Fix assert when baking lightprobes.

Clément Foucault noreply at git.blender.org
Fri Jul 27 17:35:24 CEST 2018


Commit: 5c9754c3aa3f2cb9922d76cb73611cd01192895f
Author: Clément Foucault
Date:   Fri Jul 27 17:33:53 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB5c9754c3aa3f2cb9922d76cb73611cd01192895f

Eevee: Fix assert when baking lightprobes.

The GPU context was freed before all framebuffer attached to it were
deleted.

Fix T56117

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

M	source/blender/draw/engines/eevee/eevee_data.c
M	source/blender/draw/engines/eevee/eevee_lightcache.c
M	source/blender/draw/engines/eevee/eevee_private.h

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

diff --git a/source/blender/draw/engines/eevee/eevee_data.c b/source/blender/draw/engines/eevee/eevee_data.c
index 96e784b524c..636e532555f 100644
--- a/source/blender/draw/engines/eevee/eevee_data.c
+++ b/source/blender/draw/engines/eevee/eevee_data.c
@@ -30,7 +30,7 @@
 #include "eevee_private.h"
 #include "eevee_lightcache.h"
 
-static void eevee_view_layer_data_free(void *storage)
+void EEVEE_view_layer_data_free(void *storage)
 {
 	EEVEE_ViewLayerData *sldata = (EEVEE_ViewLayerData *)storage;
 
@@ -77,7 +77,7 @@ EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void)
 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure_ex(struct ViewLayer *view_layer)
 {
 	EEVEE_ViewLayerData **sldata = (EEVEE_ViewLayerData **)DRW_view_layer_engine_data_ensure_ex(
-	        view_layer, &draw_engine_eevee_type, &eevee_view_layer_data_free);
+	        view_layer, &draw_engine_eevee_type, &EEVEE_view_layer_data_free);
 
 	if (*sldata == NULL) {
 		*sldata = MEM_callocN(sizeof(**sldata), "EEVEE_ViewLayerData");
@@ -89,7 +89,7 @@ EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure_ex(struct ViewLayer *view_laye
 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void)
 {
 	EEVEE_ViewLayerData **sldata = (EEVEE_ViewLayerData **)DRW_view_layer_engine_data_ensure(
-	        &draw_engine_eevee_type, &eevee_view_layer_data_free);
+	        &draw_engine_eevee_type, &EEVEE_view_layer_data_free);
 
 	if (*sldata == NULL) {
 		*sldata = MEM_callocN(sizeof(**sldata), "EEVEE_ViewLayerData");
diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.c b/source/blender/draw/engines/eevee/eevee_lightcache.c
index 4f5ad5159cf..b0b66ee50dc 100644
--- a/source/blender/draw/engines/eevee/eevee_lightcache.c
+++ b/source/blender/draw/engines/eevee/eevee_lightcache.c
@@ -93,6 +93,7 @@ typedef struct EEVEE_LightBake {
 	LightCache *lcache;
 	Scene *scene;
 	struct Main *bmain;
+	EEVEE_ViewLayerData *sldata;
 
 	LightProbe **probe;              /* Current probe being rendered. */
 	GPUTexture *rt_color;            /* Target cube color texture. */
@@ -597,6 +598,12 @@ static void eevee_lightbake_delete_resources(EEVEE_LightBake *lbake)
 		lbake->lcache = NULL;
 	}
 
+	/* XXX Free the resources contained in the viewlayer data
+	 * to be able to free the context before deleting the depsgraph.  */
+	if (lbake->sldata) {
+		EEVEE_view_layer_data_free(lbake->sldata);
+	}
+
 	DRW_TEXTURE_FREE_SAFE(lbake->rt_depth);
 	DRW_TEXTURE_FREE_SAFE(lbake->rt_color);
 	DRW_TEXTURE_FREE_SAFE(lbake->grid_prev);
@@ -633,6 +640,8 @@ static void eevee_lightbake_cache_create(EEVEE_Data *vedata, EEVEE_LightBake *lb
 	EEVEE_FramebufferList *fbl = vedata->fbl;
 	EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure();
 	Scene *scene_eval = DEG_get_evaluated_scene(lbake->depsgraph);
+	lbake->sldata = sldata;
+
 	/* Disable all effects BUT high bitdepth shadows. */
 	scene_eval->eevee.flag &= SCE_EEVEE_SHADOW_HIGH_BITDEPTH;
 	scene_eval->eevee.taa_samples = 1;
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 5aa331a9b99..349a27a1765 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -777,6 +777,7 @@ typedef struct EEVEE_PrivateData {
 } EEVEE_PrivateData; /* Transient data */
 
 /* eevee_data.c */
+void EEVEE_view_layer_data_free(void *sldata);
 EEVEE_ViewLayerData *EEVEE_view_layer_data_get(void);
 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure_ex(struct ViewLayer *view_layer);
 EEVEE_ViewLayerData *EEVEE_view_layer_data_ensure(void);



More information about the Bf-blender-cvs mailing list