[PATCH xf86-video-ati] Swap pixmap privates in radeon_dri2_exchange_buffers

Michel Dänzer michel at daenzer.net
Tue Jul 10 15:24:51 UTC 2018


From: Michel Dänzer <michel.daenzer at amd.com>

Instead of only the BOs.

This matches what amdgpu does, and fixes issues with DRI2 page flipping.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/radeon_dri2.c | 42 +++++++++++++++++++++++-------------------
 1 file changed, 23 insertions(+), 19 deletions(-)

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index ab3db6c5e..70ad1d92a 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -720,9 +720,8 @@ radeon_dri2_exchange_buffers(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPt
 {
     struct dri2_buffer_priv *front_priv = front->driverPrivate;
     struct dri2_buffer_priv *back_priv = back->driverPrivate;
-    struct radeon_buffer *front_buffer, *back_buffer;
-    ScreenPtr screen;
-    RADEONInfoPtr info;
+    ScreenPtr screen = draw->pScreen;
+    RADEONInfoPtr info = RADEONPTR(xf86ScreenToScrn(screen));
     RegionRec region;
     int tmp;
 
@@ -737,23 +736,28 @@ radeon_dri2_exchange_buffers(DrawablePtr draw, DRI2BufferPtr front, DRI2BufferPt
     front->name = back->name;
     back->name = tmp;
 
-    /* Swap pixmap bos */
-    front_buffer = radeon_get_pixmap_bo(front_priv->pixmap);
-    back_buffer = radeon_get_pixmap_bo(back_priv->pixmap);
-    radeon_set_pixmap_bo(front_priv->pixmap, back_buffer);
-    radeon_set_pixmap_bo(back_priv->pixmap, front_buffer);
-
-    /* Do we need to update the Screen? */
-    screen = draw->pScreen;
-    info = RADEONPTR(xf86ScreenToScrn(screen));
-    if (front_buffer == info->front_buffer) {
-	radeon_buffer_ref(back_buffer);
-	radeon_buffer_unref(&info->front_buffer);
-	info->front_buffer = back_buffer;
-	radeon_set_pixmap_bo(screen->GetScreenPixmap(screen), back_buffer);
-    }
+    /* Swap pixmap privates */
+#ifdef USE_GLAMOR
+    if (info->use_glamor) {
+	struct radeon_pixmap *front_pix, *back_pix;
+
+	front_pix = radeon_get_pixmap_private(front_priv->pixmap);
+	back_pix = radeon_get_pixmap_private(back_priv->pixmap);
+	radeon_set_pixmap_private(front_priv->pixmap, back_pix);
+	radeon_set_pixmap_private(back_priv->pixmap, front_pix);
 
-    radeon_glamor_exchange_buffers(front_priv->pixmap, back_priv->pixmap);
+	radeon_glamor_exchange_buffers(front_priv->pixmap, back_priv->pixmap);
+    } else
+#endif
+    {
+	struct radeon_exa_pixmap_priv driver_priv = *(struct radeon_exa_pixmap_priv*)
+	    exaGetPixmapDriverPrivate(front_priv->pixmap);
+
+	*(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(front_priv->pixmap) =
+	    *(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(back_priv->pixmap);
+	*(struct radeon_exa_pixmap_priv*)exaGetPixmapDriverPrivate(back_priv->pixmap) =
+	    driver_priv;
+    }
 
     DamageRegionProcessPending(&front_priv->pixmap->drawable);
 }
-- 
2.18.0



More information about the amd-gfx mailing list