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.
This commit is contained in:
Sergey Sharybin
2013-04-03 09:08:02 +00:00
parent 9512ae1a4a
commit bfeef2f5f0
2 changed files with 15 additions and 16 deletions

View File

@@ -140,23 +140,15 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
} }
} }
if (rectf == NULL) return; if (rectf == NULL) return;
if (ibuf->rect == NULL)
imb_addrectImBuf(ibuf);
rectf += 4 * (rr->rectx * ymin + xmin); rectf += 4 * (rr->rectx * ymin + xmin);
if (ibuf->rect) { IMB_partial_display_buffer_update(ibuf, rectf, NULL, rr->rectx, rxmin, rymin,
IMB_partial_display_buffer_update(ibuf, rectf, NULL, rr->rectx, rxmin, rymin, &scene->view_settings, &scene->display_settings,
&scene->view_settings, &scene->display_settings, rxmin, rymin, rxmin + xmax, rymin + ymax, TRUE);
rxmin, rymin, rxmin + xmax, rymin + ymax, TRUE);
}
/* 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);
} }
/* ****************************** render invoking ***************** */ /* ****************************** render invoking ***************** */

View File

@@ -998,7 +998,14 @@ void glaDrawImBuf_glsl_ctx(const bContext *C, ImBuf *ibuf, float x, float y, int
bool need_fallback = true; bool need_fallback = true;
/* Bytes and dithering are not supported on GLSL yet */ /* 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)) { if (IMB_colormanagement_setup_glsl_draw_from_ctx(C)) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glColor4f(1.0, 1.0, 1.0, 1.0); glColor4f(1.0, 1.0, 1.0, 1.0);