summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKevin E Martin <kem@kem.org>2006-05-18 21:15:32 +0000
committerKevin E Martin <kem@kem.org>2006-05-18 21:15:32 +0000
commitc7b9e1a3275b98ba74eacb67e7dc86ae502a4a51 (patch)
tree18fb8071cc10c6e2bd0c752a3fffb44786eb9500 /src
parentfe1fa4c016202e7e07f4e3143b6cedb7f9e82f9b (diff)
downloadxorg-driver-xf86-video-fbdev-c7b9e1a3275b98ba74eacb67e7dc86ae502a4a51.tar.gz
Fix ShadowFB support to work with recent miext/shadow changes from bug
#5460 (Kevin Martin), and apply fix for miext/shadow crasher https://bugs.freedesktop.org/show_bug.cgi?id=6940 (Kristian Hoegsberg).
Diffstat (limited to 'src')
-rw-r--r--src/fbdev.c55
1 files changed, 32 insertions, 23 deletions
diff --git a/src/fbdev.c b/src/fbdev.c
index b3bd75f..4b3ac3f 100644
--- a/src/fbdev.c
+++ b/src/fbdev.c
@@ -141,7 +141,6 @@ static const char *fbSymbols[] = {
static const char *shadowSymbols[] = {
"shadowAdd",
- "shadowAlloc",
"shadowInit",
"shadowSetup",
"shadowUpdatePacked",
@@ -236,7 +235,6 @@ typedef struct {
unsigned char* fbmem;
int fboff;
int lineLength;
- unsigned char* shadowmem;
int rotate;
Bool shadowFB;
CloseScreenProcPtr CloseScreen;
@@ -617,6 +615,36 @@ FBDevPreInit(ScrnInfoPtr pScrn, int flags)
}
static Bool
+FBDevShadowInit(ScreenPtr pScreen, FBDevPtr fPtr)
+{
+ PixmapPtr pPixmap;
+ ShadowUpdateProc update;
+ ShadowWindowProc window;
+
+ pPixmap = pScreen->CreatePixmap(pScreen, pScreen->width, pScreen->height,
+ pScreen->rootDepth);
+ if (!pPixmap)
+ return FALSE;
+
+ if (!shadowSetup(pScreen)) {
+ pScreen->DestroyPixmap(pPixmap);
+ return FALSE;
+ }
+
+ update = fPtr->rotate ? shadowUpdateRotatePackedWeak()
+ : shadowUpdatePackedWeak();
+
+ if (!shadowAdd(pScreen, pPixmap, update, FBDevWindowLinear,
+ fPtr->rotate, NULL)) {
+ pScreen->DestroyPixmap(pPixmap);
+ return FALSE;
+ } else {
+ return TRUE;
+ }
+}
+
+
+static Bool
FBDevScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
@@ -692,20 +720,7 @@ FBDevScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
pScrn->PointerMoved = FBDevPointerMoved;
}
- /* shadowfb */
- if (fPtr->shadowFB) {
- if ((fPtr->shadowmem = shadowAlloc(width, height,
- pScrn->bitsPerPixel)) == NULL) {
- xf86DrvMsg(scrnIndex,X_ERROR,
- "allocation of shadow framebuffer memory failed\n");
- return FALSE;
- }
-
- fPtr->fbstart = fPtr->shadowmem;
- } else {
- fPtr->shadowmem = NULL;
- fPtr->fbstart = fPtr->fbmem + fPtr->fboff;
- }
+ fPtr->fbstart = fPtr->fbmem + fPtr->fboff;
switch ((type = fbdevHWGetType(pScrn)))
{
@@ -803,11 +818,7 @@ FBDevScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
"Render extension initialisation failed\n");
- if (fPtr->shadowFB &&
- (!shadowSetup(pScreen) || !shadowAdd(pScreen, NULL,
- fPtr->rotate ? shadowUpdateRotatePackedWeak()
- : shadowUpdatePackedWeak(),
- FBDevWindowLinear, fPtr->rotate, NULL)) ) {
+ if (fPtr->shadowFB && !FBDevShadowInit(pScreen, fPtr)) {
xf86DrvMsg(scrnIndex, X_ERROR,
"shadow framebuffer initialization failed\n");
return FALSE;
@@ -910,8 +921,6 @@ FBDevCloseScreen(int scrnIndex, ScreenPtr pScreen)
fbdevHWRestore(pScrn);
fbdevHWUnmapVidmem(pScrn);
- if (fPtr->shadowmem)
- xfree(fPtr->shadowmem);
if (fPtr->pDGAMode) {
xfree(fPtr->pDGAMode);
fPtr->pDGAMode = NULL;