Skip to main content

rotex_vulkan/backend/vulkan/
sync.rs

1use 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}