radeonsi: Don't snoop context state while building shaders.
authorMichel Dänzer <michel.daenzer@amd.com>
Fri, 5 Oct 2012 14:59:10 +0000 (16:59 +0200)
committerMichel Dänzer <michel@daenzer.net>
Fri, 26 Oct 2012 13:51:17 +0000 (15:51 +0200)
Let's use the shader key describing the state.

Ported from r600g commit b6521801070d52bdd5908824e82c1ce2dde16e8e.

Signed-off-by: Michel Dänzer <michel.daenzer@amd.com>
Reviewed-by: Tom Stellard <thomas.stellard@amd.com>
src/gallium/drivers/radeonsi/radeonsi_shader.c
src/gallium/drivers/radeonsi/radeonsi_shader.h
src/gallium/drivers/radeonsi/si_state.c

index 8a55e0dfab0358f8bef7ae72914f243b22b37a33..32755127b58568a0f7576d444bfe45a3aa4f3dde 100644 (file)
@@ -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;
 
index 4583e62b9c4c85963e33e03e31174706bad4dec7..9d382d5628658be16d1b2036fa280a3104817938 100644 (file)
@@ -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
index c4c529fe2abf98ff8373195014aacd555051c3b8..20f4be3d8f2099e652804249bd65dd1ce9e5be14 100644 (file)
@@ -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;
                }