• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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