The code was correct, but little confusing. This is cleaner.
Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14266>
unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config,
signed char *face_vgpr_index_ptr,
- signed char *ancillary_vgpr_index_ptr)
+ signed char *ancillary_vgpr_index_ptr,
+ signed char *sample_coverage_vgpr_index_ptr)
{
unsigned num_input_vgprs = 0;
signed char face_vgpr_index = -1;
signed char ancillary_vgpr_index = -1;
+ signed char sample_coverage_vgpr_index = -1;
if (G_0286CC_PERSP_SAMPLE_ENA(config->spi_ps_input_addr))
num_input_vgprs += 2;
ancillary_vgpr_index = num_input_vgprs;
num_input_vgprs += 1;
}
- if (G_0286CC_SAMPLE_COVERAGE_ENA(config->spi_ps_input_addr))
+ if (G_0286CC_SAMPLE_COVERAGE_ENA(config->spi_ps_input_addr)) {
+ sample_coverage_vgpr_index = num_input_vgprs;
num_input_vgprs += 1;
+ }
if (G_0286CC_POS_FIXED_PT_ENA(config->spi_ps_input_addr))
num_input_vgprs += 1;
*face_vgpr_index_ptr = face_vgpr_index;
if (ancillary_vgpr_index_ptr)
*ancillary_vgpr_index_ptr = ancillary_vgpr_index;
+ if (sample_coverage_vgpr_index_ptr)
+ *sample_coverage_vgpr_index_ptr = sample_coverage_vgpr_index;
return num_input_vgprs;
}
bool is_array);
unsigned ac_get_fs_input_vgpr_cnt(const struct ac_shader_config *config,
- signed char *face_vgpr_index, signed char *ancillary_vgpr_index);
+ signed char *face_vgpr_index, signed char *ancillary_vgpr_index,
+ signed char *sample_coverage_vgpr_index_ptr);
void ac_choose_spi_color_formats(unsigned format, unsigned swap, unsigned ntype,
bool is_depth, bool use_rbplus,
unsigned num_input_vgprs = args->ac.num_vgprs_used;
if (stage == MESA_SHADER_FRAGMENT) {
- num_input_vgprs = ac_get_fs_input_vgpr_cnt(config_in, NULL, NULL);
+ num_input_vgprs = ac_get_fs_input_vgpr_cnt(config_in, NULL, NULL, NULL);
}
unsigned num_vgprs = MAX2(config_in->num_vgprs, num_input_vgprs);
shader->info.ancillary_vgpr_index = ctx->args.num_vgprs_used;
si_add_arg_checked(&ctx->args, AC_ARG_VGPR, 1, AC_ARG_INT, &ctx->args.ancillary,
SI_PARAM_ANCILLARY);
+ shader->info.sample_coverage_vgpr_index = ctx->args.num_vgprs_used;
si_add_arg_checked(&ctx->args, AC_ARG_VGPR, 1, AC_ARG_FLOAT, &ctx->args.sample_coverage,
SI_PARAM_SAMPLE_COVERAGE);
si_add_arg_checked(&ctx->args, AC_ARG_VGPR, 1, AC_ARG_INT, &ctx->pos_fixed_pt,
/* Calculate the number of fragment input VGPRs. */
if (sel->info.stage == MESA_SHADER_FRAGMENT) {
shader->info.num_input_vgprs = ac_get_fs_input_vgpr_cnt(
- &shader->config, &shader->info.face_vgpr_index, &shader->info.ancillary_vgpr_index);
+ &shader->config, &shader->info.face_vgpr_index, &shader->info.ancillary_vgpr_index,
+ &shader->info.sample_coverage_vgpr_index);
}
si_calculate_max_simd_waves(shader);
key->ps_prolog.states.force_linear_center_interp ||
key->ps_prolog.states.bc_optimize_for_persp || key->ps_prolog.states.bc_optimize_for_linear);
key->ps_prolog.ancillary_vgpr_index = shader->info.ancillary_vgpr_index;
+ key->ps_prolog.sample_coverage_vgpr_index = shader->info.sample_coverage_vgpr_index;
if (info->colors_read) {
ubyte *color = shader->selector->color_attr_index;
shader->info.num_input_vgprs = mainp->info.num_input_vgprs;
shader->info.face_vgpr_index = mainp->info.face_vgpr_index;
shader->info.ancillary_vgpr_index = mainp->info.ancillary_vgpr_index;
+ shader->info.sample_coverage_vgpr_index = mainp->info.sample_coverage_vgpr_index;
memcpy(shader->info.vs_output_ps_input_cntl, mainp->info.vs_output_ps_input_cntl,
sizeof(mainp->info.vs_output_ps_input_cntl));
shader->info.uses_instanceid = mainp->info.uses_instanceid;
unsigned num_interp_inputs : 5; /* BCOLOR is at this location */
unsigned face_vgpr_index : 5;
unsigned ancillary_vgpr_index : 5;
+ unsigned sample_coverage_vgpr_index : 5;
unsigned wqm : 1;
char color_attr_index[2];
signed char color_interp_vgpr_index[2]; /* -1 == constant */
ubyte num_input_vgprs;
signed char face_vgpr_index;
signed char ancillary_vgpr_index;
+ signed char sample_coverage_vgpr_index;
bool uses_instanceid;
ubyte nr_pos_exports;
ubyte nr_param_exports;
S_0286D0_PERSP_SAMPLE_ENA(1) | S_0286D0_PERSP_CENTER_ENA(1) |
S_0286D0_PERSP_CENTROID_ENA(1) | S_0286D0_LINEAR_SAMPLE_ENA(1) |
S_0286D0_LINEAR_CENTER_ENA(1) | S_0286D0_LINEAR_CENTROID_ENA(1) |
- S_0286D0_FRONT_FACE_ENA(1) | S_0286D0_ANCILLARY_ENA(1) | S_0286D0_POS_FIXED_PT_ENA(1));
+ S_0286D0_FRONT_FACE_ENA(1) | S_0286D0_ANCILLARY_ENA(1) |
+ S_0286D0_SAMPLE_COVERAGE_ENA(1) | S_0286D0_POS_FIXED_PT_ENA(1));
}
struct ac_arg *arg = NULL;
if (i == key->ps_prolog.ancillary_vgpr_index) {
arg = &ancillary;
- } else if (i == key->ps_prolog.ancillary_vgpr_index + 1) {
+ } else if (i == key->ps_prolog.sample_coverage_vgpr_index) {
arg = ¶m_sample_mask;
} else if (i == key->ps_prolog.num_input_vgprs - 1) {
/* POS_FIXED_PT is always last. */