diff --git a/src/amd/common/nir/ac_nir.h b/src/amd/common/nir/ac_nir.h index 1f53c0b7daa..46635909705 100644 --- a/src/amd/common/nir/ac_nir.h +++ b/src/amd/common/nir/ac_nir.h @@ -271,15 +271,13 @@ typedef struct { * generate AMD-specific intrinsics. */ /* System values. */ - bool force_persp_sample_interp; - bool force_linear_sample_interp; bool force_persp_center_interp; bool force_linear_center_interp; bool interpolate_at_sample_force_center; bool load_sample_positions_always_loads_current_ones; bool dynamic_rasterization_samples; int force_front_face; /* 0 -> keep, 1 -> set to true, -1 -> set to false */ - unsigned ps_iter_samples; + unsigned ps_iter_samples; /* >= 2 forces sample interpolation, affects sample_mask_in lowering */ /* fbfetch_output */ bool fbfetch_is_1D; diff --git a/src/amd/common/nir/ac_nir_lower_ps_early.c b/src/amd/common/nir/ac_nir_lower_ps_early.c index ce61485b98a..320e406d9dc 100644 --- a/src/amd/common/nir/ac_nir_lower_ps_early.c +++ b/src/amd/common/nir/ac_nir_lower_ps_early.c @@ -48,19 +48,19 @@ get_baryc_var(nir_builder *b, nir_intrinsic_op baryc_op, enum glsl_interp_mode m switch (baryc_op) { case nir_intrinsic_load_barycentric_pixel: if (mode == INTERP_MODE_NOPERSPECTIVE) { - return get_baryc_var_common(b, s->options->force_linear_sample_interp, &s->linear_center, + return get_baryc_var_common(b, s->options->ps_iter_samples > 1, &s->linear_center, "linear_center"); } else { - return get_baryc_var_common(b, s->options->force_persp_sample_interp, &s->persp_center, + return get_baryc_var_common(b, s->options->ps_iter_samples > 1, &s->persp_center, "persp_center"); } case nir_intrinsic_load_barycentric_centroid: if (mode == INTERP_MODE_NOPERSPECTIVE) { - return get_baryc_var_common(b, s->options->force_linear_sample_interp || + return get_baryc_var_common(b, s->options->ps_iter_samples > 1 || s->options->force_linear_center_interp, &s->linear_centroid, "linear_centroid"); } else { - return get_baryc_var_common(b, s->options->force_persp_sample_interp || + return get_baryc_var_common(b, s->options->ps_iter_samples > 1 || s->options->force_persp_center_interp, &s->persp_centroid, "persp_centroid"); } @@ -91,12 +91,9 @@ init_interp_param(nir_builder *b, lower_ps_early_state *s) { b->cursor = nir_before_cf_list(&b->impl->body); - if (s->options->force_persp_sample_interp) { + if (s->options->ps_iter_samples > 1) { set_interp_vars(b, nir_load_barycentric_sample(b, 32, .interp_mode = INTERP_MODE_SMOOTH), s->persp_center, s->persp_centroid); - } - - if (s->options->force_linear_sample_interp) { set_interp_vars(b, nir_load_barycentric_sample(b, 32, .interp_mode = INTERP_MODE_NOPERSPECTIVE), s->linear_center, s->linear_centroid); } diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 35cc931e513..968caf7f48e 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2482,14 +2482,16 @@ static struct nir_shader *si_get_nir_shader(struct si_shader *shader, struct si_ shader->info.ps_colors_read = info.colors_read; ac_nir_lower_ps_early_options early_options = { - .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, .interpolate_at_sample_force_center = key->ps.mono.interpolate_at_sample_force_center, .load_sample_positions_always_loads_current_ones = true, .force_front_face = key->ps.opt.force_front_face_input, - .ps_iter_samples = 1 << key->ps.part.prolog.samplemask_log_ps_iter, + /* This forces per-sample interpolation (if at least 2) and lowers sample_mask_in. */ + .ps_iter_samples = key->ps.part.prolog.samplemask_log_ps_iter ? + (1 << key->ps.part.prolog.samplemask_log_ps_iter) : + (key->ps.part.prolog.force_persp_sample_interp || + key->ps.part.prolog.force_linear_sample_interp ? 2 : 1), .fbfetch_is_1D = key->ps.mono.fbfetch_is_1D, .fbfetch_layered = key->ps.mono.fbfetch_layered,