diff options
author | Sergey Sharybin <sergey@blender.org> | 2021-08-04 16:37:18 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey@blender.org> | 2021-08-24 17:20:57 +0300 |
commit | 038f9b7f4a0e58da671079fd09aecdb926f12b0f (patch) | |
tree | 11e1ed18297d3cd006262b265f72489c2b09c3dd /source/blender/render/intern/engine.c | |
parent | 7aff40f410f4bb869c8045a67cda6a6ab6810a13 (diff) |
Render: Lazily allocate render passes pixels storage
The idea is to only allocate pixel storage only when there is an actual
data to be written to them.
This moves the code forward a better support of high-res rendering when
pixel storage is not allocated until render engine is ready to provide
pixel data.
Is expected to be no functional changes for neither users no external
engines. The only difference is that the motion and depth passes will
be displayed as transparent for until render engine provides any tile
result (at which point the pixels will be allocated and initialized to
infinite depth).
Differential Revision: https://developer.blender.org/D12195
Diffstat (limited to 'source/blender/render/intern/engine.c')
-rw-r--r-- | source/blender/render/intern/engine.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/source/blender/render/intern/engine.c b/source/blender/render/intern/engine.c index 75b3f2db249..1510587502b 100644 --- a/source/blender/render/intern/engine.c +++ b/source/blender/render/intern/engine.c @@ -212,6 +212,8 @@ static RenderResult *render_result_from_bake(RenderEngine *engine, int x, int y, RenderPass *primitive_pass = render_layer_add_pass(rr, rl, 4, "BakePrimitive", "", "RGBA"); RenderPass *differential_pass = render_layer_add_pass(rr, rl, 4, "BakeDifferential", "", "RGBA"); + render_result_passes_allocated_ensure(rr); + /* Fill render passes from bake pixel array, to be read by the render engine. */ for (int ty = 0; ty < h; ty++) { size_t offset = ty * w * 4; @@ -328,6 +330,7 @@ RenderResult *RE_engine_begin_result( /* can be NULL if we CLAMP the width or height to 0 */ if (result) { render_result_clone_passes(re, result, viewname); + render_result_passes_allocated_ensure(result); RenderPart *pa; @@ -400,6 +403,14 @@ 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); + } + /* merge. on break, don't merge in result for preview renders, looks nicer */ if (!highlight) { /* for exr tile render, detect tiles that are done */ |