From 88418718a9c2799ae7bcc897573de8bc034259ac Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Fri, 22 May 2026 14:03:57 +0300 Subject: [PATCH] spirv: fixup infinite recursion with shader replacement While trying to use that feature on RADV I ran into an infinite recursion. Signed-off-by: Lionel Landwerlin Fixes: 97b4a6d0e3 ("compiler: SPIR-V shader replacement") Reviewed-by: Mike Blumenkrantz Part-of: --- src/compiler/spirv/nir_spirv.h | 3 +++ src/compiler/spirv/spirv_to_nir.c | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index 35b2327ac36..31359e825ec 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -145,6 +145,9 @@ struct spirv_to_nir_options { /* If GroupNonUniform capability is used, set this api subgroup size. */ uint8_t group_non_uniform_subgroup_size; + + /* Don't look at MESA_SPIRV_READ_PATH for replacements */ + bool ignore_replacement; }; enum spirv_verify_result { diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index f4b987a6c41..5e2c0b89bd5 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -7622,7 +7622,10 @@ spirv_to_nir(const uint32_t *words, size_t word_count, } const char *read_path = os_get_option_secure("MESA_SPIRV_READ_PATH"); - if (read_path) { + if (!options->ignore_replacement && read_path) { + struct spirv_to_nir_options replace_options = *options; + replace_options.ignore_replacement = true; + char blake3_str[BLAKE3_HEX_LEN]; _mesa_blake3_format(blake3_str, b->shader->info.source_blake3); @@ -7675,7 +7678,7 @@ spirv_to_nir(const uint32_t *words, size_t word_count, ralloc_free(b->shader); ralloc_free(b); nir_shader* result = spirv_to_nir(replacement_words, replacement_size / sizeof(uint32_t), - spec, stage, entry_point_name, options, + spec, stage, entry_point_name, &replace_options, nir_options); free((void *)replacement_words);