Blob Blame History Raw
--- xf86-video-vesa-1.2.1/src/vesa.c.shadowfb	2006-09-19 15:22:36.000000000 -0400
+++ xf86-video-vesa-1.2.1/src/vesa.c	2006-09-19 15:25:02.000000000 -0400
@@ -747,6 +747,23 @@
 }
 
 static Bool
+vesaCreateScreenResources(ScreenPtr pScreen)
+{
+    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+    VESAPtr pVesa = VESAGetRec(pScrn);
+    Bool ret;
+
+    pScreen->CreateScreenResources = pVesa->CreateScreenResources;
+    ret = pScreen->CreateScreenResources(pScreen);
+    pScreen->CreateScreenResources = vesaCreateScreenResources;
+
+    shadowAdd(pScreen, pScreen->GetScreenPixmap(pScreen), pVesa->update,
+	      pVesa->window, 0, 0);
+
+    return ret;
+}
+
+static Bool
 VESAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
 {
     ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
@@ -788,6 +805,16 @@
     if (pVesa->shadowFB && pScrn->bitsPerPixel == 4)
 	pScrn->bitsPerPixel = 8;
 
+    if (pVesa->shadowFB) {
+	pVesa->shadow = xcalloc(1, pScrn->displayWidth * pScrn->virtualY *
+				   ((pScrn->bitsPerPixel + 7) / 8));
+	if (!pVesa->shadow) {
+	    xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+		       "Failed to allocate shadow buffer\n");
+	    return FALSE;
+	}
+    }
+
     /* save current video state */
     VESASaveRestore(pScrn, MODE_SAVE);
     pVesa->savedPal = VBESetGetPaletteData(pVesa->pVbe, FALSE, 0, 256,
@@ -865,7 +892,7 @@
 		case 24:
 		case 32:
 		    if (!fbScreenInit(pScreen,
-				       pVesa->base,
+				pVesa->shadowFB ? pVesa->shadow : pVesa->base,
 				       pScrn->virtualX, pScrn->virtualY,
 				       pScrn->xDpi, pScrn->yDpi,
 				       pScrn->displayWidth, pScrn->bitsPerPixel))
@@ -901,27 +928,26 @@
 	fbPictureInit(pScreen, 0, 0);
 
     if (pVesa->shadowFB) {
-	ShadowUpdateProc update;
-	ShadowWindowProc window;
-
 	if (mode->MemoryModel == 3) {	/* Planar */
 	  if (pScrn->bitsPerPixel == 8)
-		update = shadowUpdatePlanar4x8Weak();
+		pVesa->update = shadowUpdatePlanar4x8Weak();
 	    else
-		update = shadowUpdatePlanar4Weak();
-	    window = VESAWindowPlanar;
+		pVesa->update = shadowUpdatePlanar4Weak();
+	    pVesa->window = VESAWindowPlanar;
 	}
 	else if (pVesa->mapPhys == 0xa0000) {	/* Windowed */
-	    update = shadowUpdatePackedWeak();
-	    window = VESAWindowWindowed;
+	    pVesa->update = shadowUpdatePackedWeak();
+	    pVesa->window = VESAWindowWindowed;
 	}
 	else {	/* Linear */
-	    update = shadowUpdatePackedWeak();
-	    window = VESAWindowLinear;
+	    pVesa->update = shadowUpdatePackedWeak();
+	    pVesa->window = VESAWindowLinear;
 	}
 
-	if (!shadowInit(pScreen, update, window))
-	    return (FALSE);
+	if (!shadowSetup(pScreen))
+	    return FALSE;
+	pVesa->CreateScreenResources = pScreen->CreateScreenResources;
+	pScreen->CreateScreenResources = vesaCreateScreenResources;
     }
     else if (pVesa->mapPhys == 0xa0000 && mode->MemoryModel != 0x3) {
 	unsigned int bankShift = 0;
@@ -1005,6 +1031,8 @@
 				 pVesa->savedPal, FALSE, TRUE);
 	VESAUnmapVidMem(pScrn);
     }
+    if (pVesa->shadowFB && pVesa->shadow)
+	xfree(pVesa->shadow);
     if (pVesa->pDGAMode) {
 	xfree(pVesa->pDGAMode);
 	pVesa->pDGAMode = NULL;
@@ -1012,6 +1040,7 @@
     }
     pScrn->vtSema = FALSE;
 
+    pScreen->CreateScreenResources = pVesa->CreateScreenResources;
     pScreen->CloseScreen = pVesa->CloseScreen;
     return pScreen->CloseScreen(scrnIndex, pScreen);
 }
--- xf86-video-vesa-1.2.1/src/vesa.h.shadowfb	2006-06-03 05:46:00.000000000 -0400
+++ xf86-video-vesa-1.2.1/src/vesa.h	2006-09-19 15:25:03.000000000 -0400
@@ -116,9 +116,13 @@
     DGAModePtr pDGAMode;
     int nDGAMode;
     CloseScreenProcPtr CloseScreen;
+    CreateScreenResourcesProcPtr CreateScreenResources;
     OptionInfoPtr Options;
     IOADDRESS ioBase;
     Bool ModeSetClearScreen;
+    void *shadow;
+    ShadowUpdateProc update;
+    ShadowWindowProc window;
 } VESARec, *VESAPtr;