use std::sync::Arc;
use ash::vk;
use crate::{Device, Error};
pub use vk::FenceCreateFlags as FenceFlags;
pub use vk::SemaphoreCreateFlags as SemaphoreFlags;
pub struct Fence {
device: Arc<Device>,
fence: vk::Fence,
}
impl Drop for Fence {
fn drop(&mut self) { unsafe { self.device.destroy_fence(self.fence, None) }
}
}
impl std::ops::Deref for Fence {
type Target = vk::Fence;
fn deref(&self) -> &Self::Target {
&self.fence
}
}
impl Fence {
pub fn new(device: &Arc<Device>, flags: FenceFlags) -> Result<Self, Error> {
let info = vk::FenceCreateInfo::builder().flags(flags);
let fence = unsafe { device.create_fence(&info, None)? };
Ok(Self {
device: Arc::clone(&device),
fence,
})
}
pub fn wait(&self) -> Result<(), Error> {
Ok(unsafe { self.device.wait_for_fences(&[self.fence], true, u64::MAX)? })
}
pub fn reset(&self) -> Result<(), Error> {
Ok(unsafe { self.device.reset_fences(&[self.fence])? })
}
}
pub struct Semaphore {
device: Arc<Device>,
semaphore: vk::Semaphore,
}
impl Drop for Semaphore {
fn drop(&mut self) {
unsafe { self.device.destroy_semaphore(self.semaphore, None) }
}
}
impl std::ops::Deref for Semaphore {
type Target = vk::Semaphore;
fn deref(&self) -> &Self::Target {
&self.semaphore
}
}
impl Semaphore {
pub fn new(device: &Arc<Device>, flags: SemaphoreFlags) -> Result<Self, Error> {
let info = vk::SemaphoreCreateInfo::builder().flags(flags);
let semaphore = unsafe { device.create_semaphore(&info, None)? };
Ok(Self {
device: Arc::clone(&device),
semaphore,
})
}
}