| 1 | //! # Encoder |
| 2 | //! |
| 3 | //! An encoder is a bridge between a CRTC and a connector that takes the pixel |
| 4 | //! data of the CRTC and encodes it into a format the connector understands. |
| 5 | |
| 6 | use crate::control; |
| 7 | use drm_ffi as ffi; |
| 8 | |
| 9 | /// A handle to an encoder |
| 10 | #[repr (transparent)] |
| 11 | #[derive (Copy, Clone, Hash, PartialEq, Eq)] |
| 12 | pub struct Handle(control::RawResourceHandle); |
| 13 | |
| 14 | // Safety: Handle is repr(transparent) over NonZeroU32 |
| 15 | unsafe impl bytemuck::ZeroableInOption for Handle {} |
| 16 | unsafe impl bytemuck::PodInOption for Handle {} |
| 17 | |
| 18 | impl From<Handle> for control::RawResourceHandle { |
| 19 | fn from(handle: Handle) -> Self { |
| 20 | handle.0 |
| 21 | } |
| 22 | } |
| 23 | |
| 24 | impl From<Handle> for u32 { |
| 25 | fn from(handle: Handle) -> Self { |
| 26 | handle.0.into() |
| 27 | } |
| 28 | } |
| 29 | |
| 30 | impl From<control::RawResourceHandle> for Handle { |
| 31 | fn from(handle: control::RawResourceHandle) -> Self { |
| 32 | Handle(handle) |
| 33 | } |
| 34 | } |
| 35 | |
| 36 | impl control::ResourceHandle for Handle { |
| 37 | const FFI_TYPE: u32 = ffi::DRM_MODE_OBJECT_ENCODER; |
| 38 | } |
| 39 | |
| 40 | impl std::fmt::Debug for Handle { |
| 41 | fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { |
| 42 | f.debug_tuple(name:"encoder::Handle" ).field(&self.0).finish() |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | /// Information about an encoder |
| 47 | #[derive (Debug, Copy, Clone, Hash, PartialEq, Eq)] |
| 48 | pub struct Info { |
| 49 | pub(crate) handle: Handle, |
| 50 | pub(crate) enc_type: Kind, |
| 51 | pub(crate) crtc: Option<control::crtc::Handle>, |
| 52 | pub(crate) pos_crtcs: u32, |
| 53 | pub(crate) pos_clones: u32, |
| 54 | } |
| 55 | |
| 56 | impl std::fmt::Display for Info { |
| 57 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
| 58 | write!(f, "Encoder {}" , self.handle.0) |
| 59 | } |
| 60 | } |
| 61 | |
| 62 | impl Info { |
| 63 | /// Returns the handle to this encoder. |
| 64 | pub fn handle(&self) -> Handle { |
| 65 | self.handle |
| 66 | } |
| 67 | |
| 68 | /// Returns the `Kind` of encoder this is. |
| 69 | pub fn kind(&self) -> Kind { |
| 70 | self.enc_type |
| 71 | } |
| 72 | |
| 73 | /// Returns a handle to the CRTC this encoder is attached to. |
| 74 | pub fn crtc(&self) -> Option<control::crtc::Handle> { |
| 75 | self.crtc |
| 76 | } |
| 77 | |
| 78 | /// Returns a filter for the possible CRTCs that can use this encoder. |
| 79 | /// |
| 80 | /// Use with [`control::ResourceHandles::filter_crtcs`] |
| 81 | /// to receive a list of crtcs. |
| 82 | pub fn possible_crtcs(&self) -> control::CrtcListFilter { |
| 83 | control::CrtcListFilter(self.pos_crtcs) |
| 84 | } |
| 85 | |
| 86 | /// Returns a filter for the possible encoders that clones this one. |
| 87 | pub fn possible_clones(&self) { |
| 88 | unimplemented!() |
| 89 | } |
| 90 | } |
| 91 | |
| 92 | /// The type of encoder. |
| 93 | #[allow (missing_docs)] |
| 94 | #[allow (clippy::upper_case_acronyms)] |
| 95 | #[derive (Debug, Copy, Clone, Hash, PartialEq, Eq)] |
| 96 | pub enum Kind { |
| 97 | None, |
| 98 | DAC, |
| 99 | TMDS, |
| 100 | LVDS, |
| 101 | TVDAC, |
| 102 | Virtual, |
| 103 | DSI, |
| 104 | DPMST, |
| 105 | DPI, |
| 106 | } |
| 107 | |
| 108 | impl From<u32> for Kind { |
| 109 | fn from(n: u32) -> Self { |
| 110 | match n { |
| 111 | ffi::DRM_MODE_ENCODER_NONE => Kind::None, |
| 112 | ffi::DRM_MODE_ENCODER_DAC => Kind::DAC, |
| 113 | ffi::DRM_MODE_ENCODER_TMDS => Kind::TMDS, |
| 114 | ffi::DRM_MODE_ENCODER_LVDS => Kind::LVDS, |
| 115 | ffi::DRM_MODE_ENCODER_TVDAC => Kind::TVDAC, |
| 116 | ffi::DRM_MODE_ENCODER_VIRTUAL => Kind::Virtual, |
| 117 | ffi::DRM_MODE_ENCODER_DSI => Kind::DSI, |
| 118 | ffi::DRM_MODE_ENCODER_DPMST => Kind::DPMST, |
| 119 | ffi::DRM_MODE_ENCODER_DPI => Kind::DPI, |
| 120 | _ => Kind::None, |
| 121 | } |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | impl From<Kind> for u32 { |
| 126 | fn from(kind: Kind) -> Self { |
| 127 | match kind { |
| 128 | Kind::None => ffi::DRM_MODE_ENCODER_NONE, |
| 129 | Kind::DAC => ffi::DRM_MODE_ENCODER_DAC, |
| 130 | Kind::TMDS => ffi::DRM_MODE_ENCODER_TMDS, |
| 131 | Kind::LVDS => ffi::DRM_MODE_ENCODER_LVDS, |
| 132 | Kind::TVDAC => ffi::DRM_MODE_ENCODER_TVDAC, |
| 133 | Kind::Virtual => ffi::DRM_MODE_ENCODER_VIRTUAL, |
| 134 | Kind::DSI => ffi::DRM_MODE_ENCODER_DSI, |
| 135 | Kind::DPMST => ffi::DRM_MODE_ENCODER_DPMST, |
| 136 | Kind::DPI => ffi::DRM_MODE_ENCODER_DPI, |
| 137 | } |
| 138 | } |
| 139 | } |
| 140 | |