diff --git a/.pick_status.json b/.pick_status.json index c5640ee1c40..95710777684 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -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 }, diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 4797f0f881d..4908e287056 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -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); diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 066943810df..466f3b2bfd8 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -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 diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index f7817aff6bc..75b024481db 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c index 218a3c2a300..9e717b926f1 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 5a5665a51f6..03da1e3e77f 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c @@ -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)); diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c index 950daf49feb..ca6c4c6f8b0 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c @@ -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;