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