1 //! # Plane 2 //! 3 //! Attachment point for a Framebuffer. 4 //! 5 //! A Plane is a resource that can have a framebuffer attached to it, either for 6 //! hardware compositing or displaying directly to a screen. There are three 7 //! types of planes available for use: 8 //! 9 //! * Primary - A CRTC's built-in plane. When attaching a framebuffer to a CRTC, 10 //! it is actually being attached to this kind of plane. 11 //! 12 //! * Overlay - Can be overlaid on top of a primary plane, utilizing extremely 13 //! fast hardware compositing. 14 //! 15 //! * Cursor - Similar to an overlay plane, these are typically used to display 16 //! cursor type objects. 17 18 use crate::control; 19 use drm_ffi as ffi; 20 21 /// A handle to a plane 22 #[repr(transparent)] 23 #[derive(Copy, Clone, Hash, PartialEq, Eq)] 24 pub struct Handle(control::RawResourceHandle); 25 26 // Safety: Handle is repr(transparent) over NonZeroU32 27 unsafe impl bytemuck::ZeroableInOption for Handle {} 28 unsafe impl bytemuck::PodInOption for Handle {} 29 30 impl From<Handle> for control::RawResourceHandle { from(handle: Handle) -> Self31 fn from(handle: Handle) -> Self { 32 handle.0 33 } 34 } 35 36 impl From<Handle> for u32 { from(handle: Handle) -> Self37 fn from(handle: Handle) -> Self { 38 handle.0.into() 39 } 40 } 41 42 impl From<control::RawResourceHandle> for Handle { from(handle: control::RawResourceHandle) -> Self43 fn from(handle: control::RawResourceHandle) -> Self { 44 Handle(handle) 45 } 46 } 47 48 impl control::ResourceHandle for Handle { 49 const FFI_TYPE: u32 = ffi::DRM_MODE_OBJECT_PLANE; 50 } 51 52 impl std::fmt::Debug for Handle { fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result53 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { 54 f.debug_tuple("plane::Handle").field(&self.0).finish() 55 } 56 } 57 58 /// Information about a plane 59 #[derive(Debug, Clone, Hash, PartialEq, Eq)] 60 pub struct Info { 61 pub(crate) handle: Handle, 62 pub(crate) crtc: Option<control::crtc::Handle>, 63 pub(crate) fb: Option<control::framebuffer::Handle>, 64 pub(crate) pos_crtcs: u32, 65 pub(crate) formats: Vec<u32>, 66 } 67 68 impl std::fmt::Display for Info { fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result69 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 70 write!(f, "Plane {}", self.handle.0) 71 } 72 } 73 74 impl Info { 75 /// Returns the handle to this plane. handle(&self) -> Handle76 pub fn handle(&self) -> Handle { 77 self.handle 78 } 79 80 /// Returns the CRTC this plane is attached to. crtc(&self) -> Option<control::crtc::Handle>81 pub fn crtc(&self) -> Option<control::crtc::Handle> { 82 self.crtc 83 } 84 85 /// Returns a filter for supported crtcs of this plane. 86 /// 87 /// Use with [`control::ResourceHandles::filter_crtcs`] 88 /// to receive a list of crtcs. possible_crtcs(&self) -> control::CrtcListFilter89 pub fn possible_crtcs(&self) -> control::CrtcListFilter { 90 control::CrtcListFilter(self.pos_crtcs) 91 } 92 93 /// Returns the framebuffer this plane is attached to. framebuffer(&self) -> Option<control::framebuffer::Handle>94 pub fn framebuffer(&self) -> Option<control::framebuffer::Handle> { 95 self.fb 96 } 97 98 /// Returns the formats this plane supports. formats(&self) -> &[u32]99 pub fn formats(&self) -> &[u32] { 100 &self.formats 101 } 102 } 103