[xserver patch v3 4/5] glx/dri2: Notify the driver when its buffers become invalid.

Francisco Jerez currojerez at riseup.net
Fri Jan 22 06:29:37 PST 2010


Signed-off-by: Francisco Jerez <currojerez at riseup.net>
---
 glx/glxdri2.c |   31 ++++++++++++++++++++++++++++---
 1 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/glx/glxdri2.c b/glx/glxdri2.c
index 69fd39b..5cb15d9 100644
--- a/glx/glxdri2.c
+++ b/glx/glxdri2.c
@@ -67,6 +67,7 @@ struct __GLXDRIscreen {
 
     xf86EnterVTProc	*enterVT;
     xf86LeaveVTProc	*leaveVT;
+    PreConfigureWindowProcPtr PreConfigureWindow;
 
     const __DRIcoreExtension *core;
     const __DRIdri2Extension *dri2;
@@ -217,13 +218,16 @@ __glXDRIdrawableSwapBuffers(ClientPtr client, __GLXdrawable *drawable)
     __GLXDRIscreen *screen = priv->screen;
     CARD64 unused;
 
-    if (screen->flush)
-	(*screen->flush->flushInvalidate)(priv->driDrawable);
-
     if (DRI2SwapBuffers(client, drawable->pDraw, 0, 0, 0, &unused,
 			__glXdriSwapEvent, drawable->pDraw) != Success)
 	return FALSE;
 
+    if (screen->flush)
+	(*screen->flush->invalidate)(priv->driDrawable);
+
+    if (screen->flush && screen->flush->flushInvalidate)
+	(*screen->flush->flushInvalidate)(priv->driDrawable);
+
     return TRUE;
 }
 
@@ -607,6 +611,24 @@ glxDRILeaveVT (int index, int flags)
 }
 
 static void
+glxDRIPreConfigureWindow(WindowPtr pWin, int x, int y, int w, int h, int bw,
+			 WindowPtr pSib)
+{
+    ScreenPtr pScreen = pWin->drawable.pScreen;
+    __GLXDRIscreen *screen = (__GLXDRIscreen *)glxGetScreen(pScreen);
+    __GLXDRIdrawable *draw = (__GLXDRIdrawable *)glxGetDrawableFromWindow(pWin);
+
+    if (screen->PreConfigureWindow)
+	    (*screen->PreConfigureWindow)(pWin, x, y, w, h, bw, pSib);
+
+    if (!draw || (draw->height == h && draw->width == w))
+	    return;
+
+    if (screen->flush)
+	    screen->flush->invalidate(draw->driDrawable);
+}
+
+static void
 initializeExtensions(__GLXDRIscreen *screen)
 {
     const __DRIextension **extensions;
@@ -782,6 +804,9 @@ __glXDRIscreenProbe(ScreenPtr pScreen)
     screen->leaveVT = pScrn->LeaveVT;
     pScrn->LeaveVT = glxDRILeaveVT;
 
+    screen->PreConfigureWindow = pScreen->PreConfigureWindow;
+    pScreen->PreConfigureWindow = glxDRIPreConfigureWindow;
+
     LogMessage(X_INFO,
 	       "AIGLX: Loaded and initialized %s\n", filename);
 
-- 
1.6.4.4



More information about the xorg-devel mailing list