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