diff options
author | Kenneth Graunke <[email protected]> | 2019-06-28 12:56:38 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2019-07-22 16:58:09 -0700 |
commit | 78164a3a6c278adcbb93e21b64a575c3f8598327 (patch) | |
tree | d9960ccdb1fffc1e8d150867ab9154a29fca1a99 /src/mesa/main | |
parent | c37df5feaa267080b836bbcf0f2727ec9f1d288e (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.c | 35 |
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; |