Mesa (master): st/mesa: Make Gallium' s BlitFramebuffer follow the GL 4.4 sRGB rules.

Kenneth Graunke kwg at kemper.freedesktop.org
Mon Aug 8 21:12:22 UTC 2016


Module: Mesa
Branch: master
Commit: 3190c7ee9727161d627f107c2e7f8ec3a11941c1
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=3190c7ee9727161d627f107c2e7f8ec3a11941c1

Author: Kenneth Graunke <kenneth at whitecape.org>
Date:   Wed Aug  3 11:39:18 2016 -0700

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 <kenneth at whitecape.org>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle at amd.com>

---

 src/mesa/state_tracker/st_cb_blit.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c
index 5e7c34c..cfcf3f7 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 */




More information about the mesa-commit mailing list