diff --git a/src/compiler/spirv/nir_spirv.h b/src/compiler/spirv/nir_spirv.h index 9585dbbec9b..3e637ef497d 100644 --- a/src/compiler/spirv/nir_spirv.h +++ b/src/compiler/spirv/nir_spirv.h @@ -43,6 +43,7 @@ struct nir_spirv_specialization { }; enum nir_spirv_debug_level { + NIR_SPIRV_DEBUG_LEVEL_INVALID = -1, NIR_SPIRV_DEBUG_LEVEL_INFO, NIR_SPIRV_DEBUG_LEVEL_WARNING, NIR_SPIRV_DEBUG_LEVEL_ERROR, diff --git a/src/compiler/spirv/spirv_to_nir.c b/src/compiler/spirv/spirv_to_nir.c index 2abf1144b01..6690053ba97 100644 --- a/src/compiler/spirv/spirv_to_nir.c +++ b/src/compiler/spirv/spirv_to_nir.c @@ -34,9 +34,36 @@ #include "util/format/u_format.h" #include "util/u_math.h" +#include "util/u_string.h" #include +#ifndef NDEBUG +static enum nir_spirv_debug_level +vtn_default_log_level(void) +{ + enum nir_spirv_debug_level level = NIR_SPIRV_DEBUG_LEVEL_WARNING; + const char *vtn_log_level_strings[] = { + [NIR_SPIRV_DEBUG_LEVEL_WARNING] = "warning", + [NIR_SPIRV_DEBUG_LEVEL_INFO] = "info", + [NIR_SPIRV_DEBUG_LEVEL_ERROR] = "error", + }; + const char *str = getenv("MESA_SPIRV_LOG_LEVEL"); + + if (str == NULL) + return NIR_SPIRV_DEBUG_LEVEL_WARNING; + + for (int i = 0; i < ARRAY_SIZE(vtn_log_level_strings); i++) { + if (strcasecmp(str, vtn_log_level_strings[i]) == 0) { + level = i; + break; + } + } + + return level; +} +#endif + void vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level, size_t spirv_offset, const char *message) @@ -47,7 +74,13 @@ vtn_log(struct vtn_builder *b, enum nir_spirv_debug_level level, } #ifndef NDEBUG - if (level >= NIR_SPIRV_DEBUG_LEVEL_WARNING) + static enum nir_spirv_debug_level default_level = + NIR_SPIRV_DEBUG_LEVEL_INVALID; + + if (default_level == NIR_SPIRV_DEBUG_LEVEL_INVALID) + default_level = vtn_default_log_level(); + + if (level >= default_level) fprintf(stderr, "%s\n", message); #endif }