st/dri: manually swap MSAA front and back buffers in SwapBuffers
authorMarek Olšák <maraeo@gmail.com>
Fri, 31 May 2013 20:48:48 +0000 (22:48 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 13 Jun 2013 01:54:14 +0000 (03:54 +0200)
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/state_trackers/dri/common/dri_drawable.c

index ff04d57a258879cf0dde54d35bfe386f4640ddb9..1c2bad42cbe1b66f6082b420e37e0e2ac752d528 100644 (file)
@@ -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);
+   }
 }
 
 /**