Mesa (master): main/buffers: update error handling on DrawBuffers for 4.5
Alejandro Pinheiro
apinheiro at kemper.freedesktop.org
Thu Jan 12 10:21:32 UTC 2017
Module: Mesa
Branch: master
Commit: d54bc7e01f3f2e3178adecf53ea243470a3d5d93
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d54bc7e01f3f2e3178adecf53ea243470a3d5d93
Author: Alejandro Piñeiro <apinheiro at igalia.com>
Date: Tue Dec 13 08:58:59 2016 -0200
main/buffers: update error handling on DrawBuffers for 4.5
Before 4.5, GL_BACK was not allowed as a value of bufs. Since 4.5 it
is allowed under some circumstances:
>From the OpenGL 4.5 specification, Section 17.4.1 "Selecting Buffers
for Writing", 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 de- fault 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):
"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."
This patch keeps the same behaviour if OpenGL version is < 4. We
assume that for 4.x this is the intended behaviour, so a fix, but for
3.x the intended behaviour is the already in place.
Part of the fix for:
GL45-CTS.direct_state_access.framebuffers_draw_read_buffers_errors
v2: remove forgot printf
v3: remove spaces before commas on spec quote, split line too
long (Anuj)
Reviewed-by: Anuj Phogat <anuj.phogat at gmail.com>
---
src/mesa/main/buffers.c | 46 +++++++++++++++++++++++++++++++++-------------
1 file changed, 33 insertions(+), 13 deletions(-)
diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
index 2b24e5a..bba5e7e 100644
--- a/src/mesa/main/buffers.c
+++ b/src/mesa/main/buffers.c
@@ -343,7 +343,9 @@ _mesa_NamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf)
* \param n number of outputs
* \param buffers array [n] of renderbuffer names. Unlike glDrawBuffer, the
* names cannot specify more than one buffer. For example,
- * GL_FRONT_AND_BACK is illegal.
+ * GL_FRONT_AND_BACK is illegal. The only exception is GL_BACK
+ * that is considered special and allowed as far as n is one
+ * since 4.5.
*/
static void
draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb,
@@ -401,20 +403,38 @@ draw_buffers(struct gl_context *ctx, struct gl_framebuffer *fb,
return;
}
- /* From the OpenGL 4.0 specification, page 256:
- * "For both the default framebuffer and framebuffer objects, the
- * constants FRONT, BACK, LEFT, RIGHT, and FRONT_AND_BACK are not
- * valid in the bufs array passed to DrawBuffers, and will result in
- * the error INVALID_ENUM. This restriction is because these
- * constants may themselves refer to multiple buffers, as shown in
- * table 4.4."
- * Previous versions of the OpenGL specification say INVALID_OPERATION,
- * but the Khronos conformance tests expect INVALID_ENUM.
+ /* 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):
+ * "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 (_mesa_bitcount(destMask[output]) > 1) {
- _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)",
- caller, _mesa_enum_to_string(buffers[output]));
- return;
+ 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]));
+ return;
+ }
}
/* Section 4.2 (Whole Framebuffer Operations) of the OpenGL ES 3.0
More information about the mesa-commit
mailing list