mesa: Fix ReadBuffers with pbuffers
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 28 Jun 2019 19:56:38 +0000 (12:56 -0700)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 22 Jul 2019 23:58:09 +0000 (16:58 -0700)
pbuffers are internally single-buffered.  Marek fixed DrawBuffers to
handle this case, but we need to fix ReadBuffers too.  Otherwise,
pretty much every conformance test fails because glReadPixels breaks.

v2: Refactor the switch into a helper (suggested by Eric Anholt)

Fixes: 35294f2eca8 ("mesa: fix pbuffers because internally they are front buffers")
Acked-by: Eric Engestrom <eric.engestrom@intel.com> (v1)
Reviewed-by: Eric Anholt <eric@anholt.net>
src/mesa/main/buffers.c

index a46599a28721f6026c76d4adaa1d18a1283c30b5..4e48b76fcb884a4affeccfbffebf85c47a848231 100644 (file)
@@ -84,14 +84,8 @@ supported_buffer_bitmask(const struct gl_context *ctx,
    return mask;
 }
 
-
-/**
- * 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)
+static GLenum
+back_to_front_if_single_buffered(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
@@ -129,6 +123,19 @@ draw_buffer_enum_to_bitmask(const struct gl_context *ctx, GLenum buffer)
       }
    }
 
+   return buffer;
+}
+
+/**
+ * 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)
+{
+   buffer = back_to_front_if_single_buffered(ctx, buffer);
+
    switch (buffer) {
       case GL_NONE:
          return 0;
@@ -192,20 +199,12 @@ draw_buffer_enum_to_bitmask(const struct gl_context *ctx, GLenum buffer)
 static gl_buffer_index
 read_buffer_enum_to_index(const struct gl_context *ctx, GLenum buffer)
 {
+   buffer = back_to_front_if_single_buffered(ctx, buffer);
+
    switch (buffer) {
       case GL_FRONT:
          return BUFFER_FRONT_LEFT;
       case GL_BACK:
-         if (_mesa_is_gles(ctx)) {
-            /* In draw_buffer_enum_to_bitmask, when GLES contexts draw to
-             * GL_BACK with a single-buffered configuration, we actually end
-             * up drawing to the sole front buffer in our internal
-             * representation.  For consistency, we must read from that
-             * front left buffer too.
-             */
-            if (!ctx->DrawBuffer->Visual.doubleBufferMode)
-               return BUFFER_FRONT_LEFT;
-         }
          return BUFFER_BACK_LEFT;
       case GL_RIGHT:
          return BUFFER_FRONT_RIGHT;