From 44ef033c25ee0dde97a2339d4439560885d52cad Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michel=20D=C3=A4nzer?= Date: Fri, 5 Oct 2012 16:59:10 +0200 Subject: [PATCH] radeonsi: Don't snoop context state while building shaders. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Let's use the shader key describing the state. Ported from r600g commit b6521801070d52bdd5908824e82c1ce2dde16e8e. Signed-off-by: Michel Dänzer Reviewed-by: Tom Stellard --- .../drivers/radeonsi/radeonsi_shader.c | 7 +++-- .../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 8a55e0dfab0..32755127b58 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 4583e62b9c4..9d382d56286 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 c4c529fe2ab..20f4be3d8f2 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; } -- 2.30.2