diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 67e98f9bfa4..c39b4f16237 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -701,18 +701,18 @@ void si_init_shader_args(struct si_shader *shader, struct si_shader_args *args) si_add_arg_checked(&args->ac, AC_ARG_VGPR, 1, AC_ARG_INT, &args->pos_fixed_pt, SI_PARAM_POS_FIXED_PT); - /* Color inputs from the prolog. */ - if (shader->selector->info.colors_read) { - unsigned num_color_elements = util_bitcount(shader->selector->info.colors_read); - - for (i = 0; i < num_color_elements; i++) - ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, i ? NULL : &args->color_start); - - num_prolog_vgprs += num_color_elements; - } - - /* Monolithic PS emit epilog in NIR directly. */ + /* Monolithic PS emit prolog and epilog in NIR directly. */ if (!shader->is_monolithic) { + /* Color inputs from the prolog. */ + if (shader->selector->info.colors_read) { + unsigned num_color_elements = util_bitcount(shader->selector->info.colors_read); + + for (i = 0; i < num_color_elements; i++) + ac_add_arg(&args->ac, AC_ARG_VGPR, 1, AC_ARG_FLOAT, i ? NULL : &args->color_start); + + num_prolog_vgprs += num_color_elements; + } + /* Outputs for the epilog. */ num_return_sgprs = SI_SGPR_ALPHA_REF + 1; num_returns = @@ -2148,6 +2148,10 @@ struct nir_shader *si_get_nir_shader(struct si_shader *shader, } else if (is_legacy_gs) { NIR_PASS_V(nir, ac_nir_lower_legacy_gs, false, sel->screen->use_ngg, output_info); } else if (sel->stage == MESA_SHADER_FRAGMENT && shader->is_monolithic) { + /* two-side color selection and interpolation */ + if (sel->info.colors_read) + NIR_PASS_V(nir, si_nir_lower_ps_color_input, shader); + ac_nir_lower_ps_options options = { .gfx_level = sel->screen->info.gfx_level, .family = sel->screen->info.family, @@ -2161,9 +2165,22 @@ struct nir_shader *si_get_nir_shader(struct si_shader *shader, .alpha_to_one = key->ps.part.epilog.alpha_to_one, .alpha_func = key->ps.part.epilog.alpha_func, .broadcast_last_cbuf = key->ps.part.epilog.last_cbuf, + + .bc_optimize_for_persp = key->ps.part.prolog.bc_optimize_for_persp, + .bc_optimize_for_linear = key->ps.part.prolog.bc_optimize_for_linear, + .force_persp_sample_interp = key->ps.part.prolog.force_persp_sample_interp, + .force_linear_sample_interp = key->ps.part.prolog.force_linear_sample_interp, + .force_persp_center_interp = key->ps.part.prolog.force_persp_center_interp, + .force_linear_center_interp = key->ps.part.prolog.force_linear_center_interp, + .samplemask_log_ps_iter = key->ps.part.prolog.samplemask_log_ps_iter, }; NIR_PASS_V(nir, ac_nir_lower_ps, &options); + + if (key->ps.part.prolog.poly_stipple) + NIR_PASS_V(nir, si_nir_emit_polygon_stipple, args); + + progress2 = true; } NIR_PASS(progress2, nir, si_nir_lower_abi, shader, args); diff --git a/src/gallium/drivers/radeonsi/si_shader_internal.h b/src/gallium/drivers/radeonsi/si_shader_internal.h index a9dd6a3af50..858987a2b5b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_internal.h +++ b/src/gallium/drivers/radeonsi/si_shader_internal.h @@ -235,7 +235,6 @@ void si_llvm_build_ps_prolog(struct si_shader_context *ctx, union si_shader_part 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); /* si_shader_llvm_vs.c */ diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm.c b/src/gallium/drivers/radeonsi/si_shader_llvm.c index a9dc7ef5985..3228329fd2f 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm.c @@ -1177,8 +1177,6 @@ bool si_llvm_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler * } else { /* Nothing to do for gfx6-8. The shader has only 1 part and it's ctx.main_fn. */ } - } else if (shader->is_monolithic && sel->stage == MESA_SHADER_FRAGMENT) { - si_llvm_build_monolithic_ps(&ctx, shader); } si_llvm_optimize_module(&ctx); diff --git a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c index ef669b48dad..460bc06056d 100644 --- a/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c +++ b/src/gallium/drivers/radeonsi/si_shader_llvm_ps.c @@ -848,28 +848,3 @@ void si_llvm_build_ps_epilog(struct si_shader_context *ctx, union si_shader_part LLVMBuildRetVoid(ctx->ac.builder); } -void si_llvm_build_monolithic_ps(struct si_shader_context *ctx, struct si_shader *shader) -{ - union si_shader_part_key prolog_key; - si_get_ps_prolog_key(shader, &prolog_key, false); - - /* If no prolog is needed, we only have the main part, no need to build wrapper function. */ - if (!si_need_ps_prolog(&prolog_key)) - return; - - struct ac_llvm_pointer main_fn = ctx->main_fn; - - /* Preserve main arguments. */ - enum ac_arg_type main_arg_types[AC_MAX_ARGS]; - for (int i = 0; i < ctx->args->ac.arg_count; i++) - main_arg_types[i] = ctx->args->ac.args[i].type; - - si_llvm_build_ps_prolog(ctx, &prolog_key, false); - - struct ac_llvm_pointer parts[2] = { - ctx->main_fn, /* prolog */ - main_fn, /* main */ - }; - - si_build_wrapper_function(ctx, parts, 2, 1, 0, main_arg_types, false); -}