}
#[repr(i32)]
-#[derive(Copy, Clone, PartialEq, Eq)]
+#[derive(Copy, Clone, PartialEq, Eq, Default)]
pub enum ObjectType {
+ #[default]
Unknown = 0,
Instance = 1,
PhysicalDevice = 2,
pub const CENTERED_EXT: Self = Self(0x00000004);
}
+#[repr(C)]
+pub struct DebugUtilsMessengerCreateFlagsExt(u32);
+
+#[repr(C)]
+pub struct DebugUtilsMessageSeverityFlagsExt(u32);
+
+impl DebugUtilsMessageSeverityFlagsExt {
+ pub const VERBOSE: Self = Self(0x00000001);
+ pub const INFO: Self = Self(0x00000010);
+ pub const WARNING: Self = Self(0x00000100);
+ pub const ERROR: Self = Self(0x00001000);
+}
+
+#[repr(C)]
+pub struct DebugUtilsMessageTypeFlagsExt(u32);
+
+impl DebugUtilsMessageTypeFlagsExt {
+ pub const GENERAL: Self = Self(0x00000001);
+ pub const VALIDATION: Self = Self(0x00000002);
+ pub const PERFORMANCE: Self = Self(0x00000004);
+ pub const DEVICE_ADDRESS_BINDING: Self = Self(0x00000008);
+}
+
+#[repr(C)]
+pub struct DebugUtilsMessengerCallbackDataFlagsExt(u32);
+
macro_rules! impl_flags_u32 {
($($t:ty),+) => {
$(
surface_format_count: &mut u32,
surface_formats: *mut SurfaceFormat2KHR,
) -> Result;
+
+pub type FnCmdBeginDebugUtilsLabelExt =
+ extern "system" fn(command_buffer: CommandBuffer, label_info: &DebugUtilsLabelExt);
+pub type FnCmdEndDebugUtilsLabelExt = extern "system" fn(command_buffer: CommandBuffer);
+pub type FnCmdInsertDebugUtilsLabelExt =
+ extern "system" fn(command_buffer: CommandBuffer, label_info: &DebugUtilsLabelExt);
+pub type FnCreateDebugUtilsMessengerExt = extern "system" fn(
+ instance: Instance,
+ create_info: &DebugUtilsMessengerCreateInfoExt,
+ allocator: Option<&AllocationCallbacks>,
+ messenger: *mut DebugUtilsMessengerExt,
+);
+pub type FnDestroyDebugUtilsMessengerExt = extern "system" fn(
+ instance: Instance,
+ messenger: DebugUtilsMessengerExt,
+ allocator: Option<&AllocationCallbacks>,
+);
+pub type FnQueueBeginDebugUtilsLabelExt =
+ extern "system" fn(queue: Queue, label_info: &DebugUtilsLabelExt);
+pub type FnQueueEndDebugUtilsLabelExt = extern "system" fn(queue: Queue);
+pub type FnQueueInsertDebugUtilsLabelExt =
+ extern "system" fn(queue: Queue, label_info: &DebugUtilsLabelExt);
+pub type FnSetDebugUtilsObjectNameExt =
+ extern "system" fn(device: Device, name_info: &DebugUtilsObjectNameInfoExt);
+pub type FnSetDebugUtilsObjectTagExt =
+ extern "system" fn(device: Device, tag_info: &DebugUtilsObjectTagInfoExt);
+pub type FnSubmitDebugUtilsMessageExt = extern "system" fn(
+ instance: Instance,
+ message_severity: DebugUtilsMessageSeverityFlagsExt,
+ message_types: DebugUtilsMessageTypeFlagsExt,
+ callback_data: &DebugUtilsMessengerCallbackDataExt,
+);
+
+pub type FnDebugUtilsMessengerCallbackExt = extern "system" fn(
+ message_severity: DebugUtilsMessageSeverityFlagsExt,
+ message_types: DebugUtilsMessageTypeFlagsExt,
+ callback_data: &DebugUtilsMessengerCallbackDataExt,
+ user_data: *mut c_void,
+) -> Bool32;
#[derive(Copy, Clone, PartialEq, Eq, Default, Hash, Debug)]
pub struct SwapchainKHR(u64);
+#[repr(C)]
+#[derive(Copy, Clone, PartialEq, Eq, Default, Hash, Debug)]
+pub struct DebugUtilsMessengerExt(u64);
+
// impl Handle {
// #[inline]
// pub const fn null() -> Self {
// DisplayModeKHR
// SurfaceKHR
// SwapchainKHR
+// DebugUtilsMessengerExt
impl Instance {
#[inline]
Self(value)
}
}
+impl DebugUtilsMessengerExt {
+ #[inline]
+ pub const fn null() -> Self {
+ Self(0)
+ }
+
+ #[inline]
+ pub const fn is_null(self) -> bool {
+ self.0 == 0
+ }
+
+ #[inline]
+ pub fn as_raw(self) -> u64 {
+ self.0
+ }
+
+ #[inline]
+ pub fn from_raw(value: u64) -> Self {
+ Self(value)
+ }
+}
(self.release_swapchain_images_ext)(device, release_info)
}
}
+
+pub struct DebugUtilsFunctions {
+ cmd_begin_debug_utils_label_ext: FnCmdBeginDebugUtilsLabelExt,
+ cmd_end_debug_utils_label_ext: FnCmdEndDebugUtilsLabelExt,
+ cmd_insert_debug_utils_label_ext: FnCmdInsertDebugUtilsLabelExt,
+ create_debug_utils_messenger_ext: FnCreateDebugUtilsMessengerExt,
+ destroy_debug_utils_messenger_ext: FnDestroyDebugUtilsMessengerExt,
+ queue_begin_debug_utils_label_ext: FnQueueBeginDebugUtilsLabelExt,
+ queue_end_debug_utils_label_ext: FnQueueEndDebugUtilsLabelExt,
+ queue_insert_debug_utils_label_ext: FnQueueInsertDebugUtilsLabelExt,
+ set_debug_utils_object_name_ext: FnSetDebugUtilsObjectNameExt,
+ set_debug_utils_object_tag_ext: FnSetDebugUtilsObjectTagExt,
+ submit_debug_utils_message_ext: FnSubmitDebugUtilsMessageExt,
+}
+
+impl DebugUtilsFunctions {
+ pub fn new(
+ global_functions: &GlobalFunctions,
+ instance_functions: &InstanceFunctions,
+ instance: Instance,
+ device: Device,
+ ) -> Self {
+ unsafe {
+ let load_instance = |name: &CStr| {
+ global_functions
+ .get_instance_proc_addr(instance, name)
+ .unwrap_or_else(
+ #[cold]
+ || {
+ panic!(
+ "failed to load instance function {}",
+ name.to_string_lossy()
+ )
+ },
+ )
+ };
+ let load_device = |name: &CStr| {
+ instance_functions
+ .get_device_proc_addr(device, name)
+ .unwrap_or_else(
+ #[cold]
+ || panic!("failed to load device function {}", name.to_string_lossy()),
+ )
+ };
+ Self {
+ cmd_begin_debug_utils_label_ext: transmute::<_, _>(load_device(
+ c"vkCmdBeginDebugUtilsLabelEXT",
+ )),
+ cmd_end_debug_utils_label_ext: transmute::<_, _>(load_device(
+ c"vkCmdEndDebugUtilsLabelEXT",
+ )),
+ cmd_insert_debug_utils_label_ext: transmute::<_, _>(load_device(
+ c"vkCmdInsertDebugUtilsLabelEXT",
+ )),
+ create_debug_utils_messenger_ext: transmute::<_, _>(load_instance(
+ c"vkCreateDebugUtilsMessengerEXT",
+ )),
+ destroy_debug_utils_messenger_ext: transmute::<_, _>(load_instance(
+ c"vkDestroyDebugUtilsMessengerEXT",
+ )),
+ queue_begin_debug_utils_label_ext: transmute::<_, _>(load_device(
+ c"vkQueueBeginDebugUtilsLabelEXT",
+ )),
+ queue_end_debug_utils_label_ext: transmute::<_, _>(load_device(
+ c"vkQueueEndDebugUtilsLabelEXT",
+ )),
+ queue_insert_debug_utils_label_ext: transmute::<_, _>(load_device(
+ c"vkQueueInsertDebugUtilsLabelEXT",
+ )),
+ set_debug_utils_object_name_ext: transmute::<_, _>(load_device(
+ c"vkSetDebugUtilsObjectNameEXT",
+ )),
+ set_debug_utils_object_tag_ext: transmute::<_, _>(load_device(
+ c"vkSetDebugUtilsObjectTagEXT",
+ )),
+ submit_debug_utils_message_ext: transmute::<_, _>(load_instance(
+ c"vkSubmitDebugUtilsMessageEXT",
+ )),
+ }
+ }
+ }
+
+ pub unsafe fn cmd_begin_debug_utils_label_ext(
+ &self,
+ command_buffer: CommandBuffer,
+ label_info: &DebugUtilsLabelExt,
+ ) {
+ (self.cmd_begin_debug_utils_label_ext)(command_buffer, label_info)
+ }
+
+ pub unsafe fn cmd_end_debug_utils_label_ext(&self, command_buffer: CommandBuffer) {
+ (self.cmd_end_debug_utils_label_ext)(command_buffer)
+ }
+
+ pub unsafe fn cmd_insert_debug_utils_label_ext(
+ &self,
+ command_buffer: CommandBuffer,
+ label_info: &DebugUtilsLabelExt,
+ ) {
+ (self.cmd_insert_debug_utils_label_ext)(command_buffer, label_info)
+ }
+
+ pub unsafe fn create_debug_utils_messenger_ext(
+ &self,
+ instance: Instance,
+ create_info: &DebugUtilsMessengerCreateInfoExt,
+ allocator: Option<&AllocationCallbacks>,
+ messenger: *mut DebugUtilsMessengerExt,
+ ) {
+ (self.create_debug_utils_messenger_ext)(instance, create_info, allocator, messenger)
+ }
+
+ pub unsafe fn destroy_debug_utils_messenger_ext(
+ &self,
+ instance: Instance,
+ messenger: DebugUtilsMessengerExt,
+ allocator: Option<&AllocationCallbacks>,
+ ) {
+ (self.destroy_debug_utils_messenger_ext)(instance, messenger, allocator)
+ }
+
+ pub unsafe fn queue_begin_debug_utils_label_ext(
+ &self,
+ queue: Queue,
+ label_info: &DebugUtilsLabelExt,
+ ) {
+ (self.queue_begin_debug_utils_label_ext)(queue, label_info)
+ }
+
+ pub unsafe fn queue_end_debug_utils_label_ext(&self, queue: Queue) {
+ (self.queue_end_debug_utils_label_ext)(queue)
+ }
+
+ pub unsafe fn queue_insert_debug_utils_label_ext(
+ &self,
+ queue: Queue,
+ label_info: &DebugUtilsLabelExt,
+ ) {
+ (self.queue_insert_debug_utils_label_ext)(queue, label_info)
+ }
+
+ pub unsafe fn set_debug_utils_object_name_ext(
+ &self,
+ device: Device,
+ name_info: &DebugUtilsObjectNameInfoExt,
+ ) {
+ (self.set_debug_utils_object_name_ext)(device, name_info)
+ }
+
+ pub unsafe fn set_debug_utils_object_tag_ext(
+ &self,
+ device: Device,
+ tag_info: &DebugUtilsObjectTagInfoExt,
+ ) {
+ (self.set_debug_utils_object_tag_ext)(device, tag_info)
+ }
+
+ pub unsafe fn submit_debug_utils_message_ext(
+ &self,
+ instance: Instance,
+ message_severity: DebugUtilsMessageSeverityFlagsExt,
+ message_types: DebugUtilsMessageTypeFlagsExt,
+ callback_data: &DebugUtilsMessengerCallbackDataExt,
+ ) {
+ (self.submit_debug_utils_message_ext)(
+ instance,
+ message_severity,
+ message_types,
+ callback_data,
+ )
+ }
+}
}
}
+#[repr(C)]
+pub struct DebugUtilsLabelExt {
+ pub _type: StructureType,
+ pub _next: *const c_void,
+ pub label_name: *const c_char,
+ pub color: [f32; 4],
+}
+
+impl Default for DebugUtilsLabelExt {
+ fn default() -> Self {
+ DebugUtilsLabelExt {
+ _type: StructureType::DebugUtilsLabelExt,
+ _next: std::ptr::null(),
+ label_name: std::ptr::null(),
+ color: Default::default(),
+ }
+ }
+}
+
+#[repr(C)]
+
+pub struct DebugUtilsObjectTagInfoExt {
+ pub _type: StructureType,
+ pub _next: *const c_void,
+ pub object_type: ObjectType,
+ pub object_handle: u64,
+ pub tag_name: u64,
+ pub tag_size: usize,
+ pub tag_data: *const c_void,
+}
+
+impl Default for DebugUtilsObjectTagInfoExt {
+ fn default() -> Self {
+ Self {
+ _type: StructureType::DebugUtilsObjectTagInfoExt,
+ _next: std::ptr::null(),
+ object_type: ObjectType::Unknown,
+ object_handle: 0,
+ tag_name: 0,
+ tag_size: 0,
+ tag_data: std::ptr::null(),
+ }
+ }
+}
+
+#[repr(C)]
+pub struct DebugUtilsObjectNameInfoExt {
+ pub _type: StructureType,
+ pub _next: *const c_void,
+ pub object_type: ObjectType,
+ pub object_handle: u64,
+ pub object_name: *const c_char,
+}
+
+impl Default for DebugUtilsObjectNameInfoExt {
+ fn default() -> Self {
+ Self {
+ _type: StructureType::DebugUtilsObjectNameInfoExt,
+ _next: std::ptr::null(),
+ object_type: ObjectType::Unknown,
+ object_handle: 0,
+ object_name: std::ptr::null(),
+ }
+ }
+}
+
+#[repr(C)]
+pub struct DebugUtilsMessengerCreateInfoExt {
+ pub _type: StructureType,
+ pub _next: *const c_void,
+ pub flags: DebugUtilsMessengerCreateFlagsExt,
+ pub message_severity: DebugUtilsMessageSeverityFlagsExt,
+ pub message_type: DebugUtilsMessageTypeFlagsExt,
+ pub user_callback: FnDebugUtilsMessengerCallbackExt,
+ pub user_data: *mut c_void,
+}
+
+#[repr(C)]
+pub struct DebugUtilsMessengerCallbackDataExt {
+ pub _type: StructureType,
+ pub _next: *const c_void,
+ pub flags: DebugUtilsMessengerCallbackDataFlagsExt,
+ pub message_id_name: *const c_char,
+ pub message_id_number: i32,
+ pub message: *const c_char,
+ pub queue_label_count: u32,
+ pub queue_labels: *const DebugUtilsLabelExt,
+ pub command_buffer_label_count: u32,
+ pub command_buffer_labels: *const DebugUtilsLabelExt,
+ pub object_count: u32,
+ pub objects: *const DebugUtilsObjectNameInfoExt,
+}
+
#[repr(C)]
pub struct PhysicalDeviceSparseProperties {
/// Sparse resources support: GPU will access all 2D (single sample) sparse resources using the standard sparse image block shapes (based on pixel format)