vulkan/runtime: allow drivers to enable vk_log output in release builds

In non-debug builds, __vk_log_impl() silently drops all messages due to
two compile/link-time gates: an early return when no debug callbacks are
registered, and the MESA_VK_LOG=0 guard around the mesa_log*() calls.

Add vk_instance::enable_debug_logging so drivers can opt in to log
output at runtime. When set, both gates are bypassed.

No functional change without a driver setting the flag.

Signed-off-by: Michael Cheng <michael.cheng@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/40551>
This commit is contained in:
Michael Cheng 2026-03-21 10:36:36 -07:00 committed by Marge Bot
parent 1e04e7ee74
commit 7d787ba8c6
2 changed files with 34 additions and 22 deletions

View file

@ -110,6 +110,14 @@ struct vk_instance {
/** Instance-level dispatch table */
struct vk_instance_dispatch_table dispatch_table;
/** Driver-set flag to enable debug logging in release builds
*
* When set to true, vk_log messages will not be skipped in non-debug
* builds even when no debug_utils or debug_report callbacks are registered.
* Drivers should set this based on their own debug environment variables.
*/
bool enable_debug_logging;
/* VK_EXT_debug_report debug callbacks */
struct vk_debug_report debug_report;

View file

@ -113,7 +113,8 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
#if !MESA_DEBUG
if (unlikely(!instance) ||
(likely(list_is_empty(&instance->debug_utils.callbacks)) &&
(likely(!instance->enable_debug_logging) &&
likely(list_is_empty(&instance->debug_utils.callbacks)) &&
likely(list_is_empty(&instance->debug_report.callbacks))))
return;
#endif
@ -127,26 +128,30 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
char *message_idname = ralloc_asprintf(NULL, "%s:%d", file, line);
#if MESA_VK_LOG
switch (severity) {
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT:
mesa_logd("%s: %s", message_idname, message);
break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:
mesa_logi("%s: %s", message_idname, message);
break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
if (types & VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT)
mesa_logw("%s: PERF: %s", message_idname, message);
else
mesa_logw("%s: %s", message_idname, message);
break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
mesa_loge("%s: %s", message_idname, message);
break;
default:
UNREACHABLE("Invalid debug message severity");
break;
const bool do_log = MESA_VK_LOG ||
(instance && instance->enable_debug_logging);
if (do_log) {
switch (severity) {
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT:
mesa_logd("%s: %s", message_idname, message);
break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT:
mesa_logi("%s: %s", message_idname, message);
break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
if (types & VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT)
mesa_logw("%s: PERF: %s", message_idname, message);
else
mesa_logw("%s: %s", message_idname, message);
break;
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
mesa_loge("%s: %s", message_idname, message);
break;
default:
UNREACHABLE("Invalid debug message severity");
break;
}
}
if (!instance) {
@ -154,7 +159,6 @@ __vk_log_impl(VkDebugUtilsMessageSeverityFlagBitsEXT severity,
ralloc_free(message_idname);
return;
}
#endif
if (!instance->base.client_visible) {
vk_debug_message_instance(instance, severity, types,