radeonsi/compute: do CS partial flush with si_emit_cache_flush
authorMarek Olšák <marek.olsak@amd.com>
Sat, 20 Sep 2014 09:54:46 +0000 (11:54 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 24 Sep 2014 12:48:02 +0000 (14:48 +0200)
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/radeon/r600_pipe_common.h
src/gallium/drivers/radeonsi/si_compute.c
src/gallium/drivers/radeonsi/si_state_draw.c

index 9a5a100fa6d63e5e0dc9bb02bcf8642e4e9186de..4651bf8b1475f675dbbd9b5993a303749018c917 100644 (file)
@@ -75,6 +75,7 @@
 #define R600_CONTEXT_WAIT_CP_DMA_IDLE          (1 << 18)
 #define R600_CONTEXT_VGT_FLUSH                 (1 << 19)
 #define R600_CONTEXT_VGT_STREAMOUT_SYNC                (1 << 20)
+#define R600_CONTEXT_CS_PARTIAL_FLUSH          (1 << 21)
 /* other flags */
 #define R600_CONTEXT_FLAG_COMPUTE              (1u << 31)
 
index e24c6e22bb4f894bde670d21529c2cfa5887d5d8..be6441817963b1b6f99391194fee59a911f0cd2c 100644 (file)
@@ -361,10 +361,6 @@ static void si_launch_grid(
        si_pm4_cmd_add(pm4, 1); /* DISPATCH_INITIATOR */
         si_pm4_cmd_end(pm4, false);
 
-       si_pm4_cmd_begin(pm4, PKT3_EVENT_WRITE);
-       si_pm4_cmd_add(pm4, EVENT_TYPE(V_028A90_CS_PARTIAL_FLUSH | EVENT_INDEX(0x4)));
-       si_pm4_cmd_end(pm4, false);
-
        si_pm4_emit(sctx, pm4);
 
 #if 0
@@ -376,7 +372,8 @@ static void si_launch_grid(
 
        si_pm4_free_state(sctx, pm4, ~0);
 
-       sctx->b.flags |= R600_CONTEXT_INV_TEX_CACHE |
+       sctx->b.flags |= R600_CONTEXT_CS_PARTIAL_FLUSH |
+                        R600_CONTEXT_INV_TEX_CACHE |
                         R600_CONTEXT_INV_SHADER_CACHE |
                         R600_CONTEXT_INV_CONST_CACHE |
                         R600_CONTEXT_FLAG_COMPUTE;
index a4b70177ea9372b49eb45307cc2f626cdbd807b8..0888841f4a824e43d90b15b4b98974eb49a98e2c 100644 (file)
@@ -863,6 +863,11 @@ void si_emit_cache_flush(struct r600_common_context *sctx, struct r600_atom *ato
                radeon_emit(cs, EVENT_TYPE(V_028A90_VS_PARTIAL_FLUSH) | EVENT_INDEX(4));
        }
 
+       if (sctx->flags & R600_CONTEXT_CS_PARTIAL_FLUSH) {
+               radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0) | compute);
+               radeon_emit(cs, EVENT_TYPE(V_028A90_CS_PARTIAL_FLUSH | EVENT_INDEX(4)));
+       }
+
        if (sctx->flags & R600_CONTEXT_VGT_FLUSH) {
                radeon_emit(cs, PKT3(PKT3_EVENT_WRITE, 0, 0) | compute);
                radeon_emit(cs, EVENT_TYPE(V_028A90_VGT_FLUSH) | EVENT_INDEX(0));
@@ -875,7 +880,7 @@ void si_emit_cache_flush(struct r600_common_context *sctx, struct r600_atom *ato
        sctx->flags = 0;
 }
 
-const struct r600_atom si_atom_cache_flush = { si_emit_cache_flush, 19 }; /* number of CS dwords */
+const struct r600_atom si_atom_cache_flush = { si_emit_cache_flush, 21 }; /* number of CS dwords */
 
 static void si_get_draw_start_count(struct si_context *sctx,
                                    const struct pipe_draw_info *info,