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

---
 src/gallium/drivers/radeonsi/si_shader.c        | 16 +++++++++++++++-
 src/gallium/drivers/radeonsi/si_shader.h        |  2 ++
 src/gallium/drivers/radeonsi/si_state_shaders.c |  6 ++++++
 3 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index bc1d5a4..6c1565b 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -6684,20 +6684,24 @@ static void si_dump_shader_key(unsigned processor, 
struct si_shader *shader,
        case PIPE_SHADER_VERTEX:
                si_dump_shader_key_vs(key, &key->part.vs.prolog,
                                      "part.vs.prolog", f);
                fprintf(f, "  as_es = %u\n", key->as_es);
                fprintf(f, "  as_ls = %u\n", key->as_ls);
                fprintf(f, "  part.vs.epilog.export_prim_id = %u\n",
                        key->part.vs.epilog.export_prim_id);
                break;
 
        case PIPE_SHADER_TESS_CTRL:
+               if (shader->selector->screen->b.chip_class >= GFX9) {
+                       si_dump_shader_key_vs(key, &key->part.tcs.ls_prolog,
+                                             "part.tcs.ls_prolog", f);
+               }
                fprintf(f, "  part.tcs.epilog.prim_mode = %u\n", 
key->part.tcs.epilog.prim_mode);
                fprintf(f, "  mono.ff_tcs_inputs_to_copy = 0x%"PRIx64"\n", 
key->mono.ff_tcs_inputs_to_copy);
                break;
 
        case PIPE_SHADER_TESS_EVAL:
                fprintf(f, "  part.tes.epilog.export_prim_id = %u\n", 
key->part.tes.epilog.export_prim_id);
                fprintf(f, "  as_es = %u\n", key->as_es);
                break;
 
        case PIPE_SHADER_GEOMETRY:
@@ -8136,23 +8140,33 @@ static void si_build_tcs_epilog_function(struct 
si_shader_context *ctx,
 }
 
 /**
  * Select and compile (or reuse) TCS parts (epilog).
  */
 static bool si_shader_select_tcs_parts(struct si_screen *sscreen,
                                       LLVMTargetMachineRef tm,
                                       struct si_shader *shader,
                                       struct pipe_debug_callback *debug)
 {
-       union si_shader_part_key epilog_key;
+       if (sscreen->b.chip_class >= GFX9) {
+               struct si_shader *ls_main_part =
+                       shader->key.part.tcs.ls->main_shader_part_ls;
+
+               if (!si_get_vs_prolog(sscreen, tm, shader, debug, ls_main_part,
+                                     &shader->key.part.tcs.ls_prolog))
+                       return false;
+
+               shader->previous_stage = ls_main_part;
+       }
 
        /* Get the epilog. */
+       union si_shader_part_key epilog_key;
        memset(&epilog_key, 0, sizeof(epilog_key));
        epilog_key.tcs_epilog.states = shader->key.part.tcs.epilog;
 
        shader->epilog = si_get_shader_part(sscreen, &sscreen->tcs_epilogs,
                                            PIPE_SHADER_TESS_CTRL, false,
                                            &epilog_key, tm, debug,
                                            si_build_tcs_epilog_function,
                                            "Tessellation Control Shader 
Epilog");
        return shader->epilog != NULL;
 }
diff --git a/src/gallium/drivers/radeonsi/si_shader.h 
b/src/gallium/drivers/radeonsi/si_shader.h
index 92293c4..69874e4 100644
--- a/src/gallium/drivers/radeonsi/si_shader.h
+++ b/src/gallium/drivers/radeonsi/si_shader.h
@@ -428,20 +428,22 @@ union si_shader_part_key {
 };
 
 struct si_shader_key {
        /* Prolog and epilog flags. */
        union {
                struct {
                        struct si_vs_prolog_bits prolog;
                        struct si_vs_epilog_bits epilog;
                } vs;
                struct {
+                       struct si_vs_prolog_bits ls_prolog; /* for merged LS-HS 
*/
+                       struct si_shader_selector *ls;   /* for merged LS-HS */
                        struct si_tcs_epilog_bits epilog;
                } tcs; /* tessellation control shader */
                struct {
                        struct si_vs_epilog_bits epilog; /* same as VS */
                } tes; /* tessellation evaluation shader */
                struct {
                        struct si_gs_prolog_bits prolog;
                } gs;
                struct {
                        struct si_ps_prolog_bits prolog;
diff --git a/src/gallium/drivers/radeonsi/si_state_shaders.c 
b/src/gallium/drivers/radeonsi/si_state_shaders.c
index 2bcde31..4ac6182 100644
--- a/src/gallium/drivers/radeonsi/si_state_shaders.c
+++ b/src/gallium/drivers/radeonsi/si_state_shaders.c
@@ -1052,20 +1052,26 @@ static inline void si_shader_selector_key(struct 
pipe_context *ctx,
                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;
                }
                break;
        case PIPE_SHADER_TESS_CTRL:
+               if (sctx->b.chip_class >= GFX9) {
+                       si_shader_selector_key_vs(sctx, sctx->vs_shader.cso,
+                                                 key, 
&key->part.tcs.ls_prolog);
+                       key->part.tcs.ls = sctx->vs_shader.cso;
+               }
+
                key->part.tcs.epilog.prim_mode =
                        
sctx->tes_shader.cso->info.properties[TGSI_PROPERTY_TES_PRIM_MODE];
                key->part.tcs.epilog.tes_reads_tess_factors =
                        sctx->tes_shader.cso->info.reads_tess_factors;
 
                if (sel == sctx->fixed_func_tcs_shader.cso)
                        key->mono.ff_tcs_inputs_to_copy = 
sctx->vs_shader.cso->outputs_written;
                break;
        case PIPE_SHADER_TESS_EVAL:
                if (sctx->gs_shader.cso)
-- 
2.7.4

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

Reply via email to