summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-01-27 17:16:08 +0100
committerLuc Verhaegen <libv@skynet.be>2009-01-27 17:16:08 +0100
commit628c60ae244f2015de255d38d9896f7c961235bc (patch)
tree327cd2b3b8231ba4c88b7d24cb7f6671330221b7
parentf026c5d8c174814d42b19ddf3e3201e082c033b0 (diff)
Options: Unify all acceleration options in AccelMethod.
Also fix up hwcursor usage and rotation support.
-rw-r--r--man/unichrome.man14
-rw-r--r--src/via_driver.c267
-rw-r--r--src/via_driver.h10
3 files changed, 167 insertions, 124 deletions
diff --git a/man/unichrome.man b/man/unichrome.man
index 5820289..178b889 100644
--- a/man/unichrome.man
+++ b/man/unichrome.man
@@ -52,18 +52,12 @@ Specify the active device combination. Any string containing \*qCRT\*q,
is to use everything that is detected. The driver tries to most ideally
mix and match outputs between CRTCs (heads).
.TP
-.BI "Option \*qNoAccel\*q \*q" boolean \*q
-Disable or enable acceleration. Default: acceleration is enabled.
-.TP
-.BI "Option \*qHWCursor\*q \*q" boolean \*q
-Disable or enable use of hardware cursors. The default is enabled.
-.TP
.BI "Option \*qSWCursor\*q \*q" boolean \*q
-Disable or enable the use of a software cursor. The default is disabled.
+Disable the hardware cursor and use software cursor rendering instead.
.TP
-.BI "Option \*qShadowFB\*q \*q" boolean \*q
-Use a shadow frame buffer. This is required when rotating the display,
-but otherwise defaults to disabled.
+.BI "Option \*qAccelMethod\*q \*q" string \*q
+Select any of \*qNone\*q, \*qShadowFB\*q or \*qXAA\*q as an Acceleration
+Method. The default is \*qXAA\*q.
.TP
.BI "Option \*qRotate\*q \*q" string \*q
Rotate the display either clockwise (\*qCW\*q) or counter clockwise (\*qCCW\*q).
diff --git a/src/via_driver.c b/src/via_driver.c
index 515ec0a..d54a214 100644
--- a/src/via_driver.c
+++ b/src/via_driver.c
@@ -181,14 +181,12 @@ typedef enum {
OPTION_PRINTSWOVREGS,
OPTION_I2CSCAN,
OPTION_SIMULTANEOUS,
- OPTION_NOACCEL,
+ OPTION_ACCELMETHOD,
OPTION_SWCURSOR,
- OPTION_HWCURSOR,
+ OPTION_ROTATE,
#ifdef _VIA_VIDEO_H_
OPTION_NOXV,
#endif
- OPTION_SHADOW_FB,
- OPTION_ROTATE,
OPTION_ACTIVEDEVICE,
OPTION_CRTC2SCALE,
OPTION_CRTC2HSCALE,
@@ -212,14 +210,12 @@ static OptionInfoRec VIAOptions[] =
{OPTION_I2CSCAN, "I2CScan", OPTV_BOOLEAN, {0}, FALSE},
/* Normal options */
{OPTION_SIMULTANEOUS, "Simultaneous", OPTV_BOOLEAN, {0}, FALSE},
- {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE},
- {OPTION_HWCURSOR, "HWCursor", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_ACCELMETHOD, "AccelMethod", OPTV_ANYSTR, {0}, FALSE},
{OPTION_SWCURSOR, "SWCursor", OPTV_BOOLEAN, {0}, FALSE},
+ {OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE},
#ifdef _VIA_VIDEO_H_
{OPTION_NOXV, "NoXv", OPTV_BOOLEAN, {0}, FALSE},
#endif
- {OPTION_SHADOW_FB, "ShadowFB", OPTV_BOOLEAN, {0}, FALSE},
- {OPTION_ROTATE, "Rotate", OPTV_ANYSTR, {0}, FALSE},
{OPTION_ACTIVEDEVICE, "ActiveDevice", OPTV_ANYSTR, {0}, FALSE},
{OPTION_CRTC2SCALE, "CRTC2Scale", OPTV_ANYSTR, {0}, FALSE},
{OPTION_CRTC2HSCALE, "CRTC2HScale", OPTV_ANYSTR, {0}, FALSE},
@@ -704,6 +700,55 @@ VIAProbe(DriverPtr drv, int flags)
#endif
/*
+ *
+ */
+static char *
+ViaAccelMethodPrint(enum VIAAccelMethod AccelMethod)
+{
+ switch (AccelMethod) {
+ case VIA_ACCEL_NONE:
+ return "None";
+ case VIA_ACCEL_SHADOWFB:
+ return "ShadowFB";
+ case VIA_ACCEL_XAA:
+ return "XAA";
+ case VIA_ACCEL_EXA:
+ return "EXA";
+ default:
+ return "Unknown";
+ }
+}
+
+/*
+ *
+ */
+static void
+ViaOptionAccelMethodHandle(VIAPtr pVia, OptionInfoRec *VIAOptions)
+{
+ char *AccelMethod;
+
+ AccelMethod = xf86GetOptValString(VIAOptions, OPTION_ACCELMETHOD);
+ if (!AccelMethod)
+ pVia->AccelMethod = VIA_ACCEL_XAA;
+ else {
+ if (!strcasecmp(AccelMethod, "none"))
+ pVia->AccelMethod = VIA_ACCEL_NONE;
+ else if (!strcasecmp(AccelMethod, "shadowfb"))
+ pVia->AccelMethod = VIA_ACCEL_SHADOWFB;
+ else if (!strcasecmp(AccelMethod, "xaa"))
+ pVia->AccelMethod = VIA_ACCEL_XAA;
+ else {
+ xf86DrvMsg(pVia->scrnIndex, X_WARNING, "Unknown AccelMethod \"%s\".\n",
+ AccelMethod);
+ pVia->AccelMethod = VIA_ACCEL_XAA;
+ }
+ }
+
+ xf86DrvMsg(pVia->scrnIndex, X_CONFIG, "Attempting to use AccelMethod \"%s\"\n",
+ ViaAccelMethodPrint(pVia->AccelMethod));
+}
+
+/*
* Concentrate all VIA scratch area stuff in one struct.
* Or, keep all nastyness close together and far, far away.
*
@@ -939,7 +984,6 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
{
EntityInfoPtr pEnt;
VIAPtr pVia;
- MessageType from = X_DEFAULT;
char *s = NULL;
#ifndef USE_FB
char *mod = NULL;
@@ -1120,71 +1164,96 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
"Option: drixinerama ignored, no DRI support compiled into driver.\n");
#endif
- if (xf86IsOptionSet(VIAOptions, OPTION_SHADOW_FB)) {
- pVia->shadowFB = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Option: ShadowFB %s.\n",
- pVia->shadowFB ? "enabled" : "disabled");
- }
- else {
- pVia->shadowFB = FALSE;
- }
+
+ ViaOptionAccelMethodHandle(pVia, VIAOptions);
+
+ if (xf86ReturnOptValBool(VIAOptions, OPTION_SWCURSOR, FALSE)) {
+ pVia->hwcursor = FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Disabling hardware cursor.\n");
+ } else
+ pVia->hwcursor = TRUE;
if ((s = xf86GetOptValString(VIAOptions, OPTION_ROTATE))) {
if (!xf86NameCmp(s, "CW")) {
- /* accel is disabled below for shadowFB */
- pVia->shadowFB = TRUE;
- pVia->rotate = 1;
- pVia->hwcursor = FALSE;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Rotating screen clockwise - acceleration disabled\n");
- }
- else if(!xf86NameCmp(s, "CCW")) {
- pVia->shadowFB = TRUE;
- pVia->rotate = -1;
- pVia->hwcursor = FALSE;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "Rotating screen"
- "counter clockwise - acceleration disabled\n");
- }
- else {
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, "\"%s\" is not a valid"
- "value for Option \"Rotate\"\n", s);
- xf86DrvMsg(pScrn->scrnIndex, X_INFO,
- "Valid options are \"CW\" or \"CCW\"\n");
- }
- }
+ pVia->rotate = 1;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Rotation selected: Clockwise.\n");
+ } else if (!xf86NameCmp(s, "CCW")) {
+ pVia->rotate = -1;
+ xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
+ "Rotation selected: Counter Clockwise.\n");
+ } else {
+ xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
+ "Unknown Rotate option: \"%s\"\n", s);
+ pVia->rotate = 0;
+ }
+ } else
+ pVia->rotate = 0;
- if (xf86ReturnOptValBool(VIAOptions, OPTION_NOACCEL, FALSE)) {
- pVia->NoAccel = TRUE;
- xf86DrvMsg(pScrn->scrnIndex, X_CONFIG,
- "Option: NoAccel -Acceleration Disabled\n");
- }
- else {
- pVia->NoAccel = FALSE;
+ if (pVia->rotate) {
+ switch (pVia->AccelMethod) {
+ case VIA_ACCEL_XAA:
+ case VIA_ACCEL_EXA:
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Rotation selected: Disabling \"%s\" Acceleration.\n",
+ ViaAccelMethodPrint(pVia->AccelMethod));
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using ShadowFB instead.\n");
+ pVia->AccelMethod = VIA_ACCEL_SHADOWFB;
+ break;
+ case VIA_ACCEL_SHADOWFB:
+ break;
+ case VIA_ACCEL_NONE:
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "\"%s\" Acceleration selected: Disabling rotation.\n",
+ ViaAccelMethodPrint(pVia->AccelMethod));
+
+ pVia->rotate = 0;
+ break;
+ default:
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+ "Rotation selected: Unhandled AccelMethod %d.\n",
+ pVia->AccelMethod);
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Using ShadowFB instead.\n");
+ pVia->AccelMethod = VIA_ACCEL_SHADOWFB;
+ break;
+ }
}
- if (pVia->shadowFB && !pVia->NoAccel) {
- xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
- "HW acceleration not supported with \"shadowFB\".\n");
- pVia->NoAccel = TRUE;
+ if (pVia->rotate && pVia->hwcursor) {
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO,
+ "Rotation selected: Disabling Hardware Cursor\n");
+ pVia->hwcursor = FALSE;
}
- /*
- * The SWCursor setting takes priority over HWCursor. The default
- * if neither is specified is HW.
- */
-
- from = X_DEFAULT;
- pVia->hwcursor = pVia->shadowFB ? FALSE : TRUE;
- if (xf86GetOptValBool(VIAOptions, OPTION_HWCURSOR, &pVia->hwcursor))
- from = X_CONFIG;
+ if (pVia->hwcursor) {
+ if (xf86LoadSubModule(pScrn, "ramdac"))
+ xf86LoaderReqSymLists(ramdacSymbols, NULL);
+ else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to load ramdac module.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Falling back to Software cursor.\n");
+ pVia->hwcursor = FALSE;
+ }
+ }
- if (xf86ReturnOptValBool(VIAOptions, OPTION_SWCURSOR, FALSE)) {
- pVia->hwcursor = FALSE;
- from = X_CONFIG;
+ if (pVia->AccelMethod == VIA_ACCEL_XAA) {
+ if (xf86LoadSubModule(pScrn, "xaa"))
+ xf86LoaderReqSymLists(xaaSymbols, NULL);
+ else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to load xaa module.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Falling back to ShadowFB.\n");
+ pVia->AccelMethod = VIA_ACCEL_SHADOWFB;
+ }
}
- xf86DrvMsg(pScrn->scrnIndex, from, "Using %s cursor\n",
- pVia->hwcursor ? "HW" : "SW");
+ if (pVia->AccelMethod == VIA_ACCEL_SHADOWFB) {
+ if (xf86LoadSubModule(pScrn, "shadowfb"))
+ xf86LoaderReqSymLists(shadowSymbols, NULL);
+ else {
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to load shadowfb module.\n");
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Disabling all forms of acceleration.\n");
+ pVia->AccelMethod = VIA_ACCEL_NONE;
+ }
+ }
#ifdef _VIA_VIDEO_H_
if (xf86ReturnOptValBool(VIAOptions, OPTION_NOXV, FALSE)) {
@@ -1456,30 +1525,6 @@ VIAPreInit(ScrnInfoPtr pScrn, int flags)
xf86LoaderReqSymbols(reqSym, NULL);
#endif
- if (!pVia->NoAccel) {
- if(!xf86LoadSubModule(pScrn, "xaa")) {
- VIAFreeRec(pScrn);
- return FALSE;
- }
- xf86LoaderReqSymLists(xaaSymbols, NULL);
- }
-
- if (pVia->hwcursor) {
- if (!xf86LoadSubModule(pScrn, "ramdac")) {
- VIAFreeRec(pScrn);
- return FALSE;
- }
- xf86LoaderReqSymLists(ramdacSymbols, NULL);
- }
-
- if (pVia->shadowFB) {
- if (!xf86LoadSubModule(pScrn, "shadowfb")) {
- VIAFreeRec(pScrn);
- return FALSE;
- }
- xf86LoaderReqSymLists(shadowSymbols, NULL);
- }
-
/* set dpi and windowsize ourselves.
* need to dig this out properly: what gets influenced here?
*/
@@ -2200,8 +2245,8 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
/* Take 3D engine out of reset, also needed for VQ */
ViaSeqMask(hwp, 0x1A, 0x00, 0x40);
- if (!pVia->NoAccel)
- VIAInitAccel(pScrn, pScreen);
+ if (pVia->AccelMethod == VIA_ACCEL_XAA)
+ VIAInitAccel(pScrn, pScreen);
#ifdef X_USE_LINEARFB
else {
@@ -2240,7 +2285,7 @@ VIAScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv)
xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
"Hardware cursor initialization failed\n");
- if (pVia->shadowFB)
+ if (pVia->AccelMethod == VIA_ACCEL_SHADOWFB)
ViaShadowFBInit(pScrn, pScreen);
if (!miCreateDefColormap(pScreen))
@@ -2308,25 +2353,23 @@ VIAInternalScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen)
VIAFUNC(pScrn->scrnIndex);
- displayWidth = pScrn->displayWidth;
-
if (pVia->rotate) {
- height = pScrn->virtualX;
- width = pScrn->virtualY;
+ height = pScrn->virtualX;
+ width = pScrn->virtualY;
} else {
- width = pScrn->virtualX;
- height = pScrn->virtualY;
+ width = pScrn->virtualX;
+ height = pScrn->virtualY;
}
- if (pVia->shadowFB) {
- pVia->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width);
- pVia->ShadowPtr = xalloc(pVia->ShadowPitch * height);
- displayWidth = pVia->ShadowPitch / (pScrn->bitsPerPixel >> 3);
- FBStart = pVia->ShadowPtr;
- }
- else {
- pVia->ShadowPtr = NULL;
- FBStart = pVia->FBBase;
+ if (pVia->AccelMethod == VIA_ACCEL_SHADOWFB) {
+ pVia->ShadowPitch = BitmapBytePad(pScrn->bitsPerPixel * width);
+ pVia->ShadowPtr = xalloc(pVia->ShadowPitch * height);
+ displayWidth = pVia->ShadowPitch / (pScrn->bitsPerPixel >> 3);
+ FBStart = pVia->ShadowPtr;
+ } else {
+ pVia->ShadowPtr = NULL;
+ displayWidth = pScrn->displayWidth;
+ FBStart = pVia->FBBase;
}
#ifdef USE_FB
@@ -2336,18 +2379,18 @@ VIAInternalScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen)
#else
switch (pScrn->bitsPerPixel) {
case 8:
- return cfbScreenInit(pScreen, FBStart, width, height, pScrn->xDpi,
+ return cfbScreenInit(pScreen, FBStart, width, height, pScrn->xDpi,
pScrn->yDpi, displayWidth);
case 16:
- return cfb16ScreenInit(Screen, FBStart, width, height, pScrn->xDpi,
+ return cfb16ScreenInit(Screen, FBStart, width, height, pScrn->xDpi,
pScrn->yDpi, displayWidth);
case 32:
- return cfb32ScreenInit(pScreen, FBStart, width, height, pScrn->xDpi,
+ return cfb32ScreenInit(pScreen, FBStart, width, height, pScrn->xDpi,
pScrn->yDpi, displayWidth);
default:
- xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Internal error: invalid bpp (%d) in "
- "VIAInternalScreenInit\n", pScrn->bitsPerPixel);
- return FALSE;
+ xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Internal error: invalid bpp (%d) in "
+ "%s\n", pScrn->bitsPerPixel, __func__);
+ return FALSE;
}
#endif
}
@@ -2371,7 +2414,7 @@ VIAWriteMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
ViaModeSet(pScrn, mode);
/* Enable the graphics engine. */
- if (!pVia->NoAccel)
+ if (pVia->AccelMethod == VIA_ACCEL_XAA)
VIAInitialize2DEngine(pScrn);
#ifdef HAVE_DRI
diff --git a/src/via_driver.h b/src/via_driver.h
index 53c35b6..8166cc8 100644
--- a/src/via_driver.h
+++ b/src/via_driver.h
@@ -109,6 +109,13 @@ struct ViaScratch {
CARD8 TVStandard;
};
+enum VIAAccelMethod {
+ VIA_ACCEL_NONE,
+ VIA_ACCEL_SHADOWFB,
+ VIA_ACCEL_XAA,
+ VIA_ACCEL_EXA /* not yet */
+};
+
typedef struct {
CARD8 SR08, SR0A, SR0F;
@@ -182,8 +189,7 @@ typedef struct _VIA {
/* Here are all the Options */
Bool VQEnable;
Bool hwcursor;
- Bool NoAccel;
- Bool shadowFB;
+ enum VIAAccelMethod AccelMethod;
int rotate;
CloseScreenProcPtr CloseScreen;