1 #![allow(dead_code)]
2 use crate::prelude::*;
3 use crate::version::{EntryV1_0, InstanceV1_0};
4 use crate::vk;
5 use std::ffi::CStr;
6 use std::mem;
7 
8 #[derive(Clone)]
9 pub struct TimelineSemaphore {
10     handle: vk::Instance,
11     timeline_semaphore_fn: vk::KhrTimelineSemaphoreFn,
12 }
13 
14 impl TimelineSemaphore {
new<E: EntryV1_0, I: InstanceV1_0>(entry: &E, instance: &I) -> TimelineSemaphore15     pub fn new<E: EntryV1_0, I: InstanceV1_0>(entry: &E, instance: &I) -> TimelineSemaphore {
16         let timeline_semaphore_fn = vk::KhrTimelineSemaphoreFn::load(|name| unsafe {
17             mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr()))
18         });
19 
20         TimelineSemaphore {
21             handle: instance.handle(),
22             timeline_semaphore_fn,
23         }
24     }
25 
name() -> &'static CStr26     pub fn name() -> &'static CStr {
27         vk::KhrTimelineSemaphoreFn::name()
28     }
29 
30     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkGetSemaphoreCounterValue.html>"]
get_semaphore_counter_value( &self, device: vk::Device, semaphore: vk::Semaphore, ) -> VkResult<u64>31     pub unsafe fn get_semaphore_counter_value(
32         &self,
33         device: vk::Device,
34         semaphore: vk::Semaphore,
35     ) -> VkResult<u64> {
36         let mut value = 0;
37         self.timeline_semaphore_fn
38             .get_semaphore_counter_value_khr(device, semaphore, &mut value)
39             .result_with_success(value)
40     }
41 
42     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkWaitSemaphores.html>"]
wait_semaphores( &self, device: vk::Device, wait_info: &vk::SemaphoreWaitInfo, timeout: u64, ) -> VkResult<()>43     pub unsafe fn wait_semaphores(
44         &self,
45         device: vk::Device,
46         wait_info: &vk::SemaphoreWaitInfo,
47         timeout: u64,
48     ) -> VkResult<()> {
49         self.timeline_semaphore_fn
50             .wait_semaphores_khr(device, wait_info, timeout)
51             .into()
52     }
53 
54     #[doc = "<https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/vkSignalSemaphore.html>"]
signal_semaphore( &self, device: vk::Device, signal_info: &vk::SemaphoreSignalInfo, ) -> VkResult<()>55     pub unsafe fn signal_semaphore(
56         &self,
57         device: vk::Device,
58         signal_info: &vk::SemaphoreSignalInfo,
59     ) -> VkResult<()> {
60         self.timeline_semaphore_fn
61             .signal_semaphore_khr(device, signal_info)
62             .into()
63     }
64 
fp(&self) -> &vk::KhrTimelineSemaphoreFn65     pub fn fp(&self) -> &vk::KhrTimelineSemaphoreFn {
66         &self.timeline_semaphore_fn
67     }
68 
instance(&self) -> vk::Instance69     pub fn instance(&self) -> vk::Instance {
70         self.handle
71     }
72 }
73