ash/extensions/ext/
calibrated_timestamps.rs

1use crate::prelude::*;
2use crate::vk;
3use crate::{Entry, Instance};
4use std::ffi::CStr;
5use std::mem;
6
7#[derive(Clone)]
8pub struct CalibratedTimestamps {
9    handle: vk::Instance,
10    fp: vk::ExtCalibratedTimestampsFn,
11}
12
13impl CalibratedTimestamps {
14    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]
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]
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]
59    pub const fn name() -> &'static CStr {
60        vk::ExtCalibratedTimestampsFn::name()
61    }
62
63    #[inline]
64    pub fn fp(&self) -> &vk::ExtCalibratedTimestampsFn {
65        &self.fp
66    }
67
68    #[inline]
69    pub fn instance(&self) -> vk::Instance {
70        self.handle
71    }
72}