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:
parent
327741486e
commit
3c92389185
15
exa/exa.c
15
exa/exa.c
|
@ -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);
|
||||||
|
|
||||||
if (!pScrn->vtSema) {
|
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
if (!pScrn->vtSema || pExaScr->swappedOut) {
|
||||||
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
if (!pScrn->vtSema) {
|
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
if (!pScrn->vtSema || pExaScr->swappedOut) {
|
||||||
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
if (!pScrn->vtSema) {
|
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
if (!pScrn->vtSema || pExaScr->swappedOut) {
|
||||||
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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
if (!pScrn->vtSema) {
|
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
if (!pScrn->vtSema || pExaScr->swappedOut) {
|
||||||
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
if (!pScrn->vtSema) {
|
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
if (!pScrn->vtSema || pExaScr->swappedOut) {
|
||||||
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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
if (!pScrn->vtSema) {
|
|
||||||
ExaScreenPriv(pScreen);
|
ExaScreenPriv(pScreen);
|
||||||
|
|
||||||
|
if (!pScrn->vtSema || pExaScr->swappedOut) {
|
||||||
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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user