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

Eduardo Lima Mitev elima at igalia.com
Thu Mar 24 09:29:44 UTC 2016


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

>   /**
>    * 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().

>         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


More information about the mesa-dev mailing list