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>
(cherry picked from commit 2b655e267e)
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2023-02-23 10:52:26 +01:00 committed by Eric Engestrom
parent 826be8bafe
commit f817193569
7 changed files with 32 additions and 23 deletions

View file

@ -6808,7 +6808,7 @@
"description": "radeonsi: fix incorrect vgpr indices in the ps_prolog",
"nominated": true,
"nomination_type": 0,
"resolution": 0,
"resolution": 1,
"main_sha": null,
"because_sha": null
},

View file

@ -2005,7 +2005,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;
@ -2062,7 +2063,7 @@ si_get_shader_part(struct si_screen *sscreen, struct si_shader_part **list,
ctx.shader = &shader;
ctx.stage = stage;
build(&ctx, key);
build(&ctx, key, true);
/* Compile. */
si_llvm_optimize_module(&ctx);

View file

@ -247,14 +247,17 @@ LLVMValueRef si_get_tcs_in_vertex_dw_stride(struct si_shader_context *ctx);
LLVMValueRef si_get_num_tcs_out_vertices(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);
@ -274,7 +277,8 @@ void si_llvm_emit_streamout(struct si_shader_context *ctx, struct si_shader_outp
void si_llvm_build_vs_exports(struct si_shader_context *ctx, LLVMValueRef num_export_threads,
struct si_shader_output_values *outputs, unsigned noutput);
void si_llvm_vs_build_end(struct si_shader_context *ctx);
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, bool ngg_cull_shader);
#endif

View file

@ -1300,7 +1300,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, true,
&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[num_parts++] = ctx.main_fn;
first_is_prolog = true;
}
@ -1312,7 +1312,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, false,
&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[num_parts++] = ctx.main_fn;
if (num_parts == 1)
first_is_prolog = true;
@ -1337,7 +1337,7 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *
prolog_key.vs_prolog.as_ngg = 1;
prolog_key.vs_prolog.load_vgprs_after_culling = 1;
prolog_key.vs_prolog.is_monolithic = true;
si_llvm_build_vs_prolog(&ctx, &prolog_key);
si_llvm_build_vs_prolog(&ctx, &prolog_key, false);
prolog = ctx.main_fn;
parts[0] = ngg_cull_main_fn;
@ -1361,7 +1361,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 = {};
@ -1393,7 +1393,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, false,
&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;
}
@ -1417,7 +1417,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);
@ -1466,7 +1466,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, false,
&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;
}

View file

@ -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);

View file

@ -602,7 +602,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));

View file

@ -923,7 +923,8 @@ void si_llvm_vs_build_end(struct si_shader_context *ctx)
* (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;