bort_vk/
debug_callback.rs1use 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 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 #[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#[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}