summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZack Rusin <zack@kde.org>2005-07-09 14:15:35 +0000
committerZack Rusin <zack@kde.org>2005-07-09 14:15:35 +0000
commit3c92389185f0c9fa3b8c299a084b10c12bcab52c (patch)
tree6df3f00543b0e04e4547ecfcaa7d0aba8aebbc4d
parent327741486e807c068383a771c04c9042b0589c37 (diff)
Patch from Thomas Winischhofer to kick out all pixmaps to system ram upon a
VT switch and vice versa when returning.
-rw-r--r--exa/exa.c15
-rw-r--r--exa/exa_accel.c15
-rw-r--r--exa/exa_migration.c15
-rw-r--r--exa/exa_offscreen.c20
-rw-r--r--exa/exa_priv.h10
-rw-r--r--hw/xfree86/exa/exa.c15
-rw-r--r--hw/xfree86/exa/exaPriv.h10
-rw-r--r--hw/xfree86/exa/exa_accel.c15
-rw-r--r--hw/xfree86/exa/exa_migration.c15
-rw-r--r--hw/xfree86/exa/exa_offscreen.c20
-rw-r--r--hw/xfree86/exa/exa_priv.h10
-rw-r--r--hw/xfree86/exa/exaoffscreen.c20
12 files changed, 162 insertions, 18 deletions
diff --git a/exa/exa.c b/exa/exa.c
index 49c884595..50550b0a4 100644
--- a/exa/exa.c
+++ b/exa/exa.c
@@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
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 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite;
}
#endif
+ if (pExaScr->wrappedEnableDisableFB)
+ pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr);
@@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo)
{
+ /* Do NOT use XF86SCRNINFO macro here!! */
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr;
#ifdef RENDER
@@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration;
}
- pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+ pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr)
return FALSE;
@@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
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 --git a/exa/exa_accel.c b/exa/exa_accel.c
index 49c884595..50550b0a4 100644
--- a/exa/exa_accel.c
+++ b/exa/exa_accel.c
@@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
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 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite;
}
#endif
+ if (pExaScr->wrappedEnableDisableFB)
+ pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr);
@@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo)
{
+ /* Do NOT use XF86SCRNINFO macro here!! */
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr;
#ifdef RENDER
@@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration;
}
- pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+ pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr)
return FALSE;
@@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
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 --git a/exa/exa_migration.c b/exa/exa_migration.c
index 49c884595..50550b0a4 100644
--- a/exa/exa_migration.c
+++ b/exa/exa_migration.c
@@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
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 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite;
}
#endif
+ if (pExaScr->wrappedEnableDisableFB)
+ pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr);
@@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo)
{
+ /* Do NOT use XF86SCRNINFO macro here!! */
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr;
#ifdef RENDER
@@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration;
}
- pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+ pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr)
return FALSE;
@@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
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 --git a/exa/exa_offscreen.c b/exa/exa_offscreen.c
index d62db9016..6b1a160ed 100644
--- a/exa/exa_offscreen.c
+++ b/exa/exa_offscreen.c
@@ -253,6 +253,26 @@ ExaOffscreenSwapIn (ScreenPtr pScreen)
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)
diff --git a/exa/exa_priv.h b/exa/exa_priv.h
index 66d0b2faa..6372292e9 100644
--- a/exa/exa_priv.h
+++ b/exa/exa_priv.h
@@ -44,11 +44,15 @@
#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
#endif
+typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct {
ExaDriverPtr info;
CreateGCProcPtr SavedCreateGC;
@@ -63,6 +67,9 @@ typedef struct {
#ifdef RENDER
CompositeProcPtr SavedComposite;
#endif
+ EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
+ Bool wrappedEnableDisableFB;
+ Bool swappedOut;
} ExaScreenPrivRec, *ExaScreenPrivPtr;
/*
@@ -225,6 +232,9 @@ ExaOffscreenSwapIn (ScreenPtr pScreen);
void
ExaOffscreenFini (ScreenPtr pScreen);
+void
+exaEnableDisableFBAccess (int index, Bool enable);
+
/* exa.c */
void
exaPixmapUseScreen (PixmapPtr pPixmap);
diff --git a/hw/xfree86/exa/exa.c b/hw/xfree86/exa/exa.c
index 49c884595..50550b0a4 100644
--- a/hw/xfree86/exa/exa.c
+++ b/hw/xfree86/exa/exa.c
@@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
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 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite;
}
#endif
+ if (pExaScr->wrappedEnableDisableFB)
+ pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr);
@@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo)
{
+ /* Do NOT use XF86SCRNINFO macro here!! */
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr;
#ifdef RENDER
@@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration;
}
- pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+ pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr)
return FALSE;
@@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
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 --git a/hw/xfree86/exa/exaPriv.h b/hw/xfree86/exa/exaPriv.h
index 66d0b2faa..6372292e9 100644
--- a/hw/xfree86/exa/exaPriv.h
+++ b/hw/xfree86/exa/exaPriv.h
@@ -44,11 +44,15 @@
#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
#endif
+typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct {
ExaDriverPtr info;
CreateGCProcPtr SavedCreateGC;
@@ -63,6 +67,9 @@ typedef struct {
#ifdef RENDER
CompositeProcPtr SavedComposite;
#endif
+ EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
+ Bool wrappedEnableDisableFB;
+ Bool swappedOut;
} ExaScreenPrivRec, *ExaScreenPrivPtr;
/*
@@ -225,6 +232,9 @@ ExaOffscreenSwapIn (ScreenPtr pScreen);
void
ExaOffscreenFini (ScreenPtr pScreen);
+void
+exaEnableDisableFBAccess (int index, Bool enable);
+
/* exa.c */
void
exaPixmapUseScreen (PixmapPtr pPixmap);
diff --git a/hw/xfree86/exa/exa_accel.c b/hw/xfree86/exa/exa_accel.c
index 49c884595..50550b0a4 100644
--- a/hw/xfree86/exa/exa_accel.c
+++ b/hw/xfree86/exa/exa_accel.c
@@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
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 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite;
}
#endif
+ if (pExaScr->wrappedEnableDisableFB)
+ pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr);
@@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo)
{
+ /* Do NOT use XF86SCRNINFO macro here!! */
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr;
#ifdef RENDER
@@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration;
}
- pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+ pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr)
return FALSE;
@@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
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 --git a/hw/xfree86/exa/exa_migration.c b/hw/xfree86/exa/exa_migration.c
index 49c884595..50550b0a4 100644
--- a/hw/xfree86/exa/exa_migration.c
+++ b/hw/xfree86/exa/exa_migration.c
@@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
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 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif
+ ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite;
}
#endif
+ if (pExaScr->wrappedEnableDisableFB)
+ pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr);
@@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo)
{
+ /* Do NOT use XF86SCRNINFO macro here!! */
+ ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr;
#ifdef RENDER
@@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration;
}
- pExaScr = xalloc (sizeof (ExaScreenPrivRec));
+ pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr)
return FALSE;
@@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
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 --git a/hw/xfree86/exa/exa_offscreen.c b/hw/xfree86/exa/exa_offscreen.c
index d62db9016..6b1a160ed 100644
--- a/hw/xfree86/exa/exa_offscreen.c
+++ b/hw/xfree86/exa/exa_offscreen.c
@@ -253,6 +253,26 @@ ExaOffscreenSwapIn (ScreenPtr pScreen)
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)
diff --git a/hw/xfree86/exa/exa_priv.h b/hw/xfree86/exa/exa_priv.h
index 66d0b2faa..6372292e9 100644
--- a/hw/xfree86/exa/exa_priv.h
+++ b/hw/xfree86/exa/exa_priv.h
@@ -44,11 +44,15 @@
#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
#endif
+typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct {
ExaDriverPtr info;
CreateGCProcPtr SavedCreateGC;
@@ -63,6 +67,9 @@ typedef struct {
#ifdef RENDER
CompositeProcPtr SavedComposite;
#endif
+ EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
+ Bool wrappedEnableDisableFB;
+ Bool swappedOut;
} ExaScreenPrivRec, *ExaScreenPrivPtr;
/*
@@ -225,6 +232,9 @@ ExaOffscreenSwapIn (ScreenPtr pScreen);
void
ExaOffscreenFini (ScreenPtr pScreen);
+void
+exaEnableDisableFBAccess (int index, Bool enable);
+
/* exa.c */
void
exaPixmapUseScreen (PixmapPtr pPixmap);
diff --git a/hw/xfree86/exa/exaoffscreen.c b/hw/xfree86/exa/exaoffscreen.c
index d62db9016..6b1a160ed 100644
--- a/hw/xfree86/exa/exaoffscreen.c
+++ b/hw/xfree86/exa/exaoffscreen.c
@@ -253,6 +253,26 @@ ExaOffscreenSwapIn (ScreenPtr pScreen)
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)