From e04c0025ef4b8b986f928f8ccf07e5c8bbaa4f07 Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Fri, 10 Jan 2025 16:25:11 +0000 Subject: [PATCH] nir: add NIR_DEBUG=extended_validation This runs validation even if the pass makes no progress. It also requires all kinds of metadata before the pass to test whether it correctly preserves or invalidates them. It's disabled by default because it can be extremely slow. Signed-off-by: Rhys Perry Reviewed-by: Georg Lehmann Part-of: --- src/compiler/nir/nir.c | 2 ++ src/compiler/nir/nir.h | 11 +++++++++++ src/compiler/nir/nir_metadata.c | 10 ++++++++++ src/compiler/nir/nir_opt_varyings.c | 4 ++-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/compiler/nir/nir.c b/src/compiler/nir/nir.c index 9306ab8fdee..b1e3a2f1fb6 100644 --- a/src/compiler/nir/nir.c +++ b/src/compiler/nir/nir.c @@ -48,6 +48,8 @@ static const struct debug_named_value nir_debug_control[] = { "Test serialize and deserialize shader at each successful lowering/optimization call" }, { "novalidate", NIR_DEBUG_NOVALIDATE, "Disable shader validation at each successful lowering/optimization call" }, + { "extended_validation", NIR_DEBUG_EXTENDED_VALIDATION, + "Validate even if a pass does not make progress and test that it properly preserves all types of metadata. This can be very slow" }, { "tgsi", NIR_DEBUG_TGSI, "Dump NIR/TGSI shaders when doing a NIR<->TGSI translation" }, { "print", NIR_DEBUG_PRINT, diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index ab848ccca77..f524261e8eb 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -73,6 +73,7 @@ extern bool nir_debug_print_shader[MESA_SHADER_KERNEL + 1]; #define NIR_DEBUG_CLONE (1u << 0) #define NIR_DEBUG_SERIALIZE (1u << 1) #define NIR_DEBUG_NOVALIDATE (1u << 2) +#define NIR_DEBUG_EXTENDED_VALIDATION (1u << 3) #define NIR_DEBUG_TGSI (1u << 4) #define NIR_DEBUG_PRINT_VS (1u << 5) #define NIR_DEBUG_PRINT_TCS (1u << 6) @@ -5337,6 +5338,7 @@ void nir_validate_shader(nir_shader *shader, const char *when); void nir_validate_ssa_dominance(nir_shader *shader, const char *when); void nir_metadata_set_validation_flag(nir_shader *shader); void nir_metadata_check_validation_flag(nir_shader *shader); +void nir_metadata_require_all(nir_shader *shader); static inline bool should_skip_nir(const char *name) @@ -5388,6 +5390,11 @@ nir_metadata_check_validation_flag(nir_shader *shader) { (void)shader; } +static inline void +nir_metadata_require_all(nir_shader *shader) +{ + (void)shader; +} static inline bool should_skip_nir(UNUSED const char *pass_name) { @@ -5406,6 +5413,8 @@ should_print_nir(UNUSED nir_shader *shader) printf("skipping %s\n", #pass); \ break; \ } \ + if (NIR_DEBUG(EXTENDED_VALIDATION)) \ + nir_metadata_require_all(nir); \ do_pass if (NIR_DEBUG(CLONE)) \ { \ nir_shader *_clone = nir_shader_clone(ralloc_parent(nir), nir);\ @@ -5430,6 +5439,8 @@ should_print_nir(UNUSED nir_shader *shader) if (should_print_nir(nir)) \ nir_print_shader(nir, stdout); \ nir_metadata_check_validation_flag(nir); \ + } else if (NIR_DEBUG(EXTENDED_VALIDATION)) { \ + nir_validate_shader(nir, "after " #pass " in " __FILE__ ":" NIR_STRINGIZE(__LINE__)); \ } \ }) diff --git a/src/compiler/nir/nir_metadata.c b/src/compiler/nir/nir_metadata.c index 6956a2d0333..58d9ee1f46c 100644 --- a/src/compiler/nir/nir_metadata.c +++ b/src/compiler/nir/nir_metadata.c @@ -119,4 +119,14 @@ nir_metadata_check_validation_flag(nir_shader *shader) assert(!(impl->valid_metadata & nir_metadata_not_properly_reset)); } } + +void nir_metadata_require_all(nir_shader *shader) +{ + bool force_unroll_sampler_indirect = shader->options->force_indirect_unrolling_sampler; + nir_variable_mode indirect_mask = shader->options->force_indirect_unrolling; + nir_foreach_function_impl(impl, shader) { + nir_metadata_require(impl, nir_metadata_all, indirect_mask, + (int)force_unroll_sampler_indirect); + } +} #endif diff --git a/src/compiler/nir/nir_opt_varyings.c b/src/compiler/nir/nir_opt_varyings.c index ee0fd13d331..c6ba2d95184 100644 --- a/src/compiler/nir/nir_opt_varyings.c +++ b/src/compiler/nir/nir_opt_varyings.c @@ -5316,9 +5316,9 @@ nir_opt_varyings(nir_shader *producer, nir_shader *consumer, bool spirv, producer->info.cull_distance_array_size = 0; } - if (progress & nir_progress_producer) + if ((progress & nir_progress_producer) || NIR_DEBUG(EXTENDED_VALIDATION)) nir_validate_shader(producer, "nir_opt_varyings"); - if (progress & nir_progress_consumer) + if ((progress & nir_progress_consumer) || NIR_DEBUG(EXTENDED_VALIDATION)) nir_validate_shader(consumer, "nir_opt_varyings"); return progress;