11#include " vulkan_base.h"
22
3+ VkBool32 VKAPI_CALL debugReportCallback (VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT messageTypes, const VkDebugUtilsMessengerCallbackDataEXT* callbackData, void * userData) {
4+ if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
5+ LOG_ERROR (callbackData->pMessage );
6+ } else {
7+ LOG_WARN (callbackData->pMessage );
8+ }
9+ return VK_FALSE;
10+ }
11+
12+ VkDebugUtilsMessengerEXT registerDebugCallback (VkInstance instance) {
13+ PFN_vkCreateDebugUtilsMessengerEXT pfnCreateDebutUtilsMessengerEXT;
14+ pfnCreateDebutUtilsMessengerEXT = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr (instance, " vkCreateDebugUtilsMessengerEXT" );
15+ VkDebugUtilsMessengerCreateInfoEXT callbackInfo = { VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT };
16+ callbackInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
17+ callbackInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
18+ callbackInfo.pfnUserCallback = debugReportCallback;
19+
20+ VkDebugUtilsMessengerEXT callback = 0 ;
21+ VKA (pfnCreateDebutUtilsMessengerEXT (instance, &callbackInfo, 0 , &callback));
22+
23+ return callback;
24+ }
25+
326bool initVulkanInstance (VulkanContext* context, uint32_t instanceExtensionCount, const char ** instanceExtensions) {
427 uint32_t layerPropertyCount = 0 ;
528 VKA (vkEnumerateInstanceLayerProperties (&layerPropertyCount, 0 ));
@@ -17,6 +40,15 @@ bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount,
1740 " VK_LAYER_KHRONOS_validation" ,
1841 };
1942
43+ VkValidationFeatureEnableEXT enableValidationFeatures[] = {
44+ // VK_VALIDATION_FEATURE_ENABLE_BEST_PRACTICES_EXT,
45+ VK_VALIDATION_FEATURE_ENABLE_GPU_ASSISTED_EXT,
46+ VK_VALIDATION_FEATURE_ENABLE_SYNCHRONIZATION_VALIDATION_EXT,
47+ };
48+ VkValidationFeaturesEXT validationFeatures = { VK_STRUCTURE_TYPE_VALIDATION_FEATURES_EXT };
49+ validationFeatures.enabledValidationFeatureCount = ARRAY_COUNT (enableValidationFeatures);
50+ validationFeatures.pEnabledValidationFeatures = enableValidationFeatures;
51+
2052#ifdef VULKAN_INFO_OUTPUT
2153 uint32_t availableInstanceExtensionCount;
2254 VKA (vkEnumerateInstanceExtensionProperties (0 , &availableInstanceExtensionCount, 0 ));
@@ -31,9 +63,10 @@ bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount,
3163 VkApplicationInfo applicationInfo = {VK_STRUCTURE_TYPE_APPLICATION_INFO};
3264 applicationInfo.pApplicationName = " Vulkan Tutorial" ;
3365 applicationInfo.applicationVersion = VK_MAKE_VERSION (0 , 0 , 1 ); // 0.0.1
34- applicationInfo.apiVersion = VK_API_VERSION_1_2 ;
66+ applicationInfo.apiVersion = VK_API_VERSION_1_0 ;
3567
3668 VkInstanceCreateInfo createInfo = { VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO };
69+ createInfo.pNext = &validationFeatures;
3770 createInfo.pApplicationInfo = &applicationInfo;
3871 createInfo.enabledLayerCount = ARRAY_COUNT (enabledLayers);
3972 createInfo.ppEnabledLayerNames = enabledLayers;
@@ -45,6 +78,8 @@ bool initVulkanInstance(VulkanContext* context, uint32_t instanceExtensionCount,
4578 return false ;
4679 }
4780
81+ context->debugCallback = registerDebugCallback (context->instance );
82+
4883 return true ;
4984}
5085
@@ -152,5 +187,11 @@ void exitVulkan(VulkanContext* context) {
152187 VKA (vkDeviceWaitIdle (context->device ));
153188 VK (vkDestroyDevice (context->device , 0 ));
154189
190+ if (context->debugCallback ) {
191+ PFN_vkDestroyDebugUtilsMessengerEXT pfnDestroyDebugUtilsMessengerEXT;
192+ pfnDestroyDebugUtilsMessengerEXT = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr (context->instance , " vkDestroyDebugUtilsMessengerEXT" );
193+ pfnDestroyDebugUtilsMessengerEXT (context->instance , context->debugCallback , 0 );
194+ context->debugCallback = 0 ;
195+ }
155196 vkDestroyInstance (context->instance , 0 );
156197}
0 commit comments