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);
+ /* 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);
+ 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;
- }
+ num_prolog_vgprs += num_color_elements;
+ }
- /* Monolithic PS emit epilog in NIR directly. */
- if (!shader->is_monolithic) {
/* Outputs for the epilog. */
num_return_sgprs = SI_SGPR_ALPHA_REF + 1;
num_returns =
} 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,
.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);
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);
-}