From 316353fbb64c62b691ce671ef9fedc277b51e65b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sun, 26 Apr 2026 22:42:55 -0400 Subject: [PATCH] ac,radeonsi: add a helper to print PS input VGPR layout --- src/amd/common/ac_shader_util.c | 47 +++++++++++++++++++ src/amd/common/ac_shader_util.h | 3 ++ .../drivers/radeonsi/si_shader_binary.c | 5 +- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/amd/common/ac_shader_util.c b/src/amd/common/ac_shader_util.c index 98da14565b4..21001b9718e 100644 --- a/src/amd/common/ac_shader_util.c +++ b/src/amd/common/ac_shader_util.c @@ -1511,3 +1511,50 @@ retry_select_mode: max_out_vertices <= max_workgroup_size && out->hw_max_esverts >= min_esverts; } + +/* Print SPI_PS_INPUT_ADDR as follows: + * v[0:1] = PERSP_SAMPLE + * v[2:3] = PERSP_CENTER + * v[4:5] = LINEAR_SAMPLE + * v[6:7] = LINEAR_CENTER + * v8 = LINE_STIPPLE_TEX + * v9 = FRONT_FACE + * v10 = ANCILLARY + * v11 = SAMPLE_COVERAGE + * v12 = POS_FIXED_PT + */ +void +ac_print_spi_ps_input_vgpr_list(uint32_t spi_ps_input_ena, uint32_t spi_ps_input_addr, FILE *f) +{ + unsigned vgpr = 0; + +#define PRINT_PS_INPUT_VGPR(count, name) do { \ + if (G_0286CC_##name##_ENA(spi_ps_input_addr)) { \ + bool enabled = G_0286CC_##name##_ENA(spi_ps_input_ena); \ + if (count > 1) \ + fprintf(f, " v[%u:%u] = %s%s\n", vgpr, vgpr + count - 1, #name, \ + enabled ? " === initialized ===" : ""); \ + else \ + fprintf(f, " v%u = %s\n", vgpr, #name); \ + vgpr += count; \ + } \ +} while (0) + + PRINT_PS_INPUT_VGPR(2, PERSP_SAMPLE); + PRINT_PS_INPUT_VGPR(2, PERSP_CENTER); + PRINT_PS_INPUT_VGPR(2, PERSP_CENTROID); + PRINT_PS_INPUT_VGPR(3, PERSP_PULL_MODEL); + PRINT_PS_INPUT_VGPR(2, LINEAR_SAMPLE); + PRINT_PS_INPUT_VGPR(2, LINEAR_CENTER); + PRINT_PS_INPUT_VGPR(2, LINEAR_CENTROID); + PRINT_PS_INPUT_VGPR(1, LINE_STIPPLE_TEX); + PRINT_PS_INPUT_VGPR(1, POS_X_FLOAT); + PRINT_PS_INPUT_VGPR(1, POS_Y_FLOAT); + PRINT_PS_INPUT_VGPR(1, POS_Z_FLOAT); + PRINT_PS_INPUT_VGPR(1, POS_W_FLOAT); + PRINT_PS_INPUT_VGPR(1, FRONT_FACE); + PRINT_PS_INPUT_VGPR(1, ANCILLARY); + PRINT_PS_INPUT_VGPR(1, SAMPLE_COVERAGE); + PRINT_PS_INPUT_VGPR(1, POS_FIXED_PT); +#undef PRINT_PS_INPUT_VGPR +} diff --git a/src/amd/common/ac_shader_util.h b/src/amd/common/ac_shader_util.h index 77069fdb099..789b93499cd 100644 --- a/src/amd/common/ac_shader_util.h +++ b/src/amd/common/ac_shader_util.h @@ -343,6 +343,9 @@ ac_ngg_compute_subgroup_info(enum amd_gfx_level gfx_level, mesa_shader_stage es_ unsigned ngg_lds_scratch_size, bool tess_turns_off_ngg, unsigned max_esgs_lds_padding, ac_ngg_subgroup_info *out); +void +ac_print_spi_ps_input_vgpr_list(uint32_t spi_ps_input_ena, uint32_t spi_ps_input_addr, FILE *f); + static unsigned inline ac_shader_get_lds_alloc_granularity(enum amd_gfx_level gfx_level) { diff --git a/src/gallium/drivers/radeonsi/si_shader_binary.c b/src/gallium/drivers/radeonsi/si_shader_binary.c index 43f81491602..9d6170ec26b 100644 --- a/src/gallium/drivers/radeonsi/si_shader_binary.c +++ b/src/gallium/drivers/radeonsi/si_shader_binary.c @@ -491,9 +491,10 @@ static void si_shader_dump_stats(struct si_screen *sscreen, struct si_shader *sh if (shader->selector->stage == MESA_SHADER_FRAGMENT) { fprintf(file, "*** SHADER CONFIG ***\n" - "SPI_PS_INPUT_ADDR = 0x%04x\n" - "SPI_PS_INPUT_ENA = 0x%04x\n", + "SPI_PS_INPUT_ADDR = 0x%04x\n" + "SPI_PS_INPUT_ENA = 0x%04x\n", conf->spi_ps_input_addr, conf->spi_ps_input_ena); + ac_print_spi_ps_input_vgpr_list(conf->spi_ps_input_ena, conf->spi_ps_input_addr, file); } fprintf(file,