radeonsi: use uint32_t to declare si_shader_key.opt.kill_outputs
authorMarek Olšák <marek.olsak@amd.com>
Fri, 9 Jun 2017 15:25:29 +0000 (17:25 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Mon, 12 Jun 2017 16:24:37 +0000 (18:24 +0200)
the next patch will benefit from this

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/gallium/drivers/radeonsi/si_shader.c
src/gallium/drivers/radeonsi/si_shader.h
src/gallium/drivers/radeonsi/si_state_shaders.c

index a6b7e5ebf53447defacb39f6935280a7f1c6b9d5..4ee4a64f531f7f8dcdc62f1e3065fc862665765e 100644 (file)
@@ -2276,6 +2276,7 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                semantic_name = outputs[i].semantic_name;
                semantic_index = outputs[i].semantic_index;
                bool export_param = true;
+               unsigned id;
 
                switch (semantic_name) {
                case TGSI_SEMANTIC_POSITION: /* ignore these */
@@ -2289,8 +2290,8 @@ static void si_llvm_export_vs(struct lp_build_tgsi_context *bld_base,
                                break;
                        /* fall through */
                default:
-                       if (shader->key.opt.kill_outputs &
-                           (1ull << si_shader_io_get_unique_index(semantic_name, semantic_index)))
+                       id = si_shader_io_get_unique_index(semantic_name, semantic_index);
+                       if (shader->key.opt.kill_outputs[id / 32] & (1u << (id % 32)))
                                export_param = false;
                }
 
@@ -5335,7 +5336,8 @@ static void si_dump_shader_key(unsigned processor, const struct si_shader *shade
             processor == PIPE_SHADER_TESS_EVAL ||
             processor == PIPE_SHADER_VERTEX) &&
            !key->as_es && !key->as_ls) {
-               fprintf(f, "  opt.kill_outputs = 0x%"PRIx64"\n", key->opt.kill_outputs);
+               fprintf(f, "  opt.kill_outputs[0] = 0x%x\n", key->opt.kill_outputs[0]);
+               fprintf(f, "  opt.kill_outputs[1] = 0x%x\n", key->opt.kill_outputs[1]);
                fprintf(f, "  opt.clip_disable = %u\n", key->opt.clip_disable);
        }
 }
index de520a273637303ee6ce31afbd7a0860598b6baa..76e09b27e7cd62c1ed94c7ae599fa7fcc81f3da8 100644 (file)
@@ -501,7 +501,8 @@ struct si_shader_key {
        /* Optimization flags for asynchronous compilation only. */
        struct {
                /* For HW VS (it can be VS, TES, GS) */
-               uint64_t        kill_outputs; /* "get_unique_index" bits */
+               /* Don't use "uint64_t" in order to get 32-bit alignment. */
+               uint32_t        kill_outputs[2]; /* "get_unique_index" bits */
                unsigned        clip_disable:1;
 
                /* For shaders where monolithic variants have better code.
index 07e6a42857511ea16d0470984017b7cbb22a36b3..15e46b5a5e8edb48ad4269d14886a36ea30b5bef 100644 (file)
@@ -1241,9 +1241,10 @@ static void si_shader_selector_key_hw_vs(struct si_context *sctx,
                inputs_read = ps->inputs_read;
        }
 
-       uint64_t linked = outputs_written & inputs_read;
+       uint64_t kill_outputs = ~(outputs_written & inputs_read) & outputs_written;
 
-       key->opt.kill_outputs = ~linked & outputs_written;
+       key->opt.kill_outputs[0] = kill_outputs;
+       key->opt.kill_outputs[1] = kill_outputs >> 32;
 }
 
 /* Compute the key for the hw shader variant */