diff --git a/src/gallium/drivers/radeonsi/gfx/si_nir_lower_abi.c b/src/gallium/drivers/radeonsi/gfx/si_nir_lower_abi.c index 2fce5c1a554..acd467b2ed3 100644 --- a/src/gallium/drivers/radeonsi/gfx/si_nir_lower_abi.c +++ b/src/gallium/drivers/radeonsi/gfx/si_nir_lower_abi.c @@ -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; } diff --git a/src/gallium/drivers/radeonsi/gfx/si_shader.c b/src/gallium/drivers/radeonsi/gfx/si_shader.c index ffbf72ce3f6..422372dec5b 100644 --- a/src/gallium/drivers/radeonsi/gfx/si_shader.c +++ b/src/gallium/drivers/radeonsi/gfx/si_shader.c @@ -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,