[Mesa-dev] [PATCH 3/3] swrast: fix blit code's nearest/linear coordinate arithmetic

Jose Fonseca jfonseca at vmware.com
Tue Jan 22 11:31:26 PST 2013


I'm not familiar with swrast internals, but the changes look sensible from what I can tell.

Reviewed-by: Jose Fonseca <jfonseca at vmware.com>


----- Original Message -----
> Fixes piglit's fbo-blit-stretch test.
> ---
>  src/mesa/swrast/s_blit.c |   23 ++++++++---------------
>  1 files changed, 8 insertions(+), 15 deletions(-)
> 
> diff --git a/src/mesa/swrast/s_blit.c b/src/mesa/swrast/s_blit.c
> index 08ec5e2..82fa43f 100644
> --- a/src/mesa/swrast/s_blit.c
> +++ b/src/mesa/swrast/s_blit.c
> @@ -304,7 +304,8 @@ blit_nearest(struct gl_context *ctx,
>        }
>  
>        for (dstRow = 0; dstRow < dstHeight; dstRow++) {
> -         GLint srcRow = (dstRow * srcHeight) / dstHeight;
> +         GLfloat srcRowF = (dstRow + 0.5F) / dstHeight * srcHeight -
> 0.5F;
> +         GLint srcRow = IROUND(srcRowF);
>           GLubyte *dstRowStart = dstMap + dstRowStride * dstRow;
>  
>           ASSERT(srcRow >= 0);
> @@ -404,17 +405,15 @@ resample_linear_row_ub(GLint srcWidth, GLint
> dstWidth,
>     const GLubyte (*srcColor0)[4] = (const GLubyte (*)[4])
>     srcBuffer0;
>     const GLubyte (*srcColor1)[4] = (const GLubyte (*)[4])
>     srcBuffer1;
>     GLubyte (*dstColor)[4] = (GLubyte (*)[4]) dstBuffer;
> -   const GLfloat dstWidthF = (GLfloat) dstWidth;
>     GLint dstCol;
>  
>     for (dstCol = 0; dstCol < dstWidth; dstCol++) {
> -      const GLfloat srcCol = (dstCol * srcWidth) / dstWidthF;
> -      GLint srcCol0 = IFLOOR(srcCol);
> +      const GLfloat srcCol = (dstCol + 0.5F) / dstWidth * srcWidth -
> 0.5F;
> +      GLint srcCol0 = MAX2(0, IFLOOR(srcCol));
>        GLint srcCol1 = srcCol0 + 1;
>        GLfloat colWeight = srcCol - srcCol0; /* fractional part of
>        srcCol */
>        GLfloat red, green, blue, alpha;
>  
> -      ASSERT(srcCol0 >= 0);
>        ASSERT(srcCol0 < srcWidth);
>        ASSERT(srcCol1 <= srcWidth);
>  
> @@ -461,17 +460,15 @@ resample_linear_row_float(GLint srcWidth, GLint
> dstWidth,
>     const GLfloat (*srcColor0)[4] = (const GLfloat (*)[4])
>     srcBuffer0;
>     const GLfloat (*srcColor1)[4] = (const GLfloat (*)[4])
>     srcBuffer1;
>     GLfloat (*dstColor)[4] = (GLfloat (*)[4]) dstBuffer;
> -   const GLfloat dstWidthF = (GLfloat) dstWidth;
>     GLint dstCol;
>  
>     for (dstCol = 0; dstCol < dstWidth; dstCol++) {
> -      const GLfloat srcCol = (dstCol * srcWidth) / dstWidthF;
> -      GLint srcCol0 = IFLOOR(srcCol);
> +      const GLfloat srcCol = (dstCol + 0.5F) / dstWidth * srcWidth -
> 0.5F;
> +      GLint srcCol0 = MAX2(0, IFLOOR(srcCol));
>        GLint srcCol1 = srcCol0 + 1;
>        GLfloat colWeight = srcCol - srcCol0; /* fractional part of
>        srcCol */
>        GLfloat red, green, blue, alpha;
>  
> -      ASSERT(srcCol0 >= 0);
>        ASSERT(srcCol0 < srcWidth);
>        ASSERT(srcCol1 <= srcWidth);
>  
> @@ -526,7 +523,6 @@ blit_linear(struct gl_context *ctx,
>     const GLint dstWidth = ABS(dstX1 - dstX0);
>     const GLint srcHeight = ABS(srcY1 - srcY0);
>     const GLint dstHeight = ABS(dstY1 - dstY0);
> -   const GLfloat dstHeightF = (GLfloat) dstHeight;
>  
>     const GLint srcXpos = MIN2(srcX0, srcX1);
>     const GLint srcYpos = MIN2(srcY0, srcY1);
> @@ -654,14 +650,11 @@ blit_linear(struct gl_context *ctx,
>  
>        for (dstRow = 0; dstRow < dstHeight; dstRow++) {
>           const GLint dstY = dstYpos + dstRow;
> -         const GLfloat srcRow = (dstRow * srcHeight) / dstHeightF;
> -         GLint srcRow0 = IFLOOR(srcRow);
> +         GLfloat srcRow = (dstRow + 0.5F) / dstHeight * srcHeight -
> 0.5F;
> +         GLint srcRow0 = MAX2(0, IFLOOR(srcRow));
>           GLint srcRow1 = srcRow0 + 1;
>           GLfloat rowWeight = srcRow - srcRow0; /* fractional part of
>           srcRow */
>  
> -         ASSERT(srcRow >= 0);
> -         ASSERT(srcRow < srcHeight);
> -
>           if (srcRow1 == srcHeight) {
>              /* last row fudge */
>              srcRow1 = srcRow0;
> --
> 1.7.3.4
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list