mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-21 13:18:09 +02: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>
(cherry picked from commit 2b655e267e)
This commit is contained in:
parent
826be8bafe
commit
f817193569
7 changed files with 32 additions and 23 deletions
|
|
@ -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
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue