From a50144e55c3cb3d6445dccfe0bcb94028e54d642 Mon Sep 17 00:00:00 2001 From: Omar Emara Date: Tue, 4 Mar 2025 08:33:17 +0100 Subject: [PATCH] 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 --- source/blender/blenkernel/intern/blendfile.cc | 4 +++- source/blender/render/RE_pipeline.h | 5 +++++ source/blender/render/intern/pipeline.cc | 13 +++++++++---- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/source/blender/blenkernel/intern/blendfile.cc b/source/blender/blenkernel/intern/blendfile.cc index 60c9cbef624..07de8703a2d 100644 --- a/source/blender/blenkernel/intern/blendfile.cc +++ b/source/blender/blenkernel/intern/blendfile.cc @@ -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). */ diff --git a/source/blender/render/RE_pipeline.h b/source/blender/render/RE_pipeline.h index bbe14b4e225..4e688e920a2 100644 --- a/source/blender/render/RE_pipeline.h +++ b/source/blender/render/RE_pipeline.h @@ -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. */ diff --git a/source/blender/render/intern/pipeline.cc b/source/blender/render/intern/pipeline.cc index e48c22eb07c..519b3ade548 100644 --- a/source/blender/render/intern/pipeline.cc +++ b/source/blender/render/intern/pipeline.cc @@ -613,10 +613,7 @@ void RE_FreeAllRender() RE_FreeRender(static_cast(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) {