[PATCH xserver 2/2] dri2: Invalidate DRI2 buffers for all windows with the same pixmap on swap.

Keith Packard keithp at keithp.com
Wed Apr 6 09:50:48 PDT 2011


On Wed, 06 Apr 2011 10:19:01 +0200, Michel Dänzer <michel at daenzer.net> wrote:

> 10 days have passed.

I hoped you would take a few minutes and write a more efficient
version. Like this.

diff --git a/hw/xfree86/dri2/dri2.c b/hw/xfree86/dri2/dri2.c
index 10be599..6e9abb2 100644
--- a/hw/xfree86/dri2/dri2.c
+++ b/hw/xfree86/dri2/dri2.c
@@ -782,6 +782,20 @@ DRI2WaitSwap(ClientPtr client, DrawablePtr pDrawable)
     return FALSE;
 }
 
+/*
+ * A TraverseTree callback to invalidate all windows using the same
+ * pixmap
+ */
+
+static int
+DRI2InvalidateWalk(WindowPtr pWin, pointer data)
+{
+    if (pWin->drawable.pScreen->GetWindowPixmap(pWin) != data)
+	return WT_DONTWALKCHILDREN;
+    DRI2InvalidateDrawable(&pWin->drawable);
+    return WT_WALKCHILDREN;
+}
+
 int
 DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
 		CARD64 divisor, CARD64 remainder, CARD64 *swap_target,
@@ -882,7 +896,23 @@ DRI2SwapBuffers(ClientPtr client, DrawablePtr pDraw, CARD64 target_msc,
      */
     *swap_target = pPriv->swap_count + pPriv->swapsPending;
 
-    DRI2InvalidateDrawable(pDraw);
+    if (pDraw->type == DRAWABLE_WINDOW) {
+	WindowPtr	pWin = (WindowPtr) pDraw;
+	PixmapPtr	pPixmap = pScreen->GetWindowPixmap(pWin);
+
+	/*
+	 * Find the top-most window using this pixmap
+	 */
+	while (pWin->parent && pScreen->GetWindowPixmap(pWin->parent) == pPixmap)
+	    pWin = pWin->parent;
+
+	/*
+	 * Walk the sub-tree to invalidate all of the
+	 * windows using the same pixmap
+	 */
+	TraverseTree(pWin, DRI2InvalidateWalk, pPixmap);
+    } else
+	DRI2InvalidateDrawable(pDraw);
 
     return Success;
 }

-- 
keith.packard at intel.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20110406/1dcad6b4/attachment.pgp>


More information about the xorg-devel mailing list