1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{Entry, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 7 #[derive(Clone)] 8 pub struct CalibratedTimestamps { 9 handle: vk::Instance, 10 fp: vk::ExtCalibratedTimestampsFn, 11 } 12 13 impl CalibratedTimestamps { new(entry: &Entry, instance: &Instance) -> Self14 pub fn new(entry: &Entry, instance: &Instance) -> Self { 15 let handle = instance.handle(); 16 let fp = vk::ExtCalibratedTimestampsFn::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/vkGetPhysicalDeviceCalibrateableTimeDomainsEXT.html> 23 #[inline] get_physical_device_calibrateable_time_domains( &self, physical_device: vk::PhysicalDevice, ) -> VkResult<Vec<vk::TimeDomainEXT>>24 pub unsafe fn get_physical_device_calibrateable_time_domains( 25 &self, 26 physical_device: vk::PhysicalDevice, 27 ) -> VkResult<Vec<vk::TimeDomainEXT>> { 28 read_into_uninitialized_vector(|count, data| { 29 (self.fp.get_physical_device_calibrateable_time_domains_ext)( 30 physical_device, 31 count, 32 data, 33 ) 34 }) 35 } 36 37 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetCalibratedTimestampsEXT.html> 38 /// 39 /// Returns a tuple containing `(timestamps, max_deviation)` 40 #[inline] get_calibrated_timestamps( &self, device: vk::Device, info: &[vk::CalibratedTimestampInfoEXT], ) -> VkResult<(Vec<u64>, Vec<u64>)>41 pub unsafe fn get_calibrated_timestamps( 42 &self, 43 device: vk::Device, 44 info: &[vk::CalibratedTimestampInfoEXT], 45 ) -> VkResult<(Vec<u64>, Vec<u64>)> { 46 let mut timestamps = vec![0u64; info.len()]; 47 let mut max_deviation = vec![0u64; info.len()]; 48 (self.fp.get_calibrated_timestamps_ext)( 49 device, 50 info.len() as u32, 51 info.as_ptr(), 52 timestamps.as_mut_ptr(), 53 max_deviation.as_mut_ptr(), 54 ) 55 .result_with_success((timestamps, max_deviation)) 56 } 57 58 #[inline] name() -> &'static CStr59 pub const fn name() -> &'static CStr { 60 vk::ExtCalibratedTimestampsFn::name() 61 } 62 63 #[inline] fp(&self) -> &vk::ExtCalibratedTimestampsFn64 pub fn fp(&self) -> &vk::ExtCalibratedTimestampsFn { 65 &self.fp 66 } 67 68 #[inline] instance(&self) -> vk::Instance69 pub fn instance(&self) -> vk::Instance { 70 self.handle 71 } 72 } 73