Port fixes to read buffer from front.tags/mesa_7_6_rc1
@@ -823,6 +823,17 @@ void radeonDrawBuffer( GLcontext *ctx, GLenum mode ) | |||
void radeonReadBuffer( GLcontext *ctx, GLenum mode ) | |||
{ | |||
if ((ctx->DrawBuffer != NULL) && (ctx->DrawBuffer->Name == 0)) { | |||
struct radeon_context *const rmesa = RADEON_CONTEXT(ctx); | |||
const GLboolean was_front_buffer_reading = rmesa->is_front_buffer_reading; | |||
rmesa->is_front_buffer_reading = (mode == GL_FRONT_LEFT) | |||
|| (mode == GL_FRONT); | |||
if (!was_front_buffer_reading && rmesa->is_front_buffer_reading) { | |||
radeon_update_renderbuffers(rmesa->dri.context, | |||
rmesa->dri.context->driReadablePriv); | |||
} | |||
} | |||
/* nothing, until we implement h/w glRead/CopyPixels or CopyTexImage */ | |||
if (ctx->ReadBuffer == ctx->DrawBuffer) { | |||
/* This will update FBO completeness status. |
@@ -487,7 +487,10 @@ radeon_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) | |||
struct radeon_renderbuffer *stencil_rb; | |||
i = 0; | |||
if (draw->color_rb[0]) { | |||
if ((radeon->is_front_buffer_rendering || | |||
radeon->is_front_buffer_reading || | |||
!draw->color_rb[1]) | |||
&& draw->color_rb[0]) { | |||
attachments[i++] = __DRI_BUFFER_FRONT_LEFT; | |||
attachments[i++] = radeon_bits_per_pixel(draw->color_rb[0]); | |||
} |
@@ -467,6 +467,15 @@ struct radeon_context { | |||
*/ | |||
GLboolean is_front_buffer_rendering; | |||
/** | |||
* Track whether front-buffer is the current read target. | |||
* | |||
* This is closely associated with is_front_buffer_rendering, but may | |||
* be set separately. The DRI2 fake front buffer must be referenced | |||
* either way. | |||
*/ | |||
GLboolean is_front_buffer_reading; | |||
/* info for radeon_clear_tris() */ | |||
struct { | |||
struct gl_array_object *arrayObj; |