rotex_vulkan/backend/vulkan/
sync.rs1use ash::vk;
2
3use super::device::Device;
4use crate::error::{Error, vk_error};
5
6pub struct Semaphore {
7 pub(crate) handle: vk::Semaphore,
8}
9
10impl Semaphore {
11 pub fn new(device: &Device) -> Result<Self, Error> {
12 let create_info = vk::SemaphoreCreateInfo::default();
13
14 let handle = unsafe { device.logical_device().create_semaphore(&create_info, None) }
15 .map_err(vk_error)?;
16
17 Ok(Self { handle })
18 }
19
20 pub fn handle(&self) -> vk::Semaphore {
21 self.handle
22 }
23
24 pub fn destroy(&self, device: &Device) {
25 unsafe {
26 device.logical_device().destroy_semaphore(self.handle, None);
27 }
28 }
29}
30
31pub struct Fence {
32 pub(crate) handle: vk::Fence,
33}
34
35impl Fence {
36 pub fn new(device: &Device, signaled: bool) -> Result<Self, Error> {
37 let mut create_info = vk::FenceCreateInfo::default();
38
39 if signaled {
40 create_info = create_info.flags(vk::FenceCreateFlags::SIGNALED);
41 }
42
43 let handle = unsafe { device.logical_device().create_fence(&create_info, None) }
44 .map_err(vk_error)?;
45
46 Ok(Self { handle })
47 }
48
49 pub fn handle(&self) -> vk::Fence {
50 self.handle
51 }
52
53 pub fn wait(&self, device: &Device, timeout_ns: u64) -> Result<(), Error> {
54 unsafe {
55 device
56 .logical_device()
57 .wait_for_fences(&[self.handle], true, timeout_ns)
58 }
59 .map_err(vk_error)
60 }
61
62 pub fn reset(&self, device: &Device) -> Result<(), Error> {
63 unsafe { device.logical_device().reset_fences(&[self.handle]) }.map_err(vk_error)
64 }
65
66 pub fn destroy(&self, device: &Device) {
67 unsafe {
68 device.logical_device().destroy_fence(self.handle, None);
69 }
70 }
71}