Mesa (main): ac/llvm: remove ac_shader_abi::emit_outputs

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri May 13 12:22:27 UTC 2022


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

Author: Marek Olšák <marek.olsak at amd.com>
Date:   Thu May  5 20:36:55 2022 -0400

ac/llvm: remove ac_shader_abi::emit_outputs

it's called last in ac_nir_translate, so call it in the caller.

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

---

 src/amd/llvm/ac_nir_to_llvm.c                      |  3 --
 src/amd/llvm/ac_shader_abi.h                       |  2 --
 src/amd/vulkan/radv_nir_to_llvm.c                  |  4 ++-
 src/gallium/drivers/radeonsi/si_shader_internal.h  |  3 ++
 src/gallium/drivers/radeonsi/si_shader_llvm.c      | 41 ++++++++++++++++++++++
 src/gallium/drivers/radeonsi/si_shader_llvm_gs.c   |  3 +-
 src/gallium/drivers/radeonsi/si_shader_llvm_ps.c   |  3 +-
 src/gallium/drivers/radeonsi/si_shader_llvm_tess.c | 12 +------
 src/gallium/drivers/radeonsi/si_shader_llvm_vs.c   | 13 -------
 9 files changed, 50 insertions(+), 34 deletions(-)

diff --git a/src/amd/llvm/ac_nir_to_llvm.c b/src/amd/llvm/ac_nir_to_llvm.c
index efdad1449b6..3b638ceb5a7 100644
--- a/src/amd/llvm/ac_nir_to_llvm.c
+++ b/src/amd/llvm/ac_nir_to_llvm.c
@@ -5464,9 +5464,6 @@ void ac_nir_translate(struct ac_llvm_context *ac, struct ac_shader_abi *abi,
    if (ctx.ac.postponed_kill)
       ac_build_kill_if_false(&ctx.ac, LLVMBuildLoad2(ctx.ac.builder, ctx.ac.i1, ctx.ac.postponed_kill, ""));
 
-   if (!gl_shader_stage_is_compute(nir->info.stage))
-      ctx.abi->emit_outputs(ctx.abi);
-
    free(ctx.ssa_defs);
    ralloc_free(ctx.defs);
    ralloc_free(ctx.phis);
diff --git a/src/amd/llvm/ac_shader_abi.h b/src/amd/llvm/ac_shader_abi.h
index d71d25c6c0d..b7406b92b70 100644
--- a/src/amd/llvm/ac_shader_abi.h
+++ b/src/amd/llvm/ac_shader_abi.h
@@ -51,8 +51,6 @@ struct ac_shader_abi {
 
    void (*export_vertex)(struct ac_shader_abi *abi);
 
-   void (*emit_outputs)(struct ac_shader_abi *abi);
-
    void (*emit_vertex)(struct ac_shader_abi *abi, unsigned stream, LLVMValueRef *addrs);
 
    void (*emit_primitive)(struct ac_shader_abi *abi, unsigned stream);
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c b/src/amd/vulkan/radv_nir_to_llvm.c
index 80df23e144b..ecfd4f94f36 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -2044,7 +2044,6 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm,
 
    create_function(&ctx, shaders[shader_count - 1]->info.stage, shader_count >= 2);
 
-   ctx.abi.emit_outputs = handle_shader_outputs_post;
    ctx.abi.emit_vertex_with_counter = visit_emit_vertex_with_counter;
    ctx.abi.load_ubo = radv_load_ubo;
    ctx.abi.load_ssbo = radv_load_ssbo;
@@ -2185,6 +2184,9 @@ ac_translate_nir_to_llvm(struct ac_llvm_compiler *ac_llvm,
 
       ac_nir_translate(&ctx.ac, &ctx.abi, &args->ac, shaders[shader_idx]);
 
+      if (!gl_shader_stage_is_compute(shaders[shader_idx]->info.stage))
+         handle_shader_outputs_post(&ctx.abi);
+
       if (shader_count >= 2 || is_ngg) {
          LLVMBuildBr(ctx.ac.builder, merge_block);
          LLVMPositionBuilderAtEnd(ctx.ac.builder, merge_block);
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h
index fa120e8322a..f5e0b973b19 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -240,12 +240,14 @@ LLVMValueRef si_is_gs_thread(struct si_shader_context *ctx);
 void si_llvm_emit_es_epilogue(struct ac_shader_abi *abi);
 void si_preload_esgs_ring(struct si_shader_context *ctx);
 void si_preload_gs_rings(struct si_shader_context *ctx);
+void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi);
 void si_llvm_init_gs_callbacks(struct si_shader_context *ctx);
 
 /* si_shader_llvm_tess.c */
 void si_llvm_preload_tes_rings(struct si_shader_context *ctx);
 void si_llvm_emit_ls_epilogue(struct ac_shader_abi *abi);
 void si_llvm_build_tcs_epilog(struct si_shader_context *ctx, union si_shader_part_key *key);
+void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi);
 void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx);
 void si_llvm_init_tes_callbacks(struct si_shader_context *ctx, bool ngg_cull_shader);
 
@@ -254,6 +256,7 @@ LLVMValueRef si_get_sample_id(struct si_shader_context *ctx);
 void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union si_shader_part_key *key);
 void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part_key *key);
 void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader *shader);
+void si_llvm_return_fs_outputs(struct ac_shader_abi *abi);
 void si_llvm_init_ps_callbacks(struct si_shader_context *ctx);
 
 /* si_shader_llvm_resources.c */
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c
index b23c39d64db..53ec19b42e8 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c
@@ -1029,6 +1029,47 @@ bool si_llvm_translate_nir(struct si_shader_context *ctx, struct si_shader *shad
 
    ac_nir_translate(&ctx->ac, &ctx->abi, &ctx->args, nir);
 
+   switch (sel->stage) {
+   case MESA_SHADER_VERTEX:
+      if (shader->key.ge.as_ls)
+         si_llvm_emit_ls_epilogue(&ctx->abi);
+      else if (shader->key.ge.as_es)
+         si_llvm_emit_es_epilogue(&ctx->abi);
+      else if (ngg_cull_shader)
+         gfx10_emit_ngg_culling_epilogue(&ctx->abi);
+      else if (shader->key.ge.as_ngg)
+         gfx10_emit_ngg_epilogue(&ctx->abi);
+      else
+         si_llvm_emit_vs_epilogue(&ctx->abi);
+      break;
+
+   case MESA_SHADER_TESS_CTRL:
+      si_llvm_emit_tcs_epilogue(&ctx->abi);
+      break;
+
+   case MESA_SHADER_TESS_EVAL:
+      if (ctx->shader->key.ge.as_es)
+         si_llvm_emit_es_epilogue(&ctx->abi);
+      else if (ngg_cull_shader)
+         gfx10_emit_ngg_culling_epilogue(&ctx->abi);
+      else if (ctx->shader->key.ge.as_ngg)
+         gfx10_emit_ngg_epilogue(&ctx->abi);
+      else
+         si_llvm_emit_vs_epilogue(&ctx->abi);
+      break;
+
+   case MESA_SHADER_GEOMETRY:
+      si_llvm_emit_gs_epilogue(&ctx->abi);
+      break;
+
+   case MESA_SHADER_FRAGMENT:
+      si_llvm_return_fs_outputs(&ctx->abi);
+      break;
+
+   default:
+      break;
+   }
+
    si_llvm_build_ret(ctx, ctx->return_value);
 
    if (free_nir)
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c
index 4ddc860aca7..92b289cd199 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_gs.c
@@ -271,7 +271,7 @@ static void emit_gs_epilogue(struct si_shader_context *ctx)
       ac_build_endif(&ctx->ac, ctx->merged_wrap_if_label);
 }
 
-static void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi)
+void si_llvm_emit_gs_epilogue(struct ac_shader_abi *abi)
 {
    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
    struct si_shader_info UNUSED *info = &ctx->shader->selector->info;
@@ -658,5 +658,4 @@ void si_llvm_init_gs_callbacks(struct si_shader_context *ctx)
    ctx->abi.load_inputs = si_nir_load_input_gs;
    ctx->abi.emit_vertex = si_llvm_emit_vertex;
    ctx->abi.emit_primitive = si_llvm_emit_primitive;
-   ctx->abi.emit_outputs = si_llvm_emit_gs_epilogue;
 }
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c
index 4745353f78c..5b9b50298af 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c
@@ -470,7 +470,7 @@ static void si_export_mrt_color(struct si_shader_context *ctx, LLVMValueRef *col
  *
  * The alpha-ref SGPR is returned via its original location.
  */
-static void si_llvm_return_fs_outputs(struct ac_shader_abi *abi)
+void si_llvm_return_fs_outputs(struct ac_shader_abi *abi)
 {
    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
    struct si_shader *shader = ctx->shader;
@@ -987,7 +987,6 @@ void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader
 
 void si_llvm_init_ps_callbacks(struct si_shader_context *ctx)
 {
-   ctx->abi.emit_outputs = si_llvm_return_fs_outputs;
    ctx->abi.load_sample_position = load_sample_position;
    ctx->abi.load_sample_mask_in = load_sample_mask_in;
    ctx->abi.emit_fbfetch = si_nir_emit_fbfetch;
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
index 7b907b09dd0..32c5574cc2b 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
@@ -832,7 +832,7 @@ static void si_write_tess_factors(struct si_shader_context *ctx, union si_shader
 }
 
 /* This only writes the tessellation factor levels. */
-static void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi)
+void si_llvm_emit_tcs_epilogue(struct ac_shader_abi *abi)
 {
    struct si_shader_context *ctx = si_shader_context_from_abi(abi);
    LLVMBuilderRef builder = ctx->ac.builder;
@@ -1090,7 +1090,6 @@ void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx)
    ctx->abi.load_tess_varyings = si_nir_load_tcs_varyings;
    ctx->abi.load_tess_level = si_load_tess_level;
    ctx->abi.store_tcs_outputs = si_nir_store_output_tcs;
-   ctx->abi.emit_outputs = si_llvm_emit_tcs_epilogue;
    ctx->abi.load_patch_vertices_in = si_load_patch_vertices_in;
 }
 
@@ -1099,13 +1098,4 @@ void si_llvm_init_tes_callbacks(struct si_shader_context *ctx, bool ngg_cull_sha
    ctx->abi.load_tess_varyings = si_nir_load_input_tes;
    ctx->abi.load_tess_level = si_load_tess_level;
    ctx->abi.load_patch_vertices_in = si_load_patch_vertices_in;
-
-   if (ctx->shader->key.ge.as_es)
-      ctx->abi.emit_outputs = si_llvm_emit_es_epilogue;
-   else if (ngg_cull_shader)
-      ctx->abi.emit_outputs = gfx10_emit_ngg_culling_epilogue;
-   else if (ctx->shader->key.ge.as_ngg)
-      ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue;
-   else
-      ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
 }
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
index c4de9b7570f..ca0a1a869b5 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
@@ -1008,19 +1008,6 @@ static LLVMValueRef get_base_vertex(struct ac_shader_abi *abi, bool non_indexed_
 
 void si_llvm_init_vs_callbacks(struct si_shader_context *ctx, bool ngg_cull_shader)
 {
-   struct si_shader *shader = ctx->shader;
-
-   if (shader->key.ge.as_ls)
-      ctx->abi.emit_outputs = si_llvm_emit_ls_epilogue;
-   else if (shader->key.ge.as_es)
-      ctx->abi.emit_outputs = si_llvm_emit_es_epilogue;
-   else if (ngg_cull_shader)
-      ctx->abi.emit_outputs = gfx10_emit_ngg_culling_epilogue;
-   else if (shader->key.ge.as_ngg)
-      ctx->abi.emit_outputs = gfx10_emit_ngg_epilogue;
-   else
-      ctx->abi.emit_outputs = si_llvm_emit_vs_epilogue;
-
    ctx->abi.load_base_vertex = get_base_vertex;
    ctx->abi.load_inputs = si_load_vs_input;
 }



More information about the mesa-commit mailing list