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 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 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}