summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/buffers.c
diff options
context:
space:
mode:
authorMarek Olšák <[email protected]>2019-04-26 22:06:20 -0400
committerMarek Olšák <[email protected]>2019-05-01 21:15:33 -0400
commitf753f913f5a14c389b76ef6d43a87b9476e6c972 (patch)
tree9d9bd0f699fcddd737d3fafd6d1fca3121c060af /src/mesa/main/buffers.c
parent0c99b5ace888d1bb81d8f334e4ea019547fe69c4 (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.c55
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