[Mesa-dev] [PATCH v2 07/12] radeonsi: Add CE synchronization.

Bas Nieuwenhuizen bas at basnieuwenhuizen.nl
Sat Apr 16 23:43:04 UTC 2016


Signed-off-by: Bas Nieuwenhuizen <bas at basnieuwenhuizen.nl>
Reviewed-by: Marek Olšák <marek.olsak at 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 40cad50..dd13d51 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -753,6 +753,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;
@@ -882,8 +901,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



More information about the mesa-dev mailing list