[Mesa-dev] [PATCH] swrast: fix assorted bugs in software blit code

Anuj Phogat anuj.phogat at gmail.com
Thu Jan 17 08:34:56 PST 2013


On Thu, Jan 17, 2013 at 9:37 PM, Brian Paul <brianp at vmware.com> wrote:
> 1. The loop over dest buffers in blit_linear() needed a null pointer
> check.  Fixes https://bugs.freedesktop.org/show_bug.cgi?id=59499
>
> 2. The code to grab the drawRb's format needs to be inside the drawing loop.
>
> 3. An equality test was using = instead of == thus messing up a
> renderbuffer attachment texture pointer.  This lead to memory
> corruption and a crash at exit.
>
> Finally, fix a capitalization error NumDrawBuffers -> numDrawBuffers
> and change type to unsigned to fix signed/unsigned comparison warnings.
> ---
>  src/mesa/swrast/s_blit.c |   30 ++++++++++++++++++++----------
>  1 files changed, 20 insertions(+), 10 deletions(-)
>
> diff --git a/src/mesa/swrast/s_blit.c b/src/mesa/swrast/s_blit.c
> index 043b578..3a4e7ee 100644
> --- a/src/mesa/swrast/s_blit.c
> +++ b/src/mesa/swrast/s_blit.c
> @@ -114,7 +114,7 @@ blit_nearest(struct gl_context *ctx,
>     struct gl_renderbuffer_attachment *readAtt, *drawAtt;
>     struct gl_framebuffer *readFb = ctx->ReadBuffer;
>     struct gl_framebuffer *drawFb = ctx->DrawBuffer;
> -   GLint NumDrawBuffers = 0;
> +   GLuint numDrawBuffers = 0;
>     GLuint i;
>
>     const GLint srcWidth = ABS(srcX1 - srcX0);
> @@ -153,14 +153,14 @@ blit_nearest(struct gl_context *ctx,
>     case GL_COLOR_BUFFER_BIT:
>        readAtt = &readFb->Attachment[readFb->_ColorReadBufferIndex];
>        readRb = readFb->_ColorReadBuffer;
> -      NumDrawBuffers = drawFb->_NumColorDrawBuffers;
> +      numDrawBuffers = drawFb->_NumColorDrawBuffers;
>        break;
>     case GL_DEPTH_BUFFER_BIT:
>        readAtt = &readFb->Attachment[BUFFER_DEPTH];
>        drawAtt = &drawFb->Attachment[BUFFER_DEPTH];
>        readRb = readAtt->Renderbuffer;
>        drawRb = drawAtt->Renderbuffer;
> -      NumDrawBuffers = 1;
> +      numDrawBuffers = 1;
>
>        /* Note that for depth/stencil, the formats of src/dst must match.  By
>         * using the core helpers for pack/unpack, we avoid needing to handle
> @@ -179,7 +179,7 @@ blit_nearest(struct gl_context *ctx,
>        drawAtt = &drawFb->Attachment[BUFFER_STENCIL];
>        readRb = readAtt->Renderbuffer;
>        drawRb = drawAtt->Renderbuffer;
> -      NumDrawBuffers = 1;
> +      numDrawBuffers = 1;
>        mode = UNPACK_S;
>        pixelSize = 1;
>        break;
> @@ -212,7 +212,7 @@ blit_nearest(struct gl_context *ctx,
>     }
>
>     /* Blit to all the draw buffers */
> -   for (i = 0; i < NumDrawBuffers; i++) {
> +   for (i = 0; i < numDrawBuffers; i++) {
>        if (buffer == GL_COLOR_BUFFER_BIT) {
>           int idx = drawFb->_ColorDrawBufferIndexes[i];
>           if (idx == -1)
> @@ -220,6 +220,9 @@ blit_nearest(struct gl_context *ctx,
>           drawAtt = &drawFb->Attachment[idx];
>           drawRb = drawAtt->Renderbuffer;
>
> +         if (!drawRb)
> +            continue;
> +
>           if (readRb->Format == drawRb->Format) {
>              mode = DIRECT;
>              pixelSize = _mesa_get_format_bytes(readRb->Format);
> @@ -514,8 +517,6 @@ blit_linear(struct gl_context *ctx,
>              GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1)
>  {
>     struct gl_framebuffer *drawFb = ctx->DrawBuffer;
> -   struct gl_renderbuffer *drawRb = NULL;
> -   struct gl_renderbuffer_attachment *drawAtt = NULL;
>     struct gl_framebuffer *readFb = ctx->ReadBuffer;
>     struct gl_renderbuffer *readRb = readFb->_ColorReadBuffer;
>     struct gl_renderbuffer_attachment *readAtt =
> @@ -543,7 +544,6 @@ blit_linear(struct gl_context *ctx,
>     GLvoid *dstBuffer;
>
>     gl_format readFormat = _mesa_get_srgb_format_linear(readRb->Format);
> -   gl_format drawFormat = _mesa_get_srgb_format_linear(drawRb->Format);
>     GLuint bpp = _mesa_get_format_bytes(readFormat);
>
>     GLenum pixelType;
> @@ -587,17 +587,27 @@ blit_linear(struct gl_context *ctx,
>     }
>
>     for (i = 0; i < drawFb->_NumColorDrawBuffers; i++) {
> -      int idx = drawFb->_ColorDrawBufferIndexes[i];
> +      GLint idx = drawFb->_ColorDrawBufferIndexes[i];
> +      struct gl_renderbuffer_attachment *drawAtt;
> +      struct gl_renderbuffer *drawRb;
> +      gl_format drawFormat;
> +
>        if (idx == -1)
>           continue;
> +
>        drawAtt = &drawFb->Attachment[idx];
>        drawRb = drawAtt->Renderbuffer;
> +      if (!drawRb)
> +         continue;
> +
> +      drawFormat = _mesa_get_srgb_format_linear(drawRb->Format);
> +
>        /*
>         * Map src / dst renderbuffers
>         */
>        if ((readRb == drawRb) ||
>            (readAtt->Texture && drawAtt->Texture &&
> -           (readAtt->Texture = drawAtt->Texture))) {
> +           (readAtt->Texture == drawAtt->Texture))) {
>           /* map whole buffer for read/write */
>           ctx->Driver.MapRenderbuffer(ctx, readRb,
>                                       0, 0, readRb->Width, readRb->Height,
> --
> 1.7.3.4
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>


More information about the mesa-dev mailing list