From e37a333b0dc462f198657977d7cfabd42f76d17f Mon Sep 17 00:00:00 2001 From: Bradley Austin Davis Date: Sun, 21 Jan 2024 05:07:35 -0800 Subject: [PATCH] Use debug utils during instance creation (#1098) * Use debug utils during instance creation * fixup! Use debug utils during instance creation --- base/VulkanDebug.cpp | 18 +++++++++++------- base/VulkanDebug.h | 14 ++++++-------- base/vulkanexamplebase.cpp | 28 ++++++++++++++++++---------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/base/VulkanDebug.cpp b/base/VulkanDebug.cpp index e7b9c5ba..eacd6ac3 100644 --- a/base/VulkanDebug.cpp +++ b/base/VulkanDebug.cpp @@ -17,7 +17,7 @@ namespace vks PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; VkDebugUtilsMessengerEXT debugUtilsMessenger; - VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback( + VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessageCallback( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, @@ -74,21 +74,25 @@ namespace vks // The return value of this callback controls whether the Vulkan call that caused the validation message will be aborted or not // We return VK_FALSE as we DON'T want Vulkan calls that cause a validation message to abort - // If you instead want to have calls abort, pass in VK_TRUE and the function will return VK_ERROR_VALIDATION_FAILED_EXT + // If you instead want to have calls abort, pass in VK_TRUE and the function will return VK_ERROR_VALIDATION_FAILED_EXT return VK_FALSE; } + void setupDebugingMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugUtilsMessengerCI) + { + debugUtilsMessengerCI.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + debugUtilsMessengerCI.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; + debugUtilsMessengerCI.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; + debugUtilsMessengerCI.pfnUserCallback = debugUtilsMessageCallback; + } + void setupDebugging(VkInstance instance) { - vkCreateDebugUtilsMessengerEXT = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT")); vkDestroyDebugUtilsMessengerEXT = reinterpret_cast(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT")); VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{}; - debugUtilsMessengerCI.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - debugUtilsMessengerCI.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; - debugUtilsMessengerCI.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT; - debugUtilsMessengerCI.pfnUserCallback = debugUtilsMessengerCallback; + setupDebugingMessengerCreateInfo(debugUtilsMessengerCI); VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger); assert(result == VK_SUCCESS); } diff --git a/base/VulkanDebug.h b/base/VulkanDebug.h index e45a5128..87c5eb41 100644 --- a/base/VulkanDebug.h +++ b/base/VulkanDebug.h @@ -35,20 +35,18 @@ namespace vks namespace debug { // Default debug callback - VKAPI_ATTR VkBool32 VKAPI_CALL messageCallback( - VkDebugReportFlagsEXT flags, - VkDebugReportObjectTypeEXT objType, - uint64_t srcObject, - size_t location, - int32_t msgCode, - const char* pLayerPrefix, - const char* pMsg, + VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessageCallback( + VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, void* pUserData); // Load debug function pointers and set debug callback void setupDebugging(VkInstance instance); // Clear debug callback void freeDebugCallback(VkInstance instance); + // Used to populate a VkDebugUtilsMessengerCreateInfoEXT with our example messenger function and desired flags + void setupDebugingMessengerCreateInfo(VkDebugUtilsMessengerCreateInfoEXT& debugUtilsMessengerCI); } // Wrapper for the VK_EXT_debug_utils extension diff --git a/base/vulkanexamplebase.cpp b/base/vulkanexamplebase.cpp index ec3e5828..2f31d1be 100644 --- a/base/vulkanexamplebase.cpp +++ b/base/vulkanexamplebase.cpp @@ -55,7 +55,7 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation) #elif defined(VK_USE_PLATFORM_SCREEN_QNX) instanceExtensions.push_back(VK_QNX_SCREEN_SURFACE_EXTENSION_NAME); #endif - + // Get extensions supported by the instance and store for later use uint32_t extCount = 0; vkEnumerateInstanceExtensionProperties(nullptr, &extCount, nullptr); @@ -80,9 +80,9 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation) #endif // Enabled requested instance extensions - if (enabledInstanceExtensions.size() > 0) + if (enabledInstanceExtensions.size() > 0) { - for (const char * enabledExtension : enabledInstanceExtensions) + for (const char * enabledExtension : enabledInstanceExtensions) { // Output message if requested extension is not available if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), enabledExtension) == supportedInstanceExtensions.end()) @@ -98,6 +98,14 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation) instanceCreateInfo.pNext = NULL; instanceCreateInfo.pApplicationInfo = &appInfo; + VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{}; + if (settings.validation) { + vks::debug::setupDebugingMessengerCreateInfo(debugUtilsMessengerCI); + debugUtilsMessengerCI.pNext = instanceCreateInfo.pNext; + instanceCreateInfo.pNext = &debugUtilsMessengerCI; + } + + #if (defined(VK_USE_PLATFORM_IOS_MVK) || defined(VK_USE_PLATFORM_MACOS_MVK)) && defined(VK_KHR_portability_enumeration) // SRS - When running on iOS/macOS with MoltenVK and VK_KHR_portability_enumeration is defined and supported by the instance, enable the extension and the flag if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) != supportedInstanceExtensions.end()) @@ -289,7 +297,7 @@ void VulkanExampleBase::nextFrame() lastTimestamp = tEnd; } tPrevEnd = tEnd; - + // TODO: Cap UI overlay update rates updateOverlay(); } @@ -782,10 +790,10 @@ VulkanExampleBase::VulkanExampleBase() #endif // Validation for all samples can be forced at compile time using the FORCE_VALIDATION define -#if defined(FORCE_VALIDATION) +#if defined(FORCE_VALIDATION) settings.validation = true; #endif - + // Command line arguments commandLineParser.add("help", { "--help" }, 0, "Show help"); commandLineParser.add("validation", { "-v", "--validation" }, 0, "Enable validation layers"); @@ -848,7 +856,7 @@ VulkanExampleBase::VulkanExampleBase() } if (commandLineParser.isSet("benchmarkresultfile")) { benchmark.filename = commandLineParser.getValueAsString("benchmarkresultfile", benchmark.filename); - } + } if (commandLineParser.isSet("benchmarkresultframes")) { benchmark.outputFrameTimes = true; } @@ -1589,7 +1597,7 @@ dispatch_group_t concurrentGroup; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { [NSApp activateIgnoringOtherApps:YES]; // SRS - Make sure app window launches in front of Xcode window - + concurrentGroup = dispatch_group_create(); dispatch_queue_t concurrentQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0); dispatch_group_async(concurrentGroup, concurrentQueue, ^{ @@ -1598,7 +1606,7 @@ dispatch_group_t concurrentGroup; vulkanExample->displayLinkOutputCb(); } }); - + // SRS - When benchmarking, set up termination notification on main thread when concurrent queue completes if (vulkanExample->benchmark.active) { dispatch_queue_t notifyQueue = dispatch_get_main_queue(); @@ -3159,7 +3167,7 @@ void VulkanExampleBase::windowResize() destroyCommandBuffers(); createCommandBuffers(); buildCommandBuffers(); - + // SRS - Recreate fences in case number of swapchain images has changed on resize for (auto& fence : waitFences) { vkDestroyFence(device, fence, nullptr);