radeonsi: use ac_nir_lower_sample_mask_in

to use the same code as RADV

Reviewed-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41768>
This commit is contained in:
Marek Olšák 2026-05-22 01:22:49 -04:00 committed by Marge Bot
parent d5c4fb763a
commit 4b5852ad3f
2 changed files with 37 additions and 7 deletions

View file

@ -342,9 +342,6 @@ static bool lower_intrinsic(nir_builder *b, nir_instr *instr, struct lower_abi_s
replacement =
nir_iadd_imm(b, ac_nir_unpack_arg(b, &args->ac, args->ac.tcs_offchip_layout, 7, 5), 1);
break;
case nir_intrinsic_load_sample_mask_in:
replacement = ac_nir_load_arg(b, &args->ac, args->ac.sample_coverage);
break;
case nir_intrinsic_load_lshs_vertex_stride_amd:
if (stage == MESA_SHADER_VERTEX) {
replacement = nir_imm_int(b, si_shader_lshs_vertex_stride(shader));
@ -695,6 +692,9 @@ static bool lower_intrinsic(nir_builder *b, nir_instr *instr, struct lower_abi_s
case nir_intrinsic_load_ring_mesh_scratch_amd:
replacement = build_mesh_scratch_ring_desc(b, s);
break;
case nir_intrinsic_load_use_sample_mask_in_amd:
replacement = nir_imm_true(b);
break;
default:
return false;
}

View file

@ -841,12 +841,32 @@ static void si_preprocess_nir(struct si_nir_shader_ctx *ctx)
if (key->ps.mono.point_smoothing)
NIR_PASS(progress, nir, nir_lower_point_smooth, true);
bool msaa_disabled = key->ps.part.prolog.force_persp_center_interp ||
key->ps.part.prolog.force_linear_center_interp ||
key->ps.part.prolog.force_samplemask_to_helper_invocation ||
key->ps.mono.interpolate_at_sample_force_center;
bool sample_shading = key->ps.part.prolog.samplemask_log_ps_iter ||
key->ps.part.prolog.force_persp_sample_interp ||
key->ps.part.prolog.force_linear_sample_interp;
ac_nir_lower_sample_mask_in_options lower_sample_mask_in_options = {0};
/* samplemask_log_ps_iter is always 3 with maximum sample shading */
if (nir->info.fs.uses_sample_shading || key->ps.part.prolog.samplemask_log_ps_iter == 3) {
lower_sample_mask_in_options.behavior = ac_nir_lower_samplemask_sample_shading_max;
} else if (sample_shading) {
lower_sample_mask_in_options.behavior = ac_nir_lower_samplemask_sample_shading_partial;
lower_sample_mask_in_options.ps_iter_samples = 1 << key->ps.part.prolog.samplemask_log_ps_iter;
} else if (msaa_disabled) {
lower_sample_mask_in_options.behavior = ac_nir_lower_samplemask_1sample_no_vrs;
} else {
lower_sample_mask_in_options.behavior = ac_nir_lower_samplemask_unknown_states_no_sample_shading;
}
NIR_PASS(progress, nir, ac_nir_lower_sample_mask_in, &lower_sample_mask_in_options);
/* This eliminates system values and unused shader output components. */
ac_nir_lower_ps_early_options early_options = {
.msaa_disabled = key->ps.part.prolog.force_persp_center_interp ||
key->ps.part.prolog.force_linear_center_interp ||
key->ps.part.prolog.force_samplemask_to_helper_invocation ||
key->ps.mono.interpolate_at_sample_force_center,
.msaa_disabled = msaa_disabled,
.load_sample_positions_always_loads_current_ones = true,
.force_front_face = key->ps.opt.force_front_face_input,
/* This does a lot of things. See the description in ac_nir_lower_ps_early_options. */
@ -886,6 +906,16 @@ static void si_preprocess_nir(struct si_nir_shader_ctx *ctx)
if (key->ps.part.prolog.poly_stipple)
NIR_PASS(progress, nir, si_nir_lower_polygon_stipple);
} else {
ac_nir_lower_sample_mask_in_options lower_sample_mask_in_options = {0};
/* Sample shading with the sample mask used always uses monolithic shader compilation. */
if (nir->info.fs.uses_sample_shading)
lower_sample_mask_in_options.behavior = ac_nir_lower_samplemask_sample_shading_max;
else
lower_sample_mask_in_options.behavior = ac_nir_lower_samplemask_unknown_states_no_sample_shading;
NIR_PASS(progress, nir, ac_nir_lower_sample_mask_in, &lower_sample_mask_in_options);
ac_nir_lower_ps_early_options early_options = {
.ps_iter_samples = nir->info.fs.uses_sample_shading ? 8 : 0,
.lower_color_inputs_to_load_color01 = true,