--- xorg-server-1.3.0.0/GL/glx/glxdri.c.offscreen-pixmaps 2007-04-09 15:59:09.000000000 -0400 +++ xorg-server-1.3.0.0/GL/glx/glxdri.c 2007-05-07 11:35:04.000000000 -0400 @@ -327,6 +327,22 @@ int bpp; GLenum target, format, type; + /* When the GLX_EXT_texture_from_pixmap is used, as it's + * implemented here, we want to pull pixmap out of video memory + * and into host memory. */ + { + extern void XAAEvictPixmaps(void); + static int evictedPixmaps = 0; + + if (!evictedPixmaps) { + __glXDRIenterServer(); + if (dlsym(RTLD_DEFAULT, "XAAEvictPixmaps")) + XAAEvictPixmaps(); + __glXDRIleaveServer(); + evictedPixmaps = TRUE; + } + } + pixmap = (PixmapPtr) glxPixmap->pDraw; if (!glxPixmap->pDamage) { glxPixmap->pDamage = DamageCreate(NULL, NULL, DamageReportNone, --- xorg-server-1.3.0.0/hw/xfree86/xaa/xaaInit.c.offscreen-pixmaps 2006-09-18 02:04:18.000000000 -0400 +++ xorg-server-1.3.0.0/hw/xfree86/xaa/xaaInit.c 2007-05-07 11:25:56.000000000 -0400 @@ -97,6 +97,30 @@ xfree(infoRec); } +void +XAAEvictPixmaps(void) +{ + XAAScreenPtr pScreenPriv; + XAAInfoRecPtr infoRec; + ScreenPtr pScreen; + int i; + + xf86MsgVerb(X_INFO, 3, "XAA: Evicting pixmaps\n"); + + for (i = 0; i < screenInfo.numScreens; i++) { + pScreen = screenInfo.screens[i]; + infoRec = GET_XAAINFORECPTR_FROM_SCREEN(pScreen); + + pScreenPriv = pScreen->devPrivates[XAAScreenIndex].ptr; + infoRec = pScreenPriv->AccelInfoRec; + + infoRec->offscreenDepths = 0; + infoRec->Flags &= ~OFFSCREEN_PIXMAPS; + + XAAMoveOutOffscreenPixmaps(pScreen); + XAAInvalidatePixmapCache(pScreen); + } +} Bool XAAInit(ScreenPtr pScreen, XAAInfoRecPtr infoRec)