Use debug utils during instance creation (#1098)

* Use debug utils during instance creation

* fixup! Use debug utils during instance creation
This commit is contained in:
Bradley Austin Davis 2024-01-21 05:07:35 -08:00 committed by GitHub
parent 213bf850d5
commit e37a333b0d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 35 additions and 25 deletions

View file

@ -17,7 +17,7 @@ namespace vks
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT; PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
VkDebugUtilsMessengerEXT debugUtilsMessenger; VkDebugUtilsMessengerEXT debugUtilsMessenger;
VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback( VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessageCallback(
VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugUtilsMessageTypeFlagsEXT messageType, VkDebugUtilsMessageTypeFlagsEXT messageType,
const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, 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 // 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 // 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; 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) void setupDebugging(VkInstance instance)
{ {
vkCreateDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT")); vkCreateDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"));
vkDestroyDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT")); vkDestroyDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"));
VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{}; VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{};
debugUtilsMessengerCI.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; setupDebugingMessengerCreateInfo(debugUtilsMessengerCI);
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;
VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger); VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger);
assert(result == VK_SUCCESS); assert(result == VK_SUCCESS);
} }

View file

@ -35,20 +35,18 @@ namespace vks
namespace debug namespace debug
{ {
// Default debug callback // Default debug callback
VKAPI_ATTR VkBool32 VKAPI_CALL messageCallback( VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessageCallback(
VkDebugReportFlagsEXT flags, VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
VkDebugReportObjectTypeEXT objType, VkDebugUtilsMessageTypeFlagsEXT messageType,
uint64_t srcObject, const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
size_t location,
int32_t msgCode,
const char* pLayerPrefix,
const char* pMsg,
void* pUserData); void* pUserData);
// Load debug function pointers and set debug callback // Load debug function pointers and set debug callback
void setupDebugging(VkInstance instance); void setupDebugging(VkInstance instance);
// Clear debug callback // Clear debug callback
void freeDebugCallback(VkInstance instance); 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 // Wrapper for the VK_EXT_debug_utils extension

View file

@ -55,7 +55,7 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation)
#elif defined(VK_USE_PLATFORM_SCREEN_QNX) #elif defined(VK_USE_PLATFORM_SCREEN_QNX)
instanceExtensions.push_back(VK_QNX_SCREEN_SURFACE_EXTENSION_NAME); instanceExtensions.push_back(VK_QNX_SCREEN_SURFACE_EXTENSION_NAME);
#endif #endif
// Get extensions supported by the instance and store for later use // Get extensions supported by the instance and store for later use
uint32_t extCount = 0; uint32_t extCount = 0;
vkEnumerateInstanceExtensionProperties(nullptr, &extCount, nullptr); vkEnumerateInstanceExtensionProperties(nullptr, &extCount, nullptr);
@ -80,9 +80,9 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation)
#endif #endif
// Enabled requested instance extensions // 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 // Output message if requested extension is not available
if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), enabledExtension) == supportedInstanceExtensions.end()) if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), enabledExtension) == supportedInstanceExtensions.end())
@ -98,6 +98,14 @@ VkResult VulkanExampleBase::createInstance(bool enableValidation)
instanceCreateInfo.pNext = NULL; instanceCreateInfo.pNext = NULL;
instanceCreateInfo.pApplicationInfo = &appInfo; 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) #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 // 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()) if (std::find(supportedInstanceExtensions.begin(), supportedInstanceExtensions.end(), VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME) != supportedInstanceExtensions.end())
@ -289,7 +297,7 @@ void VulkanExampleBase::nextFrame()
lastTimestamp = tEnd; lastTimestamp = tEnd;
} }
tPrevEnd = tEnd; tPrevEnd = tEnd;
// TODO: Cap UI overlay update rates // TODO: Cap UI overlay update rates
updateOverlay(); updateOverlay();
} }
@ -782,10 +790,10 @@ VulkanExampleBase::VulkanExampleBase()
#endif #endif
// Validation for all samples can be forced at compile time using the FORCE_VALIDATION define // 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; settings.validation = true;
#endif #endif
// Command line arguments // Command line arguments
commandLineParser.add("help", { "--help" }, 0, "Show help"); commandLineParser.add("help", { "--help" }, 0, "Show help");
commandLineParser.add("validation", { "-v", "--validation" }, 0, "Enable validation layers"); commandLineParser.add("validation", { "-v", "--validation" }, 0, "Enable validation layers");
@ -848,7 +856,7 @@ VulkanExampleBase::VulkanExampleBase()
} }
if (commandLineParser.isSet("benchmarkresultfile")) { if (commandLineParser.isSet("benchmarkresultfile")) {
benchmark.filename = commandLineParser.getValueAsString("benchmarkresultfile", benchmark.filename); benchmark.filename = commandLineParser.getValueAsString("benchmarkresultfile", benchmark.filename);
} }
if (commandLineParser.isSet("benchmarkresultframes")) { if (commandLineParser.isSet("benchmarkresultframes")) {
benchmark.outputFrameTimes = true; benchmark.outputFrameTimes = true;
} }
@ -1589,7 +1597,7 @@ dispatch_group_t concurrentGroup;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{ {
[NSApp activateIgnoringOtherApps:YES]; // SRS - Make sure app window launches in front of Xcode window [NSApp activateIgnoringOtherApps:YES]; // SRS - Make sure app window launches in front of Xcode window
concurrentGroup = dispatch_group_create(); concurrentGroup = dispatch_group_create();
dispatch_queue_t concurrentQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0); dispatch_queue_t concurrentQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);
dispatch_group_async(concurrentGroup, concurrentQueue, ^{ dispatch_group_async(concurrentGroup, concurrentQueue, ^{
@ -1598,7 +1606,7 @@ dispatch_group_t concurrentGroup;
vulkanExample->displayLinkOutputCb(); vulkanExample->displayLinkOutputCb();
} }
}); });
// SRS - When benchmarking, set up termination notification on main thread when concurrent queue completes // SRS - When benchmarking, set up termination notification on main thread when concurrent queue completes
if (vulkanExample->benchmark.active) { if (vulkanExample->benchmark.active) {
dispatch_queue_t notifyQueue = dispatch_get_main_queue(); dispatch_queue_t notifyQueue = dispatch_get_main_queue();
@ -3159,7 +3167,7 @@ void VulkanExampleBase::windowResize()
destroyCommandBuffers(); destroyCommandBuffers();
createCommandBuffers(); createCommandBuffers();
buildCommandBuffers(); buildCommandBuffers();
// SRS - Recreate fences in case number of swapchain images has changed on resize // SRS - Recreate fences in case number of swapchain images has changed on resize
for (auto& fence : waitFences) { for (auto& fence : waitFences) {
vkDestroyFence(device, fence, nullptr); vkDestroyFence(device, fence, nullptr);