[Mesa-dev] [PATCH 17/26] radeonsi: use pipe_draw_info::instance_count indirectly

Marek Olšák maraeo at gmail.com
Wed Feb 13 05:16:12 UTC 2019


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

It will be modified by compute shader culling.
---
 src/gallium/drivers/radeonsi/si_state_draw.c | 36 ++++++++++++--------
 1 file changed, 22 insertions(+), 14 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c b/src/gallium/drivers/radeonsi/si_state_draw.c
index bf091827828..ba77fb68dcc 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -494,6 +494,7 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
 					  const struct pipe_draw_info *info,
 					  enum pipe_prim_type prim,
 					  unsigned num_patches,
+					  unsigned instance_count,
 					  bool primitive_restart)
 {
 	union si_vgt_param_key key = sctx->ia_multi_vgt_param_key;
@@ -509,10 +510,10 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
 	}
 
 	key.u.prim = prim;
-	key.u.uses_instancing = info->indirect || info->instance_count > 1;
+	key.u.uses_instancing = info->indirect || instance_count > 1;
 	key.u.multi_instances_smaller_than_primgroup =
 		info->indirect ||
-		(info->instance_count > 1 &&
+		(instance_count > 1 &&
 		 (info->count_from_stream_output ||
 		  si_num_prims_for_vertices(info, prim) < primgroup_size));
 	key.u.primitive_restart = primitive_restart;
@@ -534,7 +535,7 @@ static unsigned si_get_ia_multi_vgt_param(struct si_context *sctx,
 		if (sctx->family == CHIP_HAWAII &&
 		    G_028AA8_SWITCH_ON_EOI(ia_multi_vgt_param) &&
 		    (info->indirect ||
-		     (info->instance_count > 1 &&
+		     (instance_count > 1 &&
 		      (info->count_from_stream_output ||
 		       si_num_prims_for_vertices(info, prim) <= 1))))
 			sctx->flags |= SI_CONTEXT_VGT_FLUSH;
@@ -618,6 +619,7 @@ static void si_emit_draw_registers(struct si_context *sctx,
 				   const struct pipe_draw_info *info,
 				   enum pipe_prim_type prim,
 				   unsigned num_patches,
+				   unsigned instance_count,
 				   bool primitive_restart)
 {
 	struct radeon_cmdbuf *cs = sctx->gfx_cs;
@@ -625,7 +627,7 @@ static void si_emit_draw_registers(struct si_context *sctx,
 	unsigned ia_multi_vgt_param;
 
 	ia_multi_vgt_param = si_get_ia_multi_vgt_param(sctx, info, prim, num_patches,
-						       primitive_restart);
+						       instance_count, primitive_restart);
 
 	/* Draw state. */
 	if (ia_multi_vgt_param != sctx->last_multi_vgt_param) {
@@ -673,7 +675,8 @@ static void si_emit_draw_packets(struct si_context *sctx,
 				 const struct pipe_draw_info *info,
 				 struct pipe_resource *indexbuf,
 				 unsigned index_size,
-				 unsigned index_offset)
+				 unsigned index_offset,
+				 unsigned instance_count)
 {
 	struct pipe_draw_indirect_info *indirect = info->indirect;
 	struct radeon_cmdbuf *cs = sctx->gfx_cs;
@@ -815,7 +818,6 @@ static void si_emit_draw_packets(struct si_context *sctx,
 			radeon_emit(cs, di_src_sel);
 		}
 	} else {
-		unsigned instance_count = info->instance_count;
 		int base_vertex;
 
 		if (sctx->last_instance_count == SI_INSTANCE_COUNT_UNKNOWN ||
@@ -1204,8 +1206,8 @@ static void si_get_draw_start_count(struct si_context *sctx,
 }
 
 static void si_emit_all_states(struct si_context *sctx, const struct pipe_draw_info *info,
-			       enum pipe_prim_type prim, bool primitive_restart,
-			       unsigned skip_atom_mask)
+			       enum pipe_prim_type prim, unsigned instance_count,
+			       bool primitive_restart, unsigned skip_atom_mask)
 {
 	unsigned num_patches = 0;
 	/* Vega10/Raven scissor bug workaround. When any context register is
@@ -1258,7 +1260,8 @@ static void si_emit_all_states(struct si_context *sctx, const struct pipe_draw_i
 
 	/* Emit draw states. */
 	si_emit_vs_state(sctx, info);
-	si_emit_draw_registers(sctx, info, prim, num_patches, primitive_restart);
+	si_emit_draw_registers(sctx, info, prim, num_patches, instance_count,
+			       primitive_restart);
 }
 
 static void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
@@ -1270,6 +1273,7 @@ static void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *i
 	enum pipe_prim_type rast_prim, prim = info->mode;
 	unsigned index_size = info->index_size;
 	unsigned index_offset = info->indirect ? info->start * index_size : 0;
+	unsigned instance_count = info->instance_count;
 	bool primitive_restart = info->primitive_restart;
 
 	if (likely(!info->indirect)) {
@@ -1277,7 +1281,7 @@ static void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *i
 		 * no workaround for indirect draws, but we can at least skip
 		 * direct draws.
 		 */
-		if (unlikely(!info->instance_count))
+		if (unlikely(!instance_count))
 			return;
 
 		/* Handle count == 0. */
@@ -1474,7 +1478,8 @@ static void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *i
 			goto return_cleanup;
 
 		/* Emit all states except possibly render condition. */
-		si_emit_all_states(sctx, info, prim, primitive_restart, masked_atoms);
+		si_emit_all_states(sctx, info, prim, instance_count,
+				   primitive_restart, masked_atoms);
 		si_emit_cache_flush(sctx);
 		/* <-- CUs are idle here. */
 
@@ -1482,7 +1487,8 @@ static void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *i
 			sctx->atoms.s.render_cond.emit(sctx);
 		sctx->dirty_atoms = 0;
 
-		si_emit_draw_packets(sctx, info, indexbuf, index_size, index_offset);
+		si_emit_draw_packets(sctx, info, indexbuf, index_size, index_offset,
+				     instance_count);
 		/* <-- CUs are busy here. */
 
 		/* Start prefetches after the draw has been started. Both will run
@@ -1504,8 +1510,10 @@ static void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *i
 		if (!si_upload_graphics_shader_descriptors(sctx))
 			return;
 
-		si_emit_all_states(sctx, info, prim, primitive_restart, 0);
-		si_emit_draw_packets(sctx, info, indexbuf, index_size, index_offset);
+		si_emit_all_states(sctx, info, prim, instance_count,
+				   primitive_restart, 0);
+		si_emit_draw_packets(sctx, info, indexbuf, index_size, index_offset,
+				     instance_count);
 
 		/* Prefetch the remaining shaders after the draw has been
 		 * started. */
-- 
2.17.1



More information about the mesa-dev mailing list