diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-04-03 13:08:02 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2013-04-03 13:08:02 +0400 |
commit | bfeef2f5f07094c4014ce7c7bf7e933c168c2bd0 (patch) | |
tree | 3aa0d09177fe75ec884fca39eaf78e0f961fd546 /source | |
parent | 9512ae1a4a7b6242f425c219b4dec572f6a88bb8 (diff) |
Fix/Workaround #34854: render buffer update writes to wrong layer
Was caused by recent change in image_buffer_rect_update which
was writing data to ibuf-rect_float. Apparently, this buffer
could point to different render layer than came from RenderResult.
Made quick fix for this, which ends up in skipping float buffer
update in image_buffer_rect_update and skipping GLSL when image
has both byte and float buffers.
This will bring speed down a bit, but slower blender is better
than broken blender.
Proper fix will arrive later this week.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/render/render_internal.c | 22 | ||||
-rw-r--r-- | source/blender/editors/screen/glutil.c | 9 |
2 files changed, 15 insertions, 16 deletions
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index de8accf0180..90c80cae1ad 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -140,23 +140,15 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat } } if (rectf == NULL) return; - - rectf += 4 * (rr->rectx * ymin + xmin); - if (ibuf->rect) { - IMB_partial_display_buffer_update(ibuf, rectf, NULL, rr->rectx, rxmin, rymin, - &scene->view_settings, &scene->display_settings, - rxmin, rymin, rxmin + xmax, rymin + ymax, TRUE); - } + if (ibuf->rect == NULL) + imb_addrectImBuf(ibuf); - /* update float buffer as well, so fast GLSL display could use it - * - * TODO(sergey): not actually sure it is nice thing to modify something here - * but ibuf->rect used to be modified here - */ - IMB_buffer_float_from_float(ibuf->rect_float + 4 * (ibuf->x * rymin + rxmin), rectf, - 4, IB_PROFILE_LINEAR_RGB, IB_PROFILE_LINEAR_RGB, FALSE, - xmax, ymax, ibuf->x, rr->rectx); + rectf += 4 * (rr->rectx * ymin + xmin); + + IMB_partial_display_buffer_update(ibuf, rectf, NULL, rr->rectx, rxmin, rymin, + &scene->view_settings, &scene->display_settings, + rxmin, rymin, rxmin + xmax, rymin + ymax, TRUE); } /* ****************************** render invoking ***************** */ diff --git a/source/blender/editors/screen/glutil.c b/source/blender/editors/screen/glutil.c index fecb3c58a2d..74086c7cc8b 100644 --- a/source/blender/editors/screen/glutil.c +++ b/source/blender/editors/screen/glutil.c @@ -998,7 +998,14 @@ void glaDrawImBuf_glsl_ctx(const bContext *C, ImBuf *ibuf, float x, float y, int bool need_fallback = true; /* Bytes and dithering are not supported on GLSL yet */ - if (ibuf->rect_float && ibuf->dither == 0.0f) { + + /* WORKAROUND: only use GLSL if there's no byte buffer at all, + * this is because of how render results are handled, + * they're not updating image buffer's float buffer, + * but writes data directly to it's byte buffer and + * modifies display buffer. + */ + if (ibuf->rect == NULL && ibuf->rect_float && ibuf->dither == 0.0f) { if (IMB_colormanagement_setup_glsl_draw_from_ctx(C)) { glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glColor4f(1.0, 1.0, 1.0, 1.0); |