@@ -56,6 +56,14 @@ trait ModeObject: Send + Sync + Downcastable {
5656 fn as_connector ( & self ) -> Arc < Connector > {
5757 utils:: downcast :: < dyn ModeObject , Connector > ( & self . object ( ) ) . unwrap ( )
5858 }
59+
60+ /// Converts this mode object into an encoder.
61+ ///
62+ /// # Panics
63+ /// * Called on a non-encoder mode object.
64+ fn as_encoder ( & self ) -> Arc < Encoder > {
65+ utils:: downcast :: < dyn ModeObject , Encoder > ( & self . object ( ) ) . unwrap ( )
66+ }
5967}
6068
6169trait DrmDevice : Send + Sync {
@@ -125,16 +133,34 @@ impl ModeObject for Crtc {
125133
126134struct Encoder {
127135 sref : Weak < Self > ,
136+
137+ /// The current CRTC for this encoder.
138+ current_crtc : Arc < Crtc > ,
139+ /// A vector contaning all the possible CRTCs for this encoder.
140+ possible_crtcs : Vec < Arc < Crtc > > ,
141+ /// A vector contaning all the possible sibling encoders for cloning.
142+ possible_clones : Vec < Arc < Encoder > > ,
143+
128144 object_id : u32 ,
129- // index: u32,
145+ index : u32 ,
130146}
131147
132148impl Encoder {
133- pub fn new ( object_id : u32 ) -> Arc < Self > {
149+ pub fn new (
150+ drm : & Drm ,
151+ current_crtc : Arc < Crtc > ,
152+ possible_crtcs : Vec < Arc < Crtc > > ,
153+ object_id : u32 ,
154+ ) -> Arc < Self > {
134155 Arc :: new_cyclic ( |sref| Self {
135156 sref : sref. clone ( ) ,
136157
158+ current_crtc,
159+ possible_crtcs,
160+ possible_clones : alloc:: vec![ ] , // todo: add self as possible clone.
161+
137162 object_id,
163+ index : drm. encoders . lock ( ) . len ( ) as _ ,
138164 } )
139165 }
140166}
@@ -164,7 +190,6 @@ struct Connector {
164190 modes : Vec < DrmModeInfo > ,
165191
166192 connector_typ : u32 ,
167-
168193 object_id : u32 ,
169194}
170195
@@ -302,6 +327,12 @@ impl Drm {
302327 self . install_object ( connector)
303328 }
304329
330+ /// Installs and initializes the encoder identifier.
331+ pub fn install_encoder ( & self , encoder : Arc < Encoder > ) {
332+ self . encoders . lock ( ) . push ( encoder. clone ( ) ) ;
333+ self . install_object ( encoder)
334+ }
335+
305336 pub fn allocate_object_id ( & self ) -> u32 {
306337 self . id_alloc . alloc ( ) as _
307338 }
@@ -409,6 +440,24 @@ impl INodeInterface for Drm {
409440 . read_mut :: < DrmModeGetEncoder > ( )
410441 . unwrap ( ) ;
411442
443+ let object = self . find_object ( struc. encoder_id ) . unwrap ( ) . as_encoder ( ) ;
444+ struc. crtc_id = object. current_crtc . id ( ) ;
445+
446+ let mut crtc_mask = 0 ;
447+ for crtc in object. possible_crtcs . iter ( ) {
448+ crtc_mask = 1 << crtc. index ;
449+ }
450+
451+ struc. possible_crtcs = crtc_mask;
452+
453+ let mut clone_mask = 0 ;
454+ for clone in object. possible_clones . iter ( ) {
455+ clone_mask = 1 << clone. index ;
456+ }
457+
458+ struc. possible_clones = clone_mask;
459+ struc. encoder_typ = 0 ; // todo: fill in the encoder typ.
460+
412461 Ok ( 0 )
413462 }
414463
0 commit comments