radeonsi: disable SDMA clears and copies for sparse buffers
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Fri, 24 Mar 2017 22:30:55 +0000 (23:30 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Wed, 5 Apr 2017 08:37:19 +0000 (10:37 +0200)
VM faults cannot be disabled for SDMA on <= VI.

We could still use SDMA by asking the winsys about which parts of the
buffers are committed. This is left as a potential future improvement.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/cik_sdma.c
src/gallium/drivers/radeonsi/si_cp_dma.c
src/gallium/drivers/radeonsi/si_dma.c

index 38833666a8da6f1d3435d0f7a610b0aa23757604..99285a6de17687786be5aacb4444d45a87d1424f 100644 (file)
@@ -80,7 +80,8 @@ static void cik_sdma_clear_buffer(struct pipe_context *ctx,
        unsigned i, ncopy, csize;
        struct r600_resource *rdst = r600_resource(dst);
 
-       if (!cs || offset % 4 != 0 || size % 4 != 0) {
+       if (!cs || offset % 4 != 0 || size % 4 != 0 ||
+           dst->flags & PIPE_RESOURCE_FLAG_SPARSE) {
                ctx->clear_buffer(ctx, dst, offset, size, &clear_value, 4);
                return;
        }
@@ -526,7 +527,9 @@ static void cik_sdma_copy(struct pipe_context *ctx,
 {
        struct si_context *sctx = (struct si_context *)ctx;
 
-       if (!sctx->b.dma.cs)
+       if (!sctx->b.dma.cs ||
+           src->flags & PIPE_RESOURCE_FLAG_SPARSE ||
+           dst->flags & PIPE_RESOURCE_FLAG_SPARSE)
                goto fallback;
 
        if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
index 74e0b2d46df0d9267d5f74371b13226beb59e288..9505d622aefb55fc79eb3ec9270530d46bea307b 100644 (file)
@@ -223,6 +223,7 @@ static void si_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
        /* dma_clear_buffer can use clear_buffer on failure. Make sure that
         * doesn't happen. We don't want an infinite recursion: */
        if (sctx->b.dma.cs &&
+           !(dst->flags & PIPE_RESOURCE_FLAG_SPARSE) &&
            (offset % 4 == 0) &&
            /* CP DMA is very slow. Always use SDMA for big clears. This
             * alone improves DeusEx:MD performance by 70%. */
index 500247fccfd790994c3672d8a7a898c2c8a57307..af639a532e83e77e95c806a62e0517118cbdc46b 100644 (file)
@@ -89,7 +89,8 @@ static void si_dma_clear_buffer(struct pipe_context *ctx,
        unsigned i, ncopy, csize;
        struct r600_resource *rdst = r600_resource(dst);
 
-       if (!cs || offset % 4 != 0 || size % 4 != 0) {
+       if (!cs || offset % 4 != 0 || size % 4 != 0 ||
+           dst->flags & PIPE_RESOURCE_FLAG_SPARSE) {
                ctx->clear_buffer(ctx, dst, offset, size, &clear_value, 4);
                return;
        }
@@ -233,7 +234,9 @@ static void si_dma_copy(struct pipe_context *ctx,
        unsigned src_x, src_y;
        unsigned dst_x = dstx, dst_y = dsty, dst_z = dstz;
 
-       if (sctx->b.dma.cs == NULL) {
+       if (sctx->b.dma.cs == NULL ||
+           src->flags & PIPE_RESOURCE_FLAG_SPARSE ||
+           dst->flags & PIPE_RESOURCE_FLAG_SPARSE) {
                goto fallback;
        }