diff options
author | Luc Verhaegen <libv@skynet.be> | 2009-01-27 17:16:08 +0100 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-01-27 17:16:08 +0100 |
commit | 628c60ae244f2015de255d38d9896f7c961235bc (patch) | |
tree | 327cd2b3b8231ba4c88b7d24cb7f6671330221b7 | |
parent | f026c5d8c174814d42b19ddf3e3201e082c033b0 (diff) |
Options: Unify all acceleration options in AccelMethod.
Also fix up hwcursor usage and rotation support.
-rw-r--r-- | man/unichrome.man | 14 | ||||
-rw-r--r-- | src/via_driver.c | 267 | ||||
-rw-r--r-- | src/via_driver.h | 10 |
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; |