ash/extensions/ext/
calibrated_timestamps.rs

1use crate::prelude::{read_into_uninitialized_vector, VkResult};
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    pub unsafe fn get_physical_device_calibrateable_time_domains(
24        &self,
25        physical_device: vk::PhysicalDevice,
26    ) -> VkResult<Vec<vk::TimeDomainEXT>> {
27        read_into_uninitialized_vector(|count, data| {
28            (self.fp.get_physical_device_calibrateable_time_domains_ext)(
29                physical_device,
30                count,
31                data,
32            )
33        })
34    }
35
36    /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkGetCalibratedTimestampsEXT.html>
37    ///
38    /// Returns a tuple containing `(timestamps, max_deviation)`
39    pub unsafe fn get_calibrated_timestamps(
40        &self,
41        device: vk::Device,
42        info: &[vk::CalibratedTimestampInfoEXT],
43    ) -> VkResult<(Vec<u64>, Vec<u64>)> {
44        let mut timestamps = vec![0u64; info.len()];
45        let mut max_deviation = vec![0u64; info.len()];
46        (self.fp.get_calibrated_timestamps_ext)(
47            device,
48            info.len() as u32,
49            info.as_ptr(),
50            timestamps.as_mut_ptr(),
51            max_deviation.as_mut_ptr(),
52        )
53        .result_with_success((timestamps, max_deviation))
54    }
55
56    pub const fn name() -> &'static CStr {
57        vk::ExtCalibratedTimestampsFn::name()
58    }
59
60    pub fn fp(&self) -> &vk::ExtCalibratedTimestampsFn {
61        &self.fp
62    }
63
64    pub fn instance(&self) -> vk::Instance {
65        self.handle
66    }
67}