PeriDyno 1.0.0
Loading...
Searching...
No Matches
VulkanDebug.cpp
Go to the documentation of this file.
1/*
2* Vulkan examples debug wrapper
3*
4* Copyright (C) by Sascha Willems - www.saschawillems.de
5*
6* This code is licensed under the MIT license (MIT) (http://opensource.org/licenses/MIT)
7*/
8
9#if 0
10
11#include "VulkanDebug.h"
12#include <iostream>
13
14namespace vks
15{
16 namespace debug
17 {
18 PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessengerEXT;
19 PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessengerEXT;
20 VkDebugUtilsMessengerEXT debugUtilsMessenger;
21
22 VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(
23 VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity,
24 VkDebugUtilsMessageTypeFlagsEXT messageType,
25 const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData,
26 void* pUserData)
27 {
28 // Select prefix depending on flags passed to the callback
29 std::string prefix("");
30
31 if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) {
32 prefix = "VERBOSE: ";
33 }
34 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) {
35 prefix = "INFO: ";
36 }
37 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
38 prefix = "WARNING: ";
39 }
40 else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
41 prefix = "ERROR: ";
42 }
43
44
45 // Display message to default output (console/logcat)
46 std::stringstream debugMessage;
47 debugMessage << prefix << "[" << pCallbackData->messageIdNumber << "][" << pCallbackData->pMessageIdName << "] : " << pCallbackData->pMessage;
48
49#if defined(__ANDROID__)
50 if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
51 LOGE("%s", debugMessage.str().c_str());
52 } else {
53 LOGD("%s", debugMessage.str().c_str());
54 }
55#else
56 if (messageSeverity >= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
57 std::cerr << debugMessage.str() << "\n";
58 } else {
59 std::cout << debugMessage.str() << "\n";
60 }
61 fflush(stdout);
62#endif
63
64
65 // The return value of this callback controls whether the Vulkan call that caused the validation message will be aborted or not
66 // We return VK_FALSE as we DON'T want Vulkan calls that cause a validation message to abort
67 // If you instead want to have calls abort, pass in VK_TRUE and the function will return VK_ERROR_VALIDATION_FAILED_EXT
68 return VK_FALSE;
69 }
70
71 void setupDebugging(VkInstance instance, VkDebugReportFlagsEXT flags, VkDebugReportCallbackEXT callBack)
72 {
73
74 vkCreateDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkCreateDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkCreateDebugUtilsMessengerEXT"));
75 vkDestroyDebugUtilsMessengerEXT = reinterpret_cast<PFN_vkDestroyDebugUtilsMessengerEXT>(vkGetInstanceProcAddr(instance, "vkDestroyDebugUtilsMessengerEXT"));
76
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;
81 debugUtilsMessengerCI.pfnUserCallback = debugUtilsMessengerCallback;
82 VkResult result = vkCreateDebugUtilsMessengerEXT(instance, &debugUtilsMessengerCI, nullptr, &debugUtilsMessenger);
83 assert(result == VK_SUCCESS);
84 }
85
86 void freeDebugCallback(VkInstance instance)
87 {
88 if (debugUtilsMessenger != VK_NULL_HANDLE)
89 {
90 vkDestroyDebugUtilsMessengerEXT(instance, debugUtilsMessenger, nullptr);
91 }
92 }
93 }
94
95 namespace debugmarker
96 {
97 bool active = false;
98
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;
104
105 void setup(VkDevice device)
106 {
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"));
112
113 // Set flag if at least one function pointer is present
114 active = (pfnDebugMarkerSetObjectName != VK_NULL_HANDLE);
115 }
116
117 void setObjectName(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, const char *name)
118 {
119 // Check for valid function pointer (may not be present if not running in a debugging application)
120 if (pfnDebugMarkerSetObjectName)
121 {
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);
128 }
129 }
130
131 void setObjectTag(VkDevice device, uint64_t object, VkDebugReportObjectTypeEXT objectType, uint64_t name, size_t tagSize, const void* tag)
132 {
133 // Check for valid function pointer (may not be present if not running in a debugging application)
134 if (pfnDebugMarkerSetObjectTag)
135 {
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;
142 tagInfo.pTag = tag;
143 pfnDebugMarkerSetObjectTag(device, &tagInfo);
144 }
145 }
146
147 void beginRegion(VkCommandBuffer cmdbuffer, const char* pMarkerName, glm::vec4 color)
148 {
149 // Check for valid function pointer (may not be present if not running in a debugging application)
150 if (pfnCmdDebugMarkerBegin)
151 {
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);
157 }
158 }
159
160 void insert(VkCommandBuffer cmdbuffer, std::string markerName, glm::vec4 color)
161 {
162 // Check for valid function pointer (may not be present if not running in a debugging application)
163 if (pfnCmdDebugMarkerInsert)
164 {
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);
170 }
171 }
172
173 void endRegion(VkCommandBuffer cmdBuffer)
174 {
175 // Check for valid function (may not be present if not running in a debugging application)
176 if (pfnCmdDebugMarkerEnd)
177 {
178 pfnCmdDebugMarkerEnd(cmdBuffer);
179 }
180 }
181
182 void setCommandBufferName(VkDevice device, VkCommandBuffer cmdBuffer, const char * name)
183 {
184 setObjectName(device, (uint64_t)cmdBuffer, VK_DEBUG_REPORT_OBJECT_TYPE_COMMAND_BUFFER_EXT, name);
185 }
186
187 void setQueueName(VkDevice device, VkQueue queue, const char * name)
188 {
189 setObjectName(device, (uint64_t)queue, VK_DEBUG_REPORT_OBJECT_TYPE_QUEUE_EXT, name);
190 }
191
192 void setImageName(VkDevice device, VkImage image, const char * name)
193 {
194 setObjectName(device, (uint64_t)image, VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT, name);
195 }
196
197 void setSamplerName(VkDevice device, VkSampler sampler, const char * name)
198 {
199 setObjectName(device, (uint64_t)sampler, VK_DEBUG_REPORT_OBJECT_TYPE_SAMPLER_EXT, name);
200 }
201
202 void setBufferName(VkDevice device, VkBuffer buffer, const char * name)
203 {
204 setObjectName(device, (uint64_t)buffer, VK_DEBUG_REPORT_OBJECT_TYPE_BUFFER_EXT, name);
205 }
206
207 void setDeviceMemoryName(VkDevice device, VkDeviceMemory memory, const char * name)
208 {
209 setObjectName(device, (uint64_t)memory, VK_DEBUG_REPORT_OBJECT_TYPE_DEVICE_MEMORY_EXT, name);
210 }
211
212 void setShaderModuleName(VkDevice device, VkShaderModule shaderModule, const char * name)
213 {
214 setObjectName(device, (uint64_t)shaderModule, VK_DEBUG_REPORT_OBJECT_TYPE_SHADER_MODULE_EXT, name);
215 }
216
217 void setPipelineName(VkDevice device, VkPipeline pipeline, const char * name)
218 {
219 setObjectName(device, (uint64_t)pipeline, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_EXT, name);
220 }
221
222 void setPipelineLayoutName(VkDevice device, VkPipelineLayout pipelineLayout, const char * name)
223 {
224 setObjectName(device, (uint64_t)pipelineLayout, VK_DEBUG_REPORT_OBJECT_TYPE_PIPELINE_LAYOUT_EXT, name);
225 }
226
227 void setRenderPassName(VkDevice device, VkRenderPass renderPass, const char * name)
228 {
229 setObjectName(device, (uint64_t)renderPass, VK_DEBUG_REPORT_OBJECT_TYPE_RENDER_PASS_EXT, name);
230 }
231
232 void setFramebufferName(VkDevice device, VkFramebuffer framebuffer, const char * name)
233 {
234 setObjectName(device, (uint64_t)framebuffer, VK_DEBUG_REPORT_OBJECT_TYPE_FRAMEBUFFER_EXT, name);
235 }
236
237 void setDescriptorSetLayoutName(VkDevice device, VkDescriptorSetLayout descriptorSetLayout, const char * name)
238 {
239 setObjectName(device, (uint64_t)descriptorSetLayout, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT_EXT, name);
240 }
241
242 void setDescriptorSetName(VkDevice device, VkDescriptorSet descriptorSet, const char * name)
243 {
244 setObjectName(device, (uint64_t)descriptorSet, VK_DEBUG_REPORT_OBJECT_TYPE_DESCRIPTOR_SET_EXT, name);
245 }
246
247 void setSemaphoreName(VkDevice device, VkSemaphore semaphore, const char * name)
248 {
249 setObjectName(device, (uint64_t)semaphore, VK_DEBUG_REPORT_OBJECT_TYPE_SEMAPHORE_EXT, name);
250 }
251
252 void setFenceName(VkDevice device, VkFence fence, const char * name)
253 {
254 setObjectName(device, (uint64_t)fence, VK_DEBUG_REPORT_OBJECT_TYPE_FENCE_EXT, name);
255 }
256
257 void setEventName(VkDevice device, VkEvent _event, const char * name)
258 {
259 setObjectName(device, (uint64_t)_event, VK_DEBUG_REPORT_OBJECT_TYPE_EVENT_EXT, name);
260 }
261 };
262}
263
264#endif
assert(queueCount >=1)
VKAPI_ATTR VkBool32 VKAPI_CALL debugUtilsMessengerCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData)
Definition VkSystem.cpp:143