Patch from Thomas Winischhofer to kick out all pixmaps to system ram upon a

VT switch and vice versa when returning.
This commit is contained in:
Zack Rusin 2005-07-09 14:15:35 +00:00
parent 327741486e
commit 3c92389185
12 changed files with 162 additions and 18 deletions

View File

@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
ExaPixmapPrivPtr pExaPixmap; ExaPixmapPrivPtr pExaPixmap;
int bpp; int bpp;
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
ExaScreenPriv(pScreen);
if (!pScrn->vtSema) { if (!pScrn->vtSema || pExaScr->swappedOut) {
ExaScreenPriv(pScreen);
pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth); pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
} else { } else {
bpp = BitsPerPixel (depth); bpp = BitsPerPixel (depth);
@ -1127,6 +1127,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
} }
#endif #endif
if (pExaScr->wrappedEnableDisableFB)
pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr); xfree (pExaScr);
@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen, exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo) ExaDriverPtr pScreenInfo)
{ {
/* Do NOT use XF86SCRNINFO macro here!! */
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr; ExaScreenPrivPtr pExaScr;
#ifdef RENDER #ifdef RENDER
@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration; exaGeneration = serverGeneration;
} }
pExaScr = xalloc (sizeof (ExaScreenPrivRec)); pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr) if (!pExaScr)
return FALSE; return FALSE;
@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) { if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
if (!exaOffscreenInit (pScreen)) if (!exaOffscreenInit (pScreen))
return FALSE; return FALSE;
pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
pExaScr->wrappedEnableDisableFB = TRUE;
} }
return TRUE; return TRUE;

View File

@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
ExaPixmapPrivPtr pExaPixmap; ExaPixmapPrivPtr pExaPixmap;
int bpp; int bpp;
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
ExaScreenPriv(pScreen);
if (!pScrn->vtSema) { if (!pScrn->vtSema || pExaScr->swappedOut) {
ExaScreenPriv(pScreen);
pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth); pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
} else { } else {
bpp = BitsPerPixel (depth); bpp = BitsPerPixel (depth);
@ -1127,6 +1127,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
} }
#endif #endif
if (pExaScr->wrappedEnableDisableFB)
pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr); xfree (pExaScr);
@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen, exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo) ExaDriverPtr pScreenInfo)
{ {
/* Do NOT use XF86SCRNINFO macro here!! */
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr; ExaScreenPrivPtr pExaScr;
#ifdef RENDER #ifdef RENDER
@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration; exaGeneration = serverGeneration;
} }
pExaScr = xalloc (sizeof (ExaScreenPrivRec)); pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr) if (!pExaScr)
return FALSE; return FALSE;
@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) { if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
if (!exaOffscreenInit (pScreen)) if (!exaOffscreenInit (pScreen))
return FALSE; return FALSE;
pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
pExaScr->wrappedEnableDisableFB = TRUE;
} }
return TRUE; return TRUE;

View File

@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
ExaPixmapPrivPtr pExaPixmap; ExaPixmapPrivPtr pExaPixmap;
int bpp; int bpp;
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
ExaScreenPriv(pScreen);
if (!pScrn->vtSema) { if (!pScrn->vtSema || pExaScr->swappedOut) {
ExaScreenPriv(pScreen);
pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth); pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
} else { } else {
bpp = BitsPerPixel (depth); bpp = BitsPerPixel (depth);
@ -1127,6 +1127,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
} }
#endif #endif
if (pExaScr->wrappedEnableDisableFB)
pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr); xfree (pExaScr);
@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen, exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo) ExaDriverPtr pScreenInfo)
{ {
/* Do NOT use XF86SCRNINFO macro here!! */
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr; ExaScreenPrivPtr pExaScr;
#ifdef RENDER #ifdef RENDER
@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration; exaGeneration = serverGeneration;
} }
pExaScr = xalloc (sizeof (ExaScreenPrivRec)); pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr) if (!pExaScr)
return FALSE; return FALSE;
@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) { if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
if (!exaOffscreenInit (pScreen)) if (!exaOffscreenInit (pScreen))
return FALSE; return FALSE;
pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
pExaScr->wrappedEnableDisableFB = TRUE;
} }
return TRUE; return TRUE;

View File

@ -253,6 +253,26 @@ ExaOffscreenSwapIn (ScreenPtr pScreen)
exaOffscreenInit (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 */ /* merge the next free area into this one */
static void static void
ExaOffscreenMerge (ExaOffscreenArea *area) ExaOffscreenMerge (ExaOffscreenArea *area)

View File

@ -44,11 +44,15 @@
#include "dix.h" #include "dix.h"
#include "fb.h" #include "fb.h"
#include "fboverlay.h" #include "fboverlay.h"
#ifdef RENDER
#include "fbpict.h"
#endif
#ifndef EXA_MAX_FB #ifndef EXA_MAX_FB
#define EXA_MAX_FB FB_OVERLAY_MAX #define EXA_MAX_FB FB_OVERLAY_MAX
#endif #endif
typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct { typedef struct {
ExaDriverPtr info; ExaDriverPtr info;
CreateGCProcPtr SavedCreateGC; CreateGCProcPtr SavedCreateGC;
@ -63,6 +67,9 @@ typedef struct {
#ifdef RENDER #ifdef RENDER
CompositeProcPtr SavedComposite; CompositeProcPtr SavedComposite;
#endif #endif
EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
Bool wrappedEnableDisableFB;
Bool swappedOut;
} ExaScreenPrivRec, *ExaScreenPrivPtr; } ExaScreenPrivRec, *ExaScreenPrivPtr;
/* /*
@ -225,6 +232,9 @@ ExaOffscreenSwapIn (ScreenPtr pScreen);
void void
ExaOffscreenFini (ScreenPtr pScreen); ExaOffscreenFini (ScreenPtr pScreen);
void
exaEnableDisableFBAccess (int index, Bool enable);
/* exa.c */ /* exa.c */
void void
exaPixmapUseScreen (PixmapPtr pPixmap); exaPixmapUseScreen (PixmapPtr pPixmap);

View File

@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
ExaPixmapPrivPtr pExaPixmap; ExaPixmapPrivPtr pExaPixmap;
int bpp; int bpp;
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
ExaScreenPriv(pScreen);
if (!pScrn->vtSema) { if (!pScrn->vtSema || pExaScr->swappedOut) {
ExaScreenPriv(pScreen);
pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth); pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
} else { } else {
bpp = BitsPerPixel (depth); bpp = BitsPerPixel (depth);
@ -1127,6 +1127,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
} }
#endif #endif
if (pExaScr->wrappedEnableDisableFB)
pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr); xfree (pExaScr);
@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen, exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo) ExaDriverPtr pScreenInfo)
{ {
/* Do NOT use XF86SCRNINFO macro here!! */
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr; ExaScreenPrivPtr pExaScr;
#ifdef RENDER #ifdef RENDER
@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration; exaGeneration = serverGeneration;
} }
pExaScr = xalloc (sizeof (ExaScreenPrivRec)); pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr) if (!pExaScr)
return FALSE; return FALSE;
@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) { if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
if (!exaOffscreenInit (pScreen)) if (!exaOffscreenInit (pScreen))
return FALSE; return FALSE;
pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
pExaScr->wrappedEnableDisableFB = TRUE;
} }
return TRUE; return TRUE;

View File

@ -44,11 +44,15 @@
#include "dix.h" #include "dix.h"
#include "fb.h" #include "fb.h"
#include "fboverlay.h" #include "fboverlay.h"
#ifdef RENDER
#include "fbpict.h"
#endif
#ifndef EXA_MAX_FB #ifndef EXA_MAX_FB
#define EXA_MAX_FB FB_OVERLAY_MAX #define EXA_MAX_FB FB_OVERLAY_MAX
#endif #endif
typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct { typedef struct {
ExaDriverPtr info; ExaDriverPtr info;
CreateGCProcPtr SavedCreateGC; CreateGCProcPtr SavedCreateGC;
@ -63,6 +67,9 @@ typedef struct {
#ifdef RENDER #ifdef RENDER
CompositeProcPtr SavedComposite; CompositeProcPtr SavedComposite;
#endif #endif
EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
Bool wrappedEnableDisableFB;
Bool swappedOut;
} ExaScreenPrivRec, *ExaScreenPrivPtr; } ExaScreenPrivRec, *ExaScreenPrivPtr;
/* /*
@ -225,6 +232,9 @@ ExaOffscreenSwapIn (ScreenPtr pScreen);
void void
ExaOffscreenFini (ScreenPtr pScreen); ExaOffscreenFini (ScreenPtr pScreen);
void
exaEnableDisableFBAccess (int index, Bool enable);
/* exa.c */ /* exa.c */
void void
exaPixmapUseScreen (PixmapPtr pPixmap); exaPixmapUseScreen (PixmapPtr pPixmap);

View File

@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
ExaPixmapPrivPtr pExaPixmap; ExaPixmapPrivPtr pExaPixmap;
int bpp; int bpp;
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
ExaScreenPriv(pScreen);
if (!pScrn->vtSema) { if (!pScrn->vtSema || pExaScr->swappedOut) {
ExaScreenPriv(pScreen);
pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth); pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
} else { } else {
bpp = BitsPerPixel (depth); bpp = BitsPerPixel (depth);
@ -1127,6 +1127,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
} }
#endif #endif
if (pExaScr->wrappedEnableDisableFB)
pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr); xfree (pExaScr);
@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen, exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo) ExaDriverPtr pScreenInfo)
{ {
/* Do NOT use XF86SCRNINFO macro here!! */
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr; ExaScreenPrivPtr pExaScr;
#ifdef RENDER #ifdef RENDER
@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration; exaGeneration = serverGeneration;
} }
pExaScr = xalloc (sizeof (ExaScreenPrivRec)); pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr) if (!pExaScr)
return FALSE; return FALSE;
@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) { if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
if (!exaOffscreenInit (pScreen)) if (!exaOffscreenInit (pScreen))
return FALSE; return FALSE;
pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
pExaScr->wrappedEnableDisableFB = TRUE;
} }
return TRUE; return TRUE;

View File

@ -331,9 +331,9 @@ exaCreatePixmap(ScreenPtr pScreen, int w, int h, int depth)
ExaPixmapPrivPtr pExaPixmap; ExaPixmapPrivPtr pExaPixmap;
int bpp; int bpp;
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen); ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
ExaScreenPriv(pScreen);
if (!pScrn->vtSema) { if (!pScrn->vtSema || pExaScr->swappedOut) {
ExaScreenPriv(pScreen);
pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth); pPixmap = pExaScr->SavedCreatePixmap(pScreen, w, h, depth);
} else { } else {
bpp = BitsPerPixel (depth); bpp = BitsPerPixel (depth);
@ -1127,6 +1127,7 @@ exaCloseScreen(int i, ScreenPtr pScreen)
#ifdef RENDER #ifdef RENDER
PictureScreenPtr ps = GetPictureScreenIfSet(pScreen); PictureScreenPtr ps = GetPictureScreenIfSet(pScreen);
#endif #endif
ScrnInfoPtr pScrn = XF86SCRNINFO(pScreen);
pScreen->CreateGC = pExaScr->SavedCreateGC; pScreen->CreateGC = pExaScr->SavedCreateGC;
pScreen->CloseScreen = pExaScr->SavedCloseScreen; pScreen->CloseScreen = pExaScr->SavedCloseScreen;
@ -1142,6 +1143,8 @@ exaCloseScreen(int i, ScreenPtr pScreen)
ps->Composite = pExaScr->SavedComposite; ps->Composite = pExaScr->SavedComposite;
} }
#endif #endif
if (pExaScr->wrappedEnableDisableFB)
pScrn->EnableDisableFBAccess = pExaScr->SavedEnableDisableFBAccess;
xfree (pExaScr); xfree (pExaScr);
@ -1152,6 +1155,8 @@ Bool
exaDriverInit (ScreenPtr pScreen, exaDriverInit (ScreenPtr pScreen,
ExaDriverPtr pScreenInfo) ExaDriverPtr pScreenInfo)
{ {
/* Do NOT use XF86SCRNINFO macro here!! */
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
ExaScreenPrivPtr pExaScr; ExaScreenPrivPtr pExaScr;
#ifdef RENDER #ifdef RENDER
@ -1165,7 +1170,7 @@ exaDriverInit (ScreenPtr pScreen,
exaGeneration = serverGeneration; exaGeneration = serverGeneration;
} }
pExaScr = xalloc (sizeof (ExaScreenPrivRec)); pExaScr = xcalloc (sizeof (ExaScreenPrivRec), 1);
if (!pExaScr) if (!pExaScr)
return FALSE; return FALSE;
@ -1233,6 +1238,10 @@ exaDriverInit (ScreenPtr pScreen,
if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) { if (pExaScr->info->card.offScreenBase < pExaScr->info->card.memorySize) {
if (!exaOffscreenInit (pScreen)) if (!exaOffscreenInit (pScreen))
return FALSE; return FALSE;
pExaScr->SavedEnableDisableFBAccess = pScrn->EnableDisableFBAccess;
pScrn->EnableDisableFBAccess = exaEnableDisableFBAccess;
pExaScr->wrappedEnableDisableFB = TRUE;
} }
return TRUE; return TRUE;

View File

@ -253,6 +253,26 @@ ExaOffscreenSwapIn (ScreenPtr pScreen)
exaOffscreenInit (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 */ /* merge the next free area into this one */
static void static void
ExaOffscreenMerge (ExaOffscreenArea *area) ExaOffscreenMerge (ExaOffscreenArea *area)

View File

@ -44,11 +44,15 @@
#include "dix.h" #include "dix.h"
#include "fb.h" #include "fb.h"
#include "fboverlay.h" #include "fboverlay.h"
#ifdef RENDER
#include "fbpict.h"
#endif
#ifndef EXA_MAX_FB #ifndef EXA_MAX_FB
#define EXA_MAX_FB FB_OVERLAY_MAX #define EXA_MAX_FB FB_OVERLAY_MAX
#endif #endif
typedef void (*EnableDisableFBAccessProcPtr)(int, Bool);
typedef struct { typedef struct {
ExaDriverPtr info; ExaDriverPtr info;
CreateGCProcPtr SavedCreateGC; CreateGCProcPtr SavedCreateGC;
@ -63,6 +67,9 @@ typedef struct {
#ifdef RENDER #ifdef RENDER
CompositeProcPtr SavedComposite; CompositeProcPtr SavedComposite;
#endif #endif
EnableDisableFBAccessProcPtr SavedEnableDisableFBAccess;
Bool wrappedEnableDisableFB;
Bool swappedOut;
} ExaScreenPrivRec, *ExaScreenPrivPtr; } ExaScreenPrivRec, *ExaScreenPrivPtr;
/* /*
@ -225,6 +232,9 @@ ExaOffscreenSwapIn (ScreenPtr pScreen);
void void
ExaOffscreenFini (ScreenPtr pScreen); ExaOffscreenFini (ScreenPtr pScreen);
void
exaEnableDisableFBAccess (int index, Bool enable);
/* exa.c */ /* exa.c */
void void
exaPixmapUseScreen (PixmapPtr pPixmap); exaPixmapUseScreen (PixmapPtr pPixmap);

View File

@ -253,6 +253,26 @@ ExaOffscreenSwapIn (ScreenPtr pScreen)
exaOffscreenInit (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 */ /* merge the next free area into this one */
static void static void
ExaOffscreenMerge (ExaOffscreenArea *area) ExaOffscreenMerge (ExaOffscreenArea *area)