mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 11:18:08 +02:00
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: 35294f2eca ("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>
This commit is contained in:
parent
c37df5feaa
commit
78164a3a6c
1 changed files with 17 additions and 18 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue