Fix #134914: Backdrop remain after loading new file

The compositor backdrop is still visible even after a new completely
different file is loaded. This is because compositor contexts cache
things like the backdrop, and contexts are stored on interactive
compositor renders, which are not freed until Blender is closed. To fix
this, we cleanup the interactive compositor renders that were created
upon file load.

Pull Request: https://projects.blender.org/blender/blender/pulls/135390
This commit is contained in:
Omar Emara
2025-03-04 08:33:17 +01:00
committed by Omar Emara
parent 192d328f16
commit a50144e55c
3 changed files with 17 additions and 5 deletions

View File

@@ -929,9 +929,11 @@ static void setup_app_data(bContext *C,
mode = LOAD_UI;
}
/* Free all render results, without this stale data gets displayed after loading files */
/* Free all render results and interactive compositor renders, without this stale data gets
* displayed after loading files */
if (mode != LOAD_UNDO) {
RE_FreeAllRenderResults();
RE_FreeInteractiveCompositorRenders();
}
/* Only make file-paths compatible when loading for real (not undo). */

View File

@@ -194,6 +194,11 @@ void RE_FreeViewRender(struct ViewRender *view_render);
*/
void RE_FreeAllRender(void);
/**
* On file load, free all interactive compositor renders.
*/
void RE_FreeInteractiveCompositorRenders(void);
/**
* On file load, free render results.
*/

View File

@@ -613,10 +613,7 @@ void RE_FreeAllRender()
RE_FreeRender(static_cast<Render *>(RenderGlobal.render_list.front()));
}
for (Render *render : RenderGlobal.interactive_compositor_renders.values()) {
RE_FreeRender(render);
}
RenderGlobal.interactive_compositor_renders.clear();
RE_FreeInteractiveCompositorRenders();
#ifdef WITH_FREESTYLE
/* finalize Freestyle */
@@ -624,6 +621,14 @@ void RE_FreeAllRender()
#endif
}
void RE_FreeInteractiveCompositorRenders()
{
for (Render *render : RenderGlobal.interactive_compositor_renders.values()) {
RE_FreeRender(render);
}
RenderGlobal.interactive_compositor_renders.clear();
}
void RE_FreeAllRenderResults()
{
for (Render *re : RenderGlobal.render_list) {