diff options
Diffstat (limited to 'src/mesa/main/buffers.c')
-rw-r--r-- | src/mesa/main/buffers.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/mesa/main/buffers.c b/src/mesa/main/buffers.c index e8aedde8777..86696b80c87 100644 --- a/src/mesa/main/buffers.c +++ b/src/mesa/main/buffers.c @@ -173,12 +173,22 @@ draw_buffer_enum_to_bitmask(const struct gl_context *ctx, GLenum buffer) * return -1 for an invalid buffer. */ static gl_buffer_index -read_buffer_enum_to_index(GLenum buffer) +read_buffer_enum_to_index(const struct gl_context *ctx, GLenum 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; @@ -724,7 +734,7 @@ read_buffer(struct gl_context *ctx, struct gl_framebuffer *fb, if (_mesa_is_gles3(ctx) && !is_legal_es3_readbuffer_enum(buffer)) srcBuffer = -1; else - srcBuffer = read_buffer_enum_to_index(buffer); + srcBuffer = read_buffer_enum_to_index(ctx, buffer); if (srcBuffer == -1) { _mesa_error(ctx, GL_INVALID_ENUM, |