[Mesa-dev] [PATCH] mesa: Make TexSubImage check negative dimensions sooner.

Patrick Baggett baggett.patrick at gmail.com
Wed Jun 8 21:57:14 UTC 2016


Sorry, didn't CC mesa-dev, trying again...

On Wed, Jun 8, 2016 at 4:11 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:
> Two dEQP tests expect INVALID_VALUE errors for negative width/height
> parameters, but get INVALID_OPERATION because they haven't actually
> created a destination image.  This is arguably not a bug in Mesa, as
> there's no specified ordering of error conditions.
>
> However, it's also really easy to make the tests pass, and there's
> no real harm in doing these checks earlier.
>
> Fixes:
> dEQP-GLES3.functional.negative_api.texture.texsubimage3d_neg_width_height
> dEQP-GLES31.functional.debug.negative_coverage.get_error.texture.texsubimage3d_neg_width_height
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
>  src/mesa/main/teximage.c | 68 ++++++++++++++++++++++++++++++++++--------------
>  1 file changed, 49 insertions(+), 19 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index 58b7f27..d4f8278 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -1102,6 +1102,32 @@ _mesa_legal_texture_dimensions(struct gl_context *ctx, GLenum target,
>     }
>  }
>
> +static bool
> +error_check_subtexture_negative_dimensions(struct gl_context *ctx,
> +                                           GLuint dims,
> +                                           GLsizei subWidth,
> +                                           GLsizei subHeight,
> +                                           GLsizei subDepth,
> +                                           const char *func)
> +{
> +   /* Check size */
> +   if (subWidth < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(width=%d)", func, subWidth);
> +      return true;
> +   }
> +
> +   if (dims > 1 && subHeight < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(height=%d)", func, subHeight);
> +      return true;
> +   }
> +
> +   if (dims > 2 && subDepth < 0) {
> +      _mesa_error(ctx, GL_INVALID_VALUE, "%s(depth=%d)", func, subDepth);
> +      return true;
> +   }
> +

What do you think of a structure like:

switch(dims) {
    case 3:
        if(subDepth < 0) {
            ...
        }
        /* fall through */
    case 2:
        if(subHeight < 0) {
            ...
        }
       /* fall through *
    default:
        if(subWidth < 0) {
            ...
        }
}
return true;

I think this would reduce the overall number of expressions to check.
If you just want to check whether any are < 0, you can OR the sign
bits:


int result = 0;
switch(dims) {
    case 3: result |= subDepth & (1 << 31);
    case 2: result |= subHeight & (1 << 31);
    default: result |= subWidth & (1 << 31);
}
return (bool)(result>>31);

...then later call that function to generate a more detailed error
message about specifically which dimension was negative.

> +   return false;
> +}
>
>  /**
>   * Do error checking of xoffset, yoffset, zoffset, width, height and depth
> @@ -1119,25 +1145,6 @@ error_check_subtexture_dimensions(struct gl_context *ctx, GLuint dims,
>     const GLenum target = destImage->TexObject->Target;
>     GLuint bw, bh, bd;
>
> -   /* Check size */
> -   if (subWidth < 0) {
> -      _mesa_error(ctx, GL_INVALID_VALUE,
> -                  "%s(width=%d)", func, subWidth);
> -      return GL_TRUE;
> -   }
> -
> -   if (dims > 1 && subHeight < 0) {
> -      _mesa_error(ctx, GL_INVALID_VALUE,
> -                  "%s(height=%d)", func, subHeight);
> -      return GL_TRUE;
> -   }
> -
> -   if (dims > 2 && subDepth < 0) {
> -      _mesa_error(ctx, GL_INVALID_VALUE,
> -                  "%s(depth=%d)", func, subDepth);
> -      return GL_TRUE;
> -   }
> -
>     /* check xoffset and width */
>     if (xoffset < - (GLint) destImage->Border) {
>        _mesa_error(ctx, GL_INVALID_VALUE, "%s(xoffset)", func);
> @@ -2104,6 +2111,12 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
>        return GL_TRUE;
>     }
>
> +   if (error_check_subtexture_negative_dimensions(ctx, dimensions,
> +                                                  width, height, depth,
> +                                                  callerName)) {
> +      return GL_TRUE;
> +   }
> +
>     texImage = _mesa_select_tex_image(texObj, target, level);
>     if (!texImage) {
>        /* non-existant texture level */
> @@ -2140,6 +2153,12 @@ texsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
>        return GL_TRUE;
>     }
>
> +   if (error_check_subtexture_negative_dimensions(ctx, dimensions,
> +                                                  width, height, depth,
> +                                                  callerName)) {
> +      return GL_TRUE;
> +   }
> +
>     if (error_check_subtexture_dimensions(ctx, dimensions,
>                                           texImage, xoffset, yoffset, zoffset,
>                                           width, height, depth, callerName)) {
> @@ -2497,6 +2516,11 @@ copytexsubimage_error_check(struct gl_context *ctx, GLuint dimensions,
>        return GL_TRUE;
>     }
>
> +   if (error_check_subtexture_negative_dimensions(ctx, dimensions,
> +                                                  width, height, 1, caller)) {
> +      return GL_TRUE;
> +   }
> +
>     if (error_check_subtexture_dimensions(ctx, dimensions, texImage,
>                                           xoffset, yoffset, zoffset,
>                                           width, height, 1, caller)) {
> @@ -4387,6 +4411,12 @@ compressed_subtexture_error_check(struct gl_context *ctx, GLint dims,
>        return GL_TRUE;
>     }
>
> +   if (error_check_subtexture_negative_dimensions(ctx, dims,
> +                                                  width, height, depth,
> +                                                  callerName)) {
> +      return GL_TRUE;
> +   }
> +
>     if (error_check_subtexture_dimensions(ctx, dims,
>                                           texImage, xoffset, yoffset, zoffset,
>                                           width, height, depth,
> --
> 2.8.3
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev


More information about the mesa-dev mailing list