From 4079407f73cc16ca8e2243f464d6b111a58b68cf Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 8 Nov 2019 01:58:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=96=B0=E7=9A=84VKDebugOut?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=88=B7=E5=88=9B?= =?UTF-8?q?=E5=BB=BA=E6=97=B6=E5=8F=AF=E4=BD=BF=E7=94=A8=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E7=9A=84Debug=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc/hgl/graph/vulkan/VKDebugOut.h | 22 ++- inc/hgl/graph/vulkan/VKInstance.h | 6 +- src/RenderDevice/Vulkan/CMakeLists.txt | 1 + src/RenderDevice/Vulkan/VKDebugOut.cpp | 221 ++++++++++++++++--------- src/RenderDevice/Vulkan/VKInstance.cpp | 16 +- 5 files changed, 177 insertions(+), 89 deletions(-) diff --git a/inc/hgl/graph/vulkan/VKDebugOut.h b/inc/hgl/graph/vulkan/VKDebugOut.h index bd4f974e..4462d648 100644 --- a/inc/hgl/graph/vulkan/VKDebugOut.h +++ b/inc/hgl/graph/vulkan/VKDebugOut.h @@ -5,19 +5,37 @@ VK_NAMESPACE_BEGIN +const char *GetVkDebugReportObjectTypename(VkDebugReportObjectTypeEXT objType); + +/** + * Vulkan µ÷ÊÔÐÅÏ¢Êä³ö»ùÀà
+ * ÈçÈôÐèÒª×Ô¶¨ÒåµÄµ÷ÊÔÐÅÏ¢Êä³ö£¬Çë´Ó´ËÀàÅÉÉú + */ class VKDebugOut { - VkInstance inst=nullptr; + VkInstance inst; VkDebugUtilsMessengerEXT debug_messenger; VkDebugReportCallbackEXT debug_report_callback; public: - VKDebugOut(); + virtual VkBool32 OnDebugUtilsMessage(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,VkDebugUtilsMessageTypeFlagsEXT messageType,const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData); + virtual VkBool32 OnDebugReport(VkDebugReportFlagsEXT msgFlags,VkDebugReportObjectTypeEXT objType,uint64_t srcObject,size_t location,int32_t msgCode,const char *pLayerPrefix,const char *pMsg); + +public: + + VKDebugOut() + { + inst=VK_NULL_HANDLE; + debug_messenger=VK_NULL_HANDLE; + debug_report_callback=VK_NULL_HANDLE; + } + virtual ~VKDebugOut(); virtual bool Init(VkInstance); };//class VKDebugOut + VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_DEBUG_OUT_INCLUDE diff --git a/inc/hgl/graph/vulkan/VKInstance.h b/inc/hgl/graph/vulkan/VKInstance.h index 0d8588d0..08b903b7 100644 --- a/inc/hgl/graph/vulkan/VKInstance.h +++ b/inc/hgl/graph/vulkan/VKInstance.h @@ -20,9 +20,9 @@ VK_NAMESPACE_BEGIN private: - friend Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *do=nullptr); + friend Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out=nullptr); - Instance(VkInstance,VKDebugOut *,CharPointerList &); + Instance(VkInstance,CharPointerList &,VKDebugOut *); public: @@ -35,6 +35,6 @@ VK_NAMESPACE_BEGIN const PhysicalDevice * GetDevice (VkPhysicalDeviceType)const; };//class Instance - Instance *CreateInstance(const UTF8String &,VKDebugOut *do=nullptr); ///<创建一个Vulkan实例 + Instance *CreateInstance(const UTF8String &,VKDebugOut *); ///<创建一个Vulkan实例 VK_NAMESPACE_END #endif//HGL_GRAPH_VULKAN_INSTANCE_INCLUDE diff --git a/src/RenderDevice/Vulkan/CMakeLists.txt b/src/RenderDevice/Vulkan/CMakeLists.txt index ef118125..3cc5ea57 100644 --- a/src/RenderDevice/Vulkan/CMakeLists.txt +++ b/src/RenderDevice/Vulkan/CMakeLists.txt @@ -3,6 +3,7 @@ SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp VKMemory.cpp VKProperties.cpp + VKDebugOut.cpp VKInstance.cpp VKPhysicalDevice.cpp VKImageView.cpp diff --git a/src/RenderDevice/Vulkan/VKDebugOut.cpp b/src/RenderDevice/Vulkan/VKDebugOut.cpp index 723f40f9..da543f20 100644 --- a/src/RenderDevice/Vulkan/VKDebugOut.cpp +++ b/src/RenderDevice/Vulkan/VKDebugOut.cpp @@ -1,7 +1,62 @@ -#include +#include #include VK_NAMESPACE_BEGIN +namespace +{ + const char VkDebugReportObjectTypename[][32]= + { + "UNKNOWN", + "INSTANCE", + "PHYSICAL_DEVICE", + "DEVICE", + "QUEUE", + "SEMAPHORE", + "COMMAND_BUFFER", + "FENCE", + "DEVICE_MEMORY", + "BUFFER", + "IMAGE", + "EVENT", + "QUERY_POOL", + "BUFFER_VIEW", + "IMAGE_VIEW", + "SHADER_MODULE", + "PIPELINE_CACHE", + "PIPELINE_LAYOUT", + "RENDER_PASS", + "PIPELINE", + "DESCRIPTOR_SET_LAYOUT", + "SAMPLER", + "DESCRIPTOR_POOL", + "DESCRIPTOR_SET", + "FRAMEBUFFER", + "COMMAND_POOL", + "SURFACE_KHR", + "SWAPCHAIN_KHR", + "DEBUG_REPORT_CALLBACK_EXT", + "DISPLAY_KHR", + "DISPLAY_MODE_KHR", + "OBJECT_TABLE_NVX", + "INDIRECT_COMMANDS_LAYOUT_NVX", + "VALIDATION_CACHE_EXT", + + "SAMPLER_YCBCR_CONVERSION", + "DESCRIPTOR_UPDATE_TEMPLATE", + "ACCELERATION_STRUCTURE_NV" + }; +}//namespace + +const char *GetVkDebugReportObjectTypename(VkDebugReportObjectTypeEXT objType) +{ + if(objType==VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION_EXT) return VkDebugReportObjectTypename[VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT+1];else + if(objType==VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE_EXT) return VkDebugReportObjectTypename[VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT+2];else + if(objType==VK_DEBUG_REPORT_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV_EXT) return VkDebugReportObjectTypename[VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT+3];else + if(objTypeVK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT) return VkDebugReportObjectTypename[0];else + return VkDebugReportObjectTypename[objType]; +} + namespace { VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugUtilsMessengerEXT *pDebugMessenger) @@ -25,34 +80,33 @@ namespace func(instance,debugMessenger,pAllocator); } } - - VKAPI_ATTR VkBool32 VKAPI_CALL debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,VkDebugUtilsMessageTypeFlagsEXT messageType,const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,void *pUserData) + + VkBool32 DefaultVulkanDebugUtilsMessage(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, + VkDebugUtilsMessageTypeFlagsEXT messageType, + const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData) { - if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) - { - std::cout<<"ERROR: "<pMessage<pMessage<pMessage<pMessage<pMessage<pMessage<OnDebugUtilsMessage(messageSeverity,messageType,pCallbackData); + } + bool CreateDebugReportCallbackEXT(VkInstance instance,const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugReportCallbackEXT *pCallback) { auto func=(PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(instance,"vkCreateDebugReportCallbackEXT"); @@ -81,47 +135,43 @@ namespace } } - VKAPI_ATTR VkBool32 VKAPI_CALL dbgFunc(VkDebugReportFlagsEXT msgFlags,VkDebugReportObjectTypeEXT objType,uint64_t srcObject, + VkBool32 DefaultVulkanDebugReport( VkDebugReportFlagsEXT msgFlags, + VkDebugReportObjectTypeEXT objType, + uint64_t srcObject, + size_t location, + int32_t msgCode, + const char *pLayerPrefix, + const char *pMsg) + { + const char *obj_type_name=GetVkDebugReportObjectTypename(objType); + + if(msgFlags&VK_DEBUG_REPORT_ERROR_BIT_EXT) std::cerr<<"[ERROR:"; else + if(msgFlags&VK_DEBUG_REPORT_WARNING_BIT_EXT) std::cerr<<"[WARNING:"; else + if(msgFlags&VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT)std::cerr<<"[PERFORMANCE WARNING:"; else + if(msgFlags&VK_DEBUG_REPORT_INFORMATION_BIT_EXT) std::cerr<<"[INFO:"; else + if(msgFlags&VK_DEBUG_REPORT_DEBUG_BIT_EXT) std::cerr<<"[DEBUG:"; + + std::cerr<OnDebugReport(msgFlags,objType,srcObject,location,msgCode,pLayerPrefix,pMsg); } }//namespace +bool VKDebugOut::Init(VkInstance i) +{ + int count=0; - virtual bool Init(VkInstance); - debug_report_callback=VK_NULL_HANDLE; + inst=i; { VkDebugReportCallbackCreateInfoEXT create_info; @@ -133,39 +183,54 @@ namespace |VK_DEBUG_REPORT_DEBUG_BIT_EXT |VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; - create_info.pfnCallback =dbgFunc; - create_info.pUserData =nullptr; + create_info.pfnCallback =vulkan_debug_report_callback; + create_info.pUserData =this; - CreateDebugReportCallbackEXT(inst,&create_info,nullptr,&debug_report_callback); + if(CreateDebugReportCallbackEXT(inst,&create_info,nullptr,&debug_report_callback)) + ++count; } - debug_messenger=VK_NULL_HANDLE; { - VkDebugUtilsMessengerCreateInfoEXT createInfo; + VkDebugUtilsMessengerCreateInfoEXT create_info; - createInfo.sType =VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; - createInfo.pNext =nullptr; - createInfo.flags =0; + create_info.sType =VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT; + create_info.pNext =nullptr; + create_info.flags =0; - createInfo.messageSeverity =VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT + create_info.messageSeverity =VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT; - createInfo.messageType =VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT + create_info.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 =nullptr; + create_info.pfnUserCallback =vulkan_debug_utils_callback; + create_info.pUserData =this; - CreateDebugUtilsMessengerEXT(inst,&createInfo,nullptr,&debug_messenger); + if(CreateDebugUtilsMessengerEXT(inst,&create_info,nullptr,&debug_messenger)) + ++count; } - void close() - { - if(debug_messenger) - DestroyDebugUtilsMessengerEXT(inst,debug_messenger,nullptr); + return(count); +} - if(debug_report_callback) - DestroyDebugReportCallbackEXT(inst,debug_report_callback,nullptr); - } \ No newline at end of file +VKDebugOut::~VKDebugOut() +{ + if(debug_messenger) + DestroyDebugUtilsMessengerEXT(inst,debug_messenger,nullptr); + + if(debug_report_callback) + DestroyDebugReportCallbackEXT(inst,debug_report_callback,nullptr); +} + +VkBool32 VKDebugOut::OnDebugUtilsMessage(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,VkDebugUtilsMessageTypeFlagsEXT messageType,const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData) +{ + return DefaultVulkanDebugUtilsMessage(messageSeverity,messageType,pCallbackData); +} + +VkBool32 VKDebugOut::OnDebugReport(VkDebugReportFlagsEXT msgFlags,VkDebugReportObjectTypeEXT objType,uint64_t srcObject,size_t location,int32_t msgCode,const char *pLayerPrefix,const char *pMsg) +{ + return DefaultVulkanDebugReport(msgFlags,objType,srcObject,location,msgCode,pLayerPrefix,pMsg); +} +VK_NAMESPACE_END \ No newline at end of file diff --git a/src/RenderDevice/Vulkan/VKInstance.cpp b/src/RenderDevice/Vulkan/VKInstance.cpp index 6334ef55..cde5fdd4 100644 --- a/src/RenderDevice/Vulkan/VKInstance.cpp +++ b/src/RenderDevice/Vulkan/VKInstance.cpp @@ -1,12 +1,13 @@ #include #include #include +#include #include VK_NAMESPACE_BEGIN Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *); -Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *do) +Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *out) { VkApplicationInfo app_info; VkInstanceCreateInfo inst_info; @@ -43,19 +44,22 @@ Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *do) if(vkCreateInstance(&inst_info,nullptr,&inst)==VK_SUCCESS) { - do->Init(inst); - return(new Instance(inst,ext_list,do)); + if(!out) + out=new VKDebugOut; + + out->Init(inst); + return(new Instance(inst,ext_list,out)); } return(nullptr); } -Instance::Instance(VkInstance i,CharPointerList &el,VKDebugOut *do) +Instance::Instance(VkInstance i,CharPointerList &el,VKDebugOut *out) { inst=i; ext_list=el; - debug_out=do; + debug_out=out; uint32_t gpu_count = 1; @@ -72,7 +76,7 @@ Instance::Instance(VkInstance i,CharPointerList &el,VKDebugOut *do) } Instance::~Instance() - +{ SAFE_CLEAR(debug_out); physical_devices.Clear();