From: Marek Olšák <marek.ol...@amd.com>

---
 src/gallium/drivers/radeonsi/si_state_shaders.c | 31 ++++++++++++++++---------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 8afc731..2bcde31 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -957,20 +957,38 @@ static void si_shader_init_pm4_state(struct si_screen 
*sscreen,
 
 static unsigned si_get_alpha_test_func(struct si_context *sctx)
 {
        /* Alpha-test should be disabled if colorbuffer 0 is integer. */
        if (sctx->queued.named.dsa)
                return sctx->queued.named.dsa->alpha_func;
 
        return PIPE_FUNC_ALWAYS;
 }
 
+static void si_shader_selector_key_vs(struct si_context *sctx,
+                                     struct si_shader_selector *vs,
+                                     struct si_shader_key *key,
+                                     struct si_vs_prolog_bits *prolog_key)
+{
+       if (!sctx->vertex_elements)
+               return;
+
+       unsigned count = MIN2(vs->info.num_inputs,
+                             sctx->vertex_elements->count);
+       for (unsigned i = 0; i < count; ++i) {
+               prolog_key->instance_divisors[i] =
+                       sctx->vertex_elements->elements[i].instance_divisor;
+       }
+
+       memcpy(key->mono.vs_fix_fetch, sctx->vertex_elements->fix_fetch, count);
+}
+
 static void si_shader_selector_key_hw_vs(struct si_context *sctx,
                                         struct si_shader_selector *vs,
                                         struct si_shader_key *key)
 {
        struct si_shader_selector *ps = sctx->ps_shader.cso;
 
        key->opt.hw_vs.clip_disable =
                sctx->queued.named.rasterizer->clip_plane_enable == 0 &&
                (vs->info.clipdist_writemask ||
                 vs->info.writes_clipvertex) &&
@@ -1015,36 +1033,27 @@ static void si_shader_selector_key_hw_vs(struct 
si_context *sctx,
        key->opt.hw_vs.kill_outputs = ~linked & outputs_written;
        key->opt.hw_vs.kill_outputs2 = ~linked2 & outputs_written2;
 }
 
 /* Compute the key for the hw shader variant */
 static inline void si_shader_selector_key(struct pipe_context *ctx,
                                          struct si_shader_selector *sel,
                                          struct si_shader_key *key)
 {
        struct si_context *sctx = (struct si_context *)ctx;
-       unsigned i;
 
        memset(key, 0, sizeof(*key));
 
        switch (sel->type) {
        case PIPE_SHADER_VERTEX:
-               if (sctx->vertex_elements) {
-                       unsigned count = MIN2(sel->info.num_inputs,
-                                             sctx->vertex_elements->count);
-                       for (i = 0; i < count; ++i)
-                               key->part.vs.prolog.instance_divisors[i] =
-                                       
sctx->vertex_elements->elements[i].instance_divisor;
-
-                       memcpy(key->mono.vs_fix_fetch,
-                              sctx->vertex_elements->fix_fetch, count);
-               }
+               si_shader_selector_key_vs(sctx, sel, key, &key->part.vs.prolog);
+
                if (sctx->tes_shader.cso)
                        key->as_ls = 1;
                else if (sctx->gs_shader.cso)
                        key->as_es = 1;
                else {
                        si_shader_selector_key_hw_vs(sctx, sel, key);
 
                        if (sctx->ps_shader.cso && 
sctx->ps_shader.cso->info.uses_primid)
                                key->part.vs.epilog.export_prim_id = 1;
                }
-- 
2.7.4

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to