ursus_core/vulkan/core/
debug.rs1use crate::vulkan::Instance;
2use ash::ext::debug_utils;
3use ash::vk;
4
5pub struct DebugMessenger {
6 loader: debug_utils::Instance,
7 handle: vk::DebugUtilsMessengerEXT,
8}
9
10impl DebugMessenger {
11 pub fn new(instance: &Instance) -> anyhow::Result<Self> {
12 let loader = ash::ext::debug_utils::Instance::new(&instance.entry, &instance.handle);
13
14 let create_info = vk::DebugUtilsMessengerCreateInfoEXT::default()
15 .message_severity(
16 vk::DebugUtilsMessageSeverityFlagsEXT::ERROR | vk::DebugUtilsMessageSeverityFlagsEXT::WARNING,
17 )
18 .message_type(
19 vk::DebugUtilsMessageTypeFlagsEXT::GENERAL
20 | vk::DebugUtilsMessageTypeFlagsEXT::VALIDATION
21 | vk::DebugUtilsMessageTypeFlagsEXT::PERFORMANCE,
22 )
23 .pfn_user_callback(Some(debug_callback));
24
25 let handle = unsafe { loader.create_debug_utils_messenger(&create_info, None)? };
26 log::info!("Validation layers activated");
27
28 Ok(Self { loader, handle })
29 }
30}
31
32impl Drop for DebugMessenger {
33 fn drop(&mut self) {
34 unsafe { self.loader.destroy_debug_utils_messenger(self.handle, None) };
35 }
36}
37
38pub fn cmd_begin_label(debug_utils: &debug_utils::Device, cmd: vk::CommandBuffer, name: &str) {
39 let name = std::ffi::CString::new(name).unwrap();
40 let label = vk::DebugUtilsLabelEXT::default().label_name(&name);
41 unsafe { debug_utils.cmd_begin_debug_utils_label(cmd, &label) };
42}
43
44pub fn cmd_end_label(debug_utils: &debug_utils::Device, cmd: vk::CommandBuffer) {
45 unsafe { debug_utils.cmd_end_debug_utils_label(cmd) };
46}
47
48pub fn set_object_name(debug_utils: &ash::ext::debug_utils::Device, object: impl vk::Handle, name: &str) {
49 let name = std::ffi::CString::new(name).unwrap();
50 let info = vk::DebugUtilsObjectNameInfoEXT::default().object_handle(object).object_name(&name);
51 unsafe { debug_utils.set_debug_utils_object_name(&info).ok() };
52}
53
54unsafe extern "system" fn debug_callback(
55 severity: vk::DebugUtilsMessageSeverityFlagsEXT,
56 _type: vk::DebugUtilsMessageTypeFlagsEXT,
57 data: *const vk::DebugUtilsMessengerCallbackDataEXT,
58 _: *mut std::ffi::c_void,
59) -> vk::Bool32 {
60 let msg = unsafe { std::ffi::CStr::from_ptr((*data).p_message) };
61 match severity {
62 vk::DebugUtilsMessageSeverityFlagsEXT::ERROR => log::error!("[Vulkan] {:?}", msg),
63 vk::DebugUtilsMessageSeverityFlagsEXT::WARNING => log::warn!("[Vulkan] {:?}", msg),
64 _ => log::debug!("[Vulkan] {:?}", msg),
65 }
66 vk::FALSE
67}