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:
parent
213bf850d5
commit
e37a333b0d
3 changed files with 35 additions and 25 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue