<div dir="ltr"><div dir="ltr"><div dir="ltr"><div>I'm adding this hunk, which makes the test pass:</div><div><br></div>diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c<br>index 1ac0d5d0798..a46599a2872 100644<br>--- a/src/mesa/main/buffers.c<br>+++ b/src/mesa/main/buffers.c<br>@@ -485,7 +485,9 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n,<br>          } else if (buffers[output] == GL_FRONT ||<br>                     buffers[output] == GL_LEFT ||<br>                     buffers[output] == GL_RIGHT ||<br>-                    buffers[output] == GL_FRONT_AND_BACK) {<br>+                    buffers[output] == GL_FRONT_AND_BACK ||<br>+                    (buffers[output] == GL_BACK &&<br>+                     _mesa_is_desktop_gl(ctx))) {<br>             _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",<br>                         caller, _mesa_enum_to_string(buffers[output]));<br>             return;</div><div dir="ltr"><br></div><div dir="ltr">Marek<br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Apr 27, 2019 at 10:23 AM Mathias Fröhlich <<a href="mailto:Mathias.Froehlich@gmx.net">Mathias.Froehlich@gmx.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi Marek,<br>
<br>
one comment/failure inline:<br>
<br>
On Saturday, 27 April 2019 05:31:45 CEST Marek Olšák wrote:<br>
> From: Marek Olšák <<a href="mailto:marek.olsak@amd.com" target="_blank">marek.olsak@amd.com</a>><br>
> <br>
> It's needed by the next pbuffer fix, which changes the behavior of<br>
> draw_buffer_enum_to_bitmask, so it can't be used to help with error<br>
> checking.<br>
> ---<br>
>  src/mesa/main/buffers.c | 53 ++++++++++++++++++++++-------------------<br>
>  1 file changed, 29 insertions(+), 24 deletions(-)<br>
> <br>
> diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c<br>
> index d98c015bb24..2148fa1316c 100644<br>
> --- a/src/mesa/main/buffers.c<br>
> +++ b/src/mesa/main/buffers.c<br>
> @@ -430,65 +430,70 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n,<br>
>           _mesa_error(ctx, GL_INVALID_OPERATION, "%s(invalid buffers)", caller);<br>
>           return;<br>
>        }<br>
>     }<br>
>  <br>
>     supportedMask = supported_buffer_bitmask(ctx, fb);<br>
>     usedBufferMask = 0x0;<br>
>  <br>
>     /* complicated error checking... */<br>
>     for (output = 0; output < n; output++) {<br>
> -      destMask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);<br>
> -<br>
>        if (!no_error) {<br>
> -         /* From the OpenGL 3.0 specification, page 258:<br>
> -          * "Each buffer listed in bufs must be one of the values from tables<br>
> -          *  4.5 or 4.6.  Otherwise, an INVALID_ENUM error is generated.<br>
> -          */<br>
> -         if (destMask[output] == BAD_MASK) {<br>
> -            _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",<br>
> -                        caller, _mesa_enum_to_string(buffers[output]));<br>
> -            return;<br>
> -         }<br>
> -<br>
>           /* From the OpenGL 4.5 specification, page 493 (page 515 of the PDF)<br>
>            * "An INVALID_ENUM error is generated if any value in bufs is FRONT,<br>
>            * LEFT, RIGHT, or FRONT_AND_BACK . This restriction applies to both<br>
>            * the default framebuffer and framebuffer objects, and exists because<br>
>            * these constants may themselves refer to multiple buffers, as shown<br>
>            * in table 17.4."<br>
>            *<br>
> -          * And on page 492 (page 514 of the PDF):<br>
> +          * From the OpenGL 4.5 specification, page 492 (page 514 of the PDF):<br>
>            * "If the default framebuffer is affected, then each of the constants<br>
>            * must be one of the values listed in table 17.6 or the special value<br>
>            * BACK. When BACK is used, n must be 1 and color values are written<br>
>            * into the left buffer for single-buffered contexts, or into the back<br>
>            * left buffer for double-buffered contexts."<br>
>            *<br>
>            * Note "special value BACK". GL_BACK also refers to multiple buffers,<br>
>            * but it is consider a special case here. This is a change on 4.5.<br>
>            * For OpenGL 4.x we check that behaviour. For any previous version we<br>
>            * keep considering it wrong (as INVALID_ENUM).<br>
>            */<br>
> -         if (util_bitcount(destMask[output]) > 1) {<br>
> -            if (_mesa_is_winsys_fbo(fb) && ctx->Version >= 40 &&<br>
> -                buffers[output] == GL_BACK) {<br>
> -               if (n != 1) {<br>
> -                  _mesa_error(ctx, GL_INVALID_OPERATION, "%s(with GL_BACK n must be 1)",<br>
> -                              caller);<br>
> -                  return;<br>
> -               }<br>
> -            } else {<br>
> -               _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",<br>
> -                           caller, _mesa_enum_to_string(buffers[output]));<br>
> +         if (buffers[output] == GL_BACK &&<br>
> +             _mesa_is_winsys_fbo(fb) &&<br>
> +             _mesa_is_desktop_gl(ctx) &&<br>
> +             ctx->Version >= 40) {<br>
> +            if (n != 1) {<br>
> +               _mesa_error(ctx, GL_INVALID_OPERATION, "%s(with GL_BACK n must be 1)",<br>
> +                           caller);<br>
>                 return;<br>
>              }<br>
> +         } else if (buffers[output] == GL_FRONT ||<br>
> +                    buffers[output] == GL_LEFT ||<br>
> +                    buffers[output] == GL_RIGHT ||<br>
> +                    buffers[output] == GL_FRONT_AND_BACK) {<br>
> +            _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",<br>
> +                        caller, _mesa_enum_to_string(buffers[output]));<br>
> +            return;<br>
> +         }<br>
> +      }<br>
<br>
According to the comment above "Note "special value BACK". GL_BACK...",<br>
there must also be a GL_INVALID_ENUM on GL_BACK when not in opengles. Right?<br>
<br>
That specific case can be tested using<br>
MESA_GL_VERSION_OVERRIDE=3.3 piglit/bin/gl-3.1-draw-buffers-errors <br>
<br>
best<br>
<br>
Mathias<br>
<br>
> +<br>
> +      destMask[output] = draw_buffer_enum_to_bitmask(ctx, buffers[output]);<br>
> +<br>
> +      if (!no_error) {<br>
> +         /* From the OpenGL 3.0 specification, page 258:<br>
> +          * "Each buffer listed in bufs must be one of the values from tables<br>
> +          *  4.5 or 4.6.  Otherwise, an INVALID_ENUM error is generated.<br>
> +          */<br>
> +         if (destMask[output] == BAD_MASK) {<br>
> +            _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",<br>
> +                        caller, _mesa_enum_to_string(buffers[output]));<br>
> +            return;<br>
>           }<br>
>  <br>
>           /* Section 4.2 (Whole Framebuffer Operations) of the OpenGL ES 3.0<br>
>            * specification says:<br>
>            *<br>
>            *     "If the GL is bound to a draw framebuffer object, the ith<br>
>            *     buffer listed in bufs must be COLOR_ATTACHMENTi or NONE .<br>
>            *     Specifying a buffer out of order, BACK , or COLOR_ATTACHMENTm<br>
>            *     where m is greater than or equal to the value of MAX_-<br>
>            *     COLOR_ATTACHMENTS , will generate the error INVALID_OPERATION .<br>
> <br>
<br>
<br>
<br>
<br>
</blockquote></div>