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 <pendingchaos02@gmail.com>
Reviewed-by: Georg Lehmann <dadschoorse@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33354>
This commit is contained in:
Rhys Perry 2025-01-10 16:25:11 +00:00 committed by Marge Bot
parent ecd122ddb8
commit e04c0025ef
4 changed files with 25 additions and 2 deletions

View file

@ -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,

View file

@ -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__)); \
} \
})

View file

@ -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

View file

@ -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;