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>
This commit is contained in:
Pierre-Eric Pelloux-Prayer 2023-02-23 10:52:26 +01:00 committed by Marge Bot
parent a8e1e5b5c2
commit 2b655e267e
6 changed files with 29 additions and 20 deletions

View file

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

View file

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

View file

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

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

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

View file

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