gallium/radeon: always return the last SDMA fence on SDMA flush if needed
authorMarek Olšák <marek.olsak@amd.com>
Wed, 28 Oct 2015 11:59:38 +0000 (12:59 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 3 Nov 2015 23:43:14 +0000 (00:43 +0100)
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
src/gallium/drivers/radeon/r600_pipe_common.c
src/gallium/drivers/radeon/r600_pipe_common.h

index 0ad36849645039f550790505e9d77f66eb231713..56977c068699876499455e9c4f12133f96bce243 100644 (file)
@@ -192,13 +192,15 @@ static void r600_flush_dma_ring(void *ctx, unsigned flags,
        struct r600_common_context *rctx = (struct r600_common_context *)ctx;
        struct radeon_winsys_cs *cs = rctx->rings.dma.cs;
 
-       if (!cs->cdw) {
-               return;
-       }
+       if (!cs->cdw)
+               goto done;
 
        rctx->rings.dma.flushing = true;
-       rctx->ws->cs_flush(cs, flags, fence, 0);
+       rctx->ws->cs_flush(cs, flags, &rctx->last_sdma_fence, 0);
        rctx->rings.dma.flushing = false;
+done:
+       if (fence)
+               rctx->ws->fence_reference(fence, rctx->last_sdma_fence);
 }
 
 static enum pipe_reset_status r600_get_reset_status(struct pipe_context *ctx)
@@ -297,6 +299,7 @@ void r600_common_context_cleanup(struct r600_common_context *rctx)
        if (rctx->allocator_so_filled_size) {
                u_suballocator_destroy(rctx->allocator_so_filled_size);
        }
+       rctx->ws->fence_reference(&rctx->last_sdma_fence, NULL);
 }
 
 void r600_context_add_resource_size(struct pipe_context *ctx, struct pipe_resource *r)
index c300c0b3332da721b311ca3b043cabe988139016..b7f1a234baf3217676e23540bb718904dcbe4066 100644 (file)
@@ -384,6 +384,7 @@ struct r600_common_context {
        enum radeon_family              family;
        enum chip_class                 chip_class;
        struct r600_rings               rings;
+       struct pipe_fence_handle        *last_sdma_fence;
        unsigned                        initial_gfx_cs_size;
        unsigned                        gpu_reset_counter;