Skip to main content

ursus_core/vulkan/core/
debug.rs

1use 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}