Browse Source

enable VK_LAYER_KHRONOS_validation layer in modern vulkan sdk

tags/20210124
nihui 5 years ago
parent
commit
80499bd64a
1 changed files with 17 additions and 6 deletions
  1. +17
    -6
      src/gpu.cpp

+ 17
- 6
src/gpu.cpp View File

@@ -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



Loading…
Cancel
Save