diff options
author | Luc Verhaegen <libv@skynet.be> | 2005-12-13 19:44:51 +0000 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2005-12-13 19:44:51 +0000 |
commit | f0720502ccd0b1f734bf89fcf25d068606e93b0c (patch) | |
tree | 5aeb589483a7c8b3d2dd98cb4fcc421c6505e1a5 | |
parent | c90b9ca5e12e5199a8a97059b5b86b03762fd34d (diff) |
[devel-cursor_failure_fix] pVia->CursorInfoRec was not-NULL even when the
Cursor init failed.
-rw-r--r-- | src/via_cursor.c | 185 | ||||
-rw-r--r-- | src/via_dga.c | 9 | ||||
-rw-r--r-- | src/via_driver.c | 24 | ||||
-rw-r--r-- | src/via_driver.h | 6 |
4 files changed, 119 insertions, 105 deletions
diff --git a/src/via_cursor.c b/src/via_cursor.c index d0b7d3e..a4fc4a7 100644 --- a/src/via_cursor.c +++ b/src/via_cursor.c @@ -36,81 +36,11 @@ #include "via_driver.h" -static void VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char *src); -static void VIASetCursorPosition(ScrnInfoPtr pScrn, int x, int y); -static void VIASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg); - -Bool -VIAHWCursorInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) -{ - VIAPtr pVia = VIAPTR(pScrn); - xf86CursorInfoPtr infoPtr; - - VIAFUNC(pScrn->scrnIndex); - - infoPtr = xf86CreateCursorInfoRec(); - if (!infoPtr) - return FALSE; - - pVia->CursorInfoRec = infoPtr; - - infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | - HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | - HARDWARE_CURSOR_INVERT_MASK | - HARDWARE_CURSOR_BIT_ORDER_MSBFIRST ; - - infoPtr->SetCursorColors = VIASetCursorColors; - infoPtr->SetCursorPosition = VIASetCursorPosition; - infoPtr->LoadCursorImage = VIALoadCursorImage; - infoPtr->HideCursor = VIAHideCursor; - infoPtr->ShowCursor = VIAShowCursor; - infoPtr->UseHWCursor = NULL; - - /* cursor is 2bit plane; 64*64*2/8 = 1024 */ - if (((pVia->FBFreeEnd - 1024) & ~0x3FF) >= pVia->FBFreeStart) { - infoPtr->MaxWidth = 64; - infoPtr->MaxHeight = 64; - infoPtr->Flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64; - - pVia->CursorSize = 1024; - - pVia->FBFreeEnd -= 1024; - pVia->FBFreeEnd &= ~0x3FF; - - pVia->CursorAddress = pVia->FBFreeEnd; - VIASETREG(VIA_REG_CURSOR_MODE, pVia->CursorAddress); - - ViaDebug(pScrn->scrnIndex, "%s: Using 64x64 HW Cursor.\n", __func__); - } else { - if (((pVia->FBFreeEnd - 256) & ~0xFF) < pVia->FBFreeStart) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Not enough FB room " - "available for HW Cursor.\n", __func__); - xf86DestroyCursorInfoRec(infoPtr); - return FALSE; - } - - infoPtr->MaxWidth = 32; - infoPtr->MaxHeight = 32; - infoPtr->Flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32; - - pVia->CursorSize = 256; - - pVia->FBFreeEnd -= 256; - pVia->FBFreeEnd &= ~0xFF; - - pVia->CursorAddress = pVia->FBFreeEnd; - VIASETREG(VIA_REG_CURSOR_MODE, pVia->CursorAddress | 0x2); - - ViaDebug(pScrn->scrnIndex, "%s: Using 32x32 HW Cursor.\n", __func__); - } - - return xf86InitCursor(pScreen, infoPtr); -} - - - -void -VIAShowCursor(ScrnInfoPtr pScrn) +/* + * + */ +static void +ViaCursorShow(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); CARD32 dwCursorMode; @@ -121,9 +51,11 @@ VIAShowCursor(ScrnInfoPtr pScrn) VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode | 0x01); } - -void -VIAHideCursor(ScrnInfoPtr pScrn) +/* + * + */ +static void +ViaCursorHide(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); CARD32 dwCursorMode; @@ -134,9 +66,11 @@ VIAHideCursor(ScrnInfoPtr pScrn) VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode & 0xFFFFFFFE); } - +/* + * + */ static void -VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char* src) +ViaCursorLoadImage(ScrnInfoPtr pScrn, unsigned char* src) { VIAPtr pVia = VIAPTR(pScrn); CARD32 dwCursorMode; @@ -155,8 +89,11 @@ VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char* src) VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode); } +/* + * + */ static void -VIASetCursorPosition(ScrnInfoPtr pScrn, int x, int y) +ViaCursorSetPosition(ScrnInfoPtr pScrn, int x, int y) { VIAPtr pVia = VIAPTR(pScrn); CARD8 xoff, yoff; @@ -189,9 +126,11 @@ VIASetCursorPosition(ScrnInfoPtr pScrn, int x, int y) VIASETREG(VIA_REG_CURSOR_MODE, dwCursorMode); } - +/* + * + */ static void -VIASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) +ViaCursorSetColors(ScrnInfoPtr pScrn, int bg, int fg) { VIAPtr pVia = VIAPTR(pScrn); @@ -203,12 +142,89 @@ VIASetCursorColors(ScrnInfoPtr pScrn, int bg, int fg) /* * */ +Bool +ViaCursorInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) +{ + VIAPtr pVia = VIAPTR(pScrn); + xf86CursorInfoPtr infoPtr; + + VIAFUNC(pScrn->scrnIndex); + + infoPtr = xf86CreateCursorInfoRec(); + if (!infoPtr) + return FALSE; + + infoPtr->Flags = HARDWARE_CURSOR_AND_SOURCE_WITH_MASK | + HARDWARE_CURSOR_TRUECOLOR_AT_8BPP | + HARDWARE_CURSOR_INVERT_MASK | + HARDWARE_CURSOR_BIT_ORDER_MSBFIRST ; + + infoPtr->SetCursorColors = ViaCursorSetColors; + infoPtr->SetCursorPosition = ViaCursorSetPosition; + infoPtr->LoadCursorImage = ViaCursorLoadImage; + infoPtr->HideCursor = ViaCursorHide; + infoPtr->ShowCursor = ViaCursorShow; + infoPtr->UseHWCursor = NULL; + + /* cursor is 2bit plane; 64*64*2/8 = 1024 */ + if (((pVia->FBFreeEnd - 1024) & ~0x3FF) >= pVia->FBFreeStart) { + infoPtr->MaxWidth = 64; + infoPtr->MaxHeight = 64; + infoPtr->Flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_64; + + pVia->CursorSize = 1024; + + pVia->FBFreeEnd -= 1024; + pVia->FBFreeEnd &= ~0x3FF; + + pVia->CursorAddress = pVia->FBFreeEnd; + VIASETREG(VIA_REG_CURSOR_MODE, pVia->CursorAddress); + + ViaDebug(pScrn->scrnIndex, "%s: Using 64x64 HW Cursor.\n", __func__); + } else { + if (((pVia->FBFreeEnd - 256) & ~0xFF) < pVia->FBFreeStart) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s: Not enough FB room " + "available for HW Cursor.\n", __func__); + xf86DestroyCursorInfoRec(infoPtr); + return FALSE; + } + + infoPtr->MaxWidth = 32; + infoPtr->MaxHeight = 32; + infoPtr->Flags |= HARDWARE_CURSOR_SOURCE_MASK_INTERLEAVE_32; + + pVia->CursorSize = 256; + + pVia->FBFreeEnd -= 256; + pVia->FBFreeEnd &= ~0xFF; + + pVia->CursorAddress = pVia->FBFreeEnd; + VIASETREG(VIA_REG_CURSOR_MODE, pVia->CursorAddress | 0x2); + + ViaDebug(pScrn->scrnIndex, "%s: Using 32x32 HW Cursor.\n", __func__); + } + + if (!xf86InitCursor(pScreen, infoPtr)) { + xf86DestroyCursorInfoRec(infoPtr); + return FALSE; + } else { + pVia->Cursor = infoPtr; + return TRUE; + } +} + +/* + * + */ void ViaCursorStore(ScrnInfoPtr pScrn) { VIAPtr pVia = VIAPTR(pScrn); VIAFUNC(pScrn->scrnIndex); + + if (!pVia->Cursor) + return; if (pVia->CursorImage) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "%s: stale image left.\n", __func__); @@ -232,6 +248,9 @@ ViaCursorRestore(ScrnInfoPtr pScrn) VIAFUNC(pScrn->scrnIndex); + if (!pVia->Cursor) + return; + if (pVia->CursorImage) { memcpy(pVia->FBBase + pVia->CursorAddress, pVia->CursorImage, pVia->CursorSize); VIASETREG(VIA_REG_CURSOR_FG, pVia->CursorFG); diff --git a/src/via_dga.c b/src/via_dga.c index 933a23a..50ca9af 100644 --- a/src/via_dga.c +++ b/src/via_dga.c @@ -180,8 +180,9 @@ VIADGASetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) pScrn->depth = pVia->DGAOldDepth; pScrn->SwitchMode(pScrn->scrnIndex, pScrn->currentMode, 0); - if (pVia->hwcursor) - VIAShowCursor(pScrn); + + if (pVia->Cursor) + pVia->Cursor->ShowCursor(pScrn); pVia->DGAactive = FALSE; } @@ -193,8 +194,8 @@ VIADGASetMode(ScrnInfoPtr pScrn, DGAModePtr pMode) pMode->bitsPerPixel, pMode->depth); #endif - if (pVia->hwcursor) - VIAHideCursor(pScrn); + if (pVia->Cursor) + pVia->Cursor->HideCursor(pScrn); if (!pVia->DGAactive) { /* save the old parameters */ pVia->DGAOldDisplayWidth = pScrn->displayWidth; diff --git a/src/via_driver.c b/src/via_driver.c index 36ae9ae..7aeaca0 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -373,6 +373,7 @@ VIAGetRec(ScrnInfoPtr pScrn) pVia->Outputs = NULL; + pVia->Cursor = NULL; pVia->CursorImage = NULL; return TRUE; @@ -1413,8 +1414,7 @@ VIAEnterVT(int scrnIndex, int flags) vgaHWUnlock(hwp); /* Patch for APM suspend resume, HWCursor has garbage */ - if (pVia->hwcursor) - ViaCursorRestore(pScrn); + ViaCursorRestore(pScrn); #ifdef XF86DRI if (pVia->directRenderingEnabled) { @@ -1460,8 +1460,7 @@ static void VIALeaveVT(int scrnIndex, int flags) if (pVia->VQEnable) ViaVQDisable(pScrn); - if (pVia->hwcursor) - ViaCursorStore(pScrn); + ViaCursorStore(pScrn); VIARestore(pScrn); @@ -1975,12 +1974,9 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) miDCInitialize(pScreen, xf86GetPointerScreenFuncs()); ViaDebug(scrnIndex, "- SW cursor set up\n"); - if (pVia->hwcursor) { - if (!VIAHWCursorInit(pScrn, pScreen)) { - xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + if (pVia->hwcursor && !ViaCursorInit(pScrn, pScreen)) + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Hardware cursor initialization failed\n"); - } - } if (pVia->shadowFB) ViaShadowFBInit(pScrn, pScreen); @@ -2151,8 +2147,8 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen) hwp->writeSeq(hwp, 0x1A, pVia->SavedReg.SR1A | 0x40); #endif - if (!pVia->IsSecondary) - VIAHideCursor(pScrn); + if (pVia->Cursor) + pVia->Cursor->HideCursor(pScrn); if (pVia->VQEnable) ViaVQDisable(pScrn); @@ -2165,9 +2161,9 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen) XAADestroyInfoRec(pVia->AccelInfoRec); pVia->AccelInfoRec = NULL; } - if (pVia->CursorInfoRec) { - xf86DestroyCursorInfoRec(pVia->CursorInfoRec); - pVia->CursorInfoRec = NULL; + if (pVia->Cursor) { + xf86DestroyCursorInfoRec(pVia->Cursor); + pVia->Cursor = NULL; } if (pVia->ShadowPtr) { xfree(pVia->ShadowPtr); diff --git a/src/via_driver.h b/src/via_driver.h index c0b175a..30e4645 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -246,7 +246,7 @@ typedef struct _VIA { CARD8 ActiveDevice; /* Option */ /* cursor */ - xf86CursorInfoPtr CursorInfoRec; + xf86CursorInfoPtr Cursor; int CursorAddress; int CursorSize; unsigned char *CursorImage; @@ -290,9 +290,7 @@ void VIAInitialize3DEngine(ScrnInfoPtr pScrn); #endif /* In via_cursor.c. */ -Bool VIAHWCursorInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); -void VIAShowCursor(ScrnInfoPtr pScrn); -void VIAHideCursor(ScrnInfoPtr pScrn); +Bool ViaCursorInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); void ViaCursorStore(ScrnInfoPtr pScrn); void ViaCursorRestore(ScrnInfoPtr pScrn); |