From 3c92389185f0c9fa3b8c299a084b10c12bcab52c Mon Sep 17 00:00:00 2001 From: Zack Rusin Date: Sat, 9 Jul 2005 14:15:35 +0000 Subject: [PATCH] Patch from Thomas Winischhofer to kick out all pixmaps to system ram upon a VT switch and vice versa when returning. --- exa/exa.c | 15 ++++++++++++--- exa/exa_accel.c | 15 ++++++++++++--- exa/exa_migration.c | 15 ++++++++++++--- exa/exa_offscreen.c | 20 ++++++++++++++++++++ exa/exa_priv.h | 10 ++++++++++ hw/xfree86/exa/exa.c | 15 ++++++++++++--- hw/xfree86/exa/exaPriv.h | 10 ++++++++++ hw/xfree86/exa/exa_accel.c | 15 ++++++++++++--- hw/xfree86/exa/exa_migration.c | 15 ++++++++++++--- hw/xfree86/exa/exa_offscreen.c | 20 ++++++++++++++++++++ hw/xfree86/exa/exa_priv.h | 10 ++++++++++ hw/xfree86/exa/exaoffscreen.c | 20 ++++++++++++++++++++ 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)