From: Kenneth Graunke Date: Wed, 3 Aug 2016 18:39:18 +0000 (-0700) Subject: st/mesa: Make Gallium's BlitFramebuffer follow the GL 4.4 sRGB rules. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3190c7ee9727161d627f107c2e7f8ec3a11941c1;p=mesa.git st/mesa: Make Gallium's BlitFramebuffer follow the GL 4.4 sRGB rules. OpenGL 4.4 specifies that BlitFramebuffer should perform sRGB encode and decode like ES 3.x does, but only when GL_FRAMEBUFFER_SRGB is enabled. This is technically incompatible in certain cases, but is more consistent across GL, ES, and WebGL, and more flexible. The NVIDIA 367.35 drivers appear to follow this behavior. For the awful spec analysis, please read Piglit's tests/spec/arb_framebuffer_srgb/blit.c, which explains the differences between GL 4.1, 4.2, 4.3 (2012), 4.3 (2013), and 4.4, and why this is the right rule to implement. Signed-off-by: Kenneth Graunke Reviewed-by: Nicolai Hähnle --- diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c index 5e7c34cfc6b..cfcf3f7aae0 100644 --- a/src/mesa/state_tracker/st_cb_blit.c +++ b/src/mesa/state_tracker/st_cb_blit.c @@ -44,6 +44,14 @@ #include "util/u_format.h" +static void +st_adjust_blit_for_srgb(struct pipe_blit_info *blit, bool framebuffer_srgb) +{ + if (!framebuffer_srgb) { + blit->dst.format = util_format_linear(blit->dst.format); + blit->src.format = util_format_linear(blit->src.format); + } +} static void st_BlitFramebuffer(struct gl_context *ctx, @@ -197,12 +205,14 @@ st_BlitFramebuffer(struct gl_context *ctx, blit.dst.resource = dstSurf->texture; blit.dst.level = dstSurf->u.tex.level; blit.dst.box.z = dstSurf->u.tex.first_layer; - blit.dst.format = util_format_linear(dstSurf->format); + blit.dst.format = dstSurf->format; blit.src.resource = srcObj->pt; blit.src.level = srcAtt->TextureLevel; blit.src.box.z = srcAtt->Zoffset + srcAtt->CubeMapFace; - blit.src.format = util_format_linear(srcObj->pt->format); + blit.src.format = srcObj->pt->format; + + st_adjust_blit_for_srgb(&blit, ctx->Color.sRGBEnabled); st->pipe->blit(st->pipe, &blit); dstRb->defined = true; /* front buffer tracking */ @@ -233,12 +243,14 @@ st_BlitFramebuffer(struct gl_context *ctx, blit.dst.resource = dstSurf->texture; blit.dst.level = dstSurf->u.tex.level; blit.dst.box.z = dstSurf->u.tex.first_layer; - blit.dst.format = util_format_linear(dstSurf->format); + blit.dst.format = dstSurf->format; blit.src.resource = srcSurf->texture; blit.src.level = srcSurf->u.tex.level; blit.src.box.z = srcSurf->u.tex.first_layer; - blit.src.format = util_format_linear(srcSurf->format); + blit.src.format = srcSurf->format; + + st_adjust_blit_for_srgb(&blit, ctx->Color.sRGBEnabled); st->pipe->blit(st->pipe, &blit); dstRb->defined = true; /* front buffer tracking */