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