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    pub unsafe fn debug_utils_set_object_name(
24        &self,
25        device: vk::Device,
26        name_info: &vk::DebugUtilsObjectNameInfoEXT,
27    ) -> VkResult<()> {
28        (self.fp.set_debug_utils_object_name_ext)(device, name_info).result()
29    }
30
31    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSetDebugUtilsObjectTagEXT.html>
32    pub unsafe fn debug_utils_set_object_tag(
33        &self,
34        device: vk::Device,
35        tag_info: &vk::DebugUtilsObjectTagInfoEXT,
36    ) -> VkResult<()> {
37        (self.fp.set_debug_utils_object_tag_ext)(device, tag_info).result()
38    }
39
40    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdBeginDebugUtilsLabelEXT.html>
41    pub unsafe fn cmd_begin_debug_utils_label(
42        &self,
43        command_buffer: vk::CommandBuffer,
44        label: &vk::DebugUtilsLabelEXT,
45    ) {
46        (self.fp.cmd_begin_debug_utils_label_ext)(command_buffer, label);
47    }
48
49    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdEndDebugUtilsLabelEXT.html>
50    pub unsafe fn cmd_end_debug_utils_label(&self, command_buffer: vk::CommandBuffer) {
51        (self.fp.cmd_end_debug_utils_label_ext)(command_buffer);
52    }
53
54    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdInsertDebugUtilsLabelEXT.html>
55    pub unsafe fn cmd_insert_debug_utils_label(
56        &self,
57        command_buffer: vk::CommandBuffer,
58        label: &vk::DebugUtilsLabelEXT,
59    ) {
60        (self.fp.cmd_insert_debug_utils_label_ext)(command_buffer, label);
61    }
62
63    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkQueueBeginDebugUtilsLabelEXT.html>
64    pub unsafe fn queue_begin_debug_utils_label(
65        &self,
66        queue: vk::Queue,
67        label: &vk::DebugUtilsLabelEXT,
68    ) {
69        (self.fp.queue_begin_debug_utils_label_ext)(queue, label);
70    }
71
72    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkQueueEndDebugUtilsLabelEXT.html>
73    pub unsafe fn queue_end_debug_utils_label(&self, queue: vk::Queue) {
74        (self.fp.queue_end_debug_utils_label_ext)(queue);
75    }
76
77    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkQueueInsertDebugUtilsLabelEXT.html>
78    pub unsafe fn queue_insert_debug_utils_label(
79        &self,
80        queue: vk::Queue,
81        label: &vk::DebugUtilsLabelEXT,
82    ) {
83        (self.fp.queue_insert_debug_utils_label_ext)(queue, label);
84    }
85
86    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCreateDebugUtilsMessengerEXT.html>
87    pub unsafe fn create_debug_utils_messenger(
88        &self,
89        create_info: &vk::DebugUtilsMessengerCreateInfoEXT,
90        allocator: Option<&vk::AllocationCallbacks>,
91    ) -> VkResult<vk::DebugUtilsMessengerEXT> {
92        let mut messenger = mem::zeroed();
93        (self.fp.create_debug_utils_messenger_ext)(
94            self.handle,
95            create_info,
96            allocator.as_raw_ptr(),
97            &mut messenger,
98        )
99        .result_with_success(messenger)
100    }
101
102    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkDestroyDebugUtilsMessengerEXT.html>
103    pub unsafe fn destroy_debug_utils_messenger(
104        &self,
105        messenger: vk::DebugUtilsMessengerEXT,
106        allocator: Option<&vk::AllocationCallbacks>,
107    ) {
108        (self.fp.destroy_debug_utils_messenger_ext)(self.handle, messenger, allocator.as_raw_ptr());
109    }
110
111    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSubmitDebugUtilsMessageEXT.html>
112    pub unsafe fn submit_debug_utils_message(
113        &self,
114        message_severity: vk::DebugUtilsMessageSeverityFlagsEXT,
115        message_types: vk::DebugUtilsMessageTypeFlagsEXT,
116        callback_data: &vk::DebugUtilsMessengerCallbackDataEXT,
117    ) {
118        (self.fp.submit_debug_utils_message_ext)(
119            self.handle,
120            message_severity,
121            message_types,
122            callback_data,
123        );
124    }
125
126    pub const fn name() -> &'static CStr {
127        vk::ExtDebugUtilsFn::name()
128    }
129
130    pub fn fp(&self) -> &vk::ExtDebugUtilsFn {
131        &self.fp
132    }
133
134    pub fn instance(&self) -> vk::Instance {
135        self.handle
136    }
137}