use crate::prelude::*; use anyhow::Result; use std::{sync::Arc, time::Duration}; pub struct FenceBuilder { signaled: bool, } impl FenceBuilder { pub fn set_signaled(mut self, signaled: bool) -> Self { self.signaled = signaled; self } pub fn build(self, device: Arc) -> Result> { let flag: VkFenceCreateFlagBits = if self.signaled { VK_FENCE_CREATE_SIGNALED_BIT.into() } else { 0u32.into() }; let fence_ci = VkFenceCreateInfo::new(flag); let fence = device.create_fence(&fence_ci)?; Ok(Arc::new(Fence { device, fence })) } } #[derive(Debug)] pub struct Fence { device: Arc, fence: VkFence, } impl Fence { pub fn builder() -> FenceBuilder { FenceBuilder { signaled: false } } pub fn wait(self: &Arc, timeout: Duration) -> Result<()> { self.device.wait_for_fences(&[self], true, timeout) } pub fn reset(&self) -> bool { self.device.reset_fences(&[self.fence]).is_ok() } } impl VulkanDevice for Fence { fn device(&self) -> &Arc { &self.device } } impl_vk_handle!(Fence, VkFence, fence); impl Drop for Fence { fn drop(&mut self) { self.device.destroy_fence(self.fence); } } use crate::{ffi::*, handle_ffi_result}; #[no_mangle] pub extern "C" fn create_fence(signaled: bool, device: *const Device) -> *const Fence { let device = unsafe { Arc::from_raw(device) }; let fence_res = Fence::builder().set_signaled(signaled).build(device); handle_ffi_result!(fence_res) } #[no_mangle] pub extern "C" fn reset_fence(fence: *const Fence) -> bool { let fence = unsafe { Arc::from_raw(fence) }; fence.reset() } #[no_mangle] pub extern "C" fn destroy_fence(fence: *const Fence) { let _fence = unsafe { Arc::from_raw(fence) }; }