[Mesa-dev] [PATCH] mesa: Use signed math for possibly negative values

Chad Versace chad at chad-versace.us
Thu May 19 13:19:14 PDT 2011


On 05/19/2011 05:13 AM, Ian Romanick wrote:
> From: Ian Romanick <ian.d.romanick at intel.com>
> 
> Since RowStride might be negative, we want a signed result.  On 64-bit
> platforms, an unsigned 32-bit result added to a 64-bit pointer will
> give the wrong answer.
> 
> For x = y = 50, RowStride = -128, and format bytes = 4, the difference is:
> 
> Breakpoint 1, get_pointer_generic (ctx=0x686320, rb=0x9c3600, x=50, y=50)
>     at main/renderbuffer.c:99
> 99	   if (!rb->Data)
> (gdb) print (int *) rb->Data + (y * rb->RowStride + x)
> $1 = (int *) 0x7ffff2e3e2c8
> (gdb) print rb->Data + (y * rb->RowStride + x)*_mesa_get_format_bytes(rb->Format)
> $3 = (GLvoid *) 0x8000f2e3e2c8
> 
> The delta between 0x7ffff2e3e2c8 and 0x8000f2e3e2c8 is pretty big.
> Math is hard.
> 
> Fixes crashes in lots of depth/stencil piglit tests on 64-bit platforms.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=37351
> ---
>  src/mesa/main/renderbuffer.c |   10 ++++++++--
>  1 files changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c
> index fa884c0..b7ab49f 100644
> --- a/src/mesa/main/renderbuffer.c
> +++ b/src/mesa/main/renderbuffer.c
> @@ -96,11 +96,17 @@ static void *
>  get_pointer_generic(struct gl_context *ctx, struct gl_renderbuffer *rb,
>  		    GLint x, GLint y)
>  {
> +   intptr_t offset;
> +
>     if (!rb->Data)
>        return NULL;
>  
> -   return ((char *) rb->Data +
> -	   (y * rb->RowStride + x) * _mesa_get_format_bytes(rb->Format));
> +   /* Must use signed math for this!  Since RowStride might be negative, we
> +    * want a signed result.  On 64-bit platforms, an unsigned 32-bit result
> +    * added to a 64-bit pointer will give the wrong answer.
> +    */
> +   offset = (y * rb->RowStride + x) * (int)_mesa_get_format_bytes(rb->Format);
> +   return ((char *) rb->Data + offset);
>  }
>  
>  /* GetRow() implementation for formats where DataType matches the rb->Format.


Looks like all eyes were on this bug. I was just about a submit this
patch to the list myself.

Reviewed-by: Chad Versace <chad.versace at intel.com>
-- 
Chad Versace
chad at chad-versace.us


More information about the mesa-dev mailing list