• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! # Framebuffer
2 //!
3 //! Process specific GPU buffers that can be attached to a plane.
4 
5 use crate::buffer;
6 use crate::control;
7 use drm_ffi as ffi;
8 use drm_fourcc::{DrmFourcc, DrmModifier};
9 
10 /// A handle to a framebuffer
11 #[repr(transparent)]
12 #[derive(Copy, Clone, Hash, PartialEq, Eq)]
13 pub struct Handle(control::RawResourceHandle);
14 
15 // Safety: Handle is repr(transparent) over NonZeroU32
16 unsafe impl bytemuck::ZeroableInOption for Handle {}
17 unsafe impl bytemuck::PodInOption for Handle {}
18 
19 impl From<Handle> for control::RawResourceHandle {
from(handle: Handle) -> Self20     fn from(handle: Handle) -> Self {
21         handle.0
22     }
23 }
24 
25 impl From<Handle> for u32 {
from(handle: Handle) -> Self26     fn from(handle: Handle) -> Self {
27         handle.0.into()
28     }
29 }
30 
31 impl From<control::RawResourceHandle> for Handle {
from(handle: control::RawResourceHandle) -> Self32     fn from(handle: control::RawResourceHandle) -> Self {
33         Handle(handle)
34     }
35 }
36 
37 impl control::ResourceHandle for Handle {
38     const FFI_TYPE: u32 = ffi::DRM_MODE_OBJECT_FB;
39 }
40 
41 impl std::fmt::Debug for Handle {
fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result42     fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
43         f.debug_tuple("framebuffer::Handle").field(&self.0).finish()
44     }
45 }
46 
47 /// Information about a framebuffer
48 #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
49 pub struct Info {
50     pub(crate) handle: Handle,
51     pub(crate) size: (u32, u32),
52     pub(crate) pitch: u32,
53     pub(crate) bpp: u32,
54     pub(crate) depth: u32,
55     pub(crate) buffer: Option<buffer::Handle>,
56 }
57 
58 impl Info {
59     /// Returns the handle to this framebuffer.
handle(&self) -> Handle60     pub fn handle(&self) -> Handle {
61         self.handle
62     }
63 
64     /// Returns the size of this framebuffer.
size(&self) -> (u32, u32)65     pub fn size(&self) -> (u32, u32) {
66         self.size
67     }
68 
69     /// Returns the pitch of this framebuffer.
pitch(&self) -> u3270     pub fn pitch(&self) -> u32 {
71         self.pitch
72     }
73 
74     /// Returns the bits-per-pixel of this framebuffer.
bpp(&self) -> u3275     pub fn bpp(&self) -> u32 {
76         self.bpp
77     }
78 
79     /// Returns the depth of this framebuffer.
depth(&self) -> u3280     pub fn depth(&self) -> u32 {
81         self.depth
82     }
83 
84     /// Returns the buffer handle of this framebuffer.
buffer(&self) -> Option<buffer::Handle>85     pub fn buffer(&self) -> Option<buffer::Handle> {
86         self.buffer
87     }
88 }
89 
90 /// Information about a framebuffer (with modifiers)
91 #[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)]
92 pub struct PlanarInfo {
93     pub(crate) handle: Handle,
94     pub(crate) size: (u32, u32),
95     pub(crate) pixel_format: DrmFourcc,
96     pub(crate) flags: control::FbCmd2Flags,
97     pub(crate) buffers: [Option<buffer::Handle>; 4],
98     pub(crate) pitches: [u32; 4],
99     pub(crate) offsets: [u32; 4],
100     pub(crate) modifier: Option<DrmModifier>,
101 }
102 
103 impl PlanarInfo {
104     /// Returns the handle to this framebuffer.
handle(&self) -> Handle105     pub fn handle(&self) -> Handle {
106         self.handle
107     }
108 
109     /// Returns the size of this framebuffer.
size(&self) -> (u32, u32)110     pub fn size(&self) -> (u32, u32) {
111         self.size
112     }
113 
114     /// Returns the pixel format of this framebuffer.
pixel_format(&self) -> DrmFourcc115     pub fn pixel_format(&self) -> DrmFourcc {
116         self.pixel_format
117     }
118 
119     /// Returns the flags of this framebuffer.
flags(&self) -> control::FbCmd2Flags120     pub fn flags(&self) -> control::FbCmd2Flags {
121         self.flags
122     }
123 
124     /// Returns the buffer handles of this framebuffer.
buffers(&self) -> [Option<buffer::Handle>; 4]125     pub fn buffers(&self) -> [Option<buffer::Handle>; 4] {
126         self.buffers
127     }
128 
129     /// Returns the pitches of this framebuffer.
pitches(&self) -> [u32; 4]130     pub fn pitches(&self) -> [u32; 4] {
131         self.pitches
132     }
133 
134     /// Returns the offsets of this framebuffer.
offsets(&self) -> [u32; 4]135     pub fn offsets(&self) -> [u32; 4] {
136         self.offsets
137     }
138 
139     /// Returns the modifier of this framebuffer.
modifier(&self) -> Option<DrmModifier>140     pub fn modifier(&self) -> Option<DrmModifier> {
141         self.modifier
142     }
143 }
144