Module: Mesa
Branch: staging/20.0
Commit: d160bd3cf030981397c16f10df0c1a860008b1c4
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d160bd3cf030981397c16f10df0c1a860008b1c4

Author: Pierre-Eric Pelloux-Prayer <[email protected]>
Date:   Tue Apr 14 18:04:35 2020 +0200

radeonsi: skip vs output optimizations for some outputs

If PT_SPRITE_TEX is enabled, PS inputs are overriden at runtime so
we can't apply the vs output optim.

Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/2747
Fixes: 3ec9975555d ("radeonsi: eliminate trivial constant VS outputs")
Reviewed-by: Marek Olšák <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4559>
(cherry picked from commit 17acff01a00109c87d59b9d876fc735dd5fbe3d1)

---

 .pick_status.json                        |  4 ++--
 src/amd/llvm/ac_llvm_build.c             |  4 ++++
 src/amd/llvm/ac_llvm_build.h             |  1 +
 src/amd/vulkan/radv_nir_to_llvm.c        |  2 +-
 src/gallium/drivers/radeonsi/si_shader.c | 11 +++++++++++
 5 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/.pick_status.json b/.pick_status.json
index 1f82998eed6..f0344e50a06 100644
--- a/.pick_status.json
+++ b/.pick_status.json
@@ -1291,7 +1291,7 @@
         "description": "radeonsi: skip vs output optimizations for some 
outputs",
         "nominated": true,
         "nomination_type": 1,
-        "resolution": 0,
+        "resolution": 1,
         "master_sha": null,
         "because_sha": "3ec9975555d1cc5365413ad9062f412904f944a3"
     },
@@ -25730,4 +25730,4 @@
         "master_sha": null,
         "because_sha": null
     }
-]
\ No newline at end of file
+]
diff --git a/src/amd/llvm/ac_llvm_build.c b/src/amd/llvm/ac_llvm_build.c
index 4b2331a524a..d78110ba820 100644
--- a/src/amd/llvm/ac_llvm_build.c
+++ b/src/amd/llvm/ac_llvm_build.c
@@ -3081,6 +3081,7 @@ void ac_optimize_vs_outputs(struct ac_llvm_context *ctx,
                            LLVMValueRef main_fn,
                            uint8_t *vs_output_param_offset,
                            uint32_t num_outputs,
+                           uint32_t skip_output_mask,
                            uint8_t *num_param_exports)
 {
        LLVMBasicBlockRef bb;
@@ -3124,6 +3125,9 @@ void ac_optimize_vs_outputs(struct ac_llvm_context *ctx,
 
                        target -= V_008DFC_SQ_EXP_PARAM;
 
+                       if ((1u << target) & skip_output_mask)
+                               continue;
+
                        /* Parse the instruction. */
                        memset(&exp, 0, sizeof(exp));
                        exp.offset = target;
diff --git a/src/amd/llvm/ac_llvm_build.h b/src/amd/llvm/ac_llvm_build.h
index e08ab656f9c..4a65f117b21 100644
--- a/src/amd/llvm/ac_llvm_build.h
+++ b/src/amd/llvm/ac_llvm_build.h
@@ -605,6 +605,7 @@ void ac_optimize_vs_outputs(struct ac_llvm_context *ac,
                            LLVMValueRef main_fn,
                            uint8_t *vs_output_param_offset,
                            uint32_t num_outputs,
+                           uint32_t skip_output_mask,
                            uint8_t *num_param_exports);
 void ac_init_exec_full_mask(struct ac_llvm_context *ctx);
 
diff --git a/src/amd/vulkan/radv_nir_to_llvm.c 
b/src/amd/vulkan/radv_nir_to_llvm.c
index 64288be58bb..49065cdbe5b 100644
--- a/src/amd/vulkan/radv_nir_to_llvm.c
+++ b/src/amd/vulkan/radv_nir_to_llvm.c
@@ -3831,7 +3831,7 @@ ac_nir_eliminate_const_vs_outputs(struct 
radv_shader_context *ctx)
        ac_optimize_vs_outputs(&ctx->ac,
                               ctx->main_function,
                               outinfo->vs_output_param_offset,
-                              VARYING_SLOT_MAX,
+                              VARYING_SLOT_MAX, 0,
                               &outinfo->param_exports);
 }
 
diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index fa35489ea50..0e62bf261fb 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -1369,6 +1369,7 @@ static void si_optimize_vs_outputs(struct 
si_shader_context *ctx)
 {
        struct si_shader *shader = ctx->shader;
        struct si_shader_info *info = &shader->selector->info;
+       unsigned skip_vs_optim_mask = 0;
 
        if ((ctx->type != PIPE_SHADER_VERTEX &&
             ctx->type != PIPE_SHADER_TESS_EVAL) ||
@@ -1376,10 +1377,20 @@ static void si_optimize_vs_outputs(struct 
si_shader_context *ctx)
            shader->key.as_es)
                return;
 
+       /* Optimizing these outputs is not possible, since they might be 
overriden
+       * at runtime with S_028644_PT_SPRITE_TEX. */
+       for (int i = 0; i < info->num_outputs; i++) {
+               if (info->output_semantic_name[i] == TGSI_SEMANTIC_PCOORD ||
+                 info->output_semantic_name[i] == TGSI_SEMANTIC_TEXCOORD) {
+                        skip_vs_optim_mask |= 1u << 
shader->info.vs_output_param_offset[i];
+               }
+       }
+
        ac_optimize_vs_outputs(&ctx->ac,
                               ctx->main_fn,
                               shader->info.vs_output_param_offset,
                               info->num_outputs,
+                              skip_vs_optim_mask,
                               &shader->info.nr_param_exports);
 }
 

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to