VulkanRenderer: Improve performance of validation message filtering

This commit is contained in:
SirLynix 2023-10-08 13:25:42 +02:00
parent c02a20457a
commit 078542e44b
2 changed files with 15 additions and 18 deletions

View File

@ -86,7 +86,7 @@ namespace Nz::Vk
inline PFN_vkVoidFunction GetProcAddr(const char* name) const; inline PFN_vkVoidFunction GetProcAddr(const char* name) const;
inline RenderAPIValidationLevel GetValidationLevel() const; inline RenderAPIValidationLevel GetValidationLevel() const;
void InstallDebugMessageCallback(); void InstallDebugMessageCallback(RenderAPIValidationLevel validationLevel);
inline bool IsExtensionLoaded(const std::string& extensionName) const; inline bool IsExtensionLoaded(const std::string& extensionName) const;
inline bool IsLayerLoaded(const std::string& layerName) const; inline bool IsLayerLoaded(const std::string& layerName) const;

View File

@ -20,21 +20,8 @@ namespace Nz::Vk
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageTypes, VkDebugUtilsMessageTypeFlagsEXT messageTypes,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
void* pUserData) void* /*pUserData*/)
{ {
Instance& instance = *static_cast<Instance*>(pUserData);
if (messageTypes & VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT)
{
RenderAPIValidationLevel validationLevel = instance.GetValidationLevel();
if ((messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) && validationLevel < RenderAPIValidationLevel::Debug)
return VK_FALSE;
if ((messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) && validationLevel < RenderAPIValidationLevel::Verbose)
return VK_FALSE;
if ((messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) && validationLevel < RenderAPIValidationLevel::Warnings)
return VK_FALSE;
}
std::stringstream ss; std::stringstream ss;
ss << "Vulkan log: "; ss << "Vulkan log: ";
@ -191,7 +178,7 @@ namespace Nz::Vk
} }
m_internalData = std::make_unique<InternalData>(); m_internalData = std::make_unique<InternalData>();
InstallDebugMessageCallback(); InstallDebugMessageCallback(validationLevel);
return true; return true;
} }
@ -269,7 +256,7 @@ namespace Nz::Vk
return true; return true;
} }
void Instance::InstallDebugMessageCallback() void Instance::InstallDebugMessageCallback(RenderAPIValidationLevel validationLevel)
{ {
NazaraAssert(m_internalData, "Instance must be created before callbacks are installed"); NazaraAssert(m_internalData, "Instance must be created before callbacks are installed");
@ -277,7 +264,17 @@ namespace Nz::Vk
{ {
VkDebugUtilsMessengerCreateInfoEXT callbackCreateInfo = {}; VkDebugUtilsMessengerCreateInfoEXT callbackCreateInfo = {};
callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; callbackCreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
callbackCreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
callbackCreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
if (validationLevel >= RenderAPIValidationLevel::Debug)
callbackCreateInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
if (validationLevel >= RenderAPIValidationLevel::Verbose)
callbackCreateInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
if (validationLevel >= RenderAPIValidationLevel::Warnings)
callbackCreateInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
callbackCreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; callbackCreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
callbackCreateInfo.pfnUserCallback = &DebugMessengerCallback; callbackCreateInfo.pfnUserCallback = &DebugMessengerCallback;
callbackCreateInfo.pUserData = this; callbackCreateInfo.pUserData = this;