diff options
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/extern/include/RE_pipeline.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/external_engine.c | 12 | ||||
-rw-r--r-- | source/blender/render/intern/source/render_result.c | 3 |
3 files changed, 15 insertions, 2 deletions
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 7e8713566e5..4c15ddd6833 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -91,6 +91,8 @@ typedef struct RenderLayer { float *rectf; /* 4 float, standard rgba buffer (read not above!) */ float *acolrect; /* 4 float, optional transparent buffer, needs storage for display updates */ float *scolrect; /* 4 float, optional strand buffer, needs storage for display updates */ + int *display_buffer; /* 4 char, optional color managed display buffer which is used when + * Save Buffer is enabled to display combined pass of the screen. */ int rectx, recty; /* optional saved endresult on disk */ diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index fa72d5f4057..b9c89f449a7 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -207,6 +207,11 @@ RenderResult *RE_engine_begin_result(RenderEngine *engine, int x, int y, int w, result = render_result_new(re, &disprect, 0, RR_USE_MEM, layername); + /* Copy EXR tile settings, so pipeline knows whether this is a result + * for Save Buffers enabled rendering. + */ + result->do_exr_tile = re->result->do_exr_tile; + /* todo: make this thread safe */ /* can be NULL if we CLAMP the width or height to 0 */ @@ -263,8 +268,11 @@ void RE_engine_end_result(RenderEngine *engine, RenderResult *result, int cancel } if (!cancel || merge_results) { - if (re->result->do_exr_tile) - render_result_exr_file_merge(re->result, result); + if (re->result->do_exr_tile) { + if (!cancel) { + render_result_exr_file_merge(re->result, result); + } + } else if (!(re->test_break(re->tbh) && (re->r.scemode & R_BUTS_PREVIEW))) render_result_merge(re->result, result); diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index 487de42515d..5e8b030c3fa 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -71,6 +71,7 @@ void render_result_free(RenderResult *res) /* acolrect and scolrect are optionally allocated in shade_tile, only free here since it can be used for drawing */ if (rl->acolrect) MEM_freeN(rl->acolrect); if (rl->scolrect) MEM_freeN(rl->scolrect); + if (rl->display_buffer) MEM_freeN(rl->display_buffer); while (rl->passes.first) { RenderPass *rpass = rl->passes.first; @@ -501,6 +502,8 @@ RenderResult *render_result_new(Render *re, rcti *partrct, int crop, int savebuf rl->recty = recty; if (rr->do_exr_tile) { + rl->display_buffer = MEM_mapallocN(rectx * recty * sizeof(unsigned int), "Combined display space rgba"); + rl->exrhandle = IMB_exr_get_handle(); IMB_exr_add_channel(rl->exrhandle, rl->name, "Combined.R", 0, 0, NULL); |