mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-24 08:50:13 +01:00
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:
parent
a8e1e5b5c2
commit
2b655e267e
6 changed files with 29 additions and 20 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue