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;