r600g: pad the DMA CS to a multiple of 8 dwords
authorMarek Olšák <maraeo@gmail.com>
Wed, 27 Feb 2013 20:24:02 +0000 (21:24 +0100)
committerMarek Olšák <maraeo@gmail.com>
Fri, 1 Mar 2013 12:46:32 +0000 (13:46 +0100)
Tested-by: Andreas Boll <andreas.boll.dev@gmail.com>
NOTE: This is a candidate for the 9.1 branch.

src/gallium/drivers/r600/r600_pipe.c

index f1019f449086104d85f1e841ab08bcb1ad948ec0..a0504d14291e7645181598d77bf107c810d3bb16 100644 (file)
@@ -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;
 }