From 35294f2eca8b49193f1bcb8c62edbcc1537a9cc3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Fri, 26 Apr 2019 20:53:52 -0400 Subject: [PATCH] mesa: fix pbuffers because internally they are front buffers This fixes the egl_ext_device_base piglit test, which uses EGL pbuffers. Reviewed-by: Emil Velikov --- src/mesa/main/buffers.c | 56 ++++++++++++++++++++++++++--------------- 1 file changed, 36 insertions(+), 20 deletions(-) diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index 6e853346442..a46599a2872 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -93,32 +93,48 @@ supported_buffer_bitmask(const struct gl_context *ctx, static GLbitfield draw_buffer_enum_to_bitmask(const struct gl_context *ctx, GLenum buffer) { + /* If the front buffer is the only buffer, GL_BACK and all other flags + * that include BACK select the front buffer for drawing. There are + * several reasons we want to do this. + * + * 1) OpenGL ES 3.0 requires it: + * + * Page 181 (page 192 of the PDF) in section 4.2.1 of the OpenGL + * ES 3.0.1 specification says: + * + * "When draw buffer zero is BACK, color values are written + * into the sole buffer for single-buffered contexts, or into + * the back buffer for double-buffered contexts." + * + * We also do this for GLES 1 and 2 because those APIs have no + * concept of selecting the front and back buffer anyway and it's + * convenient to be able to maintain the magic behaviour of + * GL_BACK in that case. + * + * 2) Pbuffers are back buffers from the application point of view, + * but they are front buffers from the Mesa point of view, + * because they are always single buffered. + */ + if (!ctx->DrawBuffer->Visual.doubleBufferMode) { + switch (buffer) { + case GL_BACK: + buffer = GL_FRONT; + break; + case GL_BACK_RIGHT: + buffer = GL_FRONT_RIGHT; + break; + case GL_BACK_LEFT: + buffer = GL_FRONT_LEFT; + break; + } + } + switch (buffer) { case GL_NONE: return 0; case GL_FRONT: return BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT; case GL_BACK: - if (_mesa_is_gles(ctx)) { - /* Page 181 (page 192 of the PDF) in section 4.2.1 of the OpenGL - * ES 3.0.1 specification says: - * - * "When draw buffer zero is BACK, color values are written - * into the sole buffer for single-buffered contexts, or into - * the back buffer for double-buffered contexts." - * - * Since there is no stereo rendering in ES 3.0, only return the - * LEFT bits. This also satisfies the "n must be 1" requirement. - * - * We also do this for GLES 1 and 2 because those APIs have no - * concept of selecting the front and back buffer anyway and it's - * convenient to be able to maintain the magic behaviour of - * GL_BACK in that case. - */ - if (ctx->DrawBuffer->Visual.doubleBufferMode) - return BUFFER_BIT_BACK_LEFT; - return BUFFER_BIT_FRONT_LEFT; - } return BUFFER_BIT_BACK_LEFT | BUFFER_BIT_BACK_RIGHT; case GL_RIGHT: return BUFFER_BIT_FRONT_RIGHT | BUFFER_BIT_BACK_RIGHT; -- 2.30.2