diff options
author | Marek Olšák <[email protected]> | 2019-04-26 22:06:20 -0400 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2019-05-01 21:15:33 -0400 |
commit | f753f913f5a14c389b76ef6d43a87b9476e6c972 (patch) | |
tree | 9d9bd0f699fcddd737d3fafd6d1fca3121c060af /src/mesa/main/buffers.c | |
parent | 0c99b5ace888d1bb81d8f334e4ea019547fe69c4 (diff) |
mesa: rework error handling in glDrawBuffers
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.
Reviewed-by: Emil Velikov <[email protected]>
Diffstat (limited to 'src/mesa/main/buffers.c')
-rw-r--r-- | src/mesa/main/buffers.c | 55 |
1 files changed, 31 insertions, 24 deletions
diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index d98c015bb24..6e853346442 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -437,19 +437,7 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n, /* 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 @@ -457,7 +445,7 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n, * 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 @@ -469,19 +457,38 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb, GLsizei n, * 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 || + (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; + } + } + + 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 |