1 use crate::vk; 2 use crate::{Device, Instance}; 3 use std::ffi::CStr; 4 use std::mem; 5 use std::os::raw::c_void; 6 7 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/VK_NV_device_diagnostic_checkpoints.html> 8 #[derive(Clone)] 9 pub struct DeviceDiagnosticCheckpoints { 10 fp: vk::NvDeviceDiagnosticCheckpointsFn, 11 } 12 13 impl DeviceDiagnosticCheckpoints { new(instance: &Instance, device: &Device) -> Self14 pub fn new(instance: &Instance, device: &Device) -> Self { 15 let fp = vk::NvDeviceDiagnosticCheckpointsFn::load(|name| unsafe { 16 mem::transmute(instance.get_device_proc_addr(device.handle(), name.as_ptr())) 17 }); 18 Self { fp } 19 } 20 21 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkCmdSetCheckpointNV.html> 22 #[inline] cmd_set_checkpoint( &self, command_buffer: vk::CommandBuffer, p_checkpoint_marker: *const c_void, )23 pub unsafe fn cmd_set_checkpoint( 24 &self, 25 command_buffer: vk::CommandBuffer, 26 p_checkpoint_marker: *const c_void, 27 ) { 28 (self.fp.cmd_set_checkpoint_nv)(command_buffer, p_checkpoint_marker); 29 } 30 31 /// Retrieve the number of elements to pass to [`get_queue_checkpoint_data()`][Self::get_queue_checkpoint_data()] 32 #[inline] get_queue_checkpoint_data_len(&self, queue: vk::Queue) -> usize33 pub unsafe fn get_queue_checkpoint_data_len(&self, queue: vk::Queue) -> usize { 34 let mut count = 0; 35 (self.fp.get_queue_checkpoint_data_nv)(queue, &mut count, std::ptr::null_mut()); 36 count as usize 37 } 38 39 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetQueueCheckpointDataNV.html> 40 /// 41 /// Call [`get_queue_checkpoint_data_len()`][Self::get_queue_checkpoint_data_len()] to query the number of elements to pass to `out`. 42 /// Be sure to [`Default::default()`]-initialize these elements and optionally set their `p_next` pointer. 43 #[inline] get_queue_checkpoint_data( &self, queue: vk::Queue, out: &mut [vk::CheckpointDataNV], )44 pub unsafe fn get_queue_checkpoint_data( 45 &self, 46 queue: vk::Queue, 47 out: &mut [vk::CheckpointDataNV], 48 ) { 49 let mut count = out.len() as u32; 50 (self.fp.get_queue_checkpoint_data_nv)(queue, &mut count, out.as_mut_ptr()); 51 assert_eq!(count as usize, out.len()); 52 } 53 54 #[inline] name() -> &'static CStr55 pub const fn name() -> &'static CStr { 56 vk::NvDeviceDiagnosticCheckpointsFn::name() 57 } 58 59 #[inline] fp(&self) -> &vk::NvDeviceDiagnosticCheckpointsFn60 pub fn fp(&self) -> &vk::NvDeviceDiagnosticCheckpointsFn { 61 &self.fp 62 } 63 } 64