diff --git a/src/VmaReplay/Constants.h b/src/VmaReplay/Constants.h index d2a5db0..5db0858 100644 --- a/src/VmaReplay/Constants.h +++ b/src/VmaReplay/Constants.h @@ -37,7 +37,7 @@ enum CMD_LINE_OPT CMD_LINE_OPT_USER_DATA, CMD_LINE_OPT_VK_KHR_DEDICATED_ALLOCATION, CMD_LINE_OPT_VK_EXT_MEMORY_BUDGET, - CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION, + CMD_LINE_OPT_VK_LAYER_KHRONOS_VALIDATION, CMD_LINE_OPT_MEM_STATS, CMD_LINE_OPT_DUMP_STATS_AFTER_LINE, CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE, diff --git a/src/VmaReplay/VmaReplay.cpp b/src/VmaReplay/VmaReplay.cpp index 5a1f960..774f070 100644 --- a/src/VmaReplay/VmaReplay.cpp +++ b/src/VmaReplay/VmaReplay.cpp @@ -670,8 +670,8 @@ static uint32_t g_PhysicalDeviceIndex = 0; static RangeSequence g_LineRanges; static bool g_UserDataEnabled = true; static bool g_MemStatsEnabled = false; -VULKAN_EXTENSION_REQUEST g_VK_LAYER_LUNARG_standard_validation = VULKAN_EXTENSION_REQUEST::DEFAULT; -VULKAN_EXTENSION_REQUEST g_VK_EXT_memory_budget_request = VULKAN_EXTENSION_REQUEST::DEFAULT; +VULKAN_EXTENSION_REQUEST g_VK_LAYER_KHRONOS_validation = VULKAN_EXTENSION_REQUEST::DEFAULT; +VULKAN_EXTENSION_REQUEST g_VK_EXT_memory_budget_request = VULKAN_EXTENSION_REQUEST::DEFAULT; VULKAN_EXTENSION_REQUEST g_VK_AMD_device_coherent_memory_request = VULKAN_EXTENSION_REQUEST::DEFAULT; struct StatsAfterLineEntry @@ -1494,53 +1494,16 @@ void ConfigurationParser::CompareMemProps( //////////////////////////////////////////////////////////////////////////////// // class Player -static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_LUNARG_standard_validation"; +static const char* const VALIDATION_LAYER_NAME = "VK_LAYER_KHRONOS_validation"; -static const bool g_MemoryAliasingWarningEnabled = false; - -static VKAPI_ATTR VkBool32 VKAPI_CALL MyDebugReportCallback( - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objectType, - uint64_t object, - size_t location, - int32_t messageCode, - const char* pLayerPrefix, - const char* pMessage, - void* pUserData) +static VkBool32 VKAPI_PTR MyDebugReportCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageTypes, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, + void* pUserData) { - // "Non-linear image 0xebc91 is aliased with linear buffer 0xeb8e4 which may indicate a bug." - if(!g_MemoryAliasingWarningEnabled && flags == VK_DEBUG_REPORT_WARNING_BIT_EXT && - (strstr(pMessage, " is aliased with non-linear ") || strstr(pMessage, " is aliased with linear "))) - { - return VK_FALSE; - } - - // Ignoring because when VK_KHR_dedicated_allocation extension is enabled, - // vkGetBufferMemoryRequirements2KHR function is used instead, while Validation - // Layer seems to be unaware of it. - if (strstr(pMessage, "but vkGetBufferMemoryRequirements() has not been called on that buffer") != nullptr) - { - return VK_FALSE; - } - if (strstr(pMessage, "but vkGetImageMemoryRequirements() has not been called on that image") != nullptr) - { - return VK_FALSE; - } - - /* - "Mapping an image with layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL can result in undefined behavior if this memory is used by the device. Only GENERAL or PREINITIALIZED should be used." - Ignoring because we map entire VkDeviceMemory blocks, where different types of - images and buffers may end up together, especially on GPUs with unified memory - like Intel. - */ - if(strstr(pMessage, "Mapping an image with layout") != nullptr && - strstr(pMessage, "can result in undefined behavior if this memory is used by the device") != nullptr) - { - return VK_FALSE; - } - - printf("%s \xBA %s\n", pLayerPrefix, pMessage); - + assert(pCallbackData && pCallbackData->pMessageIdName && pCallbackData->pMessage); + printf("%s \xBA %s\n", pCallbackData->pMessageIdName, pCallbackData->pMessage); return VK_FALSE; } @@ -1609,10 +1572,9 @@ private: const VkPhysicalDeviceProperties* m_DevProps = nullptr; const VkPhysicalDeviceMemoryProperties* m_MemProps = nullptr; - PFN_vkCreateDebugReportCallbackEXT m_pvkCreateDebugReportCallbackEXT; - PFN_vkDebugReportMessageEXT m_pvkDebugReportMessageEXT; - PFN_vkDestroyDebugReportCallbackEXT m_pvkDestroyDebugReportCallbackEXT; - VkDebugReportCallbackEXT m_hCallback; + PFN_vkCreateDebugUtilsMessengerEXT m_vkCreateDebugUtilsMessengerEXT = nullptr; + PFN_vkDestroyDebugUtilsMessengerEXT m_vkDestroyDebugUtilsMessengerEXT = nullptr; + VkDebugUtilsMessengerEXT m_DebugUtilsMessenger = VK_NULL_HANDLE; uint32_t m_VmaFrameIndex = 0; @@ -1659,6 +1621,7 @@ private: int InitVulkan(); void FinalizeVulkan(); void RegisterDebugCallbacks(); + void UnregisterDebugCallbacks(); // If parmeter count doesn't match, issues warning and returns false. bool ValidateFunctionParameterCount(size_t lineNumber, const CsvSplit& csvSplit, size_t expectedParamCount, bool lastUnbound); @@ -2018,7 +1981,7 @@ int Player::InitVulkan() IsLayerSupported(instanceLayerProps.data(), instanceLayerProps.size(), VALIDATION_LAYER_NAME); bool validationLayersEnabled = false; - switch(g_VK_LAYER_LUNARG_standard_validation) + switch(g_VK_LAYER_KHRONOS_validation) { case VULKAN_EXTENSION_REQUEST::DISABLED: break; @@ -2053,10 +2016,10 @@ int Player::InitVulkan() if(validationLayersEnabled) { instanceLayers.push_back(VALIDATION_LAYER_NAME); - enabledInstanceExtensions.push_back("VK_EXT_debug_report"); } bool VK_KHR_get_physical_device_properties2_enabled = false; + bool VK_EXT_debug_utils_enabled = false; for(const auto& extensionProperties : availableInstanceExtensions) { if(strcmp(extensionProperties.extensionName, VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME) == 0) @@ -2064,6 +2027,14 @@ int Player::InitVulkan() enabledInstanceExtensions.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); VK_KHR_get_physical_device_properties2_enabled = true; } + else if(strcmp(extensionProperties.extensionName, VK_EXT_DEBUG_UTILS_EXTENSION_NAME) == 0) + { + if(validationLayersEnabled) + { + enabledInstanceExtensions.push_back("VK_EXT_debug_utils"); + VK_EXT_debug_utils_enabled = true; + } + } } VkApplicationInfo appInfo = { VK_STRUCTURE_TYPE_APPLICATION_INFO }; @@ -2087,7 +2058,7 @@ int Player::InitVulkan() return RESULT_ERROR_VULKAN; } - if(validationLayersEnabled) + if(VK_EXT_debug_utils_enabled) { RegisterDebugCallbacks(); } @@ -2388,11 +2359,7 @@ void Player::FinalizeVulkan() m_Device = nullptr; } - if(m_pvkDestroyDebugReportCallbackEXT && m_hCallback != VK_NULL_HANDLE) - { - m_pvkDestroyDebugReportCallbackEXT(m_VulkanInstance, m_hCallback, nullptr); - m_hCallback = VK_NULL_HANDLE; - } + UnregisterDebugCallbacks(); if(m_VulkanInstance != VK_NULL_HANDLE) { @@ -2403,29 +2370,41 @@ void Player::FinalizeVulkan() void Player::RegisterDebugCallbacks() { - m_pvkCreateDebugReportCallbackEXT = - reinterpret_cast - (vkGetInstanceProcAddr(m_VulkanInstance, "vkCreateDebugReportCallbackEXT")); - m_pvkDebugReportMessageEXT = - reinterpret_cast - (vkGetInstanceProcAddr(m_VulkanInstance, "vkDebugReportMessageEXT")); - m_pvkDestroyDebugReportCallbackEXT = - reinterpret_cast - (vkGetInstanceProcAddr(m_VulkanInstance, "vkDestroyDebugReportCallbackEXT")); - assert(m_pvkCreateDebugReportCallbackEXT); - assert(m_pvkDebugReportMessageEXT); - assert(m_pvkDestroyDebugReportCallbackEXT); + static const VkDebugUtilsMessageSeverityFlagsEXT DEBUG_UTILS_MESSENGER_MESSAGE_SEVERITY = + //VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT | + //VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + static const VkDebugUtilsMessageTypeFlagsEXT DEBUG_UTILS_MESSENGER_MESSAGE_TYPE = + VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | + VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; - VkDebugReportCallbackCreateInfoEXT callbackCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT }; - callbackCreateInfo.flags = //VK_DEBUG_REPORT_INFORMATION_BIT_EXT | - VK_DEBUG_REPORT_ERROR_BIT_EXT | - VK_DEBUG_REPORT_WARNING_BIT_EXT | - VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT /*| - VK_DEBUG_REPORT_DEBUG_BIT_EXT*/; - callbackCreateInfo.pfnCallback = &MyDebugReportCallback; + m_vkCreateDebugUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr( + m_VulkanInstance, "vkCreateDebugUtilsMessengerEXT"); + m_vkDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr( + m_VulkanInstance, "vkDestroyDebugUtilsMessengerEXT"); + assert(m_vkCreateDebugUtilsMessengerEXT); + assert(m_vkDestroyDebugUtilsMessengerEXT); - VkResult res = m_pvkCreateDebugReportCallbackEXT(m_VulkanInstance, &callbackCreateInfo, nullptr, &m_hCallback); - assert(res == VK_SUCCESS); + VkDebugUtilsMessengerCreateInfoEXT messengerCreateInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT }; + messengerCreateInfo.messageSeverity = DEBUG_UTILS_MESSENGER_MESSAGE_SEVERITY; + messengerCreateInfo.messageType = DEBUG_UTILS_MESSENGER_MESSAGE_TYPE; + messengerCreateInfo.pfnUserCallback = MyDebugReportCallback; + VkResult res = m_vkCreateDebugUtilsMessengerEXT(m_VulkanInstance, &messengerCreateInfo, nullptr, &m_DebugUtilsMessenger); + if(res != VK_SUCCESS) + { + printf("ERROR: vkCreateDebugUtilsMessengerEXT failed (%d)\n", res); + m_DebugUtilsMessenger = VK_NULL_HANDLE; + } +} + +void Player::UnregisterDebugCallbacks() +{ + if(m_DebugUtilsMessenger) + { + m_vkDestroyDebugUtilsMessengerEXT(m_VulkanInstance, m_DebugUtilsMessenger, nullptr); + } } void Player::Defragment() @@ -3991,7 +3970,7 @@ static void PrintCommandLineSyntax() " --PhysicalDevice - Choice of Vulkan physical device. Default: 0.\n" " --UserData - 0 to disable or 1 to enable setting pUserData during playback.\n" " Default is 1. Affects both creation of buffers and images, as well as calls to vmaSetAllocationUserData.\n" - " --VK_LAYER_LUNARG_standard_validation - 0 to disable or 1 to enable validation layers.\n" + " --VK_LAYER_KHRONOS_validation - 0 to disable or 1 to enable validation layers.\n" " By default the layers are silently enabled if available.\n" " --VK_EXT_memory_budget - 0 to disable or 1 to enable this extension.\n" " By default the extension is silently enabled if available.\n" @@ -4214,7 +4193,7 @@ static int main2(int argc, char** argv) cmdLineParser.RegisterOpt(CMD_LINE_OPT_PHYSICAL_DEVICE, "PhysicalDevice", true); cmdLineParser.RegisterOpt(CMD_LINE_OPT_USER_DATA, "UserData", true); cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_EXT_MEMORY_BUDGET, "VK_EXT_memory_budget", true); - cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION, VALIDATION_LAYER_NAME, true); + cmdLineParser.RegisterOpt(CMD_LINE_OPT_VK_LAYER_KHRONOS_VALIDATION, VALIDATION_LAYER_NAME, true); cmdLineParser.RegisterOpt(CMD_LINE_OPT_MEM_STATS, "MemStats", true); cmdLineParser.RegisterOpt(CMD_LINE_OPT_DUMP_STATS_AFTER_LINE, "DumpStatsAfterLine", true); cmdLineParser.RegisterOpt(CMD_LINE_OPT_DEFRAGMENT_AFTER_LINE, "DefragmentAfterLine", true); @@ -4288,12 +4267,12 @@ static int main2(int argc, char** argv) } } break; - case CMD_LINE_OPT_VK_LAYER_LUNARG_STANDARD_VALIDATION: + case CMD_LINE_OPT_VK_LAYER_KHRONOS_VALIDATION: { bool newValue; if(StrRangeToBool(StrRange(cmdLineParser.GetParameter()), newValue)) { - g_VK_LAYER_LUNARG_standard_validation = newValue ? + g_VK_LAYER_KHRONOS_validation = newValue ? VULKAN_EXTENSION_REQUEST::ENABLED : VULKAN_EXTENSION_REQUEST::DISABLED; } diff --git a/src/VulkanSample.cpp b/src/VulkanSample.cpp index 257d729..1c31f07 100644 --- a/src/VulkanSample.cpp +++ b/src/VulkanSample.cpp @@ -44,7 +44,6 @@ VkPhysicalDevice g_hPhysicalDevice; VkDevice g_hDevice; VmaAllocator g_hAllocator; VkInstance g_hVulkanInstance; -bool g_MemoryAliasingWarningEnabled = true; bool g_EnableValidationLayer = true; bool VK_KHR_get_memory_requirements2_enabled = false; @@ -1771,10 +1770,7 @@ static void FinalizeApplication() g_hSurface = VK_NULL_HANDLE; } - if(VK_EXT_debug_utils_enabled) - { - UnregisterDebugCallbacks(); - } + UnregisterDebugCallbacks(); if(g_hVulkanInstance != VK_NULL_HANDLE) {