18 PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
19 PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
20 VkDebugUtilsMessengerEXT debugUtilsMessenger;
23 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
24 VkDebugUtilsMessageTypeFlagsEXT messageType,
25 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
29 std::string prefix(
"");
31 if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) {
34 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) {
37 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
40 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
46 std::stringstream debugMessage;
47 debugMessage << prefix <<
"[" << pCallbackData->messageIdNumber <<
"][" << pCallbackData->pMessageIdName <<
"] : " << pCallbackData->pMessage;
49#if defined(__ANDROID__)
50 if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
51 LOGE(
"%s", debugMessage.str().c_str());
53 LOGD(
"%s", debugMessage.str().c_str());
56 if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
57 std::cerr << debugMessage.str() <<
"\n";
59 std::cout << debugMessage.str() <<
"\n";
71 void setupDebugging(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportCallbackEXT callBack)
74 vkCreateDebugUtilsMessengerEXT =
reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT
>(vkGetInstanceProcAddr(instance,
"vkCreateDebugUtilsMessengerEXT"));
75 vkDestroyDebugUtilsMessengerEXT =
reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT
>(vkGetInstanceProcAddr(instance,
"vkDestroyDebugUtilsMessengerEXT"));
77 VkDebugUtilsMessengerCreateInfoEXT debugUtilsMessengerCI{};
78 debugUtilsMessengerCI.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
79 debugUtilsMessengerCI.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
80 debugUtilsMessengerCI.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
82 VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI,
nullptr, &debugUtilsMessenger);
83 assert(result == VK_SUCCESS);
86 void freeDebugCallback(VkInstance instance)
88 if (debugUtilsMessenger != VK_NULL_HANDLE)
90 vkDestroyDebugUtilsMessengerEXT(instance, debugUtilsMessenger,
nullptr);
99 PFN_vkDebugMarkerSetObjectTagEXT pfnDebugMarkerSetObjectTag = VK_NULL_HANDLE;
100 PFN_vkDebugMarkerSetObjectNameEXT pfnDebugMarkerSetObjectName = VK_NULL_HANDLE;
101 PFN_vkCmdDebugMarkerBeginEXT pfnCmdDebugMarkerBegin = VK_NULL_HANDLE;
102 PFN_vkCmdDebugMarkerEndEXT pfnCmdDebugMarkerEnd = VK_NULL_HANDLE;
103 PFN_vkCmdDebugMarkerInsertEXT pfnCmdDebugMarkerInsert = VK_NULL_HANDLE;
105 void setup(VkDevice device)
107 pfnDebugMarkerSetObjectTag =
reinterpret_cast<PFN_vkDebugMarkerSetObjectTagEXT
>(vkGetDeviceProcAddr(device,
"vkDebugMarkerSetObjectTagEXT"));
108 pfnDebugMarkerSetObjectName =
reinterpret_cast<PFN_vkDebugMarkerSetObjectNameEXT
>(vkGetDeviceProcAddr(device,
"vkDebugMarkerSetObjectNameEXT"));
109 pfnCmdDebugMarkerBegin =
reinterpret_cast<PFN_vkCmdDebugMarkerBeginEXT
>(vkGetDeviceProcAddr(device,
"vkCmdDebugMarkerBeginEXT"));
110 pfnCmdDebugMarkerEnd =
reinterpret_cast<PFN_vkCmdDebugMarkerEndEXT
>(vkGetDeviceProcAddr(device,
"vkCmdDebugMarkerEndEXT"));
111 pfnCmdDebugMarkerInsert =
reinterpret_cast<PFN_vkCmdDebugMarkerInsertEXT
>(vkGetDeviceProcAddr(device,
"vkCmdDebugMarkerInsertEXT"));
114 active = (pfnDebugMarkerSetObjectName != VK_NULL_HANDLE);
117 void setObjectName(VkDevice device, uint64_t
object, VkDebugReportObjectTypeEXT objectType,
const char *name)
120 if (pfnDebugMarkerSetObjectName)
122 VkDebugMarkerObjectNameInfoEXT nameInfo = {};
123 nameInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_NAME_INFO_EXT;
124 nameInfo.objectType = objectType;
125 nameInfo.object = object;
126 nameInfo.pObjectName = name;
127 pfnDebugMarkerSetObjectName(device, &nameInfo);
131 void setObjectTag(VkDevice device, uint64_t
object, VkDebugReportObjectTypeEXT objectType, uint64_t name,
size_t tagSize,
const void* tag)
134 if (pfnDebugMarkerSetObjectTag)
136 VkDebugMarkerObjectTagInfoEXT tagInfo = {};
137 tagInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT;
138 tagInfo.objectType = objectType;
139 tagInfo.object = object;
140 tagInfo.tagName = name;
141 tagInfo.tagSize = tagSize;
143 pfnDebugMarkerSetObjectTag(device, &tagInfo);
147 void beginRegion(VkCommandBuffer cmdbuffer,
const char* pMarkerName, glm::vec4 color)
150 if (pfnCmdDebugMarkerBegin)
152 VkDebugMarkerMarkerInfoEXT markerInfo = {};
153 markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT;
154 memcpy(markerInfo.color, &color[0],
sizeof(
float) * 4);
155 markerInfo.pMarkerName = pMarkerName;
156 pfnCmdDebugMarkerBegin(cmdbuffer, &markerInfo);
160 void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color)
163 if (pfnCmdDebugMarkerInsert)
165 VkDebugMarkerMarkerInfoEXT markerInfo = {};
166 markerInfo.sType = VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT;
167 memcpy(markerInfo.color, &color[0],
sizeof(
float) * 4);
168 markerInfo.pMarkerName = markerName.c_str();
169 pfnCmdDebugMarkerInsert(cmdbuffer, &markerInfo);
173 void endRegion(VkCommandBuffer cmdBuffer)
176 if (pfnCmdDebugMarkerEnd)
178 pfnCmdDebugMarkerEnd(cmdBuffer);
182 void setCommandBufferName(VkDevice device, VkCommandBuffer cmdBuffer,
const char * name)
184 setObjectName(device, (uint64_t)cmdBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, name);
187 void setQueueName(VkDevice device, VkQueue queue,
const char * name)
189 setObjectName(device, (uint64_t)queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, name);
192 void setImageName(VkDevice device, VkImage image,
const char * name)
194 setObjectName(device, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, name);
197 void setSamplerName(VkDevice device, VkSampler sampler,
const char * name)
199 setObjectName(device, (uint64_t)sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, name);
202 void setBufferName(VkDevice device, VkBuffer buffer,
const char * name)
204 setObjectName(device, (uint64_t)buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, name);
207 void setDeviceMemoryName(VkDevice device, VkDeviceMemory memory,
const char * name)
209 setObjectName(device, (uint64_t)memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, name);
212 void setShaderModuleName(VkDevice device, VkShaderModule shaderModule,
const char * name)
214 setObjectName(device, (uint64_t)shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, name);
217 void setPipelineName(VkDevice device, VkPipeline pipeline,
const char * name)
219 setObjectName(device, (uint64_t)pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, name);
222 void setPipelineLayoutName(VkDevice device, VkPipelineLayout pipelineLayout,
const char * name)
224 setObjectName(device, (uint64_t)pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, name);
227 void setRenderPassName(VkDevice device, VkRenderPass renderPass,
const char * name)
229 setObjectName(device, (uint64_t)renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, name);
232 void setFramebufferName(VkDevice device, VkFramebuffer framebuffer,
const char * name)
234 setObjectName(device, (uint64_t)framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, name);
237 void setDescriptorSetLayoutName(VkDevice device, VkDescriptorSetLayout descriptorSetLayout,
const char * name)
239 setObjectName(device, (uint64_t)descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, name);
242 void setDescriptorSetName(VkDevice device, VkDescriptorSet descriptorSet,
const char * name)
244 setObjectName(device, (uint64_t)descriptorSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, name);
247 void setSemaphoreName(VkDevice device, VkSemaphore semaphore,
const char * name)
249 setObjectName(device, (uint64_t)semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, name);
252 void setFenceName(VkDevice device, VkFence fence,
const char * name)
254 setObjectName(device, (uint64_t)fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, name);
257 void setEventName(VkDevice device, VkEvent _event,
const char * name)
259 setObjectName(device, (uint64_t)_event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, name);
VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData)