diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-09-01 18:43:20 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-09-02 10:28:42 +0300 |
commit | 799a2b07ad13b879d1148b8ffe8ccd8e7e421212 (patch) | |
tree | 031d8c4d6b2ecc9267d524c477a7de6f590d489c /source/blender/render/intern/engine.c | |
parent | a8739ae6c2acbf0737113fbebf7e5ac0a942aaee (diff) |
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
Diffstat (limited to 'source/blender/render/intern/engine.c')
-rw-r--r-- | source/blender/render/intern/engine.c | 20 |
1 files 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) { |