radeonsi: add si_shader_selector::vs_needs_prolog
authorMarek Olšák <marek.olsak@amd.com>
Tue, 21 Feb 2017 19:32:51 +0000 (20:32 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Sun, 16 Apr 2017 23:22:11 +0000 (01:22 +0200)
cleanup

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 00264b57963020059d5de896b189ba58201ba952..b49e801101c460b35be4282223bb5e97f84bfffa 100644 (file)
@@ -7539,7 +7539,7 @@ int si_compile_tgsi_shader(struct si_screen *sscreen,
                bool need_prolog;
                bool need_epilog;
 
-               need_prolog = sel->info.num_inputs;
+               need_prolog = sel->vs_needs_prolog;
                need_epilog = !shader->key.as_es && !shader->key.as_ls;
 
                parts[need_prolog ? 1 : 0] = ctx.main_fn;
@@ -7992,14 +7992,12 @@ static bool si_shader_select_vs_parts(struct si_screen *sscreen,
                                      struct si_shader *shader,
                                      struct pipe_debug_callback *debug)
 {
-       struct tgsi_shader_info *info = &shader->selector->info;
-       union si_shader_part_key prolog_key;
+       if (shader->selector->vs_needs_prolog) {
+               union si_shader_part_key prolog_key;
 
-       /* Get the prolog. */
-       si_get_vs_prolog_key(shader, &prolog_key);
+               /* Get the prolog. */
+               si_get_vs_prolog_key(shader, &prolog_key);
 
-       /* The prolog is a no-op if there are no inputs. */
-       if (info->num_inputs) {
                shader->prolog =
                        si_get_shader_part(sscreen, &sscreen->vs_prologs,
                                           PIPE_SHADER_VERTEX, true,
index f145eab14f31d23ecdcff1567137b1a47288fa47..cfa691b0589555d832ec69cec6fab937c8a41781 100644 (file)
@@ -298,6 +298,7 @@ struct si_shader_selector {
 
        /* PIPE_SHADER_[VERTEX|FRAGMENT|...] */
        unsigned        type;
+       bool            vs_needs_prolog;
 
        /* GS parameters. */
        unsigned        esgs_itemsize;
index 9d05871b8e27c16fab4862d6112ad5c7e342e4c5..21185c37fa87a59504058d81449ea146a642dd14 100644 (file)
@@ -1610,6 +1610,10 @@ static void *si_create_shader_selector(struct pipe_context *ctx,
        sel->type = sel->info.processor;
        p_atomic_inc(&sscreen->b.num_shaders_created);
 
+       /* The prolog is a no-op if there are no inputs. */
+       sel->vs_needs_prolog = sel->type == PIPE_SHADER_VERTEX &&
+                              sel->info.num_inputs;
+
        /* Set which opcode uses which (i,j) pair. */
        if (sel->info.uses_persp_opcode_interp_centroid)
                sel->info.uses_persp_centroid = true;