atagen

monolith

public
Star0
Watch0
824bf02b6e554e9c0b86328878fc8eb8caa6926d
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git
crates/render-vk/src/sync.rsRust71 lines1.6 KB
1
use crate::device::Shared;
2
use ash::vk;
3
use smithay::backend::renderer::sync::{Fence, Interrupted};
4
use std::fmt;
5
use std::sync::Arc;
6
7
pub(crate) struct FenceInner {
8
    pub shared: Arc<Shared>,
9
    pub fence: vk::Fence,
10
}
11
12
impl FenceInner {
13
    pub fn new(shared: &Arc<Shared>) -> Result<Arc<Self>, vk::Result> {
14
        let fence = unsafe {
15
            shared
16
                .device
17
                .device
18
                .create_fence(&vk::FenceCreateInfo::default(), None)?
19
        };
20
        Ok(Arc::new(Self {
21
            shared: shared.clone(),
22
            fence,
23
        }))
24
    }
25
26
    pub fn signaled(&self) -> bool {
27
        unsafe { self.shared.device.device.get_fence_status(self.fence) }.unwrap_or(true)
28
    }
29
30
    pub fn wait(&self) -> Result<(), vk::Result> {
31
        unsafe {
32
            self.shared
33
                .device
34
                .device
35
                .wait_for_fences(&[self.fence], true, u64::MAX)
36
        }
37
    }
38
}
39
40
impl Drop for FenceInner {
41
    fn drop(&mut self) {
42
        unsafe { self.shared.device.device.destroy_fence(self.fence, None) };
43
    }
44
}
45
46
impl fmt::Debug for FenceInner {
47
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
48
        f.debug_tuple("FenceInner").field(&self.fence).finish()
49
    }
50
}
51
52
#[derive(Debug)]
53
pub(crate) struct VkFence(pub Arc<FenceInner>);
54
55
impl Fence for VkFence {
56
    fn is_signaled(&self) -> bool {
57
        self.0.signaled()
58
    }
59
60
    fn wait(&self) -> Result<(), Interrupted> {
61
        self.0.wait().map_err(|_| Interrupted)
62
    }
63
64
    fn is_exportable(&self) -> bool {
65
        false
66
    }
67
68
    fn export(&self) -> Option<std::os::fd::OwnedFd> {
69
        None
70
    }
71
}