[Mesa-dev] [PATCH] mesa: Check glReadBuffer enums against the ES3 table.

Kenneth Graunke kenneth at whitecape.org
Thu Mar 24 18:12:42 UTC 2016


On Thursday, March 24, 2016 10:29:44 AM PDT Eduardo Lima Mitev wrote:
> On 03/24/2016 07:54 AM, Kenneth Graunke wrote:
> >  From the ES 3.2 spec, section 16.1.1 (Selecting Buffers for Reading):
> >
> >     "An INVALID_ENUM error is generated if src is not BACK or one of
> >      the values from table 15.5."
> >
> > Table 15.5 contains NONE and COLOR_ATTACHMENTi.
> >
> > Mesa properly returned INVALID_ENUM for unknown enums, but it decided
> > what was known by using read_buffer_enum_to_index, which handles all
> > enums in every API.  So enums that were valid in GL were making it
> > past the "valid enum" check.  Such targets would then be classified
> > as unsupported, and we'd raise INVALID_OPERATION, but that's technically
> > the wrong error code.
> >
> > Fixes dEQP-GLES31's
> > functional.debug.negative_coverage.get_error.buffer.read_buffer
> >
> > Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> > ---
> >   src/mesa/main/buffers.c | 10 ++++++++++
> >   1 file changed, 10 insertions(+)
> >
> > diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
> > index 26dafd1..da90e00 100644
> > --- a/src/mesa/main/buffers.c
> > +++ b/src/mesa/main/buffers.c
> > @@ -222,6 +222,12 @@ read_buffer_enum_to_index(GLenum buffer)
> >      }
> >   }
> >
> > +static bool
> > +is_legal_es3_readbuffer_enum(GLenum buf)
> > +{
> > +   return buf == GL_BACK || buf == GL_NONE ||
> > +          (buf >= GL_COLOR_ATTACHMENT0 && buf <= GL_COLOR_ATTACHMENT31);
> > +}
> >
> 
> Technically, reading past what is reported by GL_MAX_COLOR_ATTACHMENTS 
> is not legal, so here you should probably use 
> ctx->Const.MaxColorAttachments.
> 
>  From GLES 3.1, (in various sections):
> 
>      "i in COLOR_ATTACHMENTi may range from zero to the value of
>       MAX_COLOR_ATTACHMENTS minus one".

You're right - it does say that.  However, handling that here would
cause an INVALID_ENUM error to be produced.  The spec explicitly says
that it should be INVALID_OPERATION:

"An INVALID_OPERATION error is generated if the GL is bound to a draw
 framebuffer object and src is BACK or COLOR_ATTACHMENTm where m is
 greater than or equal to the value of MAX_COLOR_ATTACHMENTS."

The dEQP test also starts failing if I make this change.  Without it,
it falls through to the "supported?" case and raises INVALID_OPERATION
correctly.

Are you okay with leaving this part as is?

> >   /**
> >    * Called by glDrawBuffer() and glNamedFramebufferDrawBuffer().
> > @@ -716,6 +722,10 @@ read_buffer(struct gl_context *ctx, struct 
gl_framebuffer *fb,
> >      else {
> >         /* general case / window-system framebuffer */
> >         srcBuffer = read_buffer_enum_to_index(buffer);
> > +
> > +      if (_mesa_is_gles3(ctx) && !is_legal_es3_readbuffer_enum(buffer))
> > +         srcBuffer = -1;
> > +
> 
> I think you can move this block above the previous one that sets 
> srcBuffer, so that if buffer is not legal, you don't need to call 
> read_buffer_enum_to_index().

Sure.  I've changed it to:

     if (_mesa_is_gles3(ctx) && !is_legal_es3_readbuffer_enum(buffer))
        srcBuffer = -1;
     else
        srcBuffer = read_buffer_enum_to_index(buffer);

Thanks for the feedback!

> >         if (srcBuffer == -1) {
> >            _mesa_error(ctx, GL_INVALID_ENUM,
> >                        "%s(invalid buffer %s)", caller,
> >
> 
> With those two things, patch is:
> 
> Reviewed-by: Eduardo Lima Mitev <elima at igalia.com>
> 
> Eduardo
-------------- 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/20160324/60d2c771/attachment-0001.sig>


More information about the mesa-dev mailing list