[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xorg-server: Changes to 'upstream-unstable'



 Xext/geext.c                                                         |   13 
 Xext/geint.h                                                         |    3 
 configure.ac                                                         |    4 
 dix/events.c                                                         |    8 
 exa/exa.c                                                            |  145 
 exa/exa_accel.c                                                      |   45 
 exa/exa_classic.c                                                    |    8 
 exa/exa_driver.c                                                     |    8 
 exa/exa_mixed.c                                                      |    8 
 exa/exa_priv.h                                                       |   17 
 exa/exa_unaccel.c                                                    |   73 
 hw/vfb/InitInput.c                                                   |    6 
 hw/xquartz/GL/indirect.c                                             |    2 
 hw/xquartz/X11Application.h                                          |    1 
 hw/xquartz/X11Application.m                                          |   19 
 hw/xquartz/X11Controller.h                                           |    6 
 hw/xquartz/X11Controller.m                                           |  102 
 hw/xquartz/bundle/Resources/Dutch.lproj/Localizable.strings          |binary
 hw/xquartz/bundle/Resources/Dutch.lproj/locversion.plist             |    4 
 hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/designable.nib      |  104 
 hw/xquartz/bundle/Resources/Dutch.lproj/main.nib/keyedobjects.nib    |binary
 hw/xquartz/bundle/Resources/English.lproj/main.nib/designable.nib    | 1791 +---
 hw/xquartz/bundle/Resources/English.lproj/main.nib/keyedobjects.nib  |binary
 hw/xquartz/bundle/Resources/French.lproj/Localizable.strings         |binary
 hw/xquartz/bundle/Resources/French.lproj/locversion.plist            |    4 
 hw/xquartz/bundle/Resources/French.lproj/main.nib/designable.nib     |  105 
 hw/xquartz/bundle/Resources/French.lproj/main.nib/keyedobjects.nib   |binary
 hw/xquartz/bundle/Resources/German.lproj/Localizable.strings         |binary
 hw/xquartz/bundle/Resources/German.lproj/locversion.plist            |    4 
 hw/xquartz/bundle/Resources/German.lproj/main.nib/designable.nib     |  106 
 hw/xquartz/bundle/Resources/German.lproj/main.nib/keyedobjects.nib   |binary
 hw/xquartz/bundle/Resources/Italian.lproj/Localizable.strings        |binary
 hw/xquartz/bundle/Resources/Italian.lproj/locversion.plist           |    4 
 hw/xquartz/bundle/Resources/Italian.lproj/main.nib/designable.nib    |  108 
 hw/xquartz/bundle/Resources/Italian.lproj/main.nib/keyedobjects.nib  |binary
 hw/xquartz/bundle/Resources/Japanese.lproj/Localizable.strings       |binary
 hw/xquartz/bundle/Resources/Japanese.lproj/locversion.plist          |    4 
 hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/designable.nib   |  125 
 hw/xquartz/bundle/Resources/Japanese.lproj/main.nib/keyedobjects.nib |binary
 hw/xquartz/bundle/Resources/Spanish.lproj/Localizable.strings        |binary
 hw/xquartz/bundle/Resources/Spanish.lproj/locversion.plist           |    4 
 hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/designable.nib    |   96 
 hw/xquartz/bundle/Resources/Spanish.lproj/main.nib/keyedobjects.nib  |binary
 hw/xquartz/bundle/Resources/ar.lproj/InfoPlist.strings               |binary
 hw/xquartz/bundle/Resources/ar.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/ar.lproj/locversion.plist                |   14 
 hw/xquartz/bundle/Resources/ar.lproj/main.nib/designable.nib         | 3955 ++++++++++
 hw/xquartz/bundle/Resources/ar.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/da.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/da.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/da.lproj/main.nib/designable.nib         |   82 
 hw/xquartz/bundle/Resources/da.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/fi.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/fi.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/fi.lproj/main.nib/designable.nib         |  167 
 hw/xquartz/bundle/Resources/fi.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/ko.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/ko.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/ko.lproj/main.nib/designable.nib         |   82 
 hw/xquartz/bundle/Resources/ko.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/no.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/no.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/no.lproj/main.nib/designable.nib         |   82 
 hw/xquartz/bundle/Resources/no.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/pl.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/pl.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/pl.lproj/main.nib/designable.nib         |   92 
 hw/xquartz/bundle/Resources/pl.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/pt.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/pt.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/pt.lproj/main.nib/designable.nib         |   82 
 hw/xquartz/bundle/Resources/pt.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/pt_PT.lproj/Localizable.strings          |binary
 hw/xquartz/bundle/Resources/pt_PT.lproj/locversion.plist             |    4 
 hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/designable.nib      |  112 
 hw/xquartz/bundle/Resources/pt_PT.lproj/main.nib/keyedobjects.nib    |binary
 hw/xquartz/bundle/Resources/ru.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/ru.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/ru.lproj/main.nib/designable.nib         |  110 
 hw/xquartz/bundle/Resources/ru.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/sv.lproj/Localizable.strings             |binary
 hw/xquartz/bundle/Resources/sv.lproj/locversion.plist                |    4 
 hw/xquartz/bundle/Resources/sv.lproj/main.nib/designable.nib         |   82 
 hw/xquartz/bundle/Resources/sv.lproj/main.nib/keyedobjects.nib       |binary
 hw/xquartz/bundle/Resources/zh_CN.lproj/Localizable.strings          |binary
 hw/xquartz/bundle/Resources/zh_CN.lproj/locversion.plist             |    4 
 hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/designable.nib      |   84 
 hw/xquartz/bundle/Resources/zh_CN.lproj/main.nib/keyedobjects.nib    |binary
 hw/xquartz/bundle/Resources/zh_TW.lproj/Localizable.strings          |binary
 hw/xquartz/bundle/Resources/zh_TW.lproj/locversion.plist             |    4 
 hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/designable.nib      |   84 
 hw/xquartz/bundle/Resources/zh_TW.lproj/main.nib/keyedobjects.nib    |binary
 hw/xquartz/doc/Makefile.am                                           |    2 
 hw/xquartz/doc/Xquartz.man.pre                                       |   39 
 hw/xquartz/quartz.c                                                  |    1 
 hw/xquartz/quartzCommon.h                                            |    1 
 hw/xquartz/quartzKeyboard.c                                          |   91 
 hw/xquartz/quartzKeyboard.h                                          |   10 
 mi/midispcur.c                                                       |    6 
 os/connection.c                                                      |    5 
 100 files changed, 5602 insertions(+), 2552 deletions(-)

New commits:
commit 2c94da4e22520f4a3e783db06b73251131382868
Author: Michel Dänzer <daenzer@vmware.com>
Date:   Thu Apr 22 14:16:59 2010 +0200

    EXA: Check sys_ptr isn't NULL before passing it to the UploadToScreen hook.
    
    Fixes https://bugs.freedesktop.org/show_bug.cgi?id=27380 .
    
    Signed-off-by: Michel Dänzer <daenzer@vmware.com>
    Reviewed-by: Alex Deucher <alexdeucher@gmail.com>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit 7b6517526631a65891b806bca30be8f49955d0a8)

diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index 4f94ae8..d4eae89 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -505,7 +505,7 @@ exaHWCopyNtoN (DrawablePtr    pSrcDrawable,
 	    (*pExaScr->info->DoneCopy) (pDstPixmap);
 	    exaMarkSync (pDstDrawable->pScreen);
 	/* UTS: mainly for SHM PutImage's secondary path. */
-	} else {
+	} else if (pSrcExaPixmap->sys_ptr) {
 	    int bpp = pSrcDrawable->bitsPerPixel;
 	    int src_stride = exaGetPixmapPitch(pSrcPixmap);
 	    CARD8 *src = NULL;
@@ -532,7 +532,8 @@ exaHWCopyNtoN (DrawablePtr    pSrcDrawable,
 
 		pbox++;
 	    }
-	}
+	} else
+	    goto fallback;
     } else
 	goto fallback;
 

commit 7815b02e8d9636b6abbe1f7cb555a1069db2d59f
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Apr 21 11:47:24 2010 +1000

    Revert "mi: don't thrash resources when displaying the software cursor across screens"
    
    This commit leads to a segfault on the very first XTS test case.
    
    Backtrace:
    0: /opt/xorg/bin/Xorg (xorg_backtrace+0x3b) [0x80a33db]
    1: /opt/xorg/bin/Xorg (0x8048000+0x62a75) [0x80aaa75]
    2: (vdso) (__kernel_rt_sigreturn+0x0) [0x5d140c]
    3: /lib/libc.so.6 (0x9bb000+0x73579) [0xa2e579]
    4: /lib/libc.so.6 (realloc+0xe0) [0xa2e830]
    5: /opt/xorg/bin/Xorg (Xrealloc+0x33) [0x80a3f33]
    6: /opt/xorg/bin/Xorg (0x8048000+0x1ab79) [0x8062b79]
    7: /opt/xorg/bin/Xorg (0x8048000+0x1ac4e) [0x8062c4e]
    8: /opt/xorg/bin/Xorg (RegisterExtensionNames+0x2ce) [0x8062fbe]
    9: /opt/xorg/bin/Xorg (AddExtension+0x19a) [0x807bd7a]
    10: /opt/xorg//lib/xorg/modules/extensions/libextmod.so (0x728000+0x1169a)
    [0x73969a]
    11: /opt/xorg/bin/Xorg (InitExtensions+0x85) [0x80c0eb5]
    12: /opt/xorg/bin/Xorg (0x8048000+0x1a51d) [0x806251d]
    13: /lib/libc.so.6 (__libc_start_main+0xe6) [0x9d1bb6]
    14: /opt/xorg/bin/Xorg (0x8048000+0x1a2a1) [0x80622a1]
    Segmentation fault at address 0x10b2d5f8
    
    valgrind output:
    ==5069== Invalid read of size 4
    ==5069==    at 0x80F928D: FreePicture (picture.c:1531)
    ==5069==    by 0x818DDEF: miDCDeviceCleanup (midispcur.c:867)
    ==5069==    by 0x81B97F0: miSpriteDeviceCursorCleanup (misprite.c:968)
    ==5069==    by 0x80995FA: miPointerDeviceCleanup (mipointer.c:292)
    ==5069==    by 0x807973E: CloseDevice (devices.c:840)
    ==5069==    by 0x80799B6: CloseDownDevices (devices.c:933)
    ==5069==    by 0x8062705: main (main.c:309)
    ==5069==  Address 0x4cce844 is 12 bytes inside a block of size 84 free'd
    ==5069==    at 0x40057F6: free (vg_replace_malloc.c:325)
    ==5069==    by 0x80A3DE0: Xfree (utils.c:1154)
    ==5069==    by 0x80F9332: FreePicture (picture.c:1576)
    ==5069==    by 0x80FBB4B: PictureDestroyWindow (picture.c:69)
    ==5069==    by 0x810B1A3: damageDestroyWindow (damage.c:1840)
    ==5069==    by 0x80864F1: FreeWindowResources (window.c:846)
    ==5069==    by 0x8086812: DeleteWindow (window.c:925)
    ==5069==    by 0x806B53E: FreeClientResources (resource.c:806)
    ==5069==    by 0x806B60F: FreeAllResources (resource.c:823)
    ==5069==    by 0x80626E4: main (main.c:299)
    ==5069==
    ==5069== Invalid write of size 4
    ==5069==    at 0x80F9295: FreePicture (picture.c:1531)
    ==5069==    by 0x818DDEF: miDCDeviceCleanup (midispcur.c:867)
    ==5069==    by 0x81B97F0: miSpriteDeviceCursorCleanup (misprite.c:968)
    ==5069==    by 0x80995FA: miPointerDeviceCleanup (mipointer.c:292)
    ==5069==    by 0x807973E: CloseDevice (devices.c:840)
    ==5069==    by 0x80799B6: CloseDownDevices (devices.c:933)
    ==5069==    by 0x8062705: main (main.c:309)
    ==5069==  Address 0x4cce844 is 12 bytes inside a block of size 84 free'd
    ==5069==    at 0x40057F6: free (vg_replace_malloc.c:325)
    ==5069==    by 0x80A3DE0: Xfree (utils.c:1154)
    ==5069==    by 0x80F9332: FreePicture (picture.c:1576)
    ==5069==    by 0x80FBB4B: PictureDestroyWindow (picture.c:69)
    ==5069==    by 0x810B1A3: damageDestroyWindow (damage.c:1840)
    ==5069==    by 0x80864F1: FreeWindowResources (window.c:846)
    ==5069==    by 0x8086812: DeleteWindow (window.c:925)
    ==5069==    by 0x806B53E: FreeClientResources (resource.c:806)
    ==5069==    by 0x806B60F: FreeAllResources (resource.c:823)
    ==5069==    by 0x80626E4: main (main.c:299)
    
    XTS test case: Xproto pAllocColor
    
    This reverts commit 00b8b7ad61b6f818271fb4d1e383113170309d72.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/mi/midispcur.c b/mi/midispcur.c
index 3a31b74..55d65d5 100644
--- a/mi/midispcur.c
+++ b/mi/midispcur.c
@@ -59,9 +59,9 @@ static DevPrivateKey miDCScreenKey = &miDCScreenKeyIndex;
 
 static Bool	miDCCloseScreen(int index, ScreenPtr pScreen);
 
-/* per device per-screen private data */
-static int miDCSpriteKeyIndex[MAXSCREENS];
-static DevPrivateKey miDCSpriteKey = miDCSpriteKeyIndex;
+/* per device private data */
+static int miDCSpriteKeyIndex;
+static DevPrivateKey miDCSpriteKey = &miDCSpriteKeyIndex;
 
 typedef struct {
     GCPtr	    pSourceGC, pMaskGC;
@@ -75,10 +75,10 @@ typedef struct {
 #endif
 } miDCBufferRec, *miDCBufferPtr;
 
-#define MIDCBUFFER(dev, screen) \
+#define MIDCBUFFER(dev) \
  ((DevHasCursor(dev)) ? \
-  (miDCBufferPtr)dixLookupPrivate(&dev->devPrivates, miDCSpriteKey + (screen)->myNum) : \
-  (miDCBufferPtr)dixLookupPrivate(&dev->u.master->devPrivates, miDCSpriteKey + (screen)->myNum))
+  (miDCBufferPtr)dixLookupPrivate(&dev->devPrivates, miDCSpriteKey) : \
+  (miDCBufferPtr)dixLookupPrivate(&dev->u.master->devPrivates, miDCSpriteKey))
 
 /* 
  * The core pointer buffer will point to the index of the virtual core pointer
@@ -158,6 +158,10 @@ miDCInitialize (ScreenPtr pScreen, miPointerScreenFuncPtr screenFuncs)
     return TRUE;
 }
 
+#define tossGC(gc)  (gc ? FreeGC (gc, (GContext) 0) : 0)
+#define tossPix(pix)	(pix ? (*pScreen->DestroyPixmap) (pix) : TRUE)
+#define tossPict(pict)	(pict ? FreePicture (pict, 0) : 0)
+
 static Bool
 miDCCloseScreen (int index, ScreenPtr pScreen)
 {
@@ -179,6 +183,7 @@ miDCRealizeCursor (ScreenPtr pScreen, CursorPtr pCursor)
 }
 
 #ifdef ARGB_CURSOR
+#define EnsurePicture(picture,draw,win) (picture || miDCMakePicture(&picture,draw,win))
 
 static VisualPtr
 miDCGetWindowVisual (WindowPtr pWin)
@@ -410,8 +415,12 @@ miDCPutBits (
     (*maskGC->ops->PushPixels) (maskGC, pPriv->maskBits, pDrawable, w, h, x, y);
 }
 
+#define EnsureGC(gc,win) (gc || miDCMakeGC(&gc, win))
+
 static GCPtr
-miDCMakeGC(WindowPtr pWin)
+miDCMakeGC(
+    GCPtr	*ppGC,
+    WindowPtr	pWin)
 {
     GCPtr pGC;
     int   status;
@@ -422,6 +431,7 @@ miDCMakeGC(WindowPtr pWin)
     pGC = CreateGC((DrawablePtr)pWin,
 		   GCSubwindowMode|GCGraphicsExposures, gcvals, &status,
 		   (XID)0, serverClient);
+    *ppGC = pGC;
     return pGC;
 }
 
@@ -446,11 +456,22 @@ miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
     pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
 						  miDCScreenKey);
     pWin = WindowTable[pScreen->myNum];
-    pBuffer = MIDCBUFFER(pDev, pScreen);
+    pBuffer = MIDCBUFFER(pDev);
 
 #ifdef ARGB_CURSOR
     if (pPriv->pPicture)
     {
+        /* see comment in miDCPutUpCursor */
+        if (pBuffer->pRootPicture &&
+                pBuffer->pRootPicture->pDrawable &&
+                pBuffer->pRootPicture->pDrawable->pScreen != pScreen)
+        {
+            tossPict(pBuffer->pRootPicture);
+            pBuffer->pRootPicture = NULL;
+        }
+
+	if (!EnsurePicture(pBuffer->pRootPicture, &pWin->drawable, pWin))
+	    return FALSE;
 	CompositePicture (PictOpOver,
 			  pPriv->pPicture,
 			  NULL,
@@ -463,6 +484,33 @@ miDCPutUpCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
     else
 #endif
     {
+        /**
+         * XXX: Before MPX, the sourceGC and maskGC were attached to the
+         * screen, and would switch as the screen switches.  With mpx we have
+         * the GC's attached to the device now, so each time we switch screen
+         * we need to make sure the GC's are allocated on the new screen.
+         * This is ... not optimal. (whot)
+         */
+        if (pBuffer->pSourceGC && pScreen != pBuffer->pSourceGC->pScreen)
+        {
+            tossGC(pBuffer->pSourceGC);
+            pBuffer->pSourceGC = NULL;
+        }
+
+        if (pBuffer->pMaskGC && pScreen != pBuffer->pMaskGC->pScreen)
+        {
+            tossGC(pBuffer->pMaskGC);
+            pBuffer->pMaskGC = NULL;
+        }
+
+	if (!EnsureGC(pBuffer->pSourceGC, pWin))
+	    return FALSE;
+	if (!EnsureGC(pBuffer->pMaskGC, pWin))
+	{
+	    FreeGC (pBuffer->pSourceGC, (GContext) 0);
+	    pBuffer->pSourceGC = 0;
+	    return FALSE;
+	}
 	miDCPutBits ((DrawablePtr)pWin, pPriv,
 		     pBuffer->pSourceGC, pBuffer->pMaskGC,
 		     x, y, pCursor->bits->width, pCursor->bits->height,
@@ -483,7 +531,7 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 
     pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
 						  miDCScreenKey);
-    pBuffer = MIDCBUFFER(pDev, pScreen);
+    pBuffer = MIDCBUFFER(pDev);
 
     pSave = pBuffer->pSave;
     pWin = WindowTable[pScreen->myNum];
@@ -496,7 +544,14 @@ miDCSaveUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 	if (!pSave)
 	    return FALSE;
     }
-
+    /* see comment in miDCPutUpCursor */
+    if (pBuffer->pSaveGC && pBuffer->pSaveGC->pScreen != pScreen)
+    {
+        tossGC(pBuffer->pSaveGC);
+        pBuffer->pSaveGC = NULL;
+    }
+    if (!EnsureGC(pBuffer->pSaveGC, pWin))
+	return FALSE;
     pGC = pBuffer->pSaveGC;
     if (pSave->drawable.serialNumber != pGC->serialNumber)
 	ValidateGC ((DrawablePtr) pSave, pGC);
@@ -517,13 +572,20 @@ miDCRestoreUnderCursor (DeviceIntPtr pDev, ScreenPtr pScreen,
 
     pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
 						  miDCScreenKey);
-    pBuffer = MIDCBUFFER(pDev, pScreen);
+    pBuffer = MIDCBUFFER(pDev);
     pSave = pBuffer->pSave;
 
     pWin = WindowTable[pScreen->myNum];
     if (!pSave)
 	return FALSE;
-
+    /* see comment in miDCPutUpCursor */
+    if (pBuffer->pRestoreGC && pBuffer->pRestoreGC->pScreen != pScreen)
+    {
+        tossGC(pBuffer->pRestoreGC);
+        pBuffer->pRestoreGC = NULL;
+    }
+    if (!EnsureGC(pBuffer->pRestoreGC, pWin))
+	return FALSE;
     pGC = pBuffer->pRestoreGC;
     if (pWin->drawable.serialNumber != pGC->serialNumber)
 	ValidateGC ((DrawablePtr) pWin, pGC);
@@ -545,7 +607,7 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
 
     pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
 						  miDCScreenKey);
-    pBuffer = MIDCBUFFER(pDev, pScreen);
+    pBuffer = MIDCBUFFER(pDev);
 
     pSave = pBuffer->pSave;
     pWin = WindowTable[pScreen->myNum];
@@ -554,7 +616,14 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
      */
     if (!pSave)
 	return FALSE;
-
+    /* see comment in miDCPutUpCursor */
+    if (pBuffer->pRestoreGC && pBuffer->pRestoreGC->pScreen != pScreen)
+    {
+        tossGC(pBuffer->pRestoreGC);
+        pBuffer->pRestoreGC = NULL;
+    }
+    if (!EnsureGC(pBuffer->pRestoreGC, pWin))
+	return FALSE;
     pGC = pBuffer->pRestoreGC;
     if (pWin->drawable.serialNumber != pGC->serialNumber)
 	ValidateGC ((DrawablePtr) pWin, pGC);
@@ -593,7 +662,14 @@ miDCChangeSave (DeviceIntPtr pDev, ScreenPtr pScreen,
 	(*pGC->ops->CopyArea) ((DrawablePtr) pSave, (DrawablePtr) pWin, pGC,
 			       0, sourcey, -dx, copyh, x + dx, desty);
     }
-
+    /* see comment in miDCPutUpCursor */
+    if (pBuffer->pSaveGC && pBuffer->pSaveGC->pScreen != pScreen)
+    {
+        tossGC(pBuffer->pSaveGC);
+        pBuffer->pSaveGC = NULL;
+    }
+    if (!EnsureGC(pBuffer->pSaveGC, pWin))
+	return FALSE;
     pGC = pBuffer->pSaveGC;
     if (pSave->drawable.serialNumber != pGC->serialNumber)
 	ValidateGC ((DrawablePtr) pSave, pGC);
@@ -690,7 +766,7 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
     pScreenPriv = (miDCScreenPtr)dixLookupPrivate(&pScreen->devPrivates,
 						  miDCScreenKey);
     pWin = WindowTable[pScreen->myNum];
-    pBuffer = MIDCBUFFER(pDev, pScreen);
+    pBuffer = MIDCBUFFER(pDev);
 
     pTemp = pBuffer->pTemp;
     if (!pTemp ||
@@ -733,9 +809,17 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
 #ifdef ARGB_CURSOR
     if (pPriv->pPicture)
     {
-	if (!pBuffer->pTempPicture)
-            miDCMakePicture(&pBuffer->pTempPicture, &pTemp->drawable, pWin);
+        /* see comment in miDCPutUpCursor */
+        if (pBuffer->pTempPicture &&
+                pBuffer->pTempPicture->pDrawable &&
+                pBuffer->pTempPicture->pDrawable->pScreen != pScreen)
+        {
+            tossPict(pBuffer->pTempPicture);
+            pBuffer->pTempPicture = NULL;
+        }
 
+	if (!EnsurePicture(pBuffer->pTempPicture, &pTemp->drawable, pWin))
+	    return FALSE;
 	CompositePicture (PictOpOver,
 			  pPriv->pPicture,
 			  NULL,
@@ -748,12 +832,38 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
     else
 #endif
     {
+	if (!pBuffer->pPixSourceGC)
+	{
+	    pBuffer->pPixSourceGC = CreateGC ((DrawablePtr)pTemp,
+		GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
+	    if (!pBuffer->pPixSourceGC)
+		return FALSE;
+	}
+	if (!pBuffer->pPixMaskGC)
+	{
+	    pBuffer->pPixMaskGC = CreateGC ((DrawablePtr)pTemp,
+		GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
+	    if (!pBuffer->pPixMaskGC)
+		return FALSE;
+	}
 	miDCPutBits ((DrawablePtr)pTemp, pPriv,
 		     pBuffer->pPixSourceGC, pBuffer->pPixMaskGC,
 		     dx, dy, pCursor->bits->width, pCursor->bits->height,
 		     source, mask);
     }
 
+    /* see comment in miDCPutUpCursor */
+    if (pBuffer->pRestoreGC && pBuffer->pRestoreGC->pScreen != pScreen)
+    {
+        tossGC(pBuffer->pRestoreGC);
+        pBuffer->pRestoreGC = NULL;
+    }
+    /*
+     * copy the temporary pixmap onto the screen
+     */
+
+    if (!EnsureGC(pBuffer->pRestoreGC, pWin))
+	return FALSE;
     pGC = pBuffer->pRestoreGC;
     if (pWin->drawable.serialNumber != pGC->serialNumber)
 	ValidateGC ((DrawablePtr) pWin, pGC);
@@ -767,113 +877,51 @@ miDCMoveCursor (DeviceIntPtr pDev, ScreenPtr pScreen, CursorPtr pCursor,
 static Bool
 miDCDeviceInitialize(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
-    miDCBufferPtr   pBuffer;
-    WindowPtr       pWin;
-    XID             gcval = FALSE;
-    int             status;
-    int             i;
-
-    if (!DevHasCursor(pDev))
-        return TRUE;
-
-    for (i = 0; i < screenInfo.numScreens; i++)
-    {
-        pScreen = screenInfo.screens[i];
-
-        pBuffer = xalloc(sizeof(miDCBufferRec));
-        if (!pBuffer)
-            goto failure;
-
-        dixSetPrivate(&pDev->devPrivates, miDCSpriteKey + pScreen->myNum, pBuffer);
-        pWin = WindowTable[pScreen->myNum];
-
-        pBuffer->pSourceGC = miDCMakeGC(pWin);
-        if (!pBuffer->pSourceGC)
-            goto failure;
-
-        pBuffer->pMaskGC = miDCMakeGC(pWin);
-        if (!pBuffer->pMaskGC)
-            goto failure;
-
-        pBuffer->pSaveGC = miDCMakeGC(pWin);
-        if (!pBuffer->pSaveGC)
-            goto failure;
-
-        pBuffer->pRestoreGC = miDCMakeGC(pWin);
-        if (!pBuffer->pRestoreGC)
-            goto failure;
-
-        pBuffer->pMoveGC = CreateGC ((DrawablePtr)pWin,
-            GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
-        if (!pBuffer->pMoveGC)
-            goto failure;
-
-        pBuffer->pPixSourceGC = CreateGC ((DrawablePtr)pWin,
-            GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
-        if (!pBuffer->pPixSourceGC)
-            goto failure;
-
-        pBuffer->pPixMaskGC = CreateGC ((DrawablePtr)pWin,
-            GCGraphicsExposures, &gcval, &status, (XID)0, serverClient);
-        if (!pBuffer->pPixMaskGC)
-            goto failure;
-
+    miDCBufferPtr pBuffer;
+
+    pBuffer = xalloc(sizeof(miDCBufferRec));
+    dixSetPrivate(&pDev->devPrivates, miDCSpriteKey, pBuffer);
+
+    pBuffer->pSourceGC =
+        pBuffer->pMaskGC =
+        pBuffer->pSaveGC =
+        pBuffer->pRestoreGC =
+        pBuffer->pMoveGC =
+        pBuffer->pPixSourceGC =
+        pBuffer->pPixMaskGC = NULL;
 #ifdef ARGB_CURSOR
-        miDCMakePicture(&pBuffer->pRootPicture, &pWin->drawable, pWin);
-        if (!pBuffer->pRootPicture)
-            goto failure;
-
-        pBuffer->pTempPicture = NULL;
+    pBuffer->pRootPicture = NULL;
+    pBuffer->pTempPicture = NULL;
 #endif
-
-        // these get (re)allocated lazily depending on the cursor size
-        pBuffer->pSave = pBuffer->pTemp = NULL;
-    }
+    pBuffer->pSave = pBuffer->pTemp = NULL;
 
     return TRUE;
-
-failure:
-
-    miDCDeviceCleanup(pDev, pScreen);
-
-    return FALSE;
 }
 
 static void
 miDCDeviceCleanup(DeviceIntPtr pDev, ScreenPtr pScreen)
 {
     miDCBufferPtr   pBuffer;
-    int             i;
 
     if (DevHasCursor(pDev))
     {
-        for (i = 0; i < screenInfo.numScreens; i++)
-        {
-            pScreen = screenInfo.screens[i];
-
-            pBuffer = MIDCBUFFER(pDev, pScreen);
-
-            if (pBuffer)
-            {
-                if (pBuffer->pSourceGC) FreeGC(pBuffer->pSourceGC, (GContext) 0);
-                if (pBuffer->pMaskGC) FreeGC(pBuffer->pMaskGC, (GContext) 0);
-                if (pBuffer->pSaveGC) FreeGC(pBuffer->pSaveGC, (GContext) 0);
-                if (pBuffer->pRestoreGC) FreeGC(pBuffer->pRestoreGC, (GContext) 0);
-                if (pBuffer->pMoveGC) FreeGC(pBuffer->pMoveGC, (GContext) 0);
-                if (pBuffer->pPixSourceGC) FreeGC(pBuffer->pPixSourceGC, (GContext) 0);
-                if (pBuffer->pPixMaskGC) FreeGC(pBuffer->pPixMaskGC, (GContext) 0);
-
+        pBuffer = MIDCBUFFER(pDev);
+        tossGC (pBuffer->pSourceGC);
+        tossGC (pBuffer->pMaskGC);
+        tossGC (pBuffer->pSaveGC);
+        tossGC (pBuffer->pRestoreGC);
+        tossGC (pBuffer->pMoveGC);
+        tossGC (pBuffer->pPixSourceGC);
+        tossGC (pBuffer->pPixMaskGC);
+        tossPix (pBuffer->pSave);
+        tossPix (pBuffer->pTemp);
 #ifdef ARGB_CURSOR
-                if (pBuffer->pRootPicture) FreePicture(pBuffer->pRootPicture, 0);
-                if (pBuffer->pTempPicture) FreePicture(pBuffer->pTempPicture, 0);
+#if 0				/* This has been free()d before */
+        tossPict (pScreenPriv->pRootPicture);
 #endif
-
-                if (pBuffer->pSave) (*pScreen->DestroyPixmap)(pBuffer->pSave);
-                if (pBuffer->pTemp) (*pScreen->DestroyPixmap)(pBuffer->pTemp);
-
-                xfree(pBuffer);
-                dixSetPrivate(&pDev->devPrivates, miDCSpriteKey + pScreen->myNum, NULL);
-            }
-        }
+        tossPict (pBuffer->pTempPicture);
+#endif
+        xfree(pBuffer);
+        dixSetPrivate(&pDev->devPrivates, miDCSpriteKey, NULL);
     }
 }

commit ba2ba32e04f9002dbb60f10e174ac63d16e5f507
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Apr 21 09:17:26 2010 +1000

    xserver 1.7.6.902
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/configure.ac b/configure.ac
index 058ad01..4b020a4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -26,8 +26,8 @@ dnl
 dnl Process this file with autoconf to create configure.
 
 AC_PREREQ(2.57)
-AC_INIT([xorg-server], 1.7.6.901, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
-RELEASE_DATE="2010-04-12"
+AC_INIT([xorg-server], 1.7.6.902, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server)
+RELEASE_DATE="2010-04-21"
 AC_CONFIG_SRCDIR([Makefile.am])
 AM_INIT_AUTOMAKE([dist-bzip2 foreign])
 AM_MAINTAINER_MODE

commit e8fae02f19d6d75ac3edbea2f5af8d250dcfbde3
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Apr 14 17:43:22 2010 +1000

    dix: Fix crash in DeliverGrabbedEvents.
    
    If both devices are synchronously grabbed, first with a GrabPointer, then
    with a GrabKeyboard (GrabModeSync on both), sync.other of each device points
    to the grab of the respective other device.
    
    If the keyboard is then thawed through a AllowSome request, the VCK's
    sync.other is reset to NULL. Subsequently, an event on the VCP would crash
    the server when dereferencing sync.other on the VCP.
    
    The check's purpose is to compare if the other device is grabbed by the same
    client, which should be checked by accessing (dev->deviceGrab->grab->resource).
    A check of the server-1.3 sources confirms that.
    
    XTS test case: Xlib13 XAllowEvents 20.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Reviewed-by: Keith Packard <keithp@keithp.com>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit 9ddbb03fa56aa73c3f417d8ee6433e45b94445b3)

diff --git a/dix/events.c b/dix/events.c
index 311c6b6..44c4624 100644
--- a/dix/events.c
+++ b/dix/events.c
@@ -3980,7 +3980,7 @@ DeliverGrabbedEvent(InternalEvent *event, DeviceIntPtr thisDev,
 		FreezeThaw(dev, TRUE);
 		if ((dev->deviceGrab.sync.state == FREEZE_BOTH_NEXT_EVENT) &&
 		    (CLIENT_BITS(grab->resource) ==
-		     CLIENT_BITS(dev->deviceGrab.sync.other->resource)))
+		     CLIENT_BITS(dev->deviceGrab.grab->resource)))
 		    dev->deviceGrab.sync.state = FROZEN_NO_EVENT;
 		else
                     dev->deviceGrab.sync.other = grab;

commit aa6a18fdebf444084c27e4a7f3eef7d93f9929b0
Author: Cyril Brulebois <kibi@debian.org>
Date:   Sat Apr 17 01:31:14 2010 +0200

    exa: handle pixmap create/destroy in lower layers
    
    - Pixmaps that are created during a fallback are automatically prepared access.
    - During the fallback accelerated ops are blocked to prevent new/scratch gc's
      from triggering accelerated ops on mapped pixmaps.
    - A few cases of incorrect wrapping (on the top level pointer instead of
      between damage and (w)fb) have been removed.
    
    Signed-off-by: Maarten Maathuis <madman2003@gmail.com>
    Acked-by: Michel Dänzer <michel@daenzer.net>
    Signed-off-by: Keith Packard <keithp@keithp.com>
    (cherry picked from commit 342f3689d17256c92cbfee079d24501d27aa1153)
    
    Conflicts:
    
    	exa/exa_mixed.c
    
    Debian bug#576816 <http://bugs.debian.org/576816>
    
    Tested-by: Arthur Marsh <arthur.marsh@internode.on.net>
    Signed-off-by: Cyril Brulebois <kibi@debian.org>
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/exa/exa.c b/exa/exa.c
index e264d44..b8f0419 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -480,57 +480,6 @@ const GCFuncs exaGCFuncs = {
     exaCopyClip
 };
 
-/*
- * This wrapper exists to allow fbValidateGC to work.
- * Note that we no longer assume newly created pixmaps to be in normal ram.
- * This assumption is certainly not garuanteed with driver allocated pixmaps.
- */
-static PixmapPtr
-exaCreatePixmapWithPrepare(ScreenPtr pScreen, int w, int h, int depth,
-		unsigned usage_hint)
-{
-    PixmapPtr pPixmap;
-    ExaScreenPriv(pScreen);
-
-    /* This swaps between this function and the real upper layer function.
-     * Normally this would swap to the fb layer pointer, this is a very special case.
-     */
-    swap(pExaScr, pScreen, CreatePixmap);
-    pPixmap = pScreen->CreatePixmap(pScreen, w, h, depth, usage_hint);
-    swap(pExaScr, pScreen, CreatePixmap);
-
-    if (!pPixmap)
-	return NULL;
-
-    /* Note the usage of ExaDoPrepareAccess, this allowed because:
-     * The pixmap is new, so not offscreen in the classic exa case.
-     * For EXA_HANDLES_PIXMAPS the driver will handle whatever is needed.
-     * We want to signal that the pixmaps will be used as destination.
-     */
-    ExaDoPrepareAccess(pPixmap, EXA_PREPARE_AUX_DEST);
-
-    return pPixmap;
-}
-
-static Bool
-exaDestroyPixmapWithFinish(PixmapPtr pPixmap)
-{
-    ScreenPtr pScreen = pPixmap->drawable.pScreen;
-    ExaScreenPriv(pScreen);
-    Bool ret;
-
-    exaFinishAccess(&pPixmap->drawable, EXA_PREPARE_AUX_DEST);
-
-    /* This swaps between this function and the real upper layer function.
-     * Normally this would swap to the fb layer pointer, this is a very special case.
-     */
-    swap(pExaScr, pScreen, DestroyPixmap);
-    ret = pScreen->DestroyPixmap(pPixmap);
-    swap(pExaScr, pScreen, DestroyPixmap);
-
-    return ret;
-}
-
 static void
 exaValidateGC(GCPtr pGC,
 		unsigned long changes,
@@ -542,20 +491,9 @@ exaValidateGC(GCPtr pGC,
 
     ScreenPtr pScreen = pDrawable->pScreen;
     ExaScreenPriv(pScreen);
-    CreatePixmapProcPtr old_ptr = NULL;
-    DestroyPixmapProcPtr old_ptr2 = NULL;
+    ExaGCPriv(pGC);
     PixmapPtr pTile = NULL;
-    EXA_GC_PROLOGUE(pGC);
-
-    /* save the "fb" pointer. */
-    old_ptr = pExaScr->SavedCreatePixmap;
-    /* create a new upper layer pointer. */
-    wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmapWithPrepare);
-
-    /* save the "fb" pointer. */
-    old_ptr2 = pExaScr->SavedDestroyPixmap;
-    /* create a new upper layer pointer. */
-    wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmapWithFinish);
+    Bool finish_current_tile = FALSE;
 
     /* Either of these conditions is enough to trigger access to a tile pixmap. */
     /* With pGC->tileIsPixel == 1, you run the risk of dereferencing an invalid tile pixmap pointer. */
@@ -569,8 +507,10 @@ exaValidateGC(GCPtr pGC,
 	 */
 	if (pTile && pTile->drawable.depth != pDrawable->depth && !(changes & GCTile)) {
 	    PixmapPtr pRotatedTile = fbGetRotatedPixmap(pGC);
-	    if (pRotatedTile->drawable.depth == pDrawable->depth)
+	    if (pRotatedTile && pRotatedTile->drawable.depth == pDrawable->depth)
 		pTile = pRotatedTile;
+	    else
+		finish_current_tile = TRUE; /* CreatePixmap will be called. */
 	}
     }
 
@@ -579,42 +519,39 @@ exaValidateGC(GCPtr pGC,
     if (pTile)
 	exaPrepareAccess(&pTile->drawable, EXA_PREPARE_SRC);
 
+    /* Calls to Create/DestroyPixmap have to be identified as special. */
+    pExaScr->fallback_counter++;
+    swap(pExaGC, pGC, funcs);
     (*pGC->funcs->ValidateGC)(pGC, changes, pDrawable);
+    swap(pExaGC, pGC, funcs);
+    pExaScr->fallback_counter--;
 
     if (pTile)
 	exaFinishAccess(&pTile->drawable, EXA_PREPARE_SRC);
+    if (finish_current_tile && pGC->tile.pixmap)
+	exaFinishAccess(&pGC->tile.pixmap->drawable, EXA_PREPARE_AUX_DEST);
     if (pGC->stipple)
-        exaFinishAccess(&pGC->stipple->drawable, EXA_PREPARE_MASK);
-
-    /* switch back to the normal upper layer. */
-    unwrap(pExaScr, pScreen, CreatePixmap);
-    /* restore copy of fb layer pointer. */
-    pExaScr->SavedCreatePixmap = old_ptr;
-
-    /* switch back to the normal upper layer. */
-    unwrap(pExaScr, pScreen, DestroyPixmap);
-    /* restore copy of fb layer pointer. */
-    pExaScr->SavedDestroyPixmap = old_ptr2;
-
-    EXA_GC_EPILOGUE(pGC);
+	exaFinishAccess(&pGC->stipple->drawable, EXA_PREPARE_MASK);
 }
 
 /* Is exaPrepareAccessGC() needed? */
 static void
 exaDestroyGC(GCPtr pGC)
 {
-    EXA_GC_PROLOGUE (pGC);
+    ExaGCPriv(pGC);
+    swap(pExaGC, pGC, funcs);
     (*pGC->funcs->DestroyGC)(pGC);
-    EXA_GC_EPILOGUE (pGC);
+    swap(pExaGC, pGC, funcs);
 }
 
 static void
 exaChangeGC (GCPtr pGC,
 		unsigned long mask)
 {
-    EXA_GC_PROLOGUE (pGC);
+    ExaGCPriv(pGC);
+    swap(pExaGC, pGC, funcs);
     (*pGC->funcs->ChangeGC) (pGC, mask);
-    EXA_GC_EPILOGUE (pGC);
+    swap(pExaGC, pGC, funcs);
 }
 
 static void
@@ -622,9 +559,10 @@ exaCopyGC (GCPtr pGCSrc,
 	      unsigned long mask,
 	      GCPtr	 pGCDst)
 {
-    EXA_GC_PROLOGUE (pGCDst);
+    ExaGCPriv(pGCDst);
+    swap(pExaGC, pGCDst, funcs);
     (*pGCDst->funcs->CopyGC) (pGCSrc, mask, pGCDst);
-    EXA_GC_EPILOGUE (pGCDst);
+    swap(pExaGC, pGCDst, funcs);
 }
 
 static void
@@ -633,25 +571,28 @@ exaChangeClip (GCPtr pGC,
 		pointer pvalue,
 		int nrects)
 {
-    EXA_GC_PROLOGUE (pGC);
+    ExaGCPriv(pGC);
+    swap(pExaGC, pGC, funcs);
     (*pGC->funcs->ChangeClip) (pGC, type, pvalue, nrects);
-    EXA_GC_EPILOGUE (pGC);
+    swap(pExaGC, pGC, funcs);
 }
 
 static void
 exaCopyClip(GCPtr pGCDst, GCPtr pGCSrc)
 {
-    EXA_GC_PROLOGUE (pGCDst);
+    ExaGCPriv(pGCDst);
+    swap(pExaGC, pGCDst, funcs);
     (*pGCDst->funcs->CopyClip)(pGCDst, pGCSrc);
-    EXA_GC_EPILOGUE (pGCDst);
+    swap(pExaGC, pGCDst, funcs);
 }
 
 static void
 exaDestroyClip(GCPtr pGC)
 {
-    EXA_GC_PROLOGUE (pGC);
+    ExaGCPriv(pGC);
+    swap(pExaGC, pGC, funcs);
     (*pGC->funcs->DestroyClip)(pGC);
-    EXA_GC_EPILOGUE (pGC);
+    swap(pExaGC, pGC, funcs);
 }
 
 /**
@@ -682,18 +623,6 @@ exaChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
     Bool ret;
     ScreenPtr pScreen = pWin->drawable.pScreen;
     ExaScreenPriv(pScreen);
-    CreatePixmapProcPtr old_ptr = NULL;
-    DestroyPixmapProcPtr old_ptr2 = NULL;
-
-    /* save the "fb" pointer. */
-    old_ptr = pExaScr->SavedCreatePixmap;
-    /* create a new upper layer pointer. */
-    wrap(pExaScr, pScreen, CreatePixmap, exaCreatePixmapWithPrepare);
-
-    /* save the "fb" pointer. */
-    old_ptr2 = pExaScr->SavedDestroyPixmap;
-    /* create a new upper layer pointer. */
-    wrap(pExaScr, pScreen, DestroyPixmap, exaDestroyPixmapWithFinish);
 
     if ((mask & CWBackPixmap) && pWin->backgroundState == BackgroundPixmap) 
 	exaPrepareAccess(&pWin->background.pixmap->drawable, EXA_PREPARE_SRC);
@@ -701,25 +630,17 @@ exaChangeWindowAttributes(WindowPtr pWin, unsigned long mask)
     if ((mask & CWBorderPixmap) && pWin->borderIsPixel == FALSE)
 	exaPrepareAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_MASK);
 
+    pExaScr->fallback_counter++;
     swap(pExaScr, pScreen, ChangeWindowAttributes);
     ret = pScreen->ChangeWindowAttributes(pWin, mask);
     swap(pExaScr, pScreen, ChangeWindowAttributes);
+    pExaScr->fallback_counter--;
 
     if ((mask & CWBackPixmap) && pWin->backgroundState == BackgroundPixmap) 
 	exaFinishAccess(&pWin->background.pixmap->drawable, EXA_PREPARE_SRC);
     if ((mask & CWBorderPixmap) && pWin->borderIsPixel == FALSE)
 	exaFinishAccess(&pWin->border.pixmap->drawable, EXA_PREPARE_MASK);
 
-    /* switch back to the normal upper layer. */
-    unwrap(pExaScr, pScreen, CreatePixmap);
-    /* restore copy of fb layer pointer. */
-    pExaScr->SavedCreatePixmap = old_ptr;
-
-    /* switch back to the normal upper layer. */
-    unwrap(pExaScr, pScreen, DestroyPixmap);
-    /* restore copy of fb layer pointer. */
-    pExaScr->SavedDestroyPixmap = old_ptr2;
-
     return ret;
 }
 
diff --git a/exa/exa_accel.c b/exa/exa_accel.c
index 7e2dd70..4f94ae8 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -51,7 +51,8 @@ exaFillSpans(DrawablePtr pDrawable, GCPtr pGC, int n,
     int		    partX1, partX2;
     int		    off_x, off_y;
 
-    if (pExaScr->swappedOut ||
+    if (pExaScr->fallback_counter ||
+	pExaScr->swappedOut ||
 	pGC->fillStyle != FillSolid ||
 	pExaPixmap->accel_blocked)
     {


Reply to: