summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2005-12-13 19:44:51 +0000
committerLuc Verhaegen <libv@skynet.be>2005-12-13 19:44:51 +0000
commitf0720502ccd0b1f734bf89fcf25d068606e93b0c (patch)
tree5aeb589483a7c8b3d2dd98cb4fcc421c6505e1a5
parentc90b9ca5e12e5199a8a97059b5b86b03762fd34d (diff)
[devel-cursor_failure_fix] pVia->CursorInfoRec was not-NULL even when the
Cursor init failed.
-rw-r--r--src/via_cursor.c185
-rw-r--r--src/via_dga.c9
-rw-r--r--src/via_driver.c24
-rw-r--r--src/via_driver.h6
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);