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