[Mesa-dev] [PATCH 2/3] mesa: fix pbuffers because internally they are front buffers

Marek Olšák maraeo at gmail.com
Sat Apr 27 03:31:46 UTC 2019


From: Marek Olšák <marek.olsak at amd.com>

This fixes the egl_ext_device_base piglit test, which uses EGL pbuffers.
---
 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 2148fa1316c..1ac0d5d0798 100644
--- a/src/mesa/main/buffers.c
+++ b/src/mesa/main/buffers.c
@@ -86,46 +86,62 @@ supported_buffer_bitmask(const struct gl_context *ctx,
 
 
 /**
  * Helper routine used by glDrawBuffer and glDrawBuffersARB.
  * Given a GLenum naming one or more color buffers (such as
  * GL_FRONT_AND_BACK), return the corresponding bitmask of BUFFER_BIT_* flags.
  */
 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;
       case GL_FRONT_RIGHT:
          return BUFFER_BIT_FRONT_RIGHT;
       case GL_BACK_RIGHT:
          return BUFFER_BIT_BACK_RIGHT;
       case GL_BACK_LEFT:
          return BUFFER_BIT_BACK_LEFT;
       case GL_FRONT_AND_BACK:
-- 
2.17.1



More information about the mesa-dev mailing list