From 799a2b07ad13b879d1148b8ffe8ccd8e7e421212 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 1 Sep 2021 17:43:20 +0200 Subject: Fix possible missing render result with `update_result` Need to ensure render result's pixels are allocated prior to merge. Differential Revision: https://developer.blender.org/D12371 --- source/blender/render/intern/engine.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index 481a6662cc0..5728b784714 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -365,6 +365,17 @@ RenderResult *RE_engine_begin_result( return result; } +static void re_ensure_passes_allocated_thread_safe(Render *re) +{ + if (!re->result->passes_allocated) { + BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); + if (!re->result->passes_allocated) { + render_result_passes_allocated_ensure(re->result); + } + BLI_rw_mutex_unlock(&re->resultmutex); + } +} + void RE_engine_update_result(RenderEngine *engine, RenderResult *result) { if (engine->bake.pixels) { @@ -375,6 +386,7 @@ void RE_engine_update_result(RenderEngine *engine, RenderResult *result) Render *re = engine->re; if (result) { + re_ensure_passes_allocated_thread_safe(re); render_result_merge(re->result, result); result->renlay = result->layers.first; /* weak, draws first layer always */ re->display_update(re->duh, result, NULL); @@ -412,13 +424,7 @@ void RE_engine_end_result( return; } - if (!re->result->passes_allocated) { - BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE); - if (!re->result->passes_allocated) { - render_result_passes_allocated_ensure(re->result); - } - BLI_rw_mutex_unlock(&re->resultmutex); - } + re_ensure_passes_allocated_thread_safe(re); /* merge. on break, don't merge in result for preview renders, looks nicer */ if (!highlight) { -- cgit v1.2.3