5d4276c
diff -up xorg-server-1.3.0.0/hw/xfree86/xaa/xaaInit.c.offscreen-pixmaps xorg-server-1.3.0.0/hw/xfree86/xaa/xaaInit.c
5d4276c
--- xorg-server-1.3.0.0/hw/xfree86/xaa/xaaInit.c.offscreen-pixmaps	2007-08-13 10:27:45.000000000 +1000
5d4276c
+++ xorg-server-1.3.0.0/hw/xfree86/xaa/xaaInit.c	2007-08-13 10:28:35.000000000 +1000
5d4276c
@@ -97,6 +97,30 @@ XAADestroyInfoRec(XAAInfoRecPtr infoRec)
Kristian Høgsberg 22c56dc
     xfree(infoRec);
Kristian Høgsberg 22c56dc
 }
Kristian Høgsberg 22c56dc
 
Kristian Høgsberg ed663d8
+void
Kristian Høgsberg ed663d8
+XAAEvictPixmaps(void)
Kristian Høgsberg 22c56dc
+{
Kristian Høgsberg ed663d8
+    XAAScreenPtr pScreenPriv;
Kristian Høgsberg ed663d8
+    XAAInfoRecPtr infoRec;
Kristian Høgsberg ed663d8
+    ScreenPtr pScreen;
Kristian Høgsberg ed663d8
+    int i;
Kristian Høgsberg 22c56dc
+
Kristian Høgsberg ed663d8
+    xf86MsgVerb(X_INFO, 3, "XAA: Evicting pixmaps\n");
Kristian Høgsberg 22c56dc
+
Kristian Høgsberg ed663d8
+    for (i = 0; i < screenInfo.numScreens; i++) {
Kristian Høgsberg ed663d8
+	pScreen = screenInfo.screens[i];
Kristian Høgsberg ed663d8
+	infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen);
Kristian Høgsberg ed663d8
+
Kristian Høgsberg ed663d8
+	pScreenPriv = pScreen->devPrivates[XAAScreenIndex].ptr;
Kristian Høgsberg ed663d8
+	infoRec = pScreenPriv->AccelInfoRec;
Kristian Høgsberg 8d0b84f
+
Kristian Høgsberg 22c56dc
+	infoRec->offscreenDepths = 0;
Kristian Høgsberg 22c56dc
+	infoRec->Flags &= ~OFFSCREEN_PIXMAPS;
Kristian Høgsberg 22c56dc
+       
Kristian Høgsberg 22c56dc
+	XAAMoveOutOffscreenPixmaps(pScreen);
Kristian Høgsberg 22c56dc
+	XAAInvalidatePixmapCache(pScreen);
Kristian Høgsberg 22c56dc
+    }
Kristian Høgsberg 22c56dc
+}
Kristian Høgsberg 22c56dc
 
Kristian Høgsberg 22c56dc
 Bool 
Kristian Høgsberg 22c56dc
 XAAInit(ScreenPtr pScreen, XAAInfoRecPtr infoRec)
5d4276c
diff -up xorg-server-1.3.0.0/GL/glx/glxdri.c.offscreen-pixmaps xorg-server-1.3.0.0/GL/glx/glxdri.c
5d4276c
--- xorg-server-1.3.0.0/GL/glx/glxdri.c.offscreen-pixmaps	2007-08-13 10:23:52.000000000 +1000
5d4276c
+++ xorg-server-1.3.0.0/GL/glx/glxdri.c	2007-08-13 10:26:08.000000000 +1000
5d4276c
@@ -380,6 +380,22 @@ __glXDRIbindTexImage(__GLXcontext *baseC
5d4276c
     __GLXDRIscreen * const screen =
5d4276c
 	(__GLXDRIscreen *) __glXgetActiveScreen(pScreen->myNum);
5d4276c
 
bb8ddfe
+    if (!screen->texOffsetStart) {
5d4276c
+         /* When the GLX_EXT_texture_from_pixmap is used, as it's
5d4276c
+          * implemented here, we want to pull pixmap out of video memory
5d4276c
+          * and into host memory. */
5d4276c
+         extern void XAAEvictPixmaps(void);
5d4276c
+         static int evictedPixmaps = 0;
5d4276c
+
5d4276c
+         if (!evictedPixmaps) {
5d4276c
+             __glXDRIenterServer(GL_FALSE);
5d4276c
+                 if (dlsym(RTLD_DEFAULT, "XAAEvictPixmaps"))
5d4276c
+                      XAAEvictPixmaps();
5d4276c
+             __glXDRIleaveServer(GL_FALSE);
5d4276c
+         evictedPixmaps = TRUE;
5d4276c
+         }
5d4276c
+    }
5d4276c
+
5d4276c
     pixmap = (PixmapPtr) glxPixmap->pDraw;
5d4276c
 
5d4276c
     if (screen->texOffsetStart && screen->driScreen.setTexOffset) {