use crate::prelude::*; use crate::vk; use crate::{EntryCustom, Instance}; use std::ffi::CStr; use std::mem; #[derive(Clone)] pub struct TimelineSemaphore { handle: vk::Instance, timeline_semaphore_fn: vk::KhrTimelineSemaphoreFn, } impl TimelineSemaphore { pub fn new(entry: &EntryCustom, instance: &Instance) -> Self { let timeline_semaphore_fn = vk::KhrTimelineSemaphoreFn::load(|name| unsafe { mem::transmute(entry.get_instance_proc_addr(instance.handle(), name.as_ptr())) }); Self { handle: instance.handle(), timeline_semaphore_fn, } } pub fn name() -> &'static CStr { vk::KhrTimelineSemaphoreFn::name() } #[doc = ""] pub unsafe fn get_semaphore_counter_value( &self, device: vk::Device, semaphore: vk::Semaphore, ) -> VkResult { let mut value = 0; self.timeline_semaphore_fn .get_semaphore_counter_value_khr(device, semaphore, &mut value) .result_with_success(value) } #[doc = ""] pub unsafe fn wait_semaphores( &self, device: vk::Device, wait_info: &vk::SemaphoreWaitInfo, timeout: u64, ) -> VkResult<()> { self.timeline_semaphore_fn .wait_semaphores_khr(device, wait_info, timeout) .into() } #[doc = ""] pub unsafe fn signal_semaphore( &self, device: vk::Device, signal_info: &vk::SemaphoreSignalInfo, ) -> VkResult<()> { self.timeline_semaphore_fn .signal_semaphore_khr(device, signal_info) .into() } pub fn fp(&self) -> &vk::KhrTimelineSemaphoreFn { &self.timeline_semaphore_fn } pub fn instance(&self) -> vk::Instance { self.handle } }