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

Kenneth Graunke kenneth at whitecape.org
Mon Jun 13 22:25:57 UTC 2016


On Monday, June 13, 2016 2:19:36 PM PDT Anuj Phogat wrote:
> On Wed, Jun 8, 2016 at 2: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;
> > +   }
> > +
> > +   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;
> > +   }
> > +
> It's not obvious why we need to check twice for the negative dimensions
> in texsubimage_error_check(). Adding a comment here will avoid confusion.

This was a mistake - I accidentally added a second call.  I've dropped
this copy (the second call) in my local patch.

> >     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;
> > +   }
> > +
> Same here.

I only see one copy here.

> >     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
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20160613/2f43cb3e/attachment-0001.sig>


More information about the mesa-dev mailing list