st/mesa: fix sRGB BlitFramebuffer regression
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Thu, 11 Aug 2016 11:06:47 +0000 (13:06 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 25 Aug 2016 11:21:05 +0000 (13:21 +0200)
Broken since: 3190c7ee9727161d627f107c2e7f8ec3a11941c1

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97285

Tested-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
src/mesa/state_tracker/st_cb_blit.c

index cfcf3f7aae0ad1897f61819073d715e693c3e2d2..8aa849b3fc0f76fdbe3a891551610e8b024752db 100644 (file)
 
 #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,
                    struct gl_framebuffer *readFB,
@@ -199,7 +190,11 @@ st_BlitFramebuffer(struct gl_context *ctx,
                st_renderbuffer(drawFB->_ColorDrawBuffers[i]);
 
             if (dstRb) {
-               struct pipe_surface *dstSurf = dstRb->surface;
+               struct pipe_surface *dstSurf;
+
+               st_update_renderbuffer_surface(st, dstRb);
+
+               dstSurf = dstRb->surface;
 
                if (dstSurf) {
                   blit.dst.resource = dstSurf->texture;
@@ -212,7 +207,8 @@ st_BlitFramebuffer(struct gl_context *ctx,
                   blit.src.box.z = srcAtt->Zoffset + srcAtt->CubeMapFace;
                   blit.src.format = srcObj->pt->format;
 
-                  st_adjust_blit_for_srgb(&blit, ctx->Color.sRGBEnabled);
+                  if (!ctx->Color.sRGBEnabled)
+                     blit.src.format = util_format_linear(blit.src.format);
 
                   st->pipe->blit(st->pipe, &blit);
                   dstRb->defined = true; /* front buffer tracking */
@@ -226,9 +222,13 @@ st_BlitFramebuffer(struct gl_context *ctx,
          struct pipe_surface *srcSurf;
          GLuint i;
 
-         if (!srcRb || !srcRb->surface) {
+         if (!srcRb)
+            return;
+
+         st_update_renderbuffer_surface(st, srcRb);
+
+         if (!srcRb->surface)
             return;
-         }
 
          srcSurf = srcRb->surface;
 
@@ -237,7 +237,11 @@ st_BlitFramebuffer(struct gl_context *ctx,
                st_renderbuffer(drawFB->_ColorDrawBuffers[i]);
 
             if (dstRb) {
-               struct pipe_surface *dstSurf = dstRb->surface;
+               struct pipe_surface *dstSurf;
+
+               st_update_renderbuffer_surface(st, dstRb);
+
+               dstSurf = dstRb->surface;
 
                if (dstSurf) {
                   blit.dst.resource = dstSurf->texture;
@@ -250,8 +254,6 @@ st_BlitFramebuffer(struct gl_context *ctx,
                   blit.src.box.z = srcSurf->u.tex.first_layer;
                   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 */
                }