From a198776ce810f5d352f28109f21db80e8312e28c Mon Sep 17 00:00:00 2001 From: Alexander Usenko Date: Tue, 17 Mar 2026 11:44:05 +0000 Subject: [PATCH] driver-graphics: MODE_SET_CRTC implementation --- drivers/graphics/driver-graphics/src/lib.rs | 45 +++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 82406525ab..a0897d97bc 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -527,6 +527,51 @@ impl SchemeSync for GraphicsSchemeInner { } Ok(0) }), + ipc::MODE_SET_CRTC => ipc::DrmModeCrtc::with(payload, |data| { + let crtc = self + .objects + .get_crtc(KmsObjectId(data.crtc_id()))? + ; + let display_id = crtc.lock().unwrap().crtc_index as usize; + let connector_ids: Vec = data + .set_connectors_ptr() + .iter() + .take(data.count_connectors() as usize) + .map(|&id| KmsObjectId(id)) + .collect(); + let fb = if data.fb_id() != 0 { + Some(self.objects.get_framebuffer(KmsObjectId(data.fb_id()))?) + } else { + None + }; + let mode = if data.mode_valid() != 0 { + Some(data.mode()) + } else { + None + }; + if *vt == self.active_vt { + self.adapter.set_crtc( + &self.objects, + crtc, + &connector_ids, + mode, + fb.as_deref(), + Damage { + x: data.x(), + y: data.y(), + width: mode.map_or(0, |m| m.hdisplay as u32), + height: mode.map_or(0, |m| m.vdisplay as u32), + }, + ); + } + self.vts.get_mut(vt).unwrap().display_fbs[display_id] = if data.fb_id() != 0 + { + Some(KmsObjectId(data.fb_id())) + } else { + None + }; + Ok(0) + }), ipc::MODE_CURSOR => ipc::DrmModeCursor::with(payload, |data| { let vt_state = self.vts.get_mut(vt).unwrap();