r600g: fix computing how much space is needed for a draw command
authorMarek Olšák <maraeo@gmail.com>
Mon, 10 Sep 2012 18:38:03 +0000 (20:38 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 13 Sep 2012 18:18:45 +0000 (20:18 +0200)
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
src/gallium/drivers/r600/r600_hw_context.c
src/gallium/drivers/r600/r600_hw_context_priv.h

index 7cf17d0b4d1ee710ec497281ea071c2049fccc0a..07226424da0639ae9ea3d07505baf6ce02d5f6ff 100644 (file)
@@ -599,8 +599,8 @@ void r600_need_cs_space(struct r600_context *ctx, unsigned num_dw,
 
                num_dw += ctx->pm4_dirty_cdwords;
 
-               /* The upper-bound of how much a draw command would take. */
-               num_dw += R600_MAX_DRAW_CS_DWORDS;
+               /* The upper-bound of how much space a draw command would take. */
+               num_dw += R600_MAX_FLUSH_CS_DWORDS + R600_MAX_DRAW_CS_DWORDS;
        }
 
        /* Count in queries_suspend. */
@@ -615,11 +615,16 @@ void r600_need_cs_space(struct r600_context *ctx, unsigned num_dw,
                num_dw += 3;
        }
 
+       /* SX_MISC */
+       if (ctx->chip_class <= R700) {
+               num_dw += 3;
+       }
+
        /* Count in framebuffer cache flushes at the end of CS. */
-       num_dw += 44; /* one SURFACE_SYNC and CACHE_FLUSH_AND_INV (r6xx-only) */
+       num_dw += R600_MAX_FLUSH_CS_DWORDS;
 
-       /* Save 16 dwords for the fence mechanism. */
-       num_dw += 16;
+       /* The fence at the end of CS. */
+       num_dw += 10;
 
        /* Flush if there's not enough space. */
        if (num_dw > RADEON_MAX_CMDBUF_DWORDS) {
index 12a9750e8b7e4d65fc5f5bd066ee031136a4e307..71bfbd18d1c8f6fb395d4a64e2c49c86489da471 100644 (file)
@@ -29,7 +29,8 @@
 #include "r600_pipe.h"
 
 /* the number of CS dwords for flushing and drawing */
-#define R600_MAX_DRAW_CS_DWORDS 64
+#define R600_MAX_FLUSH_CS_DWORDS 44
+#define R600_MAX_DRAW_CS_DWORDS 13
 
 /* these flags are used in register flags and added into block flags */
 #define REG_FLAG_NEED_BO 1