diff options
author | Luc Verhaegen <libv@skynet.be> | 2009-02-03 20:13:36 +0100 |
---|---|---|
committer | Luc Verhaegen <libv@skynet.be> | 2009-02-03 20:13:36 +0100 |
commit | 54538b08b9d330d41698d51963eccf9a7e38661d (patch) | |
tree | 7169178eda4a210f318e7dd9a5550e44689946f8 | |
parent | a0f97b00ebe363e13319afe3b4feb4b58610c6fe (diff) |
DRM: Rework commandbuffer activity tracking.
-rw-r--r-- | src/via_accel.c | 17 | ||||
-rw-r--r-- | src/via_dri.c | 89 | ||||
-rw-r--r-- | src/via_dri.h | 6 | ||||
-rw-r--r-- | src/via_driver.c | 14 | ||||
-rw-r--r-- | src/via_driver.h | 6 | ||||
-rw-r--r-- | src/via_memory.c | 1 |
6 files changed, 68 insertions, 65 deletions
diff --git a/src/via_accel.c b/src/via_accel.c index 93d78b0..d02e759 100644 --- a/src/via_accel.c +++ b/src/via_accel.c @@ -279,23 +279,16 @@ static void dispatchCBufferAGP(VIAPtr pVia, ViaCBuffer *buf) { #ifdef HAVE_DRI - drm_via_cmdbuffer_t b; + if (pVia->UseCommandBufferFor2d && pVia->CommandBufferActive) { + drm_via_cmdbuffer_t b; - b.buf = (char *)(buf->buffer); - b.size = buf->curPos * sizeof(CARD32); + b.buf = (char *)(buf->buffer); + b.size = buf->curPos * sizeof(CARD32); - if (pVia->directRenderingEnabled && pVia->UseCommandBuffer && pVia->UseCommandBufferFor2d) { - VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; - if (pVIADRI->ringBufActive) { - if (drmCommandWrite(pVia->drmFD, DRM_VIA_CMDBUFFER, &b, sizeof(b))) - dispatchCBuffer(pVia, buf); /* No success using AGP. Try PCI instead. */ + if (!drmCommandWrite(pVia->drmFD, DRM_VIA_CMDBUFFER, &b, sizeof(b))) return; - } } #endif - /* - * No AGP ringbuffer or no DRI. - */ dispatchCBuffer(pVia, buf); } diff --git a/src/via_dri.c b/src/via_dri.c index d84ad7c..6d40f89 100644 --- a/src/via_dri.c +++ b/src/via_dri.c @@ -138,73 +138,77 @@ VIADRIIrqExit(VIAPtr pVia, VIADRIPtr pVIADRI) } } -void -VIADRIRingBufferCleanup(ScrnInfoPtr pScrn) -{ - VIAPtr pVia = VIAPTR(pScrn); - VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; - - if (pVIADRI->ringBufActive) { - drm_via_dma_init_t 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(pScrn->scrnIndex, X_WARNING, - "[drm] Failed to clean up DMA ring-buffer: %d\n", errno); - } - pVIADRI->ringBufActive = 0; - } -} - +/* + * + */ Bool -VIADRIRingBufferInit(ScrnInfoPtr pScrn) +VIADRMCommandBufferStart(VIAPtr pVia) { - VIAPtr pVia = VIAPTR(pScrn); - VIADRIPtr pVIADRI = pVia->pDRIInfo->devPrivate; drm_via_dma_init_t ringBufInit; - if (pVIADRI->ringBufActive) - return TRUE; - - if (!pVia->UseCommandBuffer) - return TRUE; + VIAFUNC(pVia); if (pVia->drmVersion < 0x010400) return FALSE; + if (pVia->CommandBufferActive) + xf86DrvMsg(pVia->scrnIndex, X_ERROR, + "%s: Command buffer still active!!!\n", __func__); + + ringBufInit.offset = pVia->agpSize; + ringBufInit.size = AGP_CMDBUF_SIZE; + /* Info frome code-snippet on DRI-DEVEL list; Erdi Chen. */ switch (pVia->Chipset) { case VT3118: case VT3157: - pVIADRI->reg_pause_addr = 0x40c; + ringBufInit.reg_pause_addr = 0x40c; break; default: - pVIADRI->reg_pause_addr = 0x418; + ringBufInit.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(pScrn->scrnIndex, X_ERROR, + xf86DrvMsg(pVia->scrnIndex, X_ERROR, "[drm] Failed to initialize DMA ring-buffer: %d\n", errno); return FALSE; } - xf86DrvMsg(pScrn->scrnIndex, X_INFO, + + xf86DrvMsg(pVia->scrnIndex, X_INFO, "[drm] Initialized AGP ring-buffer, size 0x%lx at AGP offset 0x%lx.\n", ringBufInit.size, ringBufInit.offset); - - pVIADRI->ringBufActive = 1; + pVia->CommandBufferActive = TRUE; return TRUE; } +/* + * + */ +void +VIADRMCommandBufferStop(VIAPtr pVia) +{ + drm_via_dma_init_t ringBufInit; + + VIAFUNC(pVia); + + if (!pVia->CommandBufferActive) + xf86DrvMsg(pVia->scrnIndex, X_ERROR, + "%s: Command buffer not active!!!\n", __func__); + + ringBufInit.func = VIA_CLEANUP_DMA; + if (drmCommandWrite(pVia->drmFD, DRM_VIA_DMA_INIT, &ringBufInit, + sizeof(ringBufInit))) { + xf86DrvMsg(pVia->scrnIndex, X_WARNING, + "[drm] Failed to clean up DMA ring-buffer: %d\n", errno); + } + + pVia->CommandBufferActive = FALSE; +} + static Bool VIADRIAgpInit(VIAPtr pVia) { @@ -805,7 +809,9 @@ VIADRICloseScreen(ScrnInfoPtr pScrn, ScreenPtr pScreen) VIAPtr pVia = VIAPTR(pScrn); VIADRIPtr pVIADRI; - VIADRIRingBufferCleanup(pScrn); + if (pVia->CommandBufferActive) + VIADRMCommandBufferStop(pVia); + if (pVia->agpSize) { drmUnmap(pVia->agpMappedAddr,pVia->agpSize); drmRmMap(pVia->drmFD,pVia->agpHandle); @@ -913,8 +919,9 @@ VIADRIFinishScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen) if (pVia->DRIIrqEnable) VIADRIIrqInit(pVia, pVIADRI); - pVIADRI->ringBufActive = 0; - VIADRIRingBufferInit(pScrn); + if (pVia->UseCommandBuffer) + VIADRMCommandBufferStart(pVia); + return TRUE; } diff --git a/src/via_dri.h b/src/via_dri.h index 4bc41b1..091f459 100644 --- a/src/via_dri.h +++ b/src/via_dri.h @@ -55,7 +55,7 @@ typedef struct { int priv2; int fbOffset; int fbSize; - Bool drixinerama; + int deprecated_00; /* old drixinerama */ int backOffset; int depthOffset; int textureOffset; @@ -63,8 +63,8 @@ typedef struct { int irqEnabled; unsigned int scrnX, scrnY; int sarea_priv_offset; - int ringBufActive; - unsigned int reg_pause_addr; + int deprecated_01; /* old ringBufActive */ + int deprecated_02; /* old reg_pause_addr */ } VIADRIRec, *VIADRIPtr; typedef struct { diff --git a/src/via_driver.c b/src/via_driver.c index eca749c..e70d6e2 100644 --- a/src/via_driver.c +++ b/src/via_driver.c @@ -1461,7 +1461,8 @@ VIAEnterVT(int scrnIndex, int flags) #ifdef HAVE_DRI if (pVia->directRenderingEnabled) { - VIADRIRingBufferInit(pScrn); + if (pVia->UseCommandBuffer) + VIADRMCommandBufferStart(pVia); DRIUnlock(screenInfo.screens[scrnIndex]); } #endif @@ -1498,8 +1499,8 @@ static void VIALeaveVT(int scrnIndex, int flags) ViaSeqMask(hwp, 0x1A, 0x40, 0x40); #ifdef HAVE_DRI - if (pVia->directRenderingEnabled) - VIADRIRingBufferCleanup(pScrn); + if (pVia->directRenderingEnabled && pVia->CommandBufferActive) + VIADRMCommandBufferStop(pVia); #endif if (pVia->VQEnable) @@ -2373,8 +2374,8 @@ VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags) VIAAccelSync(pScrn); #ifdef HAVE_DRI - if (pVia->directRenderingEnabled) - VIADRIRingBufferCleanup(pScrn); + if (pVia->directRenderingEnabled && pVia->CommandBufferActive) + VIADRMCommandBufferStop(pVia); #endif if (pVia->VQEnable) @@ -2387,7 +2388,8 @@ VIASwitchMode(int scrnIndex, DisplayModePtr mode, int flags) #ifdef HAVE_DRI if (pVia->directRenderingEnabled) { - VIADRIRingBufferInit(pScrn); + if (pVia->UseCommandBuffer) + VIADRMCommandBufferStart(pVia); DRIUnlock(screenInfo.screens[scrnIndex]); } #endif diff --git a/src/via_driver.h b/src/via_driver.h index 6a7ee90..209900f 100644 --- a/src/via_driver.h +++ b/src/via_driver.h @@ -255,6 +255,7 @@ typedef struct _VIA { #endif Bool DRIIrqEnable; + Bool CommandBufferActive; Bool UseCommandBuffer; Bool UseCommandBufferFor2d; Bool UseDMACopy; @@ -323,8 +324,9 @@ void ViaI2CInit(ScrnInfoPtr pScrn); Bool VIADRIScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); void VIADRICloseScreen(ScrnInfoPtr pScrn, ScreenPtr pScreen); Bool VIADRIFinishScreenInit(ScrnInfoPtr pScrn, ScreenPtr pScreen); -void VIADRIRingBufferCleanup(ScrnInfoPtr pScrn); -Bool VIADRIRingBufferInit(ScrnInfoPtr pScrn); + +Bool VIADRMCommandBufferStart(VIAPtr pVia); +void VIADRMCommandBufferStop(VIAPtr pVia); #endif /* HAVE_DRI */ /* Extra debug verbosity */ diff --git a/src/via_memory.c b/src/via_memory.c index f651817..34cddaf 100644 --- a/src/via_memory.c +++ b/src/via_memory.c @@ -249,7 +249,6 @@ ViaMemFBFree(ScrnInfoPtr pScrn, struct ViaMem *Mem) static struct ViaMem * ViaMemFBAlloc(ScrnInfoPtr pScrn, unsigned long size, CARD8 alignment) { - VIAPtr pVia = VIAPTR(pScrn); struct ViaMem *Mem; FBLinearPtr linear; unsigned long tempsize; |