[Mesa-dev] [PATCH 12/61] radeonsi: separate out VS prolog key generation

Marek Olšák maraeo at gmail.com
Mon Apr 24 08:45:09 UTC 2017


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

---
 src/gallium/drivers/radeonsi/si_state_shaders.c | 31 ++++++++++++++++---------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 8afc731..2bcde31 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -957,20 +957,38 @@ static void si_shader_init_pm4_state(struct si_screen *sscreen,
 
 static unsigned si_get_alpha_test_func(struct si_context *sctx)
 {
 	/* Alpha-test should be disabled if colorbuffer 0 is integer. */
 	if (sctx->queued.named.dsa)
 		return sctx->queued.named.dsa->alpha_func;
 
 	return PIPE_FUNC_ALWAYS;
 }
 
+static void si_shader_selector_key_vs(struct si_context *sctx,
+				      struct si_shader_selector *vs,
+				      struct si_shader_key *key,
+				      struct si_vs_prolog_bits *prolog_key)
+{
+	if (!sctx->vertex_elements)
+		return;
+
+	unsigned count = MIN2(vs->info.num_inputs,
+			      sctx->vertex_elements->count);
+	for (unsigned i = 0; i < count; ++i) {
+		prolog_key->instance_divisors[i] =
+			sctx->vertex_elements->elements[i].instance_divisor;
+	}
+
+	memcpy(key->mono.vs_fix_fetch, sctx->vertex_elements->fix_fetch, count);
+}
+
 static void si_shader_selector_key_hw_vs(struct si_context *sctx,
 					 struct si_shader_selector *vs,
 					 struct si_shader_key *key)
 {
 	struct si_shader_selector *ps = sctx->ps_shader.cso;
 
 	key->opt.hw_vs.clip_disable =
 		sctx->queued.named.rasterizer->clip_plane_enable == 0 &&
 		(vs->info.clipdist_writemask ||
 		 vs->info.writes_clipvertex) &&
@@ -1015,36 +1033,27 @@ static void si_shader_selector_key_hw_vs(struct si_context *sctx,
 	key->opt.hw_vs.kill_outputs = ~linked & outputs_written;
 	key->opt.hw_vs.kill_outputs2 = ~linked2 & outputs_written2;
 }
 
 /* Compute the key for the hw shader variant */
 static inline void si_shader_selector_key(struct pipe_context *ctx,
 					  struct si_shader_selector *sel,
 					  struct si_shader_key *key)
 {
 	struct si_context *sctx = (struct si_context *)ctx;
-	unsigned i;
 
 	memset(key, 0, sizeof(*key));
 
 	switch (sel->type) {
 	case PIPE_SHADER_VERTEX:
-		if (sctx->vertex_elements) {
-			unsigned count = MIN2(sel->info.num_inputs,
-					      sctx->vertex_elements->count);
-			for (i = 0; i < count; ++i)
-				key->part.vs.prolog.instance_divisors[i] =
-					sctx->vertex_elements->elements[i].instance_divisor;
-
-			memcpy(key->mono.vs_fix_fetch,
-			       sctx->vertex_elements->fix_fetch, count);
-		}
+		si_shader_selector_key_vs(sctx, sel, key, &key->part.vs.prolog);
+
 		if (sctx->tes_shader.cso)
 			key->as_ls = 1;
 		else if (sctx->gs_shader.cso)
 			key->as_es = 1;
 		else {
 			si_shader_selector_key_hw_vs(sctx, sel, key);
 
 			if (sctx->ps_shader.cso && sctx->ps_shader.cso->info.uses_primid)
 				key->part.vs.epilog.export_prim_id = 1;
 		}
-- 
2.7.4



More information about the mesa-dev mailing list