radeon: Fix buffer object unmap to be called only once for dma buffers.
authorPauli Nieminen <suokkos@gmail.com>
Mon, 15 Mar 2010 08:30:18 +0000 (10:30 +0200)
committerPauli Nieminen <suokkos@gmail.com>
Tue, 16 Mar 2010 15:00:14 +0000 (17:00 +0200)
If flush happens inside radeonRefillCurrentMaRegion the last dma buffer would
be unmapped twice. Unmapping buffer when moving buffer to wait list fixes the
mapping error.

src/mesa/drivers/dri/radeon/radeon_dma.c

index 22499bc38d1b8fb981f59626f0c7cc9b3b86daf8..6b7690cf8b397dc2275e36826369116143d21332 100644 (file)
@@ -184,9 +184,6 @@ void radeonRefillCurrentDmaRegion(radeonContextPtr rmesa, int size)
        radeon_print(RADEON_DMA, RADEON_NORMAL, "%s size %d minimum_size %d\n",
                        __FUNCTION__, size, rmesa->dma.minimum_size);
 
-       if (!is_empty_list(&rmesa->dma.reserved))
-               radeon_bo_unmap(first_elem(&rmesa->dma.reserved)->bo);
-
        if (is_empty_list(&rmesa->dma.free)
              || last_elem(&rmesa->dma.free)->bo->size < size) {
                dma_bo = CALLOC_STRUCT(radeon_dma_bo);
@@ -336,9 +333,6 @@ void radeonReleaseDmaRegions(radeonContextPtr rmesa)
                legacy_track_pending(rmesa->radeonScreen->bom, 0);
        }
 
-       if (!is_empty_list(&rmesa->dma.reserved))
-               radeon_bo_unmap(first_elem(&rmesa->dma.reserved)->bo);
-
        /* move waiting bos to free list.
           wait list provides gpu time to handle data before reuse */
        foreach_s(dma_bo, temp, &rmesa->dma.wait) {
@@ -368,6 +362,7 @@ void radeonReleaseDmaRegions(radeonContextPtr rmesa)
 
        /* move reserved to wait list */
        foreach_s(dma_bo, temp, &rmesa->dma.reserved) {
+               radeon_bo_unmap(dma_bo->bo);
                /* free objects that are too small to be used because of large request */
                if (dma_bo->bo->size < rmesa->dma.minimum_size) {
                   radeon_bo_unref(dma_bo->bo);