diff --git a/src/neo.h b/src/neo.h index 6812e7a..1e44542 100644 --- a/src/neo.h +++ b/src/neo.h @@ -257,6 +257,7 @@ typedef struct neoRec NeoRegRec NeoSavedReg; /* proc pointer */ CloseScreenProcPtr CloseScreen; + CreateScreenResourcesProcPtr CreateScreenResources; I2CBusPtr I2C; vbeInfoPtr pVbe; unsigned char * ShadowPtr; @@ -273,6 +274,9 @@ typedef struct neoRec int overlay_offset; int videoKey; int interlace; + void *shadow; + ShadowUpdateProc update; + ShadowWindowProc window; } NEORec, *NEOPtr; typedef struct { diff --git a/src/neo_driver.c b/src/neo_driver.c index ce89ce0..df8e51d 100644 --- a/src/neo_driver.c +++ b/src/neo_driver.c @@ -1404,6 +1404,23 @@ NEOLoadPalette( } } +static Bool +NEOCreateScreenResources(ScreenPtr pScreen) +{ + ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum]; + NEOPtr nPtr = NEOPTR(pScrn); + Bool ret; + + pScreen->CreateScreenResources = nPtr->CreateScreenResources; + ret = pScreen->CreateScreenResources(pScreen); + pScreen->CreateScreenResources = NEOCreateScreenResources; + + shadowAdd(pScreen, pScreen->GetScreenPixmap(pScreen), nPtr->update, + nPtr->window, 0, 0); + + return ret; +} + /* Mandatory */ static Bool NEOScreenInit(SCREEN_INIT_ARGS_DECL) @@ -1438,7 +1455,17 @@ NEOScreenInit(SCREEN_INIT_ARGS_DECL) /* Map the Neo memory and possible MMIO areas */ if (!neoMapMem(pScrn)) return FALSE; - + + if (nPtr->shadowFB) { + nPtr->shadow = calloc(1, pScrn->displayWidth * pScrn->virtualY * + ((pScrn->bitsPerPixel + 7) / 8)); + if (!nPtr->shadow) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "Failed to allocate shadow buffer\n"); + return FALSE; + } + } + /* * next we save the current state and setup the first mode */ @@ -1485,7 +1512,7 @@ NEOScreenInit(SCREEN_INIT_ARGS_DECL) FBStart = nPtr->NeoFbBase; } - ret = fbScreenInit(pScreen, FBStart, + ret = fbScreenInit(pScreen, nPtr->shadowFB ? nPtr->shadow : FBStart, width, height, pScrn->xDpi, pScrn->yDpi, displayWidth, pScrn->bitsPerPixel); @@ -1655,7 +1682,10 @@ NEOScreenInit(SCREEN_INIT_ARGS_DECL) #if 0 ShadowFBInit(pScreen, nPtr->refreshArea); #else - shadowInit (pScreen, neoShadowUpdate, 0); + if (!shadowSetup(pScreen)) + return FALSE; + nPtr->CreateScreenResources = pScreen->CreateScreenResources; + pScreen->CreateScreenResources = NEOCreateScreenResources; #endif } @@ -1785,6 +1815,10 @@ NEOCloseScreen(CLOSE_SCREEN_ARGS_DECL) neoLock(pScrn); neoUnmapMem(pScrn); } + if (nPtr->shadowFB && nPtr->shadow) { + shadowRemove(pScreen, pScreen->GetScreenPixmap(pScreen)); + free(nPtr->shadow); + } #ifdef HAVE_XAA_H if (nPtr->AccelInfoRec) XAADestroyInfoRec(nPtr->AccelInfoRec); @@ -1795,6 +1829,7 @@ NEOCloseScreen(CLOSE_SCREEN_ARGS_DECL) free(nPtr->ShadowPtr); pScrn->vtSema = FALSE; + pScreen->CreateScreenResources = nPtr->CreateScreenResources; pScreen->CloseScreen = nPtr->CloseScreen; return (*pScreen->CloseScreen)(CLOSE_SCREEN_ARGS); }