1 use crate::prelude::*; 2 use crate::vk; 3 use crate::{EntryCustom, Instance}; 4 use std::ffi::CStr; 5 use std::mem; 6 7 #[derive(Clone)] 8 pub struct TimelineSemaphore { 9 handle: vk::Instance, 10 timeline_semaphore_fn: vk::KhrTimelineSemaphoreFn, 11 } 12 13 impl TimelineSemaphore { new<L>(entry: &EntryCustom<L>, instance: &Instance) -> Self14 pub fn new<L>(entry: &EntryCustom<L>, instance: &Instance) -> Self { 15 let timeline_semaphore_fn = vk::KhrTimelineSemaphoreFn::load(|name| unsafe { 16 mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr())) 17 }); 18 Self { 19 handle: instance.handle(), 20 timeline_semaphore_fn, 21 } 22 } 23 name() -> &'static CStr24 pub fn name() -> &'static CStr { 25 vk::KhrTimelineSemaphoreFn::name() 26 } 27 28 #[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>29 pub unsafe fn get_semaphore_counter_value( 30 &self, 31 device: vk::Device, 32 semaphore: vk::Semaphore, 33 ) -> VkResult<u64> { 34 let mut value = 0; 35 self.timeline_semaphore_fn 36 .get_semaphore_counter_value_khr(device, semaphore, &mut value) 37 .result_with_success(value) 38 } 39 40 #[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<()>41 pub unsafe fn wait_semaphores( 42 &self, 43 device: vk::Device, 44 wait_info: &vk::SemaphoreWaitInfo, 45 timeout: u64, 46 ) -> VkResult<()> { 47 self.timeline_semaphore_fn 48 .wait_semaphores_khr(device, wait_info, timeout) 49 .into() 50 } 51 52 #[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<()>53 pub unsafe fn signal_semaphore( 54 &self, 55 device: vk::Device, 56 signal_info: &vk::SemaphoreSignalInfo, 57 ) -> VkResult<()> { 58 self.timeline_semaphore_fn 59 .signal_semaphore_khr(device, signal_info) 60 .into() 61 } 62 fp(&self) -> &vk::KhrTimelineSemaphoreFn63 pub fn fp(&self) -> &vk::KhrTimelineSemaphoreFn { 64 &self.timeline_semaphore_fn 65 } 66 instance(&self) -> vk::Instance67 pub fn instance(&self) -> vk::Instance { 68 self.handle 69 } 70 } 71