1 //! # SyncObj 2 //! 3 //! A SyncObj is a binding point for the DRM subsystem to attach single-use fences which are 4 //! signalled when a device task completes. They are typically provided as optional arguments to 5 //! device-specific command submission IOCTLs. In practice, they are used to implement Vulkan 6 //! fence objects. 7 //! 8 //! After a submission IOCTL sets a fence into a SyncObj, it may be exported as a sync file 9 //! descriptor. This sync file may be epoll()'d for EPOLLIN to implement asynchronous waiting on 10 //! multiple events. This file descriptor is also compatible with [`tokio::io::unix::AsyncFd`] for 11 //! Rust async/await integration. 12 //! 13 //! [`tokio::io::unix::AsyncFd`]: <https://docs.rs/tokio/latest/tokio/io/unix/struct.AsyncFd.html> 14 15 use crate::control; 16 17 /// A handle to a specific syncobj 18 #[repr(transparent)] 19 #[derive(Copy, Clone, Hash, PartialEq, Eq)] 20 pub struct Handle(control::RawResourceHandle); 21 22 // Safety: Handle is repr(transparent) over NonZeroU32 23 unsafe impl bytemuck::ZeroableInOption for Handle {} 24 unsafe impl bytemuck::PodInOption for Handle {} 25 unsafe impl bytemuck::NoUninit for Handle {} 26 27 impl From<Handle> for control::RawResourceHandle { from(handle: Handle) -> Self28 fn from(handle: Handle) -> Self { 29 handle.0 30 } 31 } 32 33 impl From<Handle> for u32 { from(handle: Handle) -> Self34 fn from(handle: Handle) -> Self { 35 handle.0.into() 36 } 37 } 38 39 impl From<control::RawResourceHandle> for Handle { from(handle: control::RawResourceHandle) -> Self40 fn from(handle: control::RawResourceHandle) -> Self { 41 Handle(handle) 42 } 43 } 44 45 impl std::fmt::Debug for Handle { fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result46 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { 47 f.debug_tuple("syncobj::Handle").field(&self.0).finish() 48 } 49 } 50