diff -ur exa_old/exa.c exa/exa.c
--- exa_old/exa.c	2005-07-09 12:24:19.871178440 +0200
+++ exa/exa.c	2005-07-09 12:48:01.095119560 +0200
@@ -331,9 +331,9 @@
     ExaPixmapPrivPtr	pExaPixmap;
     int			bpp;
     ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
+    ExaScreenPriv(pScreen);

-    if (!pScrn->vtSema) {
-        ExaScreenPriv(pScreen);
+    if (!pScrn->vtSema || pExaScr->SwappedOut) {
         pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
     } else {
         bpp = BitsPerPixel (depth);
@@ -1127,6 +1127,7 @@
 #ifdef RENDER
     PictureScreenPtr	ps = GetPictureScreenIfSet(pScreen);
 #endif
+    ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);

     pScreen->CreateGC = pExaScr->SavedCreateGC;
     pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@
 	ps->Composite = pExaScr->SavedComposite;
     }
 #endif
+    if (pExaScr->WrappedEnableDisableFB)
+	pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;

     xfree (pExaScr);

@@ -1152,6 +1155,8 @@
 exaDriverInit (ScreenPtr		pScreen,
                ExaDriverPtr	pScreenInfo)
 {
+    /* Do NOT use XF86SCRNINFO macro here!! */
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
     ExaScreenPrivPtr pExaScr;

 #ifdef RENDER
@@ -1165,7 +1170,7 @@
 	exaGeneration = serverGeneration;
     }

-    pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+    pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);

     if (!pExaScr)
 	return FALSE;
@@ -1233,6 +1238,10 @@
     if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
 	if (!exaOffscreenInit (pScreen))
             return FALSE;
+
+	pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
+	pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
+	pExaScr->WrappedEnableDisableFB = TRUE;
     }

     return TRUE;
diff -ur exa_old/exaPriv.h exa/exaPriv.h
--- exa_old/exaPriv.h	2005-07-09 12:24:26.989096352 +0200
+++ exa/exaPriv.h	2005-07-09 12:42:40.884798928 +0200
@@ -44,6 +44,9 @@
 #include "dix.h"
 #include "fb.h"
 #include "fboverlay.h"
+#ifdef RENDER
+#include "fbpict.h"
+#endif

 #ifndef EXA_MAX_FB
 #define EXA_MAX_FB   FB_OVERLAY_MAX
@@ -63,6 +66,11 @@
 #ifdef RENDER
     CompositeProcPtr             SavedComposite;
 #endif
+    void			 (*SavedEnableDisableFBAccess)(int, Bool);
+    Bool			 WrappedEnableDisableFB;
+    Bool			 SwappedOut;
+    /* TODO: Same sort of wrapper like EnableDisableFBAccess */
+    /* int				 (*SavedSetDGAMode)(int, int, DGADevicePtr); */
 } ExaScreenPrivRec, *ExaScreenPrivPtr;

 /*
@@ -225,6 +233,9 @@
 void
 ExaOffscreenFini (ScreenPtr pScreen);

+void
+exaEnableDisableFBAccess (int index, Bool enable);
+
 /* exa.c */
 void
 exaPixmapUseScreen (PixmapPtr pPixmap);
diff -ur exa_old/exaoffscreen.c exa/exaoffscreen.c
--- exa_old/exaoffscreen.c	2005-07-09 12:24:19.871178440 +0200
+++ exa/exaoffscreen.c	2005-07-09 12:35:58.250008720 +0200
@@ -253,6 +253,30 @@
     exaOffscreenInit (pScreen);
 }

+void
+exaEnableDisableFBAccess (int index, Bool enable)
+{
+    ScreenPtr pScreen = screenInfo.screens[index];
+    ExaScreenPriv (pScreen);
+
+    if (!enable) {
+
+	ExaOffscreenSwapOut (pScreen);
+	pExaScr->SwappedOut = TRUE;
+
+    }
+
+    if (pExaScr->SavedEnableDisableFBAccess)
+       (*pExaScr->SavedEnableDisableFBAccess)(index, enable);
+
+    if (enable) {
+
+	ExaOffscreenSwapIn (pScreen);
+	pExaScr->SwappedOut = FALSE;
+
+    }
+}
+
 /* merge the next free area into this one */
 static void
 ExaOffscreenMerge (ExaOffscreenArea *area)
