atagen

monolith

public
Star0
Watch0
824bf02b6e554e9c0b86328878fc8eb8caa6926d
1
ssh://brewery@pls.lobotomise.me:33/atagen/monolith.git

Blame: crates/render-vk/src/sync.rs

824bf02b6e55atagen2026-10-16 09:15 UTC1
use crate::device::Shared;
824bf02b6e55atagen2026-10-16 09:15 UTC2
use ash::vk;
824bf02b6e55atagen2026-10-16 09:15 UTC3
use smithay::backend::renderer::sync::{Fence, Interrupted};
824bf02b6e55atagen2026-10-16 09:15 UTC4
use std::fmt;
824bf02b6e55atagen2026-10-16 09:15 UTC5
use std::sync::Arc;
824bf02b6e55atagen2026-10-16 09:15 UTC6
824bf02b6e55atagen2026-10-16 09:15 UTC7
pub(crate) struct FenceInner {
824bf02b6e55atagen2026-10-16 09:15 UTC8
    pub shared: Arc<Shared>,
824bf02b6e55atagen2026-10-16 09:15 UTC9
    pub fence: vk::Fence,
824bf02b6e55atagen2026-10-16 09:15 UTC10
}
824bf02b6e55atagen2026-10-16 09:15 UTC11
824bf02b6e55atagen2026-10-16 09:15 UTC12
impl FenceInner {
824bf02b6e55atagen2026-10-16 09:15 UTC13
    pub fn new(shared: &Arc<Shared>) -> Result<Arc<Self>, vk::Result> {
824bf02b6e55atagen2026-10-16 09:15 UTC14
        let fence = unsafe {
824bf02b6e55atagen2026-10-16 09:15 UTC15
            shared
824bf02b6e55atagen2026-10-16 09:15 UTC16
                .device
824bf02b6e55atagen2026-10-16 09:15 UTC17
                .device
824bf02b6e55atagen2026-10-16 09:15 UTC18
                .create_fence(&vk::FenceCreateInfo::default(), None)?
824bf02b6e55atagen2026-10-16 09:15 UTC19
        };
824bf02b6e55atagen2026-10-16 09:15 UTC20
        Ok(Arc::new(Self {
824bf02b6e55atagen2026-10-16 09:15 UTC21
            shared: shared.clone(),
824bf02b6e55atagen2026-10-16 09:15 UTC22
            fence,
824bf02b6e55atagen2026-10-16 09:15 UTC23
        }))
824bf02b6e55atagen2026-10-16 09:15 UTC24
    }
824bf02b6e55atagen2026-10-16 09:15 UTC25
824bf02b6e55atagen2026-10-16 09:15 UTC26
    pub fn signaled(&self) -> bool {
824bf02b6e55atagen2026-10-16 09:15 UTC27
        unsafe { self.shared.device.device.get_fence_status(self.fence) }.unwrap_or(true)
824bf02b6e55atagen2026-10-16 09:15 UTC28
    }
824bf02b6e55atagen2026-10-16 09:15 UTC29
824bf02b6e55atagen2026-10-16 09:15 UTC30
    pub fn wait(&self) -> Result<(), vk::Result> {
824bf02b6e55atagen2026-10-16 09:15 UTC31
        unsafe {
824bf02b6e55atagen2026-10-16 09:15 UTC32
            self.shared
824bf02b6e55atagen2026-10-16 09:15 UTC33
                .device
824bf02b6e55atagen2026-10-16 09:15 UTC34
                .device
824bf02b6e55atagen2026-10-16 09:15 UTC35
                .wait_for_fences(&[self.fence], true, u64::MAX)
824bf02b6e55atagen2026-10-16 09:15 UTC36
        }
824bf02b6e55atagen2026-10-16 09:15 UTC37
    }
824bf02b6e55atagen2026-10-16 09:15 UTC38
}
824bf02b6e55atagen2026-10-16 09:15 UTC39
824bf02b6e55atagen2026-10-16 09:15 UTC40
impl Drop for FenceInner {
824bf02b6e55atagen2026-10-16 09:15 UTC41
    fn drop(&mut self) {
824bf02b6e55atagen2026-10-16 09:15 UTC42
        unsafe { self.shared.device.device.destroy_fence(self.fence, None) };
824bf02b6e55atagen2026-10-16 09:15 UTC43
    }
824bf02b6e55atagen2026-10-16 09:15 UTC44
}
824bf02b6e55atagen2026-10-16 09:15 UTC45
824bf02b6e55atagen2026-10-16 09:15 UTC46
impl fmt::Debug for FenceInner {
824bf02b6e55atagen2026-10-16 09:15 UTC47
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
824bf02b6e55atagen2026-10-16 09:15 UTC48
        f.debug_tuple("FenceInner").field(&self.fence).finish()
824bf02b6e55atagen2026-10-16 09:15 UTC49
    }
824bf02b6e55atagen2026-10-16 09:15 UTC50
}
824bf02b6e55atagen2026-10-16 09:15 UTC51
824bf02b6e55atagen2026-10-16 09:15 UTC52
#[derive(Debug)]
824bf02b6e55atagen2026-10-16 09:15 UTC53
pub(crate) struct VkFence(pub Arc<FenceInner>);
824bf02b6e55atagen2026-10-16 09:15 UTC54
824bf02b6e55atagen2026-10-16 09:15 UTC55
impl Fence for VkFence {
824bf02b6e55atagen2026-10-16 09:15 UTC56
    fn is_signaled(&self) -> bool {
824bf02b6e55atagen2026-10-16 09:15 UTC57
        self.0.signaled()
824bf02b6e55atagen2026-10-16 09:15 UTC58
    }
824bf02b6e55atagen2026-10-16 09:15 UTC59
824bf02b6e55atagen2026-10-16 09:15 UTC60
    fn wait(&self) -> Result<(), Interrupted> {
824bf02b6e55atagen2026-10-16 09:15 UTC61
        self.0.wait().map_err(|_| Interrupted)
824bf02b6e55atagen2026-10-16 09:15 UTC62
    }
824bf02b6e55atagen2026-10-16 09:15 UTC63
824bf02b6e55atagen2026-10-16 09:15 UTC64
    fn is_exportable(&self) -> bool {
824bf02b6e55atagen2026-10-16 09:15 UTC65
        false
824bf02b6e55atagen2026-10-16 09:15 UTC66
    }
824bf02b6e55atagen2026-10-16 09:15 UTC67
824bf02b6e55atagen2026-10-16 09:15 UTC68
    fn export(&self) -> Option<std::os::fd::OwnedFd> {
824bf02b6e55atagen2026-10-16 09:15 UTC69
        None
824bf02b6e55atagen2026-10-16 09:15 UTC70
    }
824bf02b6e55atagen2026-10-16 09:15 UTC71
}