[Mesa-dev] [PATCH 17/42] radeonsi: don't rebind GSVS ring buffers every draw call using GS

Marek Olšák maraeo at gmail.com
Sun Aug 30 12:11:47 PDT 2015


From: Marek Olšák <marek.olsak at amd.com>

---
 src/gallium/drivers/radeonsi/si_pipe.h          |  1 +
 src/gallium/drivers/radeonsi/si_shader.h        |  1 +
 src/gallium/drivers/radeonsi/si_state_shaders.c | 11 ++++++++---
 3 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index 9fe1798..47ad619 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -234,6 +234,7 @@ struct si_context {
 	int			last_rast_prim;
 	unsigned		last_sc_line_stipple;
 	int			current_rast_prim; /* primitive type after TES, GS */
+	unsigned		last_gsvs_itemsize;
 
 	/* Scratch buffer */
 	boolean                 emit_scratch_reloc;
diff --git a/src/gallium/drivers/radeonsi/si_shader.h b/src/gallium/drivers/radeonsi/si_shader.h
index c748f71..2305b99 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -185,6 +185,7 @@ struct si_shader_selector {
 	unsigned	gs_output_prim;
 	unsigned	gs_max_out_vertices;
 	unsigned	gs_num_invocations;
+	unsigned	gsvs_itemsize;
 
 	/* masks of "get_unique_index" bits */
 	uint64_t	inputs_read;
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index a4c33fa..af91af9 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -679,6 +679,8 @@ static void *si_create_shader_state(struct pipe_context *ctx,
 			sel->info.properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES];
 		sel->gs_num_invocations =
 			sel->info.properties[TGSI_PROPERTY_GS_INVOCATIONS];
+		sel->gsvs_itemsize = sel->info.num_outputs * 16 *
+				     sel->gs_max_out_vertices;
 
 		for (i = 0; i < sel->info.num_inputs; i++) {
 			unsigned name = sel->info.input_semantic_name[i];
@@ -1096,11 +1098,14 @@ static void si_init_gs_rings(struct si_context *sctx)
 
 static void si_update_gs_rings(struct si_context *sctx)
 {
-	unsigned gs_vert_itemsize = sctx->gs_shader->info.num_outputs * 16;
-	unsigned gs_max_vert_out = sctx->gs_shader->gs_max_out_vertices;
-	unsigned gsvs_itemsize = gs_vert_itemsize * gs_max_vert_out;
+	unsigned gsvs_itemsize = sctx->gs_shader->gsvs_itemsize;
 	uint64_t offset;
 
+	if (gsvs_itemsize == sctx->last_gsvs_itemsize)
+		return;
+
+	sctx->last_gsvs_itemsize = gsvs_itemsize;
+
 	si_set_ring_buffer(&sctx->b.b, PIPE_SHADER_GEOMETRY, SI_RING_GSVS,
 			   sctx->gsvs_ring, gsvs_itemsize,
 			   64, true, true, 4, 16, 0);
-- 
2.1.4



More information about the mesa-dev mailing list