bort_vk/
debug_callback.rs

1use crate::{Instance, ALLOCATION_CALLBACK_NONE};
2use ash::{extensions::ext::DebugUtils, prelude::VkResult, vk};
3use std::sync::Arc;
4
5pub struct DebugCallback {
6    handle: vk::DebugUtilsMessengerEXT,
7    debug_utils_loader: DebugUtils,
8    properties: DebugCallbackProperties,
9
10    // dependencies
11    instance: Arc<Instance>,
12}
13
14impl DebugCallback {
15    pub fn new(
16        instance: Arc<Instance>,
17        debug_callback: vk::PFN_vkDebugUtilsMessengerCallbackEXT,
18        properties: DebugCallbackProperties,
19    ) -> VkResult<Self> {
20        let create_info_builder = properties.create_info_builder(debug_callback);
21
22        let debug_utils_loader = DebugUtils::new(instance.entry(), instance.inner());
23
24        let handle = unsafe {
25            debug_utils_loader
26                .create_debug_utils_messenger(&create_info_builder, ALLOCATION_CALLBACK_NONE)
27        }?;
28
29        Ok(Self {
30            handle,
31            debug_utils_loader,
32            properties,
33
34            instance,
35        })
36    }
37
38    pub unsafe fn new_from_create_info(
39        instance: Arc<Instance>,
40        create_info_builder: vk::DebugUtilsMessengerCreateInfoEXTBuilder,
41    ) -> VkResult<Self> {
42        let debug_utils_loader = DebugUtils::new(instance.entry(), instance.inner());
43
44        let handle = unsafe {
45            debug_utils_loader
46                .create_debug_utils_messenger(&create_info_builder, ALLOCATION_CALLBACK_NONE)
47        }?;
48
49        let properties = DebugCallbackProperties::from_create_info_builder(&create_info_builder);
50
51        Ok(Self {
52            handle,
53            debug_utils_loader,
54            properties,
55
56            instance,
57        })
58    }
59
60    // Getters
61
62    #[inline]
63    pub fn handle(&self) -> &vk::DebugUtilsMessengerEXT {
64        &self.handle
65    }
66
67    #[inline]
68    pub fn properties(&self) -> DebugCallbackProperties {
69        self.properties
70    }
71
72    #[inline]
73    pub fn instance(&self) -> &Arc<Instance> {
74        &self.instance
75    }
76}
77
78impl Drop for DebugCallback {
79    fn drop(&mut self) {
80        unsafe {
81            self.debug_utils_loader
82                .destroy_debug_utils_messenger(self.handle, ALLOCATION_CALLBACK_NONE);
83        }
84    }
85}
86
87// Properties
88
89#[derive(Clone, Copy, Debug)]
90pub struct DebugCallbackProperties {
91    message_severity: vk::DebugUtilsMessageSeverityFlagsEXT,
92    message_type: vk::DebugUtilsMessageTypeFlagsEXT,
93}
94
95impl Default for DebugCallbackProperties {
96    fn default() -> Self {
97        Self {
98            message_severity: vk::DebugUtilsMessageSeverityFlagsEXT::ERROR
99                | vk::DebugUtilsMessageSeverityFlagsEXT::WARNING
100                | vk::DebugUtilsMessageSeverityFlagsEXT::INFO
101                | vk::DebugUtilsMessageSeverityFlagsEXT::VERBOSE,
102            message_type: vk::DebugUtilsMessageTypeFlagsEXT::GENERAL
103                | vk::DebugUtilsMessageTypeFlagsEXT::VALIDATION
104                | vk::DebugUtilsMessageTypeFlagsEXT::PERFORMANCE,
105        }
106    }
107}
108
109impl DebugCallbackProperties {
110    pub fn write_create_info_builder<'a>(
111        &'a self,
112        builder: vk::DebugUtilsMessengerCreateInfoEXTBuilder<'a>,
113    ) -> vk::DebugUtilsMessengerCreateInfoEXTBuilder {
114        builder
115            .message_severity(self.message_severity)
116            .message_type(self.message_type)
117    }
118
119    pub fn create_info_builder(
120        &self,
121        debug_callback: vk::PFN_vkDebugUtilsMessengerCallbackEXT,
122    ) -> vk::DebugUtilsMessengerCreateInfoEXTBuilder {
123        let builder =
124            vk::DebugUtilsMessengerCreateInfoEXT::builder().pfn_user_callback(debug_callback);
125        self.write_create_info_builder(builder)
126    }
127
128    pub fn from_create_info_builder(value: &vk::DebugUtilsMessengerCreateInfoEXTBuilder) -> Self {
129        Self {
130            message_severity: value.message_severity,
131            message_type: value.message_type,
132        }
133    }
134}