From 78164a3a6c278adcbb93e21b64a575c3f8598327 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Fri, 28 Jun 2019 12:56:38 -0700 Subject: [PATCH] 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 (v1) Reviewed-by: Eric Anholt --- src/mesa/main/buffers.c | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index a46599a..4e48b76 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; -- 2.7.4