Mesa (main): radeonsi: add is_gs parameter into si_vs_needs_prolog

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Nov 20 00:33:41 UTC 2021


Module: Mesa
Branch: main
Commit: a368385b23e4daf41280be12d2eb269a38ec04d0
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a368385b23e4daf41280be12d2eb269a38ec04d0

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Tue Nov 16 19:45:20 2021 -0500

radeonsi: add is_gs parameter into si_vs_needs_prolog

and disable the VS prolog code for GS.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13829>

---

 src/gallium/drivers/radeonsi/si_shader.c          | 11 +++++++----
 src/gallium/drivers/radeonsi/si_shader_internal.h |  2 +-
 src/gallium/drivers/radeonsi/si_shader_llvm.c     | 11 ++++++-----
 3 files changed, 14 insertions(+), 10 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c
index c9df3cca914..4c53477e92b 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1289,7 +1289,8 @@ static void si_dump_shader_key(const struct si_shader *shader, FILE *f)
 
 bool si_vs_needs_prolog(const struct si_shader_selector *sel,
                         const struct si_vs_prolog_bits *prolog_key,
-                        const union si_shader_key *key, bool ngg_cull_shader)
+                        const union si_shader_key *key, bool ngg_cull_shader,
+                        bool is_gs)
 {
    assert(sel->info.stage == MESA_SHADER_VERTEX);
 
@@ -1297,7 +1298,7 @@ bool si_vs_needs_prolog(const struct si_shader_selector *sel,
     * VS prolog. */
    return sel->vs_needs_prolog || prolog_key->ls_vgpr_fix ||
           /* The 2nd VS prolog loads input VGPRs from LDS */
-          (key->ge.opt.ngg_culling && !ngg_cull_shader);
+          (key->ge.opt.ngg_culling && !ngg_cull_shader && !is_gs);
 }
 
 /**
@@ -1323,7 +1324,8 @@ void si_get_vs_prolog_key(const struct si_shader_info *info, unsigned num_input_
    key->vs_prolog.as_es = shader_out->key.ge.as_es;
    key->vs_prolog.as_ngg = shader_out->key.ge.as_ngg;
 
-   if (!ngg_cull_shader && shader_out->key.ge.opt.ngg_culling)
+   if (shader_out->selector->info.stage != MESA_SHADER_GEOMETRY &&
+       !ngg_cull_shader && shader_out->key.ge.opt.ngg_culling)
       key->vs_prolog.load_vgprs_after_culling = 1;
 
    if (shader_out->selector->info.stage == MESA_SHADER_TESS_CTRL) {
@@ -1652,7 +1654,8 @@ static bool si_get_vs_prolog(struct si_screen *sscreen, struct ac_llvm_compiler
 {
    struct si_shader_selector *vs = main_part->selector;
 
-   if (!si_vs_needs_prolog(vs, key, &shader->key, false))
+   if (!si_vs_needs_prolog(vs, key, &shader->key, false,
+                           shader->selector->info.stage == MESA_SHADER_GEOMETRY))
       return true;
 
    /* Get the prolog. */
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
index 2acdd838bbf..4a7d216b77a 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -171,7 +171,7 @@ void si_init_shader_args(struct si_shader_context *ctx, bool ngg_cull_shader);
 unsigned si_get_max_workgroup_size(const struct si_shader *shader);
 bool si_vs_needs_prolog(const struct si_shader_selector *sel,
                         const struct si_vs_prolog_bits *prolog_key,
-                        const union si_shader_key *key, bool ngg_cull_shader);
+                        const union si_shader_key *key, bool ngg_cull_shader, bool is_gs);
 void si_get_vs_prolog_key(const struct si_shader_info *info, unsigned num_input_sgprs,
                           bool ngg_cull_shader, const struct si_vs_prolog_bits *prolog_key,
                           struct si_shader *shader_out, union si_shader_part_key *key);
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c
index dd944e7f8b5..063b24d50e1 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c
@@ -955,7 +955,8 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
       if ((!shader->is_monolithic || no_wrapper_func) &&
           (ctx->stage == MESA_SHADER_TESS_EVAL ||
            (ctx->stage == MESA_SHADER_VERTEX &&
-            !si_vs_needs_prolog(sel, &shader->key.ge.part.vs.prolog, &shader->key, ngg_cull_shader))))
+            !si_vs_needs_prolog(sel, &shader->key.ge.part.vs.prolog, &shader->key, ngg_cull_shader,
+                                false))))
          ac_init_exec_full_mask(&ctx->ac);
 
       /* NGG VS and NGG TES: Send gs_alloc_req and the prim export at the beginning to decrease
@@ -1113,7 +1114,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
       LLVMValueRef main_fn = ctx.main_fn;
 
       if (ngg_cull_main_fn) {
-         if (si_vs_needs_prolog(sel, &shader->key.ge.part.vs.prolog, &shader->key, true)) {
+         if (si_vs_needs_prolog(sel, &shader->key.ge.part.vs.prolog, &shader->key, true, false)) {
             union si_shader_part_key prolog_key;
             si_get_vs_prolog_key(&sel->info, shader->info.num_input_sgprs, true,
                                  &shader->key.ge.part.vs.prolog, shader, &prolog_key);
@@ -1125,7 +1126,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
          parts[num_parts++] = ngg_cull_main_fn;
       }
 
-      if (si_vs_needs_prolog(sel, &shader->key.ge.part.vs.prolog, &shader->key, false)) {
+      if (si_vs_needs_prolog(sel, &shader->key.ge.part.vs.prolog, &shader->key, false, false)) {
          union si_shader_part_key prolog_key;
          si_get_vs_prolog_key(&sel->info, shader->info.num_input_sgprs, false,
                               &shader->key.ge.part.vs.prolog, shader, &prolog_key);
@@ -1162,7 +1163,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
          struct si_shader_selector *ls = shader->key.ge.part.tcs.ls;
          LLVMValueRef parts[4];
          bool vs_needs_prolog =
-            si_vs_needs_prolog(ls, &shader->key.ge.part.tcs.ls_prolog, &shader->key, false);
+            si_vs_needs_prolog(ls, &shader->key.ge.part.tcs.ls_prolog, &shader->key, false, false);
 
          /* TCS main part */
          parts[2] = ctx.main_fn;
@@ -1254,7 +1255,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
 
          /* ES prolog */
          if (es->info.stage == MESA_SHADER_VERTEX &&
-             si_vs_needs_prolog(es, &shader->key.ge.part.gs.vs_prolog, &shader->key, false)) {
+             si_vs_needs_prolog(es, &shader->key.ge.part.gs.vs_prolog, &shader->key, false, true)) {
             union si_shader_part_key vs_prolog_key;
             si_get_vs_prolog_key(&es->info, shader_es.info.num_input_sgprs, false,
                                  &shader->key.ge.part.gs.vs_prolog, shader, &vs_prolog_key);



More information about the mesa-commit mailing list