32 ScopeTimings timings = {};
34 timings.finished =
false;
35 timings.cpu_start = ScopeTimings::Clock::now();
37 scope_timings.
append(timings);
48 for (
int i = scope_timings.
size() - 1; i >= 0; i--) {
49 ScopeTimings &query = scope_timings[i];
50 if (!query.finished) {
51 query.finished =
true;
52 query.cpu_end = ScopeTimings::Clock::now();
56 CLOG_ERROR(&
LOG,
"Profile GPU error: Extra GPU_debug_group_end() call.");
61void VKContext::process_frame_timings()
69 bool frame_is_valid = !queries.
is_empty();
71 for (
int i = queries.
size() - 1; i >= 0; i--) {
72 if (!queries[i].finished) {
73 frame_is_valid =
false;
74 CLOG_ERROR(&
LOG,
"Profile GPU error: Missing GPU_debug_group_end() call");
79 if (!frame_is_valid) {
83 for (ScopeTimings &query : queries) {
85 query.cpu_start.time_since_epoch().count(),
86 query.cpu_end.time_since_epoch().count());
104 renderdoc_api_.set_frame_capture_title(title);
135 const char *title = (
const char *)scope;
149 const char *title = (
const char *)scope;
162void VKDebuggingTools::init(VkInstance vk_instance)
165 init_messenger(vk_instance);
168void VKDebuggingTools::deinit(VkInstance vk_instance)
170 destroy_messenger(vk_instance);
175 const VKDevice &device = VKBackend::get().device;
177 VkDebugUtilsObjectNameInfoEXT
info = {};
178 info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT;
179 info.objectType = vk_object_type;
180 info.objectHandle = object_handle;
190void VKDebuggingTools::print_labels(
const VkDebugUtilsMessengerCallbackDataEXT *callback_data)
192 std::stringstream ss;
193 for (
uint32_t object = 0;
object < callback_data->objectCount; ++object) {
194 ss <<
" - ObjectType[" <<
to_string(callback_data->pObjects[
object].objectType) <<
"],";
195 ss <<
"Handle[0x" << std::hex <<
uintptr_t(callback_data->pObjects[
object].objectHandle)
197 if (callback_data->pObjects[
object].pObjectName) {
198 ss <<
",Name[" << callback_data->pObjects[object].pObjectName <<
"]";
203 if (callback_data->pCmdBufLabels[
label].pLabelName) {
204 ss <<
" - CommandBuffer : " << callback_data->pCmdBufLabels[
label].pLabelName << std::endl;
208 if (callback_data->pQueueLabels[
label].pLabelName) {
209 ss <<
" - Queue : " << callback_data->pQueueLabels[
label].pLabelName << std::endl;
213 printf(
"%s", ss.str().c_str());
216static VKAPI_ATTR VkBool32 VKAPI_CALL
218 VkDebugUtilsMessageTypeFlagsEXT ,
219 const VkDebugUtilsMessengerCallbackDataEXT *callback_data,
223 if (message_severity & (VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
224 VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT))
228 if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) {
231 if (message_severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) {
235 const char *
format =
"{0x%x}% s\n %s ";
240 callback_data->messageIdNumber,
241 callback_data->pMessageIdName,
242 callback_data->pMessage);
243 const bool do_labels = (callback_data->objectCount + callback_data->cmdBufLabelCount +
244 callback_data->queueLabelCount) > 0;
246 if (do_labels && log_active) {
254void VKDebuggingTools::init_messenger(VkInstance vk_instance)
256 if (vk_debug_utils_messenger) {
260 VKDevice &device = VKBackend::get().device;
265 VkDebugUtilsMessengerCreateInfoEXT create_info;
266 create_info.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
267 create_info.pNext =
nullptr;
268 create_info.flags = 0;
269 create_info.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT |
270 VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
271 VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
272 VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
273 create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
274 VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
275 VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
277 create_info.pUserData =
this;
279 vk_instance, &create_info,
nullptr, &vk_debug_utils_messenger);
283void VKDebuggingTools::destroy_messenger(VkInstance vk_instance)
285 if (vk_debug_utils_messenger ==
nullptr) {
289 VKDevice &device = VKBackend::get().device;
291 vk_debug_utils_messenger =
nullptr;
#define CLOG_ERROR(clg_ref,...)
void CLG_logref_init(CLG_LogRef *clg_ref)
#define CLOG_AT_SEVERITY(clg_ref, severity, verbose_level,...)
void append(const T &value)
static ProfileReport & get()
void add_group_cpu(StringRefNull name, uint64_t cpu_start, uint64_t cpu_end)
bool debug_capture_begin(const char *title)
void debug_group_begin(const char *, int) override
void debug_group_end() override
bool debug_capture_scope_begin(void *scope) override
void * debug_capture_scope_create(const char *name) override
bool debug_capture_begin(const char *title) override
const render_graph::VKRenderGraph & render_graph() const
void debug_capture_end() override
void debug_capture_scope_end(void *scope) override
TimelineValue flush_render_graph(RenderGraphFlushFlags flags, VkPipelineStageFlags wait_dst_stage_mask=VK_PIPELINE_STAGE_NONE, VkSemaphore wait_semaphore=VK_NULL_HANDLE, VkSemaphore signal_semaphore=VK_NULL_HANDLE, VkFence signal_fence=VK_NULL_HANDLE)
PFN_vkSetDebugUtilsObjectNameEXT vkSetDebugUtilsObjectName
VkDevice vk_handle() const
PFN_vkCreateDebugUtilsMessengerEXT vkCreateDebugUtilsMessenger
VkInstance instance_get() const
PFN_vkDestroyDebugUtilsMessengerEXT vkDestroyDebugUtilsMessenger
struct blender::gpu::VKDevice::@630 functions
void debug_group_begin(const char *name, const ColorTheme4f &color)
static const char * to_string(const Interpolation &interp)
static ColorTheme4f get_debug_group_color(StringRefNull name)
static VKAPI_ATTR VkBool32 VKAPI_CALL messenger_callback(VkDebugUtilsMessageSeverityFlagBitsEXT message_severity, VkDebugUtilsMessageTypeFlagsEXT, const VkDebugUtilsMessengerCallbackDataEXT *callback_data, void *user_data)
void object_label(GLenum type, GLuint object, const char *name)
_W64 unsigned int uintptr_t
unsigned __int64 uint64_t