ash/extensions/ext/
debug_utils.rs

1use crate::prelude::*;
2use crate::{vk, RawPtr};
3use crate::{Entry, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7#[derive(Clone)]
8pub struct DebugUtils {
9    handle: vk::Instance,
10    fp: vk::ExtDebugUtilsFn,
11}
12
13impl DebugUtils {
14    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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
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]
160    pub const fn name() -> &'static CStr {
161        vk::ExtDebugUtilsFn::name()
162    }
163
164    #[inline]
165    pub fn fp(&self) -> &vk::ExtDebugUtilsFn {
166        &self.fp
167    }
168
169    #[inline]
170    pub fn instance(&self) -> vk::Instance {
171        self.handle
172    }
173}