ash/extensions/ext/
calibrated_timestamps.rs1use 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 #[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 #[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}