From bbdd6419acd420a53cbdd0dd4b52fef86c9d5f75 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 30 Jan 2025 17:18:46 +0100 Subject: [PATCH] Fix #133800: View Render Animation leaves play buttons inactive The operator can get freed late if the window is out of focus. So finish up everything already when the job ends. Pull Request: https://projects.blender.org/blender/blender/pulls/133828 --- source/blender/editors/render/render_opengl.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/blender/editors/render/render_opengl.cc b/source/blender/editors/render/render_opengl.cc index 9042dcec091..bcc1f0f9e1e 100644 --- a/source/blender/editors/render/render_opengl.cc +++ b/source/blender/editors/render/render_opengl.cc @@ -141,6 +141,8 @@ struct OGLRender : public RenderJobBase { std::condition_variable task_condition; wmJob *wm_job = nullptr; + + bool ended = false; }; static bool screen_opengl_is_multiview(OGLRender *oglrender) @@ -852,6 +854,11 @@ static bool screen_opengl_render_init(bContext *C, wmOperator *op) static void screen_opengl_render_end(OGLRender *oglrender) { + /* Ensure we don't call this both from the job and operator callbacks. */ + if (oglrender->ended) { + return; + } + if (oglrender->task_pool) { /* Trickery part for movie output: * @@ -909,6 +916,7 @@ static void screen_opengl_render_end(OGLRender *oglrender) WM_main_add_notifier(NC_SCENE | ND_RENDER_RESULT, oglrender->scene); G.is_rendering = false; + oglrender->ended = true; } static void screen_opengl_render_cancel(bContext *C, wmOperator *op) @@ -1229,9 +1237,11 @@ static void opengl_render_startjob(void *customdata, wmJobWorkerStatus *worker_s } } -static void opengl_render_freejob(void * /*customdata*/) +static void opengl_render_freejob(void *customdata) { - /* Freed by operator. */ + /* End the render here, as the modal handler might be called with the window out of focus. */ + OGLRender *oglrender = static_cast(customdata); + screen_opengl_render_end(oglrender); } static int screen_opengl_render_invoke(bContext *C, wmOperator *op, const wmEvent *event)