diff options
author | Marek Olšák <[email protected]> | 2013-02-27 21:24:02 +0100 |
---|---|---|
committer | Marek Olšák <[email protected]> | 2013-03-01 13:46:32 +0100 |
commit | c77917d35fdf64d9f194fbecc4748213621eefc8 (patch) | |
tree | 6746c0f0595a5119fe7f631f1c2730e2e3f86328 /src/gallium/drivers | |
parent | 782d4f0f3c4a69335bf826e10031ad8a0847e496 (diff) |
r600g: pad the DMA CS to a multiple of 8 dwords
Tested-by: Andreas Boll <[email protected]>
NOTE: This is a candidate for the 9.1 branch.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r-- | src/gallium/drivers/r600/r600_pipe.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c index f1019f44908..a0504d14291 100644 --- a/src/gallium/drivers/r600/r600_pipe.c +++ b/src/gallium/drivers/r600/r600_pipe.c @@ -23,6 +23,7 @@ #include "r600_pipe.h" #include "r600_public.h" #include "r600_isa.h" +#include "r600d.h" #include <errno.h> #include "pipe/p_shader_tokens.h" @@ -166,12 +167,23 @@ static void r600_flush_gfx_ring(void *ctx, unsigned flags) static void r600_flush_dma_ring(void *ctx, unsigned flags) { struct r600_context *rctx = (struct r600_context *)ctx; + struct radeon_winsys_cs *cs = rctx->rings.dma.cs; + unsigned padding_dw, i; - if (!rctx->rings.dma.cs->cdw) { + if (!cs->cdw) { return; } + + /* Pad the DMA CS to a multiple of 8 dwords. */ + padding_dw = 8 - cs->cdw % 8; + if (padding_dw < 8) { + for (i = 0; i < padding_dw; i++) { + cs->buf[cs->cdw++] = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0); + } + } + rctx->rings.dma.flushing = true; - rctx->ws->cs_flush(rctx->rings.dma.cs, flags); + rctx->ws->cs_flush(cs, flags); rctx->rings.dma.flushing = false; } |