1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{Device, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 7 #[derive(Clone)] 8 pub struct TimelineSemaphore { 9 handle: vk::Device, 10 fp: vk::KhrTimelineSemaphoreFn, 11 } 12 13 impl TimelineSemaphore { new(instance: &Instance, device: &Device) -> Self14 pub fn new(instance: &Instance, device: &Device) -> Self { 15 let handle = device.handle(); 16 let fp = vk::KhrTimelineSemaphoreFn::load(|name| unsafe { 17 mem::transmute(instance.get_device_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/vkGetSemaphoreCounterValue.html> 23 #[inline] get_semaphore_counter_value(&self, semaphore: vk::Semaphore) -> VkResult<u64>24 pub unsafe fn get_semaphore_counter_value(&self, semaphore: vk::Semaphore) -> VkResult<u64> { 25 let mut value = 0; 26 (self.fp.get_semaphore_counter_value_khr)(self.handle, semaphore, &mut value) 27 .result_with_success(value) 28 } 29 30 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkWaitSemaphores.html> 31 #[inline] wait_semaphores( &self, wait_info: &vk::SemaphoreWaitInfo, timeout: u64, ) -> VkResult<()>32 pub unsafe fn wait_semaphores( 33 &self, 34 wait_info: &vk::SemaphoreWaitInfo, 35 timeout: u64, 36 ) -> VkResult<()> { 37 (self.fp.wait_semaphores_khr)(self.handle, wait_info, timeout).result() 38 } 39 40 /// <https://www.khronos.org/registry/vulkan/specs/1.3-extensions/man/html/vkSignalSemaphore.html> 41 #[inline] signal_semaphore(&self, signal_info: &vk::SemaphoreSignalInfo) -> VkResult<()>42 pub unsafe fn signal_semaphore(&self, signal_info: &vk::SemaphoreSignalInfo) -> VkResult<()> { 43 (self.fp.signal_semaphore_khr)(self.handle, signal_info).result() 44 } 45 46 #[inline] name() -> &'static CStr47 pub const fn name() -> &'static CStr { 48 vk::KhrTimelineSemaphoreFn::name() 49 } 50 51 #[inline] fp(&self) -> &vk::KhrTimelineSemaphoreFn52 pub fn fp(&self) -> &vk::KhrTimelineSemaphoreFn { 53 &self.fp 54 } 55 56 #[inline] device(&self) -> vk::Device57 pub fn device(&self) -> vk::Device { 58 self.handle 59 } 60 } 61