summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuc Verhaegen <libv@skynet.be>2009-02-03 20:13:36 +0100
committerLuc Verhaegen <libv@skynet.be>2009-02-03 20:13:36 +0100
commit54538b08b9d330d41698d51963eccf9a7e38661d (patch)
tree7169178eda4a210f318e7dd9a5550e44689946f8
parenta0f97b00ebe363e13319afe3b4feb4b58610c6fe (diff)
DRM: Rework commandbuffer activity tracking.
-rw-r--r--src/via_accel.c17
-rw-r--r--src/via_dri.c89
-rw-r--r--src/via_dri.h6
-rw-r--r--src/via_driver.c14
-rw-r--r--src/via_driver.h6
-rw-r--r--src/via_memory.c1
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;