radeonsi: CP DMA clear supports unaligned destination addresses
authorNicolai Hähnle <nicolai.haehnle@amd.com>
Mon, 13 Feb 2017 12:08:52 +0000 (13:08 +0100)
committerNicolai Hähnle <nicolai.haehnle@amd.com>
Tue, 28 Mar 2017 08:22:12 +0000 (10:22 +0200)
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
src/gallium/drivers/radeonsi/si_cp_dma.c

index b40f5cc5871fb70c8ef335f9c3b4bad407dc3f9c..0cf7b3b3cbc2ee5e018d2477aaffde9b5f61414d 100644 (file)
@@ -197,7 +197,7 @@ static void si_clear_buffer(struct pipe_context *ctx, struct pipe_resource *dst,
                       offset + size);
 
        /* Fallback for unaligned clears. */
-       if (offset % 4 != 0 || size % 4 != 0) {
+       if (size % 4 != 0) {
                uint8_t *map = r600_buffer_map_sync_with_rings(&sctx->b, rdst,
                                                               PIPE_TRANSFER_WRITE);
                map += offset;
@@ -211,6 +211,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 &&
+           (offset % 4 == 0) &&
            /* CP DMA is very slow. Always use SDMA for big clears. This
             * alone improves DeusEx:MD performance by 70%. */
            (size > 128 * 1024 ||