From 83a920dfb9a753aeeaa75dca177a705c05cb348a Mon Sep 17 00:00:00 2001 From: Qiang Yu Date: Wed, 12 Apr 2023 18:38:18 +0800 Subject: [PATCH] radeonsi: init spi ps input shader config when aco MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reviewed-by: Marek Olšák Signed-off-by: Qiang Yu Part-of: --- src/gallium/drivers/radeonsi/si_shader.c | 54 ++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 2ed8d6f161d..43716830635 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2420,6 +2420,56 @@ static void si_fixup_spi_ps_input_config(struct si_shader *shader) shader->config.spi_ps_input_ena |= S_0286CC_ANCILLARY_ENA(1); } +static void +si_set_spi_ps_input_config(struct si_shader *shader) +{ + assert(shader->is_monolithic); + + const struct si_shader_selector *sel = shader->selector; + const struct si_shader_info *info = &sel->info; + const union si_shader_key *key = &shader->key; + + shader->config.spi_ps_input_ena = + S_0286CC_PERSP_CENTER_ENA(info->uses_persp_center) | + S_0286CC_PERSP_CENTROID_ENA(info->uses_persp_centroid) | + S_0286CC_PERSP_SAMPLE_ENA(info->uses_persp_sample) | + S_0286CC_LINEAR_CENTER_ENA(info->uses_linear_center) | + S_0286CC_LINEAR_CENTROID_ENA(info->uses_linear_centroid) | + S_0286CC_LINEAR_SAMPLE_ENA(info->uses_linear_sample) | + S_0286CC_FRONT_FACE_ENA(info->uses_frontface) | + S_0286CC_SAMPLE_COVERAGE_ENA(info->reads_samplemask) | + S_0286CC_ANCILLARY_ENA(info->uses_sampleid); + + uint8_t mask = info->reads_frag_coord_mask | info->reads_sample_pos_mask; + u_foreach_bit(i, mask) { + shader->config.spi_ps_input_ena |= S_0286CC_POS_X_FLOAT_ENA(1) << i; + } + + if (key->ps.part.prolog.color_two_side) + shader->config.spi_ps_input_ena |= S_0286CC_FRONT_FACE_ENA(1); + + /* INTERP_MODE_COLOR, same as SMOOTH if flat shading is disabled. */ + if (info->uses_interp_color && !key->ps.part.prolog.flatshade_colors) { + shader->config.spi_ps_input_ena |= + S_0286CC_PERSP_SAMPLE_ENA(info->uses_persp_sample_color) | + S_0286CC_PERSP_CENTER_ENA(info->uses_persp_center_color) | + S_0286CC_PERSP_CENTROID_ENA(info->uses_persp_centroid_color); + } + + /* nir_lower_poly_line_smooth use nir_load_sample_mask_in */ + if (key->ps.mono.poly_line_smoothing) + shader->config.spi_ps_input_ena |= S_0286CC_SAMPLE_COVERAGE_ENA(1); + + /* nir_lower_point_smooth use nir_load_point_coord_maybe_flipped which is lowered + * to nir_load_barycentric_pixel and nir_load_interpolated_input. + */ + if (key->ps.mono.point_smoothing) + shader->config.spi_ps_input_ena |= S_0286CC_PERSP_CENTER_ENA(1); + + si_fixup_spi_ps_input_config(shader); + shader->config.spi_ps_input_addr = shader->config.spi_ps_input_ena; +} + bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compiler, struct si_shader *shader, struct util_debug_callback *debug) { @@ -2428,6 +2478,10 @@ bool si_compile_shader(struct si_screen *sscreen, struct ac_llvm_compiler *compi si_determine_use_aco(shader); + /* ACO need spi_ps_input in advance to init args and used in compiler. */ + if (sel->stage == MESA_SHADER_FRAGMENT && shader->use_aco) + si_set_spi_ps_input_config(shader); + /* We need this info only when legacy GS. */ struct si_gs_output_info legacy_gs_output_info; if (sel->stage == MESA_SHADER_GEOMETRY && !shader->key.ge.as_ngg) {