完成新的VKDebugOut对象,使用户创建时可使用自定义的Debug输出

This commit is contained in:
hyzboy 2019-11-08 01:58:51 +08:00
parent 19be1c4d9f
commit 4079407f73
5 changed files with 177 additions and 89 deletions

View File

@ -5,19 +5,37 @@
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
const char *GetVkDebugReportObjectTypename(VkDebugReportObjectTypeEXT objType);
/**
* Vulkan <br>
*
*/
class VKDebugOut class VKDebugOut
{ {
VkInstance inst=nullptr; VkInstance inst;
VkDebugUtilsMessengerEXT debug_messenger; VkDebugUtilsMessengerEXT debug_messenger;
VkDebugReportCallbackEXT debug_report_callback; VkDebugReportCallbackEXT debug_report_callback;
public: 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 ~VKDebugOut();
virtual bool Init(VkInstance); virtual bool Init(VkInstance);
};//class VKDebugOut };//class VKDebugOut
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_DEBUG_OUT_INCLUDE #endif//HGL_GRAPH_VULKAN_DEBUG_OUT_INCLUDE

View File

@ -20,9 +20,9 @@ VK_NAMESPACE_BEGIN
private: 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: public:
@ -35,6 +35,6 @@ VK_NAMESPACE_BEGIN
const PhysicalDevice * GetDevice (VkPhysicalDeviceType)const; const PhysicalDevice * GetDevice (VkPhysicalDeviceType)const;
};//class Instance };//class Instance
Instance *CreateInstance(const UTF8String &,VKDebugOut *do=nullptr); ///<创建一个Vulkan实例 Instance *CreateInstance(const UTF8String &,VKDebugOut *); ///<创建一个Vulkan实例
VK_NAMESPACE_END VK_NAMESPACE_END
#endif//HGL_GRAPH_VULKAN_INSTANCE_INCLUDE #endif//HGL_GRAPH_VULKAN_INSTANCE_INCLUDE

View File

@ -3,6 +3,7 @@
SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp SET(RENDER_DEVICE_VULKAN_SOURCE VKFormat.cpp
VKMemory.cpp VKMemory.cpp
VKProperties.cpp VKProperties.cpp
VKDebugOut.cpp
VKInstance.cpp VKInstance.cpp
VKPhysicalDevice.cpp VKPhysicalDevice.cpp
VKImageView.cpp VKImageView.cpp

View File

@ -1,7 +1,62 @@
#include<hgl/graph/vulkan/VK.h> #include<hgl/graph/vulkan/VKDebugOut.h>
#include<iostream> #include<iostream>
VK_NAMESPACE_BEGIN 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(objType<VK_DEBUG_REPORT_OBJECT_TYPE_UNKNOWN_EXT
&&objType>VK_DEBUG_REPORT_OBJECT_TYPE_VALIDATION_CACHE_EXT_EXT) return VkDebugReportObjectTypename[0];else
return VkDebugReportObjectTypename[objType];
}
namespace namespace
{ {
VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugUtilsMessengerEXT *pDebugMessenger) VkResult CreateDebugUtilsMessengerEXT(VkInstance instance,const VkDebugUtilsMessengerCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugUtilsMessengerEXT *pDebugMessenger)
@ -26,33 +81,32 @@ namespace
} }
} }
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) if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) std::cerr<<"[ERROR] "; else
{ if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) std::cerr<<"[WARNING] "; else
std::cout<<"ERROR: "<<pCallbackData->pMessage<<std::endl; if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) std::cerr<<"[INFO] "; else
} if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) std::cerr<<"[VERBOSE] "; else
else std::cerr<<"[Validation layer] ";
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
{ std::cerr<<pCallbackData->pMessage<<std::endl;
std::cout<<"WARNING: "<<pCallbackData->pMessage<<std::endl;
}
else
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT)
{
std::cout<<"INFO: "<<pCallbackData->pMessage<<std::endl;
}
else
if(messageSeverity&VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT)
{
std::cout<<"VERBOSE: "<<pCallbackData->pMessage<<std::endl;
}
else
std::cerr<<"validation layer: "<<pCallbackData->pMessage<<std::endl;
return VK_FALSE; return VK_FALSE;
} }
VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_utils_callback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,VkDebugUtilsMessageTypeFlagsEXT messageType,const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData,void *pUserData)
{
if(!pCallbackData)
return VK_FALSE;
if(!pUserData)
return DefaultVulkanDebugUtilsMessage(messageSeverity,messageType,pCallbackData);
else
return ((VKDebugOut *)pUserData)->OnDebugUtilsMessage(messageSeverity,messageType,pCallbackData);
}
bool CreateDebugReportCallbackEXT(VkInstance instance,const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugReportCallbackEXT *pCallback) bool CreateDebugReportCallbackEXT(VkInstance instance,const VkDebugReportCallbackCreateInfoEXT *pCreateInfo,const VkAllocationCallbacks *pAllocator,VkDebugReportCallbackEXT *pCallback)
{ {
auto func=(PFN_vkCreateDebugReportCallbackEXT)vkGetInstanceProcAddr(instance,"vkCreateDebugReportCallbackEXT"); 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<<msgCode<<"]["<<obj_type_name<<":"<<srcObject<<"][Location:"<<location<<"]["<<pLayerPrefix<<"] "<<pMsg<<std::endl;
return VK_FALSE;
}
VKAPI_ATTR VkBool32 VKAPI_CALL vulkan_debug_report_callback(VkDebugReportFlagsEXT msgFlags,VkDebugReportObjectTypeEXT objType,uint64_t srcObject,
size_t location,int32_t msgCode,const char *pLayerPrefix,const char *pMsg, size_t location,int32_t msgCode,const char *pLayerPrefix,const char *pMsg,
void *pUserData) void *pUserData)
{ {
if(msgFlags&VK_DEBUG_REPORT_ERROR_BIT_EXT) if(!pUserData)
{ return DefaultVulkanDebugReport(msgFlags,objType,srcObject,location,msgCode,pLayerPrefix,pMsg);
std::cout<<"ERROR: "; else
} return ((VKDebugOut *)pUserData)->OnDebugReport(msgFlags,objType,srcObject,location,msgCode,pLayerPrefix,pMsg);
else if(msgFlags&VK_DEBUG_REPORT_WARNING_BIT_EXT)
{
std::cout<<"WARNING: ";
}
else if(msgFlags&VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT)
{
std::cout<<"PERFORMANCE WARNING: ";
}
else if(msgFlags&VK_DEBUG_REPORT_INFORMATION_BIT_EXT)
{
std::cout<<"INFO: ";
}
else if(msgFlags&VK_DEBUG_REPORT_DEBUG_BIT_EXT)
{
std::cout<<"DEBUG: ";
}
std::cout<<"["<<pLayerPrefix<<"] Code "<<msgCode<<" : "<<pMsg<<std::endl;
/*
* false indicates that layer should not bail-out of an
* API call that had validation failures. This may mean that the
* app dies inside the driver due to invalid parameter(s).
* That's what would happen without validation layers, so we'll
* keep that behavior here.
*/
return false;
} }
}//namespace }//namespace
bool VKDebugOut::Init(VkInstance i)
{
int count=0;
virtual bool Init(VkInstance); inst=i;
debug_report_callback=VK_NULL_HANDLE;
{ {
VkDebugReportCallbackCreateInfoEXT create_info; VkDebugReportCallbackCreateInfoEXT create_info;
@ -133,39 +183,54 @@ namespace
|VK_DEBUG_REPORT_DEBUG_BIT_EXT |VK_DEBUG_REPORT_DEBUG_BIT_EXT
|VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT; |VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
create_info.pfnCallback =dbgFunc; create_info.pfnCallback =vulkan_debug_report_callback;
create_info.pUserData =nullptr; 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; create_info.sType =VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
createInfo.pNext =nullptr; create_info.pNext =nullptr;
createInfo.flags =0; 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_WARNING_BIT_EXT
|VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_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_VALIDATION_BIT_EXT
|VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT; |VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
createInfo.pfnUserCallback =debugCallback; create_info.pfnUserCallback =vulkan_debug_utils_callback;
createInfo.pUserData =nullptr; create_info.pUserData =this;
CreateDebugUtilsMessengerEXT(inst,&createInfo,nullptr,&debug_messenger); if(CreateDebugUtilsMessengerEXT(inst,&create_info,nullptr,&debug_messenger))
++count;
} }
void close() return(count);
{ }
if(debug_messenger)
DestroyDebugUtilsMessengerEXT(inst,debug_messenger,nullptr);
if(debug_report_callback) VKDebugOut::~VKDebugOut()
DestroyDebugReportCallbackEXT(inst,debug_report_callback,nullptr); {
} 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

View File

@ -1,12 +1,13 @@
#include<hgl/graph/vulkan/VKInstance.h> #include<hgl/graph/vulkan/VKInstance.h>
#include<hgl/graph/vulkan/VKSurfaceExtensionName.h> #include<hgl/graph/vulkan/VKSurfaceExtensionName.h>
#include<hgl/graph/vulkan/VKPhysicalDevice.h> #include<hgl/graph/vulkan/VKPhysicalDevice.h>
#include<hgl/graph/vulkan/VKDebugOut.h>
#include<iostream> #include<iostream>
VK_NAMESPACE_BEGIN VK_NAMESPACE_BEGIN
Device *CreateRenderDevice(VkInstance,const PhysicalDevice *,Window *); 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; VkApplicationInfo app_info;
VkInstanceCreateInfo inst_info; VkInstanceCreateInfo inst_info;
@ -43,19 +44,22 @@ Instance *CreateInstance(const UTF8String &app_name,VKDebugOut *do)
if(vkCreateInstance(&inst_info,nullptr,&inst)==VK_SUCCESS) if(vkCreateInstance(&inst_info,nullptr,&inst)==VK_SUCCESS)
{ {
do->Init(inst); if(!out)
return(new Instance(inst,ext_list,do)); out=new VKDebugOut;
out->Init(inst);
return(new Instance(inst,ext_list,out));
} }
return(nullptr); return(nullptr);
} }
Instance::Instance(VkInstance i,CharPointerList &el,VKDebugOut *do) Instance::Instance(VkInstance i,CharPointerList &el,VKDebugOut *out)
{ {
inst=i; inst=i;
ext_list=el; ext_list=el;
debug_out=do; debug_out=out;
uint32_t gpu_count = 1; uint32_t gpu_count = 1;
@ -72,7 +76,7 @@ Instance::Instance(VkInstance i,CharPointerList &el,VKDebugOut *do)
} }
Instance::~Instance() Instance::~Instance()
{
SAFE_CLEAR(debug_out); SAFE_CLEAR(debug_out);
physical_devices.Clear(); physical_devices.Clear();