[Mesa-dev] [PATCH v2] mesa: Check first that draw buffers are valid for glDrawBuffers on GLES3

Eduardo Lima Mitev elima at igalia.com
Tue Jan 13 03:29:53 PST 2015


This patch was updated and is pending review.

Thanks,
Eduardo

On 12/15/2014 11:47 AM, Eduardo Lima Mitev wrote:
> Section 4.2 (Whole Framebuffer Operations) of the OpenGL 3.0 specification
> says "Each buffer listed in bufs must be BACK, NONE, or one of the values from
> table 4.3 (NONE, COLOR_ATTACHMENTi)".
> 
> This patch adds this check before previous other, more complex validation steps.
> 
> Fixes 1 dEQP test: dEQP-GLES3.functional.negative_api.buffer.draw_buffers
> ---
>  src/mesa/main/buffers.c | 33 +++++++++++++++++++++++++--------
>  1 file changed, 25 insertions(+), 8 deletions(-)
> 
> diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
> index 1ee2009..d7e97c7 100644
> --- a/src/mesa/main/buffers.c
> +++ b/src/mesa/main/buffers.c
> @@ -323,14 +323,31 @@ _mesa_DrawBuffers(GLsizei n, const GLenum *buffers)
>     supportedMask = supported_buffer_bitmask(ctx, ctx->DrawBuffer);
>     usedBufferMask = 0x0;
>  
> -   /* From the ES 3.0 specification, page 180:
> -    * "If the GL is bound to the default framebuffer, then n must be 1
> -    *  and the constant must be BACK or NONE."
> -    */
> -   if (_mesa_is_gles3(ctx) && _mesa_is_winsys_fbo(ctx->DrawBuffer) &&
> -       (n != 1 || (buffers[0] != GL_NONE && buffers[0] != GL_BACK))) {
> -      _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffers(buffer)");
> -      return;
> +   if (_mesa_is_gles3(ctx)) {
> +      /* Section 4.2 (Whole Framebuffer Operations) of the OpenGL 3.0
> +       * specification says:
> +       *
> +       *     "Each buffer listed in bufs must be BACK, NONE, or one of the values
> +       *      from table 4.3 (NONE, COLOR_ATTACHMENTi)"
> +       */
> +      for (output = 0; output < n; output++) {
> +         if (buffers[output] != GL_NONE && buffers[output] != GL_BACK &&
> +             (buffers[output] < GL_COLOR_ATTACHMENT0 ||
> +              buffers[output] >= GL_COLOR_ATTACHMENT0 + ctx->Const.MaxColorAttachments)) {
> +            _mesa_error(ctx, GL_INVALID_ENUM, "glDrawBuffers(buffer)");
> +            return;
> +         }
> +      }
> +
> +      /* From the ES 3.0 specification, page 180:
> +       * "If the GL is bound to the default framebuffer, then n must be 1
> +       *  and the constant must be BACK or NONE."
> +       */
> +      if (_mesa_is_winsys_fbo(ctx->DrawBuffer) &&
> +          (n != 1 || (buffers[0] != GL_NONE && buffers[0] != GL_BACK))) {
> +         _mesa_error(ctx, GL_INVALID_OPERATION, "glDrawBuffers(buffer)");
> +         return;
> +      }
>     }
>  
>     /* complicated error checking... */
> 



More information about the mesa-dev mailing list