summaryrefslogtreecommitdiff
path: root/src/via_exa.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/via_exa.c')
-rw-r--r--src/via_exa.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/src/via_exa.c b/src/via_exa.c
index 60dce0b..e9848b3 100644
--- a/src/via_exa.c
+++ b/src/via_exa.c
@@ -1732,8 +1732,8 @@ Bool
UMSAccelInit(ScreenPtr pScreen)
{
ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
+ Bool nPOTSupported, ret = FALSE;
VIAPtr pVia = VIAPTR(pScrn);
- Bool nPOTSupported, ret;
/* HW Limitation are described here:
*
@@ -1753,10 +1753,11 @@ UMSAccelInit(ScreenPtr pScreen)
* */
pVia->VQStart = 0;
pVia->vq_bo = drm_bo_alloc(pScrn, VIA_VQ_SIZE, 16, TTM_PL_FLAG_VRAM);
- if (pVia->vq_bo) {
- pVia->VQStart = pVia->vq_bo->offset;
- pVia->VQEnd = pVia->vq_bo->offset + pVia->vq_bo->size;
- }
+ if (!pVia->vq_bo)
+ goto err;
+
+ pVia->VQStart = pVia->vq_bo->offset;
+ pVia->VQEnd = pVia->vq_bo->offset + pVia->vq_bo->size;
viaInitialize2DEngine(pScrn);
@@ -1765,17 +1766,19 @@ UMSAccelInit(ScreenPtr pScreen)
if (Success != viaSetupCBuffer(pScrn, &pVia->cb, 0))
pVia->NoAccel = TRUE;
+ pVia->exa_sync_bo = drm_bo_alloc(pScrn, 32, 32, TTM_PL_FLAG_VRAM);
+ if (!pVia->exa_sync_bo)
+ goto err;
+
/* Sync marker space. */
pVia->exa_sync_bo = drm_bo_alloc(pScrn, 32, 32, TTM_PL_FLAG_VRAM);
if (!pVia->exa_sync_bo)
- return FALSE;
+ goto err;
pVia->markerOffset = pVia->exa_sync_bo->offset;
pVia->markerBuf = drm_bo_map(pScrn, pVia->exa_sync_bo);
- if (!pVia->markerBuf) {
- drm_bo_free(pScrn, pVia->exa_sync_bo);
- return FALSE;
- }
+ if (!pVia->markerBuf)
+ goto err;
pVia->curMarker = 0;
pVia->lastMarkerRead = 0;
@@ -1805,11 +1808,22 @@ UMSAccelInit(ScreenPtr pScreen)
* case with the old linear offscreen FB manager
*/
pVia->NoAccel = TRUE;
- return FALSE;
- }
+ } else
+ ret = TRUE;
xf86DrvMsg(pScrn->scrnIndex, X_INFO,
"[EXA] Enabled EXA acceleration.\n");
- return TRUE;
+err:
+ if (!ret) {
+ if (pVia->markerBuf) {
+ drm_bo_unmap(pScrn, pVia->exa_sync_bo);
+ pVia->markerBuf = NULL;
+ }
+ if (pVia->exa_sync_bo)
+ drm_bo_free(pScrn, pVia->exa_sync_bo);
+ if (pVia->vq_bo)
+ drm_bo_free(pScrn, pVia->vq_bo);
+ }
+ return ret;
}
void