Signed-off-by: Bas Nieuwenhuizen <b...@basnieuwenhuizen.nl>
Reviewed-by: Marek Olšák <marek.ol...@amd.com>
---
 src/gallium/drivers/radeonsi/si_pipe.h       |  1 +
 src/gallium/drivers/radeonsi/si_state_draw.c | 24 ++++++++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.h 
b/src/gallium/drivers/radeonsi/si_pipe.h
index b8db3b2..b3f5ed5 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -193,6 +193,7 @@ struct si_context {
        struct si_screen                *screen;
        struct radeon_winsys_cs         *ce_ib;
        struct radeon_winsys_cs         *ce_preamble_ib;
+       bool                            ce_need_synchronization;
 
        struct pipe_fence_handle        *last_gfx_fence;
        struct si_shader_ctx_state      fixed_func_tcs_shader;
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index d31f77f..f5ea359 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -757,6 +757,25 @@ static void si_get_draw_start_count(struct si_context 
*sctx,
        }
 }
 
+static void si_ce_pre_draw_synchronization(struct si_context *sctx) {
+       if (sctx->ce_need_synchronization) {
+               radeon_emit(sctx->ce_ib, PKT3(PKT3_INCREMENT_CE_COUNTER, 0, 0));
+               radeon_emit(sctx->ce_ib, 1);
+
+               radeon_emit(sctx->b.gfx.cs, PKT3(PKT3_WAIT_ON_CE_COUNTER, 0, 
0));
+               radeon_emit(sctx->b.gfx.cs, 1);
+       }
+}
+
+static void si_ce_post_draw_synchronization(struct si_context *sctx) {
+       if (sctx->ce_need_synchronization) {
+               radeon_emit(sctx->b.gfx.cs, PKT3(PKT3_INCREMENT_DE_COUNTER, 0, 
0));
+               radeon_emit(sctx->b.gfx.cs, 0);
+
+               sctx->ce_need_synchronization = false;
+       }
+}
+
 void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
 {
        struct si_context *sctx = (struct si_context *)ctx;
@@ -886,8 +905,13 @@ void si_draw_vbo(struct pipe_context *ctx, const struct 
pipe_draw_info *info)
        si_emit_scratch_reloc(sctx);
        si_emit_rasterizer_prim_state(sctx);
        si_emit_draw_registers(sctx, info);
+
+       si_ce_pre_draw_synchronization(sctx);
+
        si_emit_draw_packets(sctx, info, &ib);
 
+       si_ce_post_draw_synchronization(sctx);
+
        if (sctx->trace_buf)
                si_trace_emit(sctx);
 
-- 
2.8.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to