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

Author: Pierre-Eric Pelloux-Prayer <[email protected]>
Date:   Thu Feb 23 10:52:26 2023 +0100

radeonsi: fix incorrect vgpr indices in the ps_prolog

In monolithic PS shaders, we need to account for PERSP_PULL_MODEL even
if we don't use it; si_get_ps_prolog_key already does the same thing
to determine color_interp_vgpr_index.

Cc: mesa-stable
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8280
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/21483>

---

 src/gallium/drivers/radeonsi/si_shader.c           |  5 +++--
 src/gallium/drivers/radeonsi/si_shader_internal.h  | 12 ++++++++----
 src/gallium/drivers/radeonsi/si_shader_llvm.c      | 10 +++++-----
 src/gallium/drivers/radeonsi/si_shader_llvm_ps.c   | 16 +++++++++-------
 src/gallium/drivers/radeonsi/si_shader_llvm_tess.c |  3 ++-
 src/gallium/drivers/radeonsi/si_shader_llvm_vs.c   |  3 ++-
 6 files changed, 29 insertions(+), 20 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index ea388731699..06e294b74e6 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -2338,7 +2338,8 @@ static struct si_shader_part *
 si_get_shader_part(struct si_screen *sscreen, struct si_shader_part **list,
                    gl_shader_stage stage, bool prolog, union 
si_shader_part_key *key,
                    struct ac_llvm_compiler *compiler, struct 
util_debug_callback *debug,
-                   void (*build)(struct si_shader_context *, union 
si_shader_part_key *),
+                   void (*build)(struct si_shader_context *, union 
si_shader_part_key *,
+                                 bool non_monolithic),
                    const char *name)
 {
    struct si_shader_part *result;
@@ -2406,7 +2407,7 @@ si_get_shader_part(struct si_screen *sscreen, struct 
si_shader_part **list,
    struct si_shader_args args;
    ctx.args = &args;
 
-   build(&ctx, key);
+   build(&ctx, key, true);
 
    /* Compile. */
    si_llvm_optimize_module(&ctx);
diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h 
b/src/gallium/drivers/radeonsi/si_shader_internal.h
index 77dca9e5a20..890651b074d 100644
--- a/src/gallium/drivers/radeonsi/si_shader_internal.h
+++ b/src/gallium/drivers/radeonsi/si_shader_internal.h
@@ -238,20 +238,24 @@ void si_llvm_init_gs_callbacks(struct si_shader_context 
*ctx);
 LLVMValueRef si_get_rel_patch_id(struct si_shader_context *ctx);
 void si_llvm_preload_tess_rings(struct si_shader_context *ctx);
 void si_llvm_ls_build_end(struct si_shader_context *ctx);
-void si_llvm_build_tcs_epilog(struct si_shader_context *ctx, union 
si_shader_part_key *key);
+void si_llvm_build_tcs_epilog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                              bool separate_epilog);
 void si_llvm_tcs_build_end(struct si_shader_context *ctx);
 void si_llvm_init_tcs_callbacks(struct si_shader_context *ctx);
 
 /* si_shader_llvm_ps.c */
 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_ps_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                             bool separate_prolog);
+void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                             bool separate_epilog);
 void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct 
si_shader *shader);
 void si_llvm_ps_build_end(struct si_shader_context *ctx);
 void si_llvm_init_ps_callbacks(struct si_shader_context *ctx);
 
 /* si_shader_llvm_vs.c */
-void si_llvm_build_vs_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key);
+void si_llvm_build_vs_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                             bool separate_prolog);
 void si_llvm_init_vs_callbacks(struct si_shader_context *ctx);
 
 #endif
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c 
b/src/gallium/drivers/radeonsi/si_shader_llvm.c
index 3c199e58b7f..b4b3e7aaad8 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c
@@ -1134,7 +1134,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, 
struct ac_llvm_compiler *
       si_get_vs_prolog_key(&sel->info, shader->info.num_input_sgprs,
                            &shader->key.ge.part.vs.prolog, shader, 
&prolog_key);
       prolog_key.vs_prolog.is_monolithic = true;
-      si_llvm_build_vs_prolog(&ctx, &prolog_key);
+      si_llvm_build_vs_prolog(&ctx, &prolog_key, false);
       parts[0] = ctx.main_fn;
 
       si_build_wrapper_function(&ctx, parts, 2, 1, 0, main_arg_types, false);
@@ -1154,7 +1154,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, 
struct ac_llvm_compiler *
          /* TCS epilog */
          union si_shader_part_key tcs_epilog_key;
          si_get_tcs_epilog_key(shader, &tcs_epilog_key);
-         si_llvm_build_tcs_epilog(&ctx, &tcs_epilog_key);
+         si_llvm_build_tcs_epilog(&ctx, &tcs_epilog_key, false);
          parts[3] = ctx.main_fn;
 
          struct si_shader shader_ls = {};
@@ -1190,7 +1190,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, 
struct ac_llvm_compiler *
             si_get_vs_prolog_key(&ls->info, shader_ls.info.num_input_sgprs,
                                  &shader->key.ge.part.tcs.ls_prolog, shader, 
&vs_prolog_key);
             vs_prolog_key.vs_prolog.is_monolithic = true;
-            si_llvm_build_vs_prolog(&ctx, &vs_prolog_key);
+            si_llvm_build_vs_prolog(&ctx, &vs_prolog_key, false);
             parts[0] = ctx.main_fn;
          }
 
@@ -1214,7 +1214,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, 
struct ac_llvm_compiler *
 
          memset(&epilog_key, 0, sizeof(epilog_key));
          epilog_key.tcs_epilog.states = shader->key.ge.part.tcs.epilog;
-         si_llvm_build_tcs_epilog(&ctx, &epilog_key);
+         si_llvm_build_tcs_epilog(&ctx, &epilog_key, false);
          parts[1] = ctx.main_fn;
 
          si_build_wrapper_function(&ctx, parts, 2, 0, 0, main_arg_types, 
false);
@@ -1266,7 +1266,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, 
struct ac_llvm_compiler *
             si_get_vs_prolog_key(&es->info, shader_es.info.num_input_sgprs,
                                  &shader->key.ge.part.gs.vs_prolog, shader, 
&vs_prolog_key);
             vs_prolog_key.vs_prolog.is_monolithic = true;
-            si_llvm_build_vs_prolog(&ctx, &vs_prolog_key);
+            si_llvm_build_vs_prolog(&ctx, &vs_prolog_key, false);
             es_prolog = ctx.main_fn;
          }
 
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c 
b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c
index 39db5f050f4..953ff6eb18a 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c
@@ -570,7 +570,8 @@ static void si_llvm_emit_polygon_stipple(struct 
si_shader_context *ctx,
  * overriden by other states. (e.g. per-sample interpolation)
  * Interpolated colors are stored after the preloaded VGPRs.
  */
-void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key)
+void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                             bool separate_prolog)
 {
    LLVMValueRef ret, func;
    int num_returns, i, num_color_channels;
@@ -694,13 +695,13 @@ void si_llvm_build_ps_prolog(struct si_shader_context 
*ctx, union si_shader_part
 
       /* Read LINEAR_SAMPLE. */
       for (i = 0; i < 2; i++)
-         linear_sample[i] = LLVMGetParam(func, base + 6 + i);
+         linear_sample[i] = LLVMGetParam(func, base + (separate_prolog ? 6 : 
9) + i);
       /* Overwrite LINEAR_CENTER. */
       for (i = 0; i < 2; i++)
-         ret = LLVMBuildInsertValue(ctx->ac.builder, ret, linear_sample[i], 
base + 8 + i, "");
+         ret = LLVMBuildInsertValue(ctx->ac.builder, ret, linear_sample[i], 
base + (separate_prolog ? 8 : 11) + i, "");
       /* Overwrite LINEAR_CENTROID. */
       for (i = 0; i < 2; i++)
-         ret = LLVMBuildInsertValue(ctx->ac.builder, ret, linear_sample[i], 
base + 10 + i, "");
+         ret = LLVMBuildInsertValue(ctx->ac.builder, ret, linear_sample[i], 
base + (separate_prolog ? 10 : 13) + i, "");
    }
 
    /* Force center interpolation. */
@@ -825,7 +826,8 @@ void si_llvm_build_ps_prolog(struct si_shader_context *ctx, 
union si_shader_part
  * Build the pixel shader epilog function. This handles everything that must be
  * emulated for pixel shader exports. (alpha-test, format conversions, etc)
  */
-void si_llvm_build_ps_epilog(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,
+                             UNUSED bool separate_epilog)
 {
    int i;
    struct si_ps_exports exp = {};
@@ -947,7 +949,7 @@ void si_llvm_build_monolithic_ps(struct si_shader_context 
*ctx, struct si_shader
    si_get_ps_prolog_key(shader, &prolog_key, false);
 
    if (si_need_ps_prolog(&prolog_key)) {
-      si_llvm_build_ps_prolog(ctx, &prolog_key);
+      si_llvm_build_ps_prolog(ctx, &prolog_key, false);
       parts[num_parts++] = ctx->main_fn;
    }
 
@@ -956,7 +958,7 @@ void si_llvm_build_monolithic_ps(struct si_shader_context 
*ctx, struct si_shader
 
    union si_shader_part_key epilog_key;
    si_get_ps_epilog_key(shader, &epilog_key);
-   si_llvm_build_ps_epilog(ctx, &epilog_key);
+   si_llvm_build_ps_epilog(ctx, &epilog_key, false);
    parts[num_parts++] = ctx->main_fn;
 
    si_build_wrapper_function(ctx, parts, num_parts, main_index, 0, 
main_arg_types, false);
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c 
b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
index 05076b4d5f7..00cf40b311a 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c
@@ -580,7 +580,8 @@ void si_llvm_ls_build_end(struct si_shader_context *ctx)
  * Compile the TCS epilog function. This writes tesselation factors to memory
  * based on the output primitive type of the tesselator (determined by TES).
  */
-void si_llvm_build_tcs_epilog(struct si_shader_context *ctx, union 
si_shader_part_key *key)
+void si_llvm_build_tcs_epilog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                              UNUSED bool separate_epilog)
 {
    memset(ctx->args, 0, sizeof(*ctx->args));
 
diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c 
b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
index 75e6551529e..bb5fb2d2761 100644
--- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
+++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c
@@ -346,7 +346,8 @@ static LLVMValueRef si_load_vs_input(struct ac_shader_abi 
*abi, unsigned driver_
  *   (InstanceID + StartInstance),
  *   (InstanceID / 2 + StartInstance)
  */
-void si_llvm_build_vs_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key)
+void si_llvm_build_vs_prolog(struct si_shader_context *ctx, union 
si_shader_part_key *key,
+                             UNUSED bool separate_prolog)
 {
    LLVMTypeRef *returns;
    LLVMValueRef ret, func;

Reply via email to