Eevee: Fix assert when baking lightprobes.
The GPU context was freed before all framebuffer attached to it were deleted. Fix T56117
This commit is contained in:
parent
31657fef40
commit
5c9754c3aa
Notes:
blender-bot
2023-02-14 05:31:32 +01:00
Referenced by issue #56117, Indirect light baking crash on osx
|
@ -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");
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue