Blender V4.3
vk_debug.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
9#include <sstream>
10
11#include "BKE_global.hh"
12#include "CLG_log.h"
13
14#include "vk_backend.hh"
15#include "vk_context.hh"
16#include "vk_debug.hh"
17#include "vk_to_string.hh"
18
19static CLG_LogRef LOG = {"gpu.vulkan"};
20
21namespace blender::gpu {
22void VKContext::debug_group_begin(const char *name, int)
23{
25}
26
31
32bool VKContext::debug_capture_begin(const char *title)
33{
35 return VKBackend::get().debug_capture_begin(title);
36}
37
38bool VKBackend::debug_capture_begin(const char *title)
39{
40#ifdef WITH_RENDERDOC
41 bool result = renderdoc_api_.start_frame_capture(device.instance_get(), nullptr);
42 if (result && title) {
43 renderdoc_api_.set_frame_capture_title(title);
44 }
45 return result;
46#else
47 UNUSED_VARS(title);
48 return false;
49#endif
50}
51
57
59{
60#ifdef WITH_RENDERDOC
61 renderdoc_api_.end_frame_capture(device.instance_get(), nullptr);
62#endif
63}
64
66{
67 return (void *)name;
68}
69
71{
72#ifdef WITH_RENDERDOC
73 const char *title = (const char *)scope;
74 if (StringRefNull(title) != StringRefNull(G.gpu_debug_scope_name)) {
75 return false;
76 }
78#else
79 UNUSED_VARS(scope);
80#endif
81 return false;
82}
83
85{
86#ifdef WITH_RENDERDOC
87 const char *title = (const char *)scope;
88 if (StringRefNull(title) == StringRefNull(G.gpu_debug_scope_name)) {
90 }
91#else
92 UNUSED_VARS(scope);
93#endif
94}
95
96} // namespace blender::gpu
97
98namespace blender::gpu::debug {
99
100void VKDebuggingTools::init(VkInstance vk_instance)
101{
103 init_messenger(vk_instance);
104}
105
106void VKDebuggingTools::deinit(VkInstance vk_instance)
107{
108 destroy_messenger(vk_instance);
109}
110
111void object_label(VkObjectType vk_object_type, uint64_t object_handle, const char *name)
112{
113 const VKDevice &device = VKBackend::get().device;
114 if (G.debug & G_DEBUG_GPU && device.functions.vkSetDebugUtilsObjectName) {
115 VkDebugUtilsObjectNameInfoEXT info = {};
116 info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
117 info.objectType = vk_object_type;
118 info.objectHandle = object_handle;
119 info.pObjectName = name;
120 device.functions.vkSetDebugUtilsObjectName(device.vk_handle(), &info);
121 }
122}
123
124} // namespace blender::gpu::debug
125
126namespace blender::gpu::debug {
127
128void VKDebuggingTools::print_labels(const VkDebugUtilsMessengerCallbackDataEXT *callback_data)
129{
130 std::stringstream ss;
131 for (uint32_t object = 0; object < callback_data->objectCount; ++object) {
132 ss << " - ObjectType[" << to_string(callback_data->pObjects[object].objectType) << "],";
133 ss << "Handle[0x" << std::hex << uintptr_t(callback_data->pObjects[object].objectHandle)
134 << "]";
135 if (callback_data->pObjects[object].pObjectName) {
136 ss << ",Name[" << callback_data->pObjects[object].pObjectName << "]";
137 }
138 ss << std::endl;
139 }
140 for (uint32_t label = 0; label < callback_data->cmdBufLabelCount; ++label) {
141 if (callback_data->pCmdBufLabels[label].pLabelName) {
142 ss << " - CommandBuffer : " << callback_data->pCmdBufLabels[label].pLabelName << std::endl;
143 }
144 }
145 for (uint32_t label = 0; label < callback_data->queueLabelCount; ++label) {
146 if (callback_data->pQueueLabels[label].pLabelName) {
147 ss << " - Queue : " << callback_data->pQueueLabels[label].pLabelName << std::endl;
148 }
149 }
150 ss << std::endl;
151 printf("%s", ss.str().c_str());
152}
153
154static VKAPI_ATTR VkBool32 VKAPI_CALL
155messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity,
156 VkDebugUtilsMessageTypeFlagsEXT /*message_type*/,
157 const VkDebugUtilsMessengerCallbackDataEXT *callback_data,
158 void *user_data)
159{
160
162 if (message_severity & (VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
163 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT))
164 {
165 severity = CLG_SEVERITY_INFO;
166 }
167 if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
168 severity = CLG_SEVERITY_WARN;
169 }
170 if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
171 severity = CLG_SEVERITY_ERROR;
172 }
173
174 if ((LOG.type->flag & CLG_FLAG_USE) && (LOG.type->level <= severity)) {
175 const char *format = "{0x%x}% s\n %s ";
176 CLG_logf(LOG.type,
177 severity,
178 "",
179 "",
180 format,
181 callback_data->messageIdNumber,
182 callback_data->pMessageIdName,
183 callback_data->pMessage);
184 }
185
186 const bool do_labels = (callback_data->objectCount + callback_data->cmdBufLabelCount +
187 callback_data->queueLabelCount) > 0;
188 if (do_labels) {
189 VKDebuggingTools &debugging_tools = *reinterpret_cast<VKDebuggingTools *>(user_data);
190 debugging_tools.print_labels(callback_data);
191 }
192
193 return VK_FALSE;
194};
195
196void VKDebuggingTools::init_messenger(VkInstance vk_instance)
197{
198 if (vk_debug_utils_messenger) {
199 return;
200 }
201
202 VKDevice &device = VKBackend::get().device;
204 return;
205 }
206
207 VkDebugUtilsMessengerCreateInfoEXT create_info;
208 create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
209 create_info.pNext = nullptr;
210 create_info.flags = 0;
211 create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
212 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
213 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
214 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
215 create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
216 VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
217 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
218 create_info.pfnUserCallback = messenger_callback;
219 create_info.pUserData = this;
221 vk_instance, &create_info, nullptr, &vk_debug_utils_messenger);
222 return;
223}
224
225void VKDebuggingTools::destroy_messenger(VkInstance vk_instance)
226{
227 if (vk_debug_utils_messenger == nullptr) {
228 return;
229 }
230
231 VKDevice &device = VKBackend::get().device;
232 device.functions.vkDestroyDebugUtilsMessenger(vk_instance, vk_debug_utils_messenger, nullptr);
233 vk_debug_utils_messenger = nullptr;
234 return;
235}
236
237}; // namespace blender::gpu::debug
@ G_DEBUG_GPU
#define UNUSED_VARS(...)
CLG_Severity
Definition CLG_log.h:87
@ CLG_SEVERITY_INFO
Definition CLG_log.h:88
@ CLG_SEVERITY_WARN
Definition CLG_log.h:89
@ CLG_SEVERITY_ERROR
Definition CLG_log.h:90
@ CLG_FLAG_USE
Definition CLG_log.h:84
void void CLG_logf(const CLG_LogType *lg, enum CLG_Severity severity, const char *file_line, const char *fn, const char *format,...) _CLOG_ATTR_NONNULL(1
void CLG_logref_init(CLG_LogRef *clg_ref)
Definition clog.c:764
static VKBackend & get()
Definition vk_backend.hh:92
bool debug_capture_begin(const char *title)
Definition vk_debug.cc:38
void debug_group_begin(const char *, int) override
Definition vk_debug.cc:22
void debug_group_end() override
Definition vk_debug.cc:27
render_graph::VKRenderGraph render_graph
Definition vk_context.hh:42
bool debug_capture_scope_begin(void *scope) override
Definition vk_debug.cc:70
void * debug_capture_scope_create(const char *name) override
Definition vk_debug.cc:65
bool debug_capture_begin(const char *title) override
Definition vk_debug.cc:32
void debug_capture_end() override
Definition vk_debug.cc:52
void debug_capture_scope_end(void *scope) override
Definition vk_debug.cc:84
PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectName
Definition vk_device.hh:189
VkDevice vk_handle() const
Definition vk_device.hh:224
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessenger
Definition vk_device.hh:190
VkInstance instance_get() const
Definition vk_device.hh:219
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessenger
Definition vk_device.hh:191
struct blender::gpu::VKDevice::@670 functions
void print_labels(const VkDebugUtilsMessengerCallbackDataEXT *callback_data)
Definition vk_debug.cc:128
#define printf
const char * label
static const char * to_string(const Interpolation &interp)
Definition gl_shader.cc:82
format
#define LOG(severity)
Definition log.h:33
#define G(x, y, z)
static VKAPI_ATTR VkBool32 VKAPI_CALL messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT, const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data)
Definition vk_debug.cc:155
void object_label(GLenum type, GLuint object, const char *name)
Definition gl_debug.cc:344
_W64 unsigned int uintptr_t
Definition stdint.h:119
unsigned int uint32_t
Definition stdint.h:80
unsigned __int64 uint64_t
Definition stdint.h:90
static CLG_LogRef LOG
Definition vk_debug.cc:19