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();