[Mesa-dev] [PATCH] st/mesa: fix sRGB blit errors

Brian Paul brianp at vmware.com
Wed Aug 17 14:16:54 UTC 2016


On 08/17/2016 03:55 AM, Nicolai Hähnle wrote:
> From: Nicolai Hähnle <nicolai.haehnle at amd.com>
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97285

Hi Nicolai,

The commit message seems a bit sparse.  It would be nice if one didn't 
have to wade through the bug report to know what's being done.

-Brian

> ---
>   src/mesa/state_tracker/st_cb_blit.c | 34 ++++++++++++++++++----------------
>   1 file changed, 18 insertions(+), 16 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c
> index cfcf3f7..8aa849b 100644
> --- a/src/mesa/state_tracker/st_cb_blit.c
> +++ b/src/mesa/state_tracker/st_cb_blit.c
> @@ -38,29 +38,20 @@
>   #include "st_texture.h"
>   #include "st_cb_bitmap.h"
>   #include "st_cb_blit.h"
>   #include "st_cb_fbo.h"
>   #include "st_manager.h"
>   #include "st_scissor.h"
>
>   #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,
>                      struct gl_framebuffer *drawFB,
>                      GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
>                      GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
>                      GLbitfield mask, GLenum filter)
>   {
>      const GLbitfield depthStencil = (GL_DEPTH_BUFFER_BIT |
>                                       GL_STENCIL_BUFFER_BIT);
>      struct st_context *st = st_context(ctx);
> @@ -192,73 +183,84 @@ st_BlitFramebuffer(struct gl_context *ctx,
>
>            if (!srcObj || !srcObj->pt) {
>               return;
>            }
>
>            for (i = 0; i < drawFB->_NumColorDrawBuffers; i++) {
>               struct st_renderbuffer *dstRb =
>                  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;
>                     blit.dst.level = dstSurf->u.tex.level;
>                     blit.dst.box.z = dstSurf->u.tex.first_layer;
>                     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 = 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 */
>                  }
>               }
>            }
>         }
>         else {
>            struct st_renderbuffer *srcRb =
>               st_renderbuffer(readFB->_ColorReadBuffer);
>            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;
>
>            for (i = 0; i < drawFB->_NumColorDrawBuffers; i++) {
>               struct st_renderbuffer *dstRb =
>                  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;
>                     blit.dst.level = dstSurf->u.tex.level;
>                     blit.dst.box.z = dstSurf->u.tex.first_layer;
>                     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 = srcSurf->format;
>
> -                  st_adjust_blit_for_srgb(&blit, ctx->Color.sRGBEnabled);
> -
>                     st->pipe->blit(st->pipe, &blit);
>                     dstRb->defined = true; /* front buffer tracking */
>                  }
>               }
>            }
>         }
>      }
>
>      if (mask & depthStencil) {
>         /* depth and/or stencil blit */
>



More information about the mesa-dev mailing list