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