diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index ea388731699..06e294b74e6 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -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); diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index 77dca9e5a20..890651b074d 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -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 diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index 3c199e58b7f..b4b3e7aaad8 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c index 39db5f050f4..953ff6eb18a 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 05076b4d5f7..00cf40b311a 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_tess.c @@ -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)); diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c index 75e6551529e..bb5fb2d2761 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_vs.c @@ -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;