Module: Mesa
Branch: master
Commit: bb4c70358778f28f644ae493b5d8163e76e9fddb
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=bb4c70358778f28f644ae493b5d8163e76e9fddb

Author: Dave Airlie <[email protected]>
Date:   Tue Jul 14 01:22:17 2009 +1000

radeon: port more front fixes from intel.

Port fixes to read buffer from front.

---

 src/mesa/drivers/dri/radeon/radeon_common.c        |   11 +++++++++++
 .../drivers/dri/radeon/radeon_common_context.c     |    5 ++++-
 .../drivers/dri/radeon/radeon_common_context.h     |    9 +++++++++
 3 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/src/mesa/drivers/dri/radeon/radeon_common.c 
b/src/mesa/drivers/dri/radeon/radeon_common.c
index 3b8541a..0853518 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common.c
@@ -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.
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.c 
b/src/mesa/drivers/dri/radeon/radeon_common_context.c
index 94bda78..828d647 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common_context.c
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.c
@@ -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]);
                }
diff --git a/src/mesa/drivers/dri/radeon/radeon_common_context.h 
b/src/mesa/drivers/dri/radeon/radeon_common_context.h
index 8781715..036d265 100644
--- a/src/mesa/drivers/dri/radeon/radeon_common_context.h
+++ b/src/mesa/drivers/dri/radeon/radeon_common_context.h
@@ -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;

_______________________________________________
mesa-commit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to