1 use crate::prelude::*;
2 use crate::{vk, RawPtr};
3 use crate::{Entry, Instance};
4 use std::ffi::CStr;
5 use std::mem;
6 
7 #[derive(Clone)]
8 pub struct DebugUtils {
9     handle: vk::Instance,
10     fp: vk::ExtDebugUtilsFn,
11 }
12 
13 impl DebugUtils {
new(entry: &Entry, instance: &Instance) -> Self14     pub fn new(entry: &Entry, instance: &Instance) -> Self {
15         let handle = instance.handle();
16         let fp = vk::ExtDebugUtilsFn::load(|name| unsafe {
17             mem::transmute(entry.get_instance_proc_addr(handle, name.as_ptr()))
18         });
19         Self { handle, fp }
20     }
21 
22     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSetDebugUtilsObjectNameEXT.html>
23     #[deprecated = "Backwards-compatible alias containing a typo, use `set_debug_utils_object_name()` instead"]
24     #[inline]
debug_utils_set_object_name( &self, device: vk::Device, name_info: &vk::DebugUtilsObjectNameInfoEXT, ) -> VkResult<()>25     pub unsafe fn debug_utils_set_object_name(
26         &self,
27         device: vk::Device,
28         name_info: &vk::DebugUtilsObjectNameInfoEXT,
29     ) -> VkResult<()> {
30         self.set_debug_utils_object_name(device, name_info)
31     }
32 
33     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSetDebugUtilsObjectNameEXT.html>
34     #[inline]
set_debug_utils_object_name( &self, device: vk::Device, name_info: &vk::DebugUtilsObjectNameInfoEXT, ) -> VkResult<()>35     pub unsafe fn set_debug_utils_object_name(
36         &self,
37         device: vk::Device,
38         name_info: &vk::DebugUtilsObjectNameInfoEXT,
39     ) -> VkResult<()> {
40         (self.fp.set_debug_utils_object_name_ext)(device, name_info).result()
41     }
42 
43     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSetDebugUtilsObjectTagEXT.html>
44     #[deprecated = "Backwards-compatible alias containing a typo, use `set_debug_utils_object_tag()` instead"]
45     #[inline]
debug_utils_set_object_tag( &self, device: vk::Device, tag_info: &vk::DebugUtilsObjectTagInfoEXT, ) -> VkResult<()>46     pub unsafe fn debug_utils_set_object_tag(
47         &self,
48         device: vk::Device,
49         tag_info: &vk::DebugUtilsObjectTagInfoEXT,
50     ) -> VkResult<()> {
51         self.set_debug_utils_object_tag(device, tag_info)
52     }
53 
54     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSetDebugUtilsObjectTagEXT.html>
55     #[inline]
set_debug_utils_object_tag( &self, device: vk::Device, tag_info: &vk::DebugUtilsObjectTagInfoEXT, ) -> VkResult<()>56     pub unsafe fn set_debug_utils_object_tag(
57         &self,
58         device: vk::Device,
59         tag_info: &vk::DebugUtilsObjectTagInfoEXT,
60     ) -> VkResult<()> {
61         (self.fp.set_debug_utils_object_tag_ext)(device, tag_info).result()
62     }
63 
64     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBeginDebugUtilsLabelEXT.html>
65     #[inline]
cmd_begin_debug_utils_label( &self, command_buffer: vk::CommandBuffer, label: &vk::DebugUtilsLabelEXT, )66     pub unsafe fn cmd_begin_debug_utils_label(
67         &self,
68         command_buffer: vk::CommandBuffer,
69         label: &vk::DebugUtilsLabelEXT,
70     ) {
71         (self.fp.cmd_begin_debug_utils_label_ext)(command_buffer, label);
72     }
73 
74     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdEndDebugUtilsLabelEXT.html>
75     #[inline]
cmd_end_debug_utils_label(&self, command_buffer: vk::CommandBuffer)76     pub unsafe fn cmd_end_debug_utils_label(&self, command_buffer: vk::CommandBuffer) {
77         (self.fp.cmd_end_debug_utils_label_ext)(command_buffer);
78     }
79 
80     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdInsertDebugUtilsLabelEXT.html>
81     #[inline]
cmd_insert_debug_utils_label( &self, command_buffer: vk::CommandBuffer, label: &vk::DebugUtilsLabelEXT, )82     pub unsafe fn cmd_insert_debug_utils_label(
83         &self,
84         command_buffer: vk::CommandBuffer,
85         label: &vk::DebugUtilsLabelEXT,
86     ) {
87         (self.fp.cmd_insert_debug_utils_label_ext)(command_buffer, label);
88     }
89 
90     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkQueueBeginDebugUtilsLabelEXT.html>
91     #[inline]
queue_begin_debug_utils_label( &self, queue: vk::Queue, label: &vk::DebugUtilsLabelEXT, )92     pub unsafe fn queue_begin_debug_utils_label(
93         &self,
94         queue: vk::Queue,
95         label: &vk::DebugUtilsLabelEXT,
96     ) {
97         (self.fp.queue_begin_debug_utils_label_ext)(queue, label);
98     }
99 
100     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkQueueEndDebugUtilsLabelEXT.html>
101     #[inline]
queue_end_debug_utils_label(&self, queue: vk::Queue)102     pub unsafe fn queue_end_debug_utils_label(&self, queue: vk::Queue) {
103         (self.fp.queue_end_debug_utils_label_ext)(queue);
104     }
105 
106     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkQueueInsertDebugUtilsLabelEXT.html>
107     #[inline]
queue_insert_debug_utils_label( &self, queue: vk::Queue, label: &vk::DebugUtilsLabelEXT, )108     pub unsafe fn queue_insert_debug_utils_label(
109         &self,
110         queue: vk::Queue,
111         label: &vk::DebugUtilsLabelEXT,
112     ) {
113         (self.fp.queue_insert_debug_utils_label_ext)(queue, label);
114     }
115 
116     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDebugUtilsMessengerEXT.html>
117     #[inline]
create_debug_utils_messenger( &self, create_info: &vk::DebugUtilsMessengerCreateInfoEXT, allocator: Option<&vk::AllocationCallbacks>, ) -> VkResult<vk::DebugUtilsMessengerEXT>118     pub unsafe fn create_debug_utils_messenger(
119         &self,
120         create_info: &vk::DebugUtilsMessengerCreateInfoEXT,
121         allocator: Option<&vk::AllocationCallbacks>,
122     ) -> VkResult<vk::DebugUtilsMessengerEXT> {
123         let mut messenger = mem::zeroed();
124         (self.fp.create_debug_utils_messenger_ext)(
125             self.handle,
126             create_info,
127             allocator.as_raw_ptr(),
128             &mut messenger,
129         )
130         .result_with_success(messenger)
131     }
132 
133     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDestroyDebugUtilsMessengerEXT.html>
134     #[inline]
destroy_debug_utils_messenger( &self, messenger: vk::DebugUtilsMessengerEXT, allocator: Option<&vk::AllocationCallbacks>, )135     pub unsafe fn destroy_debug_utils_messenger(
136         &self,
137         messenger: vk::DebugUtilsMessengerEXT,
138         allocator: Option<&vk::AllocationCallbacks>,
139     ) {
140         (self.fp.destroy_debug_utils_messenger_ext)(self.handle, messenger, allocator.as_raw_ptr());
141     }
142 
143     /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSubmitDebugUtilsMessageEXT.html>
144     #[inline]
submit_debug_utils_message( &self, message_severity: vk::DebugUtilsMessageSeverityFlagsEXT, message_types: vk::DebugUtilsMessageTypeFlagsEXT, callback_data: &vk::DebugUtilsMessengerCallbackDataEXT, )145     pub unsafe fn submit_debug_utils_message(
146         &self,
147         message_severity: vk::DebugUtilsMessageSeverityFlagsEXT,
148         message_types: vk::DebugUtilsMessageTypeFlagsEXT,
149         callback_data: &vk::DebugUtilsMessengerCallbackDataEXT,
150     ) {
151         (self.fp.submit_debug_utils_message_ext)(
152             self.handle,
153             message_severity,
154             message_types,
155             callback_data,
156         );
157     }
158 
159     #[inline]
name() -> &'static CStr160     pub const fn name() -> &'static CStr {
161         vk::ExtDebugUtilsFn::name()
162     }
163 
164     #[inline]
fp(&self) -> &vk::ExtDebugUtilsFn165     pub fn fp(&self) -> &vk::ExtDebugUtilsFn {
166         &self.fp
167     }
168 
169     #[inline]
instance(&self) -> vk::Instance170     pub fn instance(&self) -> vk::Instance {
171         self.handle
172     }
173 }
174