From 80499bd64a279bab6de4cfa72d0ef283fb5b388b Mon Sep 17 00:00:00 2001 From: nihui Date: Sat, 23 Jan 2021 20:12:31 +0800 Subject: [PATCH] enable VK_LAYER_KHRONOS_validation layer in modern vulkan sdk --- src/gpu.cpp | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/src/gpu.cpp b/src/gpu.cpp index 5cad12809..07a7625bf 100644 --- a/src/gpu.cpp +++ b/src/gpu.cpp @@ -30,6 +30,8 @@ #include "mat.h" #include "pipelinecache.h" +// There is known issue that vkDestroyDebugUtilsMessengerEXT crash on exit when vulkan validation layer enabled +// upstream fix https://github.com/KhronosGroup/Vulkan-Loader/pull/539 #define ENABLE_VALIDATION_LAYER 0 namespace ncnn { @@ -43,6 +45,9 @@ public: __ncnn_vulkan_instance_holder() { instance = 0; +#if ENABLE_VALIDATION_LAYER + callback = 0; +#endif } ~__ncnn_vulkan_instance_holder() @@ -56,6 +61,9 @@ public: } VkInstance instance; +#if ENABLE_VALIDATION_LAYER + VkDebugUtilsMessengerEXT callback; +#endif }; static __ncnn_vulkan_instance_holder g_instance; @@ -639,8 +647,6 @@ static int init_instance_extension() } #if ENABLE_VALIDATION_LAYER -static VkDebugUtilsMessengerEXT callback; - static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( VkDebugUtilsMessageSeverityFlagBitsEXT /*messageSeverity*/, VkDebugUtilsMessageTypeFlagsEXT /*messageType*/, @@ -652,7 +658,7 @@ static VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback( return VK_FALSE; } -VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pCallback) +static VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMessengerCreateInfoEXT* pCreateInfo, const VkAllocationCallbacks* pAllocator, VkDebugUtilsMessengerEXT* pCallback) { PFN_vkCreateDebugUtilsMessengerEXT func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"); if (func) @@ -661,7 +667,7 @@ VkResult CreateDebugUtilsMessengerEXT(VkInstance instance, const VkDebugUtilsMes return VK_ERROR_EXTENSION_NOT_PRESENT; } -void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT callback, const VkAllocationCallbacks* pAllocator) +static void DestroyDebugUtilsMessengerEXT(VkInstance instance, VkDebugUtilsMessengerEXT callback, const VkAllocationCallbacks* pAllocator) { PFN_vkDestroyDebugUtilsMessengerEXT func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"); if (func) @@ -862,6 +868,10 @@ int create_gpu_instance() { enabledLayers.push_back("VK_LAYER_LUNARG_parameter_validation"); } + if (strcmp(lp.layerName, "VK_LAYER_KHRONOS_validation") == 0) + { + enabledLayers.push_back("VK_LAYER_KHRONOS_validation"); + } } #endif // ENABLE_VALIDATION_LAYER @@ -981,7 +991,7 @@ int create_gpu_instance() createInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; createInfo.pfnUserCallback = debugCallback; createInfo.pUserData = 0; - ret = CreateDebugUtilsMessengerEXT(g_instance, &createInfo, NULL, &callback); + ret = CreateDebugUtilsMessengerEXT(g_instance, &createInfo, NULL, &g_instance.callback); if (ret != VK_SUCCESS) { NCNN_LOGE("CreateDebugUtilsMessengerEXT failed %d", ret); @@ -1476,7 +1486,8 @@ void destroy_gpu_instance() #if ENABLE_VALIDATION_LAYER if (support_VK_EXT_debug_utils) { - DestroyDebugUtilsMessengerEXT(g_instance, callback, NULL); + DestroyDebugUtilsMessengerEXT(g_instance, g_instance.callback, NULL); + g_instance.callback = 0; } #endif // ENABLE_VALIDATION_LAYER