[Mesa-dev] [PATCH 13/15] st/dri: manually swap MSAA front and back buffers in SwapBuffers

Marek Olšák maraeo at gmail.com
Sat Jun 1 07:29:29 PDT 2013


---
 .../state_trackers/dri/common/dri_drawable.c       |   25 ++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/src/gallium/state_trackers/dri/common/dri_drawable.c b/src/gallium/state_trackers/dri/common/dri_drawable.c
index ff04d57..1c2bad4 100644
--- a/src/gallium/state_trackers/dri/common/dri_drawable.c
+++ b/src/gallium/state_trackers/dri/common/dri_drawable.c
@@ -414,6 +414,7 @@ dri_flush(__DRIcontext *cPriv,
    struct dri_context *ctx = dri_context(cPriv);
    struct dri_drawable *drawable = dri_drawable(dPriv);
    unsigned flush_flags;
+   boolean swap_msaa_buffers = FALSE;
 
    if (!ctx) {
       assert(0);
@@ -440,6 +441,12 @@ dri_flush(__DRIcontext *cPriv,
                        drawable->textures[ST_ATTACHMENT_BACK_LEFT],
                        drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]);
 
+         if (reason == __DRI2_THROTTLE_SWAPBUFFER &&
+             drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT] &&
+             drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT]) {
+            swap_msaa_buffers = TRUE;
+         }
+
          /* FRONT_LEFT is resolved in drawable->flush_frontbuffer. */
       }
 
@@ -494,6 +501,24 @@ dri_flush(__DRIcontext *cPriv,
    if (drawable) {
       drawable->flushing = FALSE;
    }
+
+   /* Swap the MSAA front and back buffers, so that reading
+    * from the front buffer after SwapBuffers returns what was
+    * in the back buffer.
+    */
+   if (swap_msaa_buffers) {
+      struct pipe_resource *tmp =
+         drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT];
+
+      drawable->msaa_textures[ST_ATTACHMENT_FRONT_LEFT] =
+         drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT];
+      drawable->msaa_textures[ST_ATTACHMENT_BACK_LEFT] = tmp;
+
+      /* Now that we have swapped the buffers, this tells the state
+       * tracker to revalidate the framebuffer.
+       */
+      p_atomic_inc(&drawable->base.stamp);
+   }
 }
 
 /**
-- 
1.7.10.4



More information about the mesa-dev mailing list