From 588c762936161a22f3a0de17a8dac046a0cae086 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 18 Apr 2024 10:56:50 -0400 Subject: [PATCH] zink: preserve/merge variable names when generating new variables MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit in the case where multiple variables get merged into one, try to use all the names when creating new vars Acked-by: Marek Olšák Reviewed-by: Timur Kristóf Part-of: --- src/gallium/drivers/zink/zink_compiler.c | 35 ++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/src/gallium/drivers/zink/zink_compiler.c b/src/gallium/drivers/zink/zink_compiler.c index 443ed41e2d5fc..f1c826f075326 100644 --- a/src/gallium/drivers/zink/zink_compiler.c +++ b/src/gallium/drivers/zink/zink_compiler.c @@ -5234,6 +5234,7 @@ struct rework_io_state { nir_variable_mode mode; gl_shader_stage stage; nir_shader *nir; + const char *name; /* these are found by scanning */ bool arrayed_io; @@ -5246,6 +5247,8 @@ struct rework_io_state { unsigned bit_size; unsigned base; nir_alu_type type; + /* must be last */ + char *newname; }; /* match an existing variable against the rework state */ @@ -5272,6 +5275,26 @@ find_rework_var(nir_shader *nir, struct rework_io_state *ris) return NULL; } +static void +update_io_var_name(struct rework_io_state *ris, const char *name) +{ + if (!(zink_debug & (ZINK_DEBUG_NIR | ZINK_DEBUG_SPIRV))) + return; + if (!name) + return; + if (ris->name && !strcmp(ris->name, name)) + return; + if (ris->newname && !strcmp(ris->newname, name)) + return; + if (ris->newname) { + ris->newname = ralloc_asprintf(ris->nir, "%s_%s", ris->newname, name); + } else if (ris->name) { + ris->newname = ralloc_asprintf(ris->nir, "%s_%s", ris->name, name); + } else { + ris->newname = ralloc_strdup(ris->nir, name); + } +} + /* check/update tracking state for variable info */ static void update_io_var_state(nir_intrinsic_instr *intr, struct rework_io_state *ris) @@ -5340,6 +5363,8 @@ update_io_var_state(nir_intrinsic_instr *intr, struct rework_io_state *ris) ris->type = type; } + update_io_var_name(ris, intr->name); + ris->medium_precision |= sem.medium_precision; ris->fb_fetch_output |= sem.fb_fetch_output; ris->dual_source_blend_index |= sem.dual_source_blend_index; @@ -5400,6 +5425,7 @@ scan_io_var_slot(nir_shader *nir, nir_variable_mode mode, unsigned location, boo struct rework_io_state test; do { + update_io_var_name(&test, ris.newname ? ris.newname : ris.name); test = ris; /* always run indirect scan first to detect potential overlaps */ if (scan_indirects) { @@ -5409,7 +5435,7 @@ scan_io_var_slot(nir_shader *nir, nir_variable_mode mode, unsigned location, boo ris.indirect_only = false; nir_shader_intrinsics_pass(nir, scan_io_var_usage, nir_metadata_all, &ris); /* keep scanning until no changes found */ - } while (memcmp(&ris, &test, sizeof(ris))); + } while (memcmp(&ris, &test, offsetof(struct rework_io_state, newname))); return ris; } @@ -5419,8 +5445,10 @@ create_io_var(nir_shader *nir, struct rework_io_state *ris) { char name[1024]; assert(ris->component_mask); + if (ris->newname || ris->name) { + snprintf(name, sizeof(name), "%s", ris->newname ? ris->newname : ris->name); /* always use builtin name where possible */ - if (nir->info.stage == MESA_SHADER_VERTEX && ris->mode == nir_var_shader_in) { + } else if (nir->info.stage == MESA_SHADER_VERTEX && ris->mode == nir_var_shader_in) { snprintf(name, sizeof(name), "%s", gl_vert_attrib_name(ris->location)); } else if (nir->info.stage == MESA_SHADER_FRAGMENT && ris->mode == nir_var_shader_out) { snprintf(name, sizeof(name), "%s", gl_frag_result_name(ris->location)); @@ -5562,7 +5590,8 @@ rework_io_vars(nir_shader *nir, nir_variable_mode mode, struct zink_shader *zs) .stage = nir->info.stage, .bit_size = 32, .component_mask = component_mask, - .type = nir_type_float32 + .type = nir_type_float32, + .newname = scan_io_var_slot(nir, nir_var_shader_in, slot, false).newname, }; create_io_var(nir, &ris); inputs_read &= ~BITFIELD64_BIT(slot);