radeon: port more front fixes from intel.
authorDave Airlie <airlied@linux.ie>
Mon, 13 Jul 2009 15:22:17 +0000 (01:22 +1000)
committerDave Airlie <airlied@linux.ie>
Mon, 13 Jul 2009 15:23:24 +0000 (01:23 +1000)
Port fixes to read buffer from front.

src/mesa/drivers/dri/radeon/radeon_common.c
src/mesa/drivers/dri/radeon/radeon_common_context.c
src/mesa/drivers/dri/radeon/radeon_common_context.h

index 3b8541a74a447a2be8ab4d3a363543b9ccd758d5..08535180b8cf22d18a486b9d48b77b0141ddfcf2 100644 (file)
@@ -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.
index 94bda78ce3a219254fabea25421bad2befb8feb0..828d6477f014c08a37bca277e95e54fa0dd8f963 100644 (file)
@@ -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]);
                }
index 8781715af07795bc66a7a69cd0a679eb7c5ed81e..036d2658d985f46091cadd8c2c58c78be67bba6a 100644 (file)
@@ -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;