Vulkan: Debugging Tools #107635
@ -6,6 +6,8 @@
|
||||
* \ingroup gpu
|
||||
*/
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
#include "vk_common.hh"
|
||||
|
||||
namespace blender::gpu {
|
||||
@ -747,4 +749,109 @@ VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test)
|
||||
return VK_CULL_MODE_NONE;
|
||||
}
|
||||
|
||||
const char *to_string(VkObjectType type)
|
||||
{
|
||||
|
||||
switch (type) {
|
||||
case VK_OBJECT_TYPE_UNKNOWN:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_UNKNOWN);
|
||||
case VK_OBJECT_TYPE_INSTANCE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_INSTANCE);
|
||||
case VK_OBJECT_TYPE_PHYSICAL_DEVICE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_PHYSICAL_DEVICE);
|
||||
case VK_OBJECT_TYPE_DEVICE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DEVICE);
|
||||
case VK_OBJECT_TYPE_QUEUE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_QUEUE);
|
||||
case VK_OBJECT_TYPE_SEMAPHORE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_SEMAPHORE);
|
||||
case VK_OBJECT_TYPE_COMMAND_BUFFER:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_COMMAND_BUFFER);
|
||||
case VK_OBJECT_TYPE_FENCE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_FENCE);
|
||||
case VK_OBJECT_TYPE_DEVICE_MEMORY:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DEVICE_MEMORY);
|
||||
case VK_OBJECT_TYPE_BUFFER:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_BUFFER);
|
||||
case VK_OBJECT_TYPE_IMAGE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_IMAGE);
|
||||
case VK_OBJECT_TYPE_EVENT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_EVENT);
|
||||
case VK_OBJECT_TYPE_QUERY_POOL:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_QUERY_POOL);
|
||||
case VK_OBJECT_TYPE_BUFFER_VIEW:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_BUFFER_VIEW);
|
||||
case VK_OBJECT_TYPE_IMAGE_VIEW:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_IMAGE_VIEW);
|
||||
case VK_OBJECT_TYPE_SHADER_MODULE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_SHADER_MODULE);
|
||||
case VK_OBJECT_TYPE_PIPELINE_CACHE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_PIPELINE_CACHE);
|
||||
case VK_OBJECT_TYPE_PIPELINE_LAYOUT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_PIPELINE_LAYOUT);
|
||||
case VK_OBJECT_TYPE_RENDER_PASS:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_RENDER_PASS);
|
||||
case VK_OBJECT_TYPE_PIPELINE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_PIPELINE);
|
||||
case VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT);
|
||||
case VK_OBJECT_TYPE_SAMPLER:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_SAMPLER);
|
||||
case VK_OBJECT_TYPE_DESCRIPTOR_POOL:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DESCRIPTOR_POOL);
|
||||
case VK_OBJECT_TYPE_DESCRIPTOR_SET:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DESCRIPTOR_SET);
|
||||
case VK_OBJECT_TYPE_FRAMEBUFFER:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_FRAMEBUFFER);
|
||||
case VK_OBJECT_TYPE_COMMAND_POOL:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_COMMAND_POOL);
|
||||
case VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_SAMPLER_YCBCR_CONVERSION);
|
||||
case VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DESCRIPTOR_UPDATE_TEMPLATE);
|
||||
case VK_OBJECT_TYPE_SURFACE_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_SURFACE_KHR);
|
||||
case VK_OBJECT_TYPE_SWAPCHAIN_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_SWAPCHAIN_KHR);
|
||||
case VK_OBJECT_TYPE_DISPLAY_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DISPLAY_KHR);
|
||||
case VK_OBJECT_TYPE_DISPLAY_MODE_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DISPLAY_MODE_KHR);
|
||||
case VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DEBUG_REPORT_CALLBACK_EXT);
|
||||
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
||||
case VK_OBJECT_TYPE_VIDEO_SESSION_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_VIDEO_SESSION_KHR);
|
||||
#endif
|
||||
#ifdef VK_ENABLE_BETA_EXTENSIONS
|
||||
case VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_VIDEO_SESSION_PARAMETERS_KHR);
|
||||
#endif
|
||||
case VK_OBJECT_TYPE_CU_MODULE_NVX:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_CU_MODULE_NVX);
|
||||
case VK_OBJECT_TYPE_CU_FUNCTION_NVX:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_CU_FUNCTION_NVX);
|
||||
case VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DEBUG_UTILS_MESSENGER_EXT);
|
||||
case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_KHR);
|
||||
case VK_OBJECT_TYPE_VALIDATION_CACHE_EXT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_VALIDATION_CACHE_EXT);
|
||||
case VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_ACCELERATION_STRUCTURE_NV);
|
||||
case VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_PERFORMANCE_CONFIGURATION_INTEL);
|
||||
case VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_DEFERRED_OPERATION_KHR);
|
||||
case VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_INDIRECT_COMMANDS_LAYOUT_NV);
|
||||
case VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_PRIVATE_DATA_SLOT_EXT);
|
||||
case VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA:
|
||||
return STRINGIFY_ARG(VK_OBJECT_TYPE_BUFFER_COLLECTION_FUCHSIA);
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
}
|
||||
return "NotFound";
|
||||
};
|
||||
} // namespace blender::gpu
|
||||
|
@ -35,6 +35,7 @@ VkClearColorValue to_vk_clear_color_value(const eGPUDataFormat format, const voi
|
||||
VkIndexType to_vk_index_type(const GPUIndexBufType index_type);
|
||||
VkPrimitiveTopology to_vk_primitive_topology(const GPUPrimType prim_type);
|
||||
VkCullModeFlags to_vk_cull_mode_flags(const eGPUFaceCullTest cull_test);
|
||||
const char *to_string(VkObjectType type);
|
||||
|
||||
template<typename T> VkObjectType to_vk_object_type(T /*vk_obj*/)
|
||||
{
|
||||
|
@ -7,11 +7,15 @@
|
||||
*/
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BLI_dynstr.h"
|
||||
#include "CLG_log.h"
|
||||
|
||||
#include "vk_backend.hh"
|
||||
#include "vk_context.hh"
|
||||
#include "vk_debug.hh"
|
||||
|
||||
static CLG_LogRef LOG = {"gpu.debug.vulkan"};
|
||||
|
||||
namespace blender::gpu {
|
||||
void VKContext::debug_group_begin(const char *name, int)
|
||||
{
|
||||
@ -70,6 +74,7 @@ void VKDebuggingTools::init(VkInstance vk_instance)
|
||||
{
|
||||
PFN_vkGetInstanceProcAddr instance_proc_addr = vkGetInstanceProcAddr;
|
||||
enabled = false;
|
||||
vk_debug_utils_messenger = nullptr;
|
||||
vkCmdBeginDebugUtilsLabelEXT_r = (PFN_vkCmdBeginDebugUtilsLabelEXT)instance_proc_addr(
|
||||
vk_instance, "vkCmdBeginDebugUtilsLabelEXT");
|
||||
vkCmdEndDebugUtilsLabelEXT_r = (PFN_vkCmdEndDebugUtilsLabelEXT)instance_proc_addr(
|
||||
@ -94,11 +99,15 @@ void VKDebuggingTools::init(VkInstance vk_instance)
|
||||
vk_instance, "vkSubmitDebugUtilsMessageEXT");
|
||||
if (vkCmdBeginDebugUtilsLabelEXT_r) {
|
||||
enabled = true;
|
||||
init_messenger(vk_instance);
|
||||
}
|
||||
}
|
||||
|
||||
void VKDebuggingTools::deinit()
|
||||
void VKDebuggingTools::deinit(VkInstance vk_instance)
|
||||
{
|
||||
if (enabled) {
|
||||
destroy_messenger(vk_instance);
|
||||
}
|
||||
vkCmdBeginDebugUtilsLabelEXT_r = nullptr;
|
||||
vkCmdEndDebugUtilsLabelEXT_r = nullptr;
|
||||
vkCmdInsertDebugUtilsLabelEXT_r = nullptr;
|
||||
@ -206,3 +215,231 @@ void pop_marker(const VKDevice &device)
|
||||
}
|
||||
|
||||
} // namespace blender::gpu::debug
|
||||
|
||||
namespace blender::gpu::debug {
|
||||
VKDebuggingTools::~VKDebuggingTools()
|
||||
{
|
||||
BLI_assert(vk_debug_utils_messenger == nullptr);
|
||||
};
|
||||
void VKDebuggingTools::print_vulkan_version()
|
||||
{
|
||||
uint32_t instanceVersion = VK_API_VERSION_1_0;
|
||||
vkEnumerateInstanceVersion(&instanceVersion);
|
||||
uint32_t major = VK_VERSION_MAJOR(instanceVersion);
|
||||
uint32_t minor = VK_VERSION_MINOR(instanceVersion);
|
||||
uint32_t patch = VK_VERSION_PATCH(instanceVersion);
|
||||
|
||||
printf("Vulkan Version:%u.%u.%u\n", major, minor, patch);
|
||||
}
|
||||
|
||||
void VKDebuggingTools::print_labels(const VkDebugUtilsMessengerCallbackDataEXT *callback_data)
|
||||
{
|
||||
std::stringstream ss;
|
||||
if (callback_data->objectCount > 0) {
|
||||
ss << std::endl;
|
||||
ss << callback_data->objectCount << " Object[s] related \n";
|
||||
for (uint32_t object = 0; object < callback_data->objectCount; ++object) {
|
||||
ss << "ObjectType[" << to_string(callback_data->pObjects[object].objectType) << "],";
|
||||
ss << "Handle[0x" << std::hex
|
||||
<< static_cast<uintptr_t>(callback_data->pObjects[object].objectHandle) << "]";
|
||||
if (callback_data->pObjects[object].pObjectName) {
|
||||
ss << ",Name[" << callback_data->pObjects[object].pObjectName << "]";
|
||||
}
|
||||
ss << std::endl;
|
||||
}
|
||||
}
|
||||
if (callback_data->cmdBufLabelCount > 0) {
|
||||
ss << std::endl;
|
||||
ss << callback_data->cmdBufLabelCount << " Command Buffer Label[s] " << std::endl;
|
||||
for (uint32_t label = 0; label < callback_data->cmdBufLabelCount; ++label) {
|
||||
if (callback_data->pCmdBufLabels[label].pLabelName) {
|
||||
ss << "CmdBufLabelName : " << callback_data->pCmdBufLabels[label].pLabelName << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (callback_data->queueLabelCount > 0) {
|
||||
ss << std::endl;
|
||||
ss << callback_data->queueLabelCount << " Queue Label[s]\n";
|
||||
for (uint32_t label = 0; label < callback_data->queueLabelCount; ++label) {
|
||||
if (callback_data->pQueueLabels[label].pLabelName) {
|
||||
ss << "QueueLabelName : " << callback_data->pQueueLabels[label].pLabelName << std::endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
printf("%s\n", ss.str().c_str());
|
||||
fflush(stdout);
|
||||
}
|
||||
VKAPI_ATTR VkBool32 VKAPI_CALL
|
||||
messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
|
||||
VkDebugUtilsMessageTypeFlagsEXT /* message_type*/,
|
||||
const VkDebugUtilsMessengerCallbackDataEXT *callback_data,
|
||||
void *user_data);
|
||||
VKAPI_ATTR VkBool32 VKAPI_CALL
|
||||
messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
|
||||
VkDebugUtilsMessageTypeFlagsEXT /* message_type*/,
|
||||
const VkDebugUtilsMessengerCallbackDataEXT *callback_data,
|
||||
void *user_data)
|
||||
{
|
||||
VKDebuggingTools &debugging_tools = *reinterpret_cast<VKDebuggingTools *>(user_data);
|
||||
if (debugging_tools.is_ignore(callback_data->messageIdNumber)) {
|
||||
return VK_FALSE;
|
||||
}
|
||||
bool use_color = CLG_color_support_get(&LOG);
|
||||
UNUSED_VARS(use_color);
|
||||
bool enabled = false;
|
||||
if ((message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) ||
|
||||
(message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT))
|
||||
{
|
||||
if ((LOG.type->flag & CLG_FLAG_USE) && (LOG.type->level >= CLG_SEVERITY_INFO)) {
|
||||
const char *format = "{0x%x}% s\n %s ";
|
||||
CLG_logf(LOG.type,
|
||||
CLG_SEVERITY_INFO,
|
||||
"",
|
||||
"",
|
||||
format,
|
||||
callback_data->messageIdNumber,
|
||||
callback_data->pMessageIdName,
|
||||
callback_data->pMessage);
|
||||
enabled = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
CLG_Severity clog_severity;
|
||||
switch (message_severity) {
|
||||
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT:
|
||||
clog_severity = CLG_SEVERITY_WARN;
|
||||
break;
|
||||
case VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT:
|
||||
clog_severity = CLG_SEVERITY_ERROR;
|
||||
break;
|
||||
default:
|
||||
BLI_assert_unreachable();
|
||||
}
|
||||
enabled = true;
|
||||
if (clog_severity == CLG_SEVERITY_ERROR) {
|
||||
const char *format = " %s {0x%x}\n %s ";
|
||||
CLG_logf(LOG.type,
|
||||
clog_severity,
|
||||
"",
|
||||
"",
|
||||
format,
|
||||
callback_data->pMessageIdName,
|
||||
callback_data->messageIdNumber,
|
||||
callback_data->pMessage);
|
||||
}
|
||||
else if (LOG.type->level >= CLG_SEVERITY_WARN) {
|
||||
const char *format = " %s {0x%x}\n %s ";
|
||||
CLG_logf(LOG.type,
|
||||
clog_severity,
|
||||
"",
|
||||
"",
|
||||
format,
|
||||
callback_data->pMessageIdName,
|
||||
callback_data->messageIdNumber,
|
||||
callback_data->pMessage);
|
||||
}
|
||||
}
|
||||
if ((enabled) && ((callback_data->objectCount > 0) || (callback_data->cmdBufLabelCount > 0) ||
|
||||
(callback_data->queueLabelCount > 0)))
|
||||
{
|
||||
debugging_tools.print_labels(callback_data);
|
||||
}
|
||||
return VK_TRUE;
|
||||
};
|
||||
|
||||
VkResult VKDebuggingTools::init_messenger(VkInstance vk_instance)
|
||||
{
|
||||
print_vulkan_version();
|
||||
vk_message_id_number_ignored.clear();
|
||||
BLI_assert(enabled);
|
||||
|
||||
VkDebugUtilsMessengerCreateInfoEXT create_info;
|
||||
create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
|
||||
create_info.pNext = nullptr;
|
||||
create_info.flags = 0;
|
||||
create_info.messageSeverity = message_severity;
|
||||
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;
|
||||
create_info.pfnUserCallback = messenger_callback;
|
||||
create_info.pUserData = this;
|
||||
VkResult res = vkCreateDebugUtilsMessengerEXT_r(
|
||||
vk_instance, &create_info, nullptr, &vk_debug_utils_messenger);
|
||||
BLI_assert(res == VK_SUCCESS);
|
||||
return res;
|
||||
}
|
||||
|
||||
void VKDebuggingTools::destroy_messenger(VkInstance vk_instance)
|
||||
{
|
||||
if (vk_debug_utils_messenger == nullptr) {
|
||||
return;
|
||||
}
|
||||
BLI_assert(enabled);
|
||||
vkDestroyDebugUtilsMessengerEXT_r(vk_instance, vk_debug_utils_messenger, nullptr);
|
||||
|
||||
vk_message_id_number_ignored.clear();
|
||||
vk_debug_utils_messenger = nullptr;
|
||||
return;
|
||||
}
|
||||
|
||||
bool VKDebuggingTools::is_ignore(int32_t id_number)
|
||||
{
|
||||
bool found = false;
|
||||
{
|
||||
std::scoped_lock lock(ignore_mutex);
|
||||
found = vk_message_id_number_ignored.contains(id_number);
|
||||
}
|
||||
return found;
|
||||
}
|
||||
|
||||
void VKDebuggingTools::add_group(int32_t id_number)
|
||||
{
|
||||
std::scoped_lock lock(ignore_mutex);
|
||||
vk_message_id_number_ignored.add(id_number);
|
||||
};
|
||||
|
||||
void VKDebuggingTools::remove_group(int32_t id_number)
|
||||
{
|
||||
std::scoped_lock lock(ignore_mutex);
|
||||
vk_message_id_number_ignored.remove(id_number);
|
||||
};
|
||||
|
||||
void raise_message(int32_t id_number,
|
||||
VkDebugUtilsMessageSeverityFlagBitsEXT vk_severity_flag_bits,
|
||||
const char *format,
|
||||
...)
|
||||
{
|
||||
const VKDevice &device = VKBackend::get().device_get();
|
||||
const VKDebuggingTools &debugging_tools = device.debugging_tools_get();
|
||||
if (debugging_tools.enabled) {
|
||||
DynStr *ds = nullptr;
|
||||
va_list arg;
|
||||
char *info = nullptr;
|
||||
|
||||
va_start(arg, format);
|
||||
|
||||
ds = BLI_dynstr_new();
|
||||
BLI_dynstr_vappendf(ds, format, arg);
|
||||
info = BLI_dynstr_get_cstring(ds);
|
||||
BLI_dynstr_free(ds);
|
||||
|
||||
va_end(arg);
|
||||
|
||||
static VkDebugUtilsMessengerCallbackDataEXT vk_call_back_data;
|
||||
vk_call_back_data.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT;
|
||||
vk_call_back_data.pNext = VK_NULL_HANDLE;
|
||||
vk_call_back_data.messageIdNumber = id_number;
|
||||
vk_call_back_data.pMessageIdName = "VulkanMessenger";
|
||||
vk_call_back_data.objectCount = 0;
|
||||
vk_call_back_data.flags = 0;
|
||||
vk_call_back_data.pObjects = VK_NULL_HANDLE;
|
||||
vk_call_back_data.pMessage = info;
|
||||
debugging_tools.vkSubmitDebugUtilsMessageEXT_r(device.instance_get(),
|
||||
vk_severity_flag_bits,
|
||||
VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT,
|
||||
&vk_call_back_data);
|
||||
MEM_freeN((void *)info);
|
||||
}
|
||||
}
|
||||
|
||||
}; // namespace blender::gpu::debug
|
||||
|
@ -8,10 +8,12 @@
|
||||
#pragma once
|
||||
|
||||
#include "BKE_global.h"
|
||||
#include "BLI_set.hh"
|
||||
#include "BLI_string.h"
|
||||
|
||||
#include "vk_common.hh"
|
||||
|
||||
#include <mutex>
|
||||
#include <typeindex>
|
||||
|
||||
namespace blender::gpu {
|
||||
@ -19,8 +21,14 @@ class VKContext;
|
||||
class VKDevice;
|
||||
|
||||
namespace debug {
|
||||
struct VKDebuggingTools {
|
||||
class VKDebuggingTools {
|
||||
public:
|
||||
bool enabled = false;
|
||||
VkDebugUtilsMessageSeverityFlagsEXT message_severity =
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
|
||||
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
|
||||
/* Function pointer definitions. */
|
||||
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT_r = nullptr;
|
||||
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT_r = nullptr;
|
||||
@ -33,9 +41,22 @@ struct VKDebuggingTools {
|
||||
PFN_vkQueueInsertDebugUtilsLabelEXT vkQueueInsertDebugUtilsLabelEXT_r = nullptr;
|
||||
PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectNameEXT_r = nullptr;
|
||||
PFN_vkSetDebugUtilsObjectTagEXT vkSetDebugUtilsObjectTagEXT_r = nullptr;
|
||||
|
||||
VKDebuggingTools() = default;
|
||||
~VKDebuggingTools();
|
||||
void init(VkInstance vk_instance);
|
||||
void deinit();
|
||||
void deinit(VkInstance vk_instance);
|
||||
bool is_ignore(int32_t id_number);
|
||||
VkResult init_messenger(VkInstance vk_instance);
|
||||
void destroy_messenger(VkInstance vk_instance);
|
||||
void print_labels(const VkDebugUtilsMessengerCallbackDataEXT *callback_data);
|
||||
|
||||
private:
|
||||
VkDebugUtilsMessengerEXT vk_debug_utils_messenger = nullptr;
|
||||
Set<int32_t> vk_message_id_number_ignored;
|
||||
std::mutex ignore_mutex;
|
||||
void print_vulkan_version();
|
||||
void add_group(int32_t id_number);
|
||||
void remove_group(int32_t id_number);
|
||||
};
|
||||
|
||||
void object_label(VkObjectType vk_object_type, uint64_t object_handle, const char *name);
|
||||
@ -58,5 +79,11 @@ void pop_marker(VkCommandBuffer vk_command_buffer);
|
||||
void push_marker(const VKDevice &device, const char *name);
|
||||
void set_marker(const VKDevice &device, const char *name);
|
||||
void pop_marker(const VKDevice &device);
|
||||
/* how to use : debug::raise_message(0xB41ca2,VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT,"This
|
||||
* is a raise message. %llx", (uintptr_t)vk_object); */
|
||||
void raise_message(int32_t id_number,
|
||||
VkDebugUtilsMessageSeverityFlagBitsEXT vk_severity_flag_bits,
|
||||
const char *fmt,
|
||||
...);
|
||||
} // namespace debug
|
||||
} // namespace blender::gpu
|
||||
|
@ -18,7 +18,7 @@ void VKDevice::deinit()
|
||||
{
|
||||
vmaDestroyAllocator(mem_allocator_);
|
||||
mem_allocator_ = VK_NULL_HANDLE;
|
||||
debugging_tools_.deinit();
|
||||
debugging_tools_.deinit(vk_instance_);
|
||||
|
||||
vk_instance_ = VK_NULL_HANDLE;
|
||||
vk_physical_device_ = VK_NULL_HANDLE;
|
||||
|
Loading…
Reference in New Issue
Block a user