From 00b10f9c3f24afdd3307631209906ff79298f508 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Tue, 18 Jun 2019 12:47:16 +0200 Subject: Fix T63359: no render preview when save buffers is on --- source/blender/editors/render/render_internal.c | 7 ++----- source/blender/render/intern/source/external_engine.c | 1 + source/blender/render/intern/source/render_result.c | 13 ++++++++++--- 3 files changed, 13 insertions(+), 8 deletions(-) (limited to 'source') diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 8f84d84f01d..352593a15ad 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -137,10 +137,7 @@ static void image_buffer_rect_update(RenderJob *rj, ColorManagedViewSettings *view_settings; ColorManagedDisplaySettings *display_settings; - /* Exception for exr tiles -- display buffer conversion happens here, - * NOT in the color management pipeline. - */ - if (ibuf->userflags & IB_DISPLAY_BUFFER_INVALID && rr->do_exr_tile == false) { + if (ibuf->userflags & IB_DISPLAY_BUFFER_INVALID) { /* The whole image buffer it so be color managed again anyway. */ return; } @@ -631,7 +628,7 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec * this case GLSL doesn't have original float buffer to * operate with. */ - if (rr->do_exr_tile || !rj->supports_glsl_draw || ibuf->channels == 1 || + if (!rj->supports_glsl_draw || ibuf->channels == 1 || ED_draw_imbuf_method(ibuf) != IMAGE_DRAW_METHOD_GLSL) { image_buffer_rect_update(rj, rr, ibuf, &rj->iuser, renrect, viewname); } diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 83d857211d0..0292a807131 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -288,6 +288,7 @@ void RE_engine_end_result( if (re->result->do_exr_tile) { if (!cancel && merge_results) { render_result_exr_file_merge(re->result, result, re->viewname); + render_result_merge(re->result, result); } } else if (!(re->test_break(re->tbh) && (re->r.scemode & R_BUTS_PREVIEW))) { diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c index 8a95cc6397f..cf9bfe99474 100644 --- a/source/blender/render/intern/source/render_result.c +++ b/source/blender/render/intern/source/render_result.c @@ -240,7 +240,10 @@ static RenderPass *render_layer_add_pass(RenderResult *rr, false); } } - else { + + /* Always allocate combined for display, in case of save buffers + * other passes are not allocated and only saved to the EXR file. */ + if (rl->exrhandle == NULL || STREQ(rpass->name, RE_PASSNAME_COMBINED)) { float *rect; int x; @@ -853,10 +856,14 @@ void render_result_merge(RenderResult *rr, RenderResult *rrpart) for (rl = rr->layers.first; rl; rl = rl->next) { rlp = RE_GetRenderLayer(rrpart, rl->name); if (rlp) { - /* passes are allocated in sync */ + /* Passes are allocated in sync. */ for (rpass = rl->passes.first, rpassp = rlp->passes.first; rpass && rpassp; rpass = rpass->next) { - /* renderresult have all passes, renderpart only the active view's passes */ + /* For save buffers, skip any passes that are only saved to disk. */ + if (rpass->rect == NULL || rpassp->rect == NULL) { + continue; + } + /* Renderresult have all passes, renderpart only the active view's passes. */ if (strcmp(rpassp->fullname, rpass->fullname) != 0) { continue; } -- cgit v1.2.3