summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2019-06-28 12:56:38 -0700
committerKenneth Graunke <[email protected]>2019-07-22 16:58:09 -0700
commit78164a3a6c278adcbb93e21b64a575c3f8598327 (patch)
treed9960ccdb1fffc1e8d150867ab9154a29fca1a99 /src/mesa/main
parentc37df5feaa267080b836bbcf0f2727ec9f1d288e (diff)
mesa: Fix ReadBuffers with pbuffers
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 <[email protected]> (v1) Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/buffers.c35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c
index a46599a2872..4e48b76fcb8 100644
--- a/src/mesa/main/buffers.c
+++ b/src/mesa/main/buffers.c
@@ -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;