X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fbuffers.c;h=d85974afe60d24eab710a7fbd3df325839c25a75;hb=edd50828618ed2efe799013c2723d67c407d86b4;hp=2b24e5ad17f7b0c4c137df31c8faa4859bfb428c;hpb=a1652a059edc5a5f0f4b0836ba310a22e094bd85;p=mesa.git diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 2b24e5ad17f..d85974afe60 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -204,6 +204,8 @@ read_buffer_enum_to_index(const struct gl_context *ctx, GLenum buffer) return BUFFER_FRONT_LEFT; case GL_AUX0: return BUFFER_AUX0; + case GL_FRONT_AND_BACK: + return BUFFER_FRONT_LEFT; case GL_AUX1: case GL_AUX2: case GL_AUX3: @@ -229,7 +231,7 @@ read_buffer_enum_to_index(const struct gl_context *ctx, GLenum buffer) if (buffer >= GL_COLOR_ATTACHMENT8 && buffer <= GL_COLOR_ATTACHMENT31) return BUFFER_COUNT; /* error */ - return -1; + return BUFFER_NONE; } } @@ -343,7 +345,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 +405,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 @@ -730,16 +752,16 @@ read_buffer(struct gl_context *ctx, struct gl_framebuffer *fb, if (buffer == GL_NONE) { /* This is legal--it means that no buffer should be bound for reading. */ - srcBuffer = -1; + srcBuffer = BUFFER_NONE; } else { /* general case / window-system framebuffer */ if (_mesa_is_gles3(ctx) && !is_legal_es3_readbuffer_enum(buffer)) - srcBuffer = -1; + srcBuffer = BUFFER_NONE; else srcBuffer = read_buffer_enum_to_index(ctx, buffer); - if (srcBuffer == -1) { + if (srcBuffer == BUFFER_NONE) { _mesa_error(ctx, GL_INVALID_ENUM, "%s(invalid buffer %s)", caller, _mesa_enum_to_string(buffer));