Replace usage of old VK_LAYER_LUNARG_standard_validation and extension VK_EXT_debug_report with new VK_LAYER_KHRONOS_validation and extension VK_EXT_debug_utils also in VmaReplay
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 @@
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 RangeSequence<size_t> 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 @@
////////////////////////////////////////////////////////////////////////////////
// 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
return RESULT_ERROR_VULKAN;
}
- if(validationLayersEnabled)
+ if(VK_EXT_debug_utils_enabled)
{
RegisterDebugCallbacks();
}
@@ -2388,11 +2359,7 @@
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::RegisterDebugCallbacks()
{
- m_pvkCreateDebugReportCallbackEXT =
- reinterpret_cast<PFN_vkCreateDebugReportCallbackEXT>
- (vkGetInstanceProcAddr(m_VulkanInstance, "vkCreateDebugReportCallbackEXT"));
- m_pvkDebugReportMessageEXT =
- reinterpret_cast<PFN_vkDebugReportMessageEXT>
- (vkGetInstanceProcAddr(m_VulkanInstance, "vkDebugReportMessageEXT"));
- m_pvkDestroyDebugReportCallbackEXT =
- reinterpret_cast<PFN_vkDestroyDebugReportCallbackEXT>
- (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 @@
" --PhysicalDevice <Index> - Choice of Vulkan physical device. Default: 0.\n"
" --UserData <Value> - 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 <Value> - 0 to disable or 1 to enable validation layers.\n"
+ " --VK_LAYER_KHRONOS_validation <Value> - 0 to disable or 1 to enable validation layers.\n"
" By default the layers are silently enabled if available.\n"
" --VK_EXT_memory_budget <Value> - 0 to disable or 1 to enable this extension.\n"
" By default the extension is silently enabled if available.\n"
@@ -4214,7 +4193,7 @@
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 @@
}
}
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 @@
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 @@
g_hSurface = VK_NULL_HANDLE;
}
- if(VK_EXT_debug_utils_enabled)
- {
- UnregisterDebugCallbacks();
- }
+ UnregisterDebugCallbacks();
if(g_hVulkanInstance != VK_NULL_HANDLE)
{