Mesa (master): radeonsi: Don't snoop context state while building shaders.

Michel Dänzer daenzer at kemper.freedesktop.org
Fri Oct 26 13:56:25 UTC 2012


Module: Mesa
Branch: master
Commit: 44ef033c25ee0dde97a2339d4439560885d52cad
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=44ef033c25ee0dde97a2339d4439560885d52cad

Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Fri Oct  5 16:59:10 2012 +0200

radeonsi: Don't snoop context state while building shaders.

Let's use the shader key describing the state.

Ported from r600g commit b6521801070d52bdd5908824e82c1ce2dde16e8e.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
Reviewed-by: Tom Stellard <thomas.stellard at amd.com>

---

 src/gallium/drivers/radeonsi/radeonsi_shader.c |    7 ++++-
 src/gallium/drivers/radeonsi/radeonsi_shader.h |   10 +++++++-
 src/gallium/drivers/radeonsi/si_state.c        |   27 ++++++++++++-----------
 3 files changed, 27 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.c b/src/gallium/drivers/radeonsi/radeonsi_shader.c
index 8a55e0d..3275512 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.c
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.c
@@ -55,6 +55,7 @@ struct si_shader_context
 	struct tgsi_parse_context parse;
 	struct tgsi_token * tokens;
 	struct si_pipe_shader *shader;
+	struct si_shader_key key;
 	unsigned type; /* TGSI_PROCESSOR_* specifies the type of shader. */
 	unsigned ninput_emitted;
 /*	struct list_head inputs; */
@@ -405,7 +406,7 @@ static void si_llvm_init_export_args(struct lp_build_tgsi_context *bld_base,
 
 		if (cbuf >= 0 && cbuf < 8) {
 			struct r600_context *rctx = si_shader_ctx->rctx;
-			compressed = (rctx->export_16bpc >> cbuf) & 0x1;
+			compressed = (si_shader_ctx->key.export_16bpc >> cbuf) & 0x1;
 		}
 	}
 
@@ -681,7 +682,8 @@ static const struct lp_build_tgsi_action tex_action = {
 
 int si_pipe_shader_create(
 	struct pipe_context *ctx,
-	struct si_pipe_shader *shader)
+	struct si_pipe_shader *shader,
+	struct si_shader_key key)
 {
 	struct r600_context *rctx = (struct r600_context*)ctx;
 	struct si_pipe_shader_selector *sel = shader->selector;
@@ -718,6 +720,7 @@ int si_pipe_shader_create(
 	si_shader_ctx.tokens = sel->tokens;
 	tgsi_parse_init(&si_shader_ctx.parse, si_shader_ctx.tokens);
 	si_shader_ctx.shader = shader;
+	si_shader_ctx.key = key;
 	si_shader_ctx.type = si_shader_ctx.parse.FullHeader.Processor.Processor;
 	si_shader_ctx.rctx = rctx;
 
diff --git a/src/gallium/drivers/radeonsi/radeonsi_shader.h b/src/gallium/drivers/radeonsi/radeonsi_shader.h
index 4583e62..9d382d5 100644
--- a/src/gallium/drivers/radeonsi/radeonsi_shader.h
+++ b/src/gallium/drivers/radeonsi/radeonsi_shader.h
@@ -77,6 +77,11 @@ struct si_shader {
 	unsigned		nr_cbufs;
 };
 
+struct si_shader_key {
+	unsigned		export_16bpc:8;
+	unsigned		nr_cbufs:4;
+};
+
 struct si_pipe_shader {
 	struct si_pipe_shader_selector	*selector;
 	struct si_pipe_shader		*next_variant;
@@ -88,11 +93,12 @@ struct si_pipe_shader {
 	unsigned			spi_ps_input_ena;
 	unsigned			sprite_coord_enable;
 	unsigned			so_strides[4];
-	unsigned			key;
+	struct si_shader_key		key;
 };
 
 /* radeonsi_shader.c */
-int si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader);
+int si_pipe_shader_create(struct pipe_context *ctx, struct si_pipe_shader *shader,
+			  struct si_shader_key key);
 void si_pipe_shader_destroy(struct pipe_context *ctx, struct si_pipe_shader *shader);
 
 #endif
diff --git a/src/gallium/drivers/radeonsi/si_state.c b/src/gallium/drivers/radeonsi/si_state.c
index c4c529f..20f4be3 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -1830,19 +1830,20 @@ static void si_set_framebuffer_state(struct pipe_context *ctx,
  */
 
 /* Compute the key for the hw shader variant */
-static INLINE unsigned si_shader_selector_key(struct pipe_context *ctx,
-					      struct si_pipe_shader_selector *sel)
+static INLINE struct si_shader_key si_shader_selector_key(struct pipe_context *ctx,
+							  struct si_pipe_shader_selector *sel)
 {
 	struct r600_context *rctx = (struct r600_context *)ctx;
-	unsigned key = 0;
+	struct si_shader_key key;
+	memset(&key, 0, sizeof(key));
 
 	if (sel->type == PIPE_SHADER_FRAGMENT) {
 		if (sel->fs_write_all)
-			key |= rctx->framebuffer.nr_cbufs;
-		key |= rctx->export_16bpc << 4;
+			key.nr_cbufs = rctx->framebuffer.nr_cbufs;
+		key.export_16bpc = rctx->export_16bpc;
 		/*if (rctx->queued.named.rasterizer)
-			  key |= rctx->queued.named.rasterizer->flatshade << 12;*/
-		/*key |== rctx->two_side << 13;*/
+			  key.flatshade = rctx->queued.named.rasterizer->flatshade;*/
+		/*key.color_two_side |== rctx->two_side;*/
 	}
 
 	return key;
@@ -1854,7 +1855,7 @@ int si_shader_select(struct pipe_context *ctx,
 		     struct si_pipe_shader_selector *sel,
 		     unsigned *dirty)
 {
-	unsigned key;
+	struct si_shader_key key;
 	struct si_pipe_shader * shader = NULL;
 	int r;
 
@@ -1864,7 +1865,7 @@ int si_shader_select(struct pipe_context *ctx,
 	 * This path is also used for most shaders that don't need multiple
 	 * variants, it will cost just a computation of the key and this
 	 * test. */
-	if (likely(sel->current && sel->current->key == key)) {
+	if (likely(sel->current && memcmp(&sel->current->key, &key, sizeof(key)) == 0)) {
 		return 0;
 	}
 
@@ -1872,7 +1873,7 @@ int si_shader_select(struct pipe_context *ctx,
 	if (sel->num_shaders > 1) {
 		struct si_pipe_shader *p = sel->current, *c = p->next_variant;
 
-		while (c && c->key != key) {
+		while (c && memcmp(&c->key, &key, sizeof(key)) != 0) {
 			p = c;
 			c = c->next_variant;
 		}
@@ -1887,10 +1888,10 @@ int si_shader_select(struct pipe_context *ctx,
 		shader = CALLOC(1, sizeof(struct si_pipe_shader));
 		shader->selector = sel;
 
-		r = si_pipe_shader_create(ctx, shader);
+		r = si_pipe_shader_create(ctx, shader, key);
 		if (unlikely(r)) {
-			R600_ERR("Failed to build shader variant (type=%u, key=%u) %d\n",
-				 sel->type, key, r);
+			R600_ERR("Failed to build shader variant (type=%u) %d\n",
+				 sel->type, r);
 			sel->current = NULL;
 			return r;
 		}




More information about the mesa-commit mailing list