diff options
author | Alan Hourihane <alanh@fairlite.demon.co.uk> | 2005-01-12 17:14:46 +0000 |
---|---|---|
committer | Alan Hourihane <alanh@fairlite.demon.co.uk> | 2005-01-12 17:14:46 +0000 |
commit | c45015ce852c6e8718fed7b33d5d3990589b7ec0 (patch) | |
tree | 7951d4feeafd0983dfeeebf2cd321de71fd0aef0 | |
parent | fbe54d6ee7c1e95b98b9cae1a4deaa5605c2c2c1 (diff) |
xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.c
xc/programs/Xserver/hw/xfree86/drivers/via/via_driver.h
xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.c
xc/programs/Xserver/hw/xfree86/drivers/via/via_dri.h
xc/programs/Xserver/hw/xfree86/drivers/via/via_memcpy.c
xc/programs/Xserver/hw/xfree86/drivers/via/via_cursor.c
xc/programs/Xserver/hw/xfree86/drivers/via/via_accel.c Import some changes
from the Unichrome project.
- Fixes 2D acceleration problems
- Adds AGP DMA
-rw-r--r-- | src/via_accel.c | 131 | ||||
-rw-r--r-- | src/via_cursor.c | 2 | ||||
-rw-r--r-- | src/via_dri.c | 139 | ||||
-rw-r--r-- | src/via_dri.h | 4 | ||||
-rw-r--r-- | src/via_driver.c | 141 | ||||
-rw-r--r-- | src/via_driver.h | 4 | ||||
-rw-r--r-- | src/via_memcpy.c | 4 |
7 files changed, 220 insertions, 205 deletions
diff --git a/src/via_accel.c b/src/via_accel.c index 19edb99..6125335 100644 --- a/src/via_accel.c +++ b/src/via_accel.c @@ -300,6 +300,7 @@ VIAInitialize2DEngine(ScrnInfoPtr pScrn) break; case 32: dwGEMode |= VIA_GEM_32bpp; + break; default: dwGEMode |= VIA_GEM_8bpp; break; @@ -357,7 +358,6 @@ static void dispatchCBuffer(VIAPtr pVia, ViaCBuffer *buf) static void dispatchCBufferAGP(VIAPtr pVia, ViaCBuffer *buf) { -#ifdef ENABLE_AGP_RINGBUF #ifdef XF86DRI DRIInfoPtr pDRIInfo = pVia->pDRIInfo; VIADRIPtr pVIADRI = pDRIInfo->devPrivate; @@ -365,20 +365,21 @@ static void dispatchCBufferAGP(VIAPtr pVia, ViaCBuffer *buf) b.buf = (char *)(buf->buffer); b.size = buf->curPos*sizeof(CARD32); - - if (pVia->directRenderingEnabled && pVIADRI->ringBufActive) { - if (drmCommandWrite(pVia->drmFD,DRM_VIA_CMDBUFFER,&b,sizeof(b))) { + + if (pVia->agpEnable && pVia->dma2d) { + if (pVia->directRenderingEnabled && pVIADRI->ringBufActive) { + if (drmCommandWrite(pVia->drmFD,DRM_VIA_CMDBUFFER,&b,sizeof(b))) { - /* - * No success using AGP. Try PCI instead. - */ + /* + * No success using AGP. Try PCI instead. + */ - dispatchCBuffer(pVia,buf); + dispatchCBuffer(pVia,buf); + } + return; } - return; } #endif -#endif /* * No AGP ringbuffer or no DRI. */ @@ -469,7 +470,7 @@ VIAInitAccel(ScreenPtr pScreen) VIASubsequentMono8x8PatternFillRect; xaaptr->Mono8x8PatternFillFlags = NO_PLANEMASK | HARDWARE_PATTERN_PROGRAMMED_BITS | - ROP_NEEDS_SOURCE | + HARDWARE_PATTERN_PROGRAMMED_ORIGIN | BIT_ORDER_IN_BYTE_MSBFIRST | 0; @@ -480,7 +481,7 @@ VIAInitAccel(ScreenPtr pScreen) xaaptr->Color8x8PatternFillFlags = NO_PLANEMASK | NO_TRANSPARENCY | HARDWARE_PATTERN_PROGRAMMED_BITS | - ROP_NEEDS_SOURCE | + HARDWARE_PATTERN_PROGRAMMED_ORIGIN | 0; /*=* This function is only used in drawing check box when use RedHat 7.2 @@ -593,15 +594,26 @@ VIAInitAccel(ScreenPtr pScreen) return XAAInit(pScreen, xaaptr); } - - -/* The sync function for the GE */ -void VIAAccelSync(ScrnInfoPtr pScrn) +/* + * The sync function for the GE + */ +void +VIAAccelSync(ScrnInfoPtr pScrn) { - ViaWaitIdle(pScrn); + VIAPtr pVia = VIAPTR(pScrn); + int loop = 0; + + mem_barrier(); + + while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && (loop++ < MAXLOOP)) + ; + + while ((VIAGETREG(VIA_REG_STATUS) & + (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && + (loop++ < MAXLOOP)) + ; } - /* These are the ScreenToScreen bitblt functions. We support all ROPs, all * directions. * @@ -644,7 +656,6 @@ VIASetupForScreenToScreenCopy( } } - static void VIASubsequentScreenToScreenCopy( ScrnInfoPtr pScrn, @@ -658,10 +669,33 @@ VIASubsequentScreenToScreenCopy( VIAPtr pVia = VIAPTR(pScrn); ViaCBuffer *buf = &pVia->cBuf; ViaTwodContext *tdc = &pVia->td; + CARD32 srcBase, dstBase; if (!w || !h) return; + srcBase = y1*pVia->Bpl + x1*pVia->Bpp; + dstBase = y2*pVia->Bpl + x2*pVia->Bpp; + + x1 = (srcBase & 31); + x2 = (dstBase & 31); + + switch (pScrn->bitsPerPixel) { + case 16: + x1 >>= 1; + x2 >>= 1; + break; + case 32: + x1 >>= 2; + x2 >>= 2; + break; + default: + break; + } + + y1 = 0; + y2 = 0; + if (pVia->SavedCmd & VIA_GEC_DECX) { x1 += (w - 1); x2 += (w - 1); @@ -673,14 +707,12 @@ VIASubsequentScreenToScreenCopy( } COND_CLEAR_CBUFFER( buf, pVia); - CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); + CBUFFER(buf,VIA_REG_GEMODE, tdc->mode ); /* Set Src and Dst base address and pitch, pitch is qword */ - CBUFFER(buf,VIA_REG_SRCBASE, 0x0); - CBUFFER(buf,VIA_REG_DSTBASE, 0x0); + CBUFFER(buf,VIA_REG_SRCBASE, (srcBase & ~31) >> 3); + CBUFFER(buf,VIA_REG_DSTBASE, (dstBase & ~31) >> 3); CBUFFER(buf,VIA_REG_PITCH, VIA_PITCH_ENABLE | - ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | - (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); - + (pVia->Bpl >> 3) | ((pVia->Bpl >> 3) << 16)); CBUFFER(buf,VIA_REG_SRCPOS, ((y1 << 16) | x1)); CBUFFER(buf,VIA_REG_DSTPOS, ((y2 << 16) | x2)); CBUFFER(buf,VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); @@ -803,7 +835,7 @@ VIASubsequentMono8x8PatternFillRect( if (!w || !h) return; - dwPatOffset = (((patOffy + y) & 0x7) << 29) | (((patOffx + x) & 0x7) << 26); + dwPatOffset = ((patOffy & 0x7) << 29) | ((patOffx & 0x7) << 26); COND_CLEAR_CBUFFER( buf, pVia); CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); @@ -953,7 +985,6 @@ VIASubsequentScanlineCPUToScreenColorExpandFill( } - static void VIASetupForScreenToScreenColorExpand( ScrnInfoPtr pScrn, @@ -965,7 +996,6 @@ VIASetupForScreenToScreenColorExpand( VIAPtr pVia = VIAPTR(pScrn); int cmd; ViaCBuffer *buf = &pVia->cBuf; - ViaTwodContext *tdc = &pVia->td; cmd = VIA_GEC_BLT | VIA_GEC_SRC_MONO | (XAAGetCopyROP(rop) << 24); @@ -979,9 +1009,7 @@ VIASetupForScreenToScreenColorExpand( /* Disable Transparent Bitblt */ CLEAR_CBUFFER( buf, pVia); - CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); CBUFFER(buf,VIA_REG_KEYCONTROL, 0x0); - dispatchCBufferAGP(pVia, buf); } @@ -999,34 +1027,48 @@ VIASubsequentScreenToScreenColorExpand( VIAPtr pVia = VIAPTR(pScrn); ViaCBuffer *buf = &pVia->cBuf; ViaTwodContext *tdc = &pVia->td; + CARD32 srcBase,dstBase; + + srcBase = srcy*pVia->Bpl + srcx*pVia->Bpp; + dstBase = y*pVia->Bpl + x*pVia->Bpp; + + x = (dstBase & 31); + srcx = srcBase & 7; + + switch (pScrn->bitsPerPixel) { + case 16: + x >>= 1; + break; + case 32: + x >>= 2; + break; + default: + break; + } + + srcy = 0; + y = 0; /* Set Src and Dst base address and pitch, pitch is qword */ COND_CLEAR_CBUFFER( buf, pVia); CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); - CBUFFER(buf,VIA_REG_SRCBASE, 0x0); - CBUFFER(buf,VIA_REG_DSTBASE, 0x0); + CBUFFER(buf,VIA_REG_KEYCONTROL, 0x0); + CBUFFER(buf,VIA_REG_SRCBASE, (srcBase & ~7) >> 3); + CBUFFER(buf,VIA_REG_DSTBASE, (dstBase & ~31) >> 3); CBUFFER(buf,VIA_REG_PITCH, VIA_PITCH_ENABLE | ((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) | (((pScrn->displayWidth * pScrn->bitsPerPixel >> 3) >> 3) << 16)); - - CBUFFER(buf,VIA_REG_SRCBASE, ((((srcy * pScrn->displayWidth) + srcx) * - (pScrn->bitsPerPixel >> 3)) >> 3)); - srcy = 0; - srcx = 0; - - CBUFFER(buf,VIA_REG_SRCPOS, ((srcy << 16) | - (srcx * pScrn->bitsPerPixel + offset))); + CBUFFER(buf,VIA_REG_SRCPOS, (srcx << 6) | offset); CBUFFER(buf,VIA_REG_DSTPOS, ((y << 16) | x)); CBUFFER(buf,VIA_REG_DIMENSION, (((h - 1) << 16) | (w - 1))); CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor); CBUFFER(buf,VIA_REG_BGCOLOR, pVia->SavedBgColor); CBUFFER(buf,VIA_REG_GECMD, pVia->SavedCmd); - CBUFFER(buf,VIA_REG_SRCBASE, 0x0); - dispatchCBuffer(pVia, buf); - + dispatchCBufferAGP(pVia, buf); } + static void VIASetupForImageWrite( ScrnInfoPtr pScrn, @@ -1141,6 +1183,7 @@ VIASubsequentSolidTwoPointLine( COND_CLEAR_CBUFFER( buf, pVia); CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); + CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor); cmd = pVia->SavedCmd | VIA_GEC_LINE; dx = x2 - x1; @@ -1204,6 +1247,7 @@ VIASubsequentSolidHorVertLine( /* Set Src and Dst base address and pitch, pitch is qword */ COND_CLEAR_CBUFFER( buf, pVia); CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); + CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor); CBUFFER(buf,VIA_REG_SRCBASE, 0x0); CBUFFER(buf,VIA_REG_DSTBASE, 0x0); CBUFFER(buf,VIA_REG_PITCH, VIA_PITCH_ENABLE | @@ -1284,6 +1328,7 @@ VIASubsequentDashedTwoPointLine( COND_CLEAR_CBUFFER( buf, pVia); CBUFFER(buf,VIA_REG_GEMODE, tdc->mode); + CBUFFER(buf,VIA_REG_FGCOLOR, pVia->SavedFgColor); cmd = pVia->SavedCmd; dx = x2 - x1; diff --git a/src/via_cursor.c b/src/via_cursor.c index f141f6e..a303599 100644 --- a/src/via_cursor.c +++ b/src/via_cursor.c @@ -114,7 +114,7 @@ VIALoadCursorImage(ScrnInfoPtr pScrn, unsigned char* src) VIAPtr pVia = VIAPTR(pScrn); CARD32 dwCursorMode; - ViaWaitIdle(pScrn); + VIAAccelSync(pScrn); dwCursorMode = VIAGETREG(VIA_REG_CURSOR_MODE); diff --git a/src/via_dri.c b/src/via_dri.c index bbecc0a..f66f63b 100644 --- a/src/via_dri.c +++ b/src/via_dri.c @@ -116,76 +116,80 @@ static void VIADRIIrqExit( ScrnInfoPtr pScrn , VIADRIPtr pVIADRI) { } } -#ifdef ENABLE_AGP_RINGBUF - -static void VIADRIRingBufferCleanup(ScreenPtr pScreen, VIAPtr pVia) +void +VIADRIRingBufferCleanup(ScrnInfoPtr pScrn) { - DRIInfoPtr pDRIInfo = pVia->pDRIInfo; - VIADRIPtr pVIADRI = pDRIInfo->devPrivate; - drmViaDmaInit ringBufInit; + VIAPtr pVia = VIAPTR(pScrn); + VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; if (pVIADRI->ringBufActive) { - xf86DrvMsg(pScreen->myNum, X_INFO, + drmViaDmaInit ringBufInit; + + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "[drm] Cleaning up DMA ring-buffer.\n"); ringBufInit.func = VIA_CLEANUP_DMA; if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit, sizeof(ringBufInit))) { - xf86DrvMsg(pScreen->myNum, X_WARNING, + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "[drm] Failed to clean up DMA ring-buffer: %d\n", errno); } pVIADRI->ringBufActive = 0; } } -static Bool VIADRIRingBufferInit(ScreenPtr pScreen, VIAPtr pVia) +Bool +VIADRIRingBufferInit(ScrnInfoPtr pScrn) { - DRIInfoPtr pDRIInfo = pVia->pDRIInfo; - VIADRIPtr pVIADRI = pDRIInfo->devPrivate; - drmViaDmaInit ringBufInit; - drmVersionPtr drmVer; + VIAPtr pVia = VIAPTR(pScrn); + VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; - pVIADRI->ringBufActive = 0; + if (pVIADRI->ringBufActive) + return TRUE; - if (NULL == (drmVer = drmGetVersion(pVia->drmFD))) { - return FALSE; - } + if (pVia->agpEnable) { + drmViaDmaInit ringBufInit; + drmVersionPtr drmVer; - if (((drmVer->version_major <= 1) && (drmVer->version_minor <= 3))) { - return FALSE; - } + if (NULL == (drmVer = drmGetVersion(pVia->drmFD))) { + return FALSE; + } - /* - * Info frome code-snippet on DRI-DEVEL list; Erdi Chen. - */ + if (((drmVer->version_major <= 1) && (drmVer->version_minor <= 3))) { + return FALSE; + } - switch (pVia->ChipId) { - case PCI_CHIP_VT3259: - pVIADRI->reg_pause_addr = 0x40c; - break; - default: - pVIADRI->reg_pause_addr = 0x418; - break; - } + /* + * Info frome code-snippet on DRI-DEVEL list; Erdi Chen. + */ + + switch (pVia->ChipId) { + case PCI_CHIP_VT3259: + pVIADRI->reg_pause_addr = 0x40c; + break; + default: + pVIADRI->reg_pause_addr = 0x418; + break; + } - ringBufInit.offset = pVia->agpSize; - ringBufInit.size = AGP_CMDBUF_SIZE; - ringBufInit.reg_pause_addr = pVIADRI->reg_pause_addr; - ringBufInit.func = VIA_INIT_DMA; - if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit, - sizeof(ringBufInit))) { - xf86DrvMsg(pScreen->myNum, X_ERROR, - "[drm] Failed to initialize DMA ring-buffer: %d\n", errno); - return FALSE; - } - xf86DrvMsg(pScreen->myNum, X_INFO, - "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP offset 0x%lx.\n", - ringBufInit.size, ringBufInit.offset); + ringBufInit.offset = pVia->agpSize; + ringBufInit.size = AGP_CMDBUF_SIZE; + ringBufInit.reg_pause_addr = pVIADRI->reg_pause_addr; + ringBufInit.func = VIA_INIT_DMA; + if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit, + sizeof(ringBufInit))) { + xf86DrvMsg(pScrn->scrnIndex, X_ERROR, + "[drm] Failed to initialize DMA ring-buffer: %d\n", errno); + return FALSE; + } + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP offset 0x%lx.\n", + ringBufInit.size, ringBufInit.offset); - pVIADRI->ringBufActive = 1; + pVIADRI->ringBufActive = 1; + } return TRUE; } -#endif static Bool VIADRIAgpInit(ScreenPtr pScreen, VIAPtr pVia) { @@ -686,10 +690,7 @@ VIADRICloseScreen(ScreenPtr pScreen) VIAPtr pVia = VIAPTR(pScrn); VIADRIPtr pVIADRI; -#ifdef ENABLE_AGP_RINGBUF - VIADRIRingBufferCleanup(pScreen, pVia); -#endif - + VIADRIRingBufferCleanup(pScrn); if (pVia->agpSize) { drmUnmap(pVia->agpMappedAddr,pVia->agpSize); drmRmMap(pVia->drmFD,pVia->agpHandle); @@ -782,9 +783,7 @@ VIADRIFinishScreenInit(ScreenPtr pScreen) VIADRIIrqInit(pScrn, pVIADRI); pVIADRI->ringBufActive = 0; -#ifdef ENABLE_AGP_RINGBUF - VIADRIRingBufferInit(pScreen,pVia); -#endif + VIADRIRingBufferInit(pScrn); return TRUE; } @@ -856,37 +855,3 @@ static Bool VIADRIMapInit(ScreenPtr pScreen, VIAPtr pVia) return TRUE; } - - -void viaDRIEnterVT(int scrnIndex) -{ - ScreenPtr pScreen = screenInfo.screens[scrnIndex]; -#ifdef ENABLE_AGP_RINGBUF - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - VIAPtr pVia = VIAPTR(pScrn); - DRIInfoPtr pDRIInfo = pVia->pDRIInfo; - VIADRIPtr pVIADRI = pDRIInfo->devPrivate; - - if (!pVIADRI->ringBufActive) - VIADRIRingBufferInit(pScreen, pVia); -#endif - - DRIUnlock( pScreen ); -} - -void viaDRILeaveVT(int scrnIndex) -{ - ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; - ScreenPtr pScreen = screenInfo.screens[scrnIndex]; - - DRILock(pScreen,0); - VIAAccelSync(pScrn); - -#ifdef ENABLE_AGP_RINGBUF - { - VIAPtr pVia = VIAPTR(pScrn); - VIADRIRingBufferCleanup(pScreen, pVia); - } -#endif - -} diff --git a/src/via_dri.h b/src/via_dri.h index d7db1be..8764d9f 100644 --- a/src/via_dri.h +++ b/src/via_dri.h @@ -144,8 +144,8 @@ typedef struct { Bool VIADRIScreenInit(ScreenPtr pScreen); void VIADRICloseScreen(ScreenPtr pScreen); Bool VIADRIFinishScreenInit(ScreenPtr pScreen); -void viaDRILeaveVT(int scrnIndex); -void viaDRIEnterVT(int scrnIndex); +void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn); +Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn); diff --git a/src/via_driver.c b/src/via_driver.c index da8da67..a0f4e9e 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -41,9 +41,7 @@ #include "via_driver.h" #include "via_video.h" -#include "videodev.h" -#include "via_capture.h" #include "via.h" #ifdef XF86DRI #include "dri.h" @@ -152,7 +150,9 @@ typedef enum { OPTION_CAP0_FIELDSWAP, OPTION_DRIXINERAMA, OPTION_DISABLEIRQ, - OPTION_TVDEFLICKER + OPTION_TVDEFLICKER, + OPTION_AGP_DMA, + OPTION_2D_DMA } VIAOpts; @@ -187,6 +187,8 @@ static OptionInfoRec VIAOptions[] = {OPTION_CAP0_FIELDSWAP, "Cap0FieldSwap", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_DRIXINERAMA, "DRIXINERAMA", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_DISABLEIRQ, "DisableIRQ", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_AGP_DMA, "EnableAGPDMA", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_2D_DMA, "NoAGPFor2D", OPTV_BOOLEAN, {0}, FALSE}, {-1, NULL, OPTV_NONE, {0}, FALSE} }; @@ -372,30 +374,6 @@ static pointer VIASetup(pointer module, pointer opts, int *errmaj, int *errmin) #endif /* XFree86LOADER */ - -/* - * Used to be named WaitIdleCLE266 - * Across CLEXF releases this is used for all unichrome incarnations - */ -void -ViaWaitIdle(ScrnInfoPtr pScrn) -{ - VIAPtr pVia = VIAPTR(pScrn); - int loop = 0; - - mem_barrier(); - - while (!(VIAGETREG(VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && (loop++ < MAXLOOP)) - ; - - while ((VIAGETREG(VIA_REG_STATUS) & - (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY | VIA_3D_ENG_BUSY)) && - (loop++ < MAXLOOP)) - ; - -} - - static Bool VIAGetRec(ScrnInfoPtr pScrn) { DEBUG(xf86DrvMsg(pScrn->scrnIndex, X_INFO, "VIAGetRec\n")); @@ -893,6 +871,25 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags) pVia->DRIIrqEnable = TRUE; } + if (xf86ReturnOptValBool(VIAOptions, OPTION_AGP_DMA, FALSE)) { + pVia->agpEnable = TRUE; + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: EnableAGPDMA - Enabling AGP DMA\n"); + } else { + pVia->agpEnable = FALSE; + } + + if (xf86ReturnOptValBool(VIAOptions, OPTION_2D_DMA, FALSE)) { + pVia->dma2d = FALSE; + if (pVia->agpEnable) { + xf86DrvMsg(pScrn->scrnIndex, X_CONFIG, + "Option: NoAGPFor2D - AGP DMA is not used for 2D " + "acceleration\n"); + } + } else { + pVia->dma2d = TRUE; + } + /* ActiveDevice Option for device selection */ pBIOSInfo->ActiveDevice = 0x00; if ((s = xf86GetOptValString(VIAOptions, OPTION_ACTIVEDEVICE))) { @@ -1349,6 +1346,19 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags) * don't exceed the chipset's limit if pScrn->maxHValue and * pScrn->maxVValue are set. Since our VIAValidMode() already takes * care of this, we don't worry about setting them here. + * + * CLE266A: + * Max Line Pitch: 4080, (FB corruption when higher, driver problem?) + * Max Height: 4096 (and beyond) + * + * CLE266A: primary AdjustFrame only is able to use 24bits, so we are + * limited to 12x11bits; 4080x2048 (~2:1), 3344x2508 (4:3) or 2896x2896 + * (1:1). + * Test CLE266Cx, KM400, KM400A, K8M800, PM800, CN400 please. + * + * We should be able to limit the memory available for a mode to 32MB, + * yet xf86ValidateModes (or miScanLineWidth) fails to catch this properly + * (apertureSize). */ /* Select valid modes from those available */ @@ -1358,13 +1368,13 @@ static Bool VIAPreInit(ScrnInfoPtr pScrn, int flags) clockRanges, /* list of clock ranges */ NULL, /* list of line pitches */ 256, /* mini line pitch */ - 2048, /* max line pitch */ + 3344, /* max line pitch */ 16 * pScrn->bitsPerPixel, /* pitch inc (bits) */ 128, /* min height */ - 2048, /* max height */ + 2508, /* max height */ pScrn->display->virtualX, /* virtual width */ - pScrn->display->virtualY, /* virutal height */ - pVia->videoRambytes, /* size of video memory */ + pScrn->display->virtualY, /* virtual height */ + pVia->videoRambytes, /* apertureSize */ LOOKUP_BEST_REFRESH); /* lookup mode flags */ if (i == -1) { @@ -1473,7 +1483,6 @@ static Bool VIAEnterVT(int scrnIndex, int flags) Bool ret; /* FIXME: Rebind AGP memory here */ - /* FIXME: Unlock DRI here */ DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIAEnterVT\n")); VIASave(pScrn); vgaHWUnlock(hwp); @@ -1489,13 +1498,10 @@ static Bool VIAEnterVT(int scrnIndex, int flags) viaRestoreVideo(pScrn); #ifdef XF86DRI - - /* - * Reinitialize ringbuffer and release the - * hardware lock. - */ - - viaDRIEnterVT(scrnIndex); + if (pVia->directRenderingEnabled) { + VIADRIRingBufferInit(pScrn); + DRIUnlock(screenInfo.screens[scrnIndex]); + } #endif VIAAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0); @@ -1513,14 +1519,15 @@ static void VIALeaveVT(int scrnIndex, int flags) DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIALeaveVT\n")); #ifdef XF86DRI + if (pVia->directRenderingEnabled) + DRILock(screenInfo.screens[scrnIndex], 0); +#endif - /* - * Take the hardware lock, flush and disable the ringbuffer. - */ + VIAAccelSync(pScrn); - viaDRILeaveVT(scrnIndex); -#else - ViaWaitIdle(pScrn); +#ifdef XF86DRI + if (pVia->directRenderingEnabled) + VIADRIRingBufferCleanup(pScrn); #endif if (pVia->VQEnable) @@ -2248,7 +2255,7 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen) if(pScrn->vtSema) { /* Wait Hardware Engine idle to exit graphical mode */ - ViaWaitIdle(pScrn); + VIAAccelSync(pScrn); /* Patch for normal log out and restart X, 3D application will hang */ VIARestore(pScrn); @@ -2267,9 +2274,8 @@ static Bool VIACloseScreen(int scrnIndex, ScreenPtr pScreen) ViaVQDisable(pScrn); } #ifdef XF86DRI - if (pVia->directRenderingEnabled) { + if (pVia->directRenderingEnabled) VIADRICloseScreen(pScreen); - } #endif if (pVia->AccelInfoRec) { XAADestroyInfoRec(pVia->AccelInfoRec); @@ -2402,34 +2408,31 @@ Bool VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags) ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; VIAPtr pVia = VIAPTR(pScrn); Bool ret; - + DEBUG(xf86DrvMsg(scrnIndex, X_INFO, "VIASwitchMode\n")); - /* Wait Hardware Engine idle to switch graphicd mode */ - + #ifdef XF86DRI - - /* - * Take the hardware lock, flush and disable the ringbuffer. - */ - - viaDRILeaveVT(scrnIndex); -#else - ViaWaitIdle(pScrn); + if (pVia->directRenderingEnabled) + DRILock(screenInfo.screens[scrnIndex], 0); #endif - + + VIAAccelSync(pScrn); + +#ifdef XF86DRI + if (pVia->directRenderingEnabled) + VIADRIRingBufferCleanup(pScrn); +#endif + if (pVia->VQEnable) ViaVQDisable(pScrn); - - ret = VIAWriteMode(xf86Screens[scrnIndex], mode); + + ret = VIAWriteMode(pScrn, mode); #ifdef XF86DRI - - /* - * Reinitialize ringbuffer and release the - * hardware lock. - */ - - viaDRIEnterVT(scrnIndex); + if (pVia->directRenderingEnabled) { + VIADRIRingBufferInit(pScrn); + DRIUnlock(screenInfo.screens[scrnIndex]); + } #endif return ret; diff --git a/src/via_driver.h b/src/via_driver.h index 2e1ddb9..0383769 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -304,8 +304,10 @@ typedef struct _VIA { ViaXvMC xvmc; #endif Bool DRIIrqEnable; + Bool agpEnable; + Bool dma2d; - unsigned char ActiveDevice; /* if SAMM, non-equal pBIOSInfo->ActiveDevice */ + CARD8 ActiveDevice; /* Option */ unsigned char *CursorImage; CARD32 CursorFG; CARD32 CursorBG; diff --git a/src/via_memcpy.c b/src/via_memcpy.c index 23f4909..b2dd39f 100644 --- a/src/via_memcpy.c +++ b/src/via_memcpy.c @@ -442,9 +442,9 @@ static unsigned fastrdtsc(void) { unsigned eax; __asm__ volatile ("\t" - "pushl %%ebx\n\t" + "pushl %%ebx\n\t" "cpuid\n\t" - "rdtsc\n\t" + ".byte 0x0f, 0x31\n\t" "popl %%ebx\n" : "=a" (eax) : "0"(0) |