From e9188e0f91b61d8e13f30d3e0c78a47b905d65ae Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 7 May 2026 20:25:48 +0200 Subject: [PATCH 1/2] drivers/graphics/driver-graphics: Reduce visibility of some functions --- .../graphics/driver-graphics/src/kms/connector.rs | 2 +- .../graphics/driver-graphics/src/kms/objects.rs | 14 +++++++------- .../graphics/driver-graphics/src/kms/properties.rs | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/connector.rs b/drivers/graphics/driver-graphics/src/kms/connector.rs index c885f41351..0a15d42b4b 100644 --- a/drivers/graphics/driver-graphics/src/kms/connector.rs +++ b/drivers/graphics/driver-graphics/src/kms/connector.rs @@ -178,7 +178,7 @@ impl KmsConnector { } } -pub(crate) fn modeinfo_for_size(width: u32, height: u32) -> drm_mode_modeinfo { +fn modeinfo_for_size(width: u32, height: u32) -> drm_mode_modeinfo { let mut modeinfo = drm_mode_modeinfo { // The actual visible display size hdisplay: width as u16, diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 1daf32212d..d8befafdc9 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -18,11 +18,11 @@ use crate::GraphicsAdapter; #[derive(Debug)] pub struct KmsObjects { next_id: KmsObjectId, - pub(crate) connectors: Vec, - pub(crate) encoders: Vec, + pub(super) connectors: Vec, + pub(super) encoders: Vec, crtcs: Vec, framebuffers: Vec, - pub(crate) objects: HashMap>, + pub(super) objects: HashMap>, _marker: PhantomData, } @@ -41,7 +41,7 @@ impl KmsObjects { objects } - pub(crate) fn add>>(&mut self, data: U) -> KmsObjectId { + pub(super) fn add>>(&mut self, data: U) -> KmsObjectId { let id = self.next_id; self.objects.insert(id, data.into()); self.next_id.0 += 1; @@ -49,7 +49,7 @@ impl KmsObjects { id } - pub(crate) fn get<'a, U: 'a>(&'a self, id: KmsObjectId) -> Result<&'a U> + pub(super) fn get<'a, U: 'a>(&'a self, id: KmsObjectId) -> Result<&'a U> where &'a U: TryFrom<&'a KmsObject>, { @@ -61,7 +61,7 @@ impl KmsObjects { } } - pub fn object_type(&self, id: KmsObjectId) -> Result { + pub(crate) fn object_type(&self, id: KmsObjectId) -> Result { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; Ok(object.object_type()) } @@ -147,7 +147,7 @@ macro_rules! define_object_kinds { $variant:ident($data:ty) = $type:ident, )*) => { #[derive(Debug)] - pub(crate) enum KmsObject<$T: GraphicsAdapter> { + pub(super) enum KmsObject<$T: GraphicsAdapter> { $($variant($data),)* } diff --git a/drivers/graphics/driver-graphics/src/kms/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs index e22527a702..37075db2d4 100644 --- a/drivers/graphics/driver-graphics/src/kms/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -229,7 +229,7 @@ macro_rules! define_object_props { } )* }) => { impl$(<$($T$(: $bound)?),*>)? $obj$(<$($T),*>)? { - pub(super) fn base_properties() -> Vec> { + fn base_properties() -> Vec> { vec![$(KmsPropertyData { id: $prop, getter: |$object| $get From 1dcf00dc8e613a6b25c6585852e2fd68dcf9639b Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 7 May 2026 20:42:16 +0200 Subject: [PATCH 2/2] drivers/graphics/driver-graphics: Replace hw_cursor_size with has_cursor_plane Clients get the cursor size using get_cap. hw_cursor_size is only used to determine the existence of a cursor plane nowadays. --- drivers/graphics/driver-graphics/src/lib.rs | 28 +++++++++++++-------- drivers/graphics/ihdgd/src/device/scheme.rs | 4 +-- drivers/graphics/vesad/src/scheme.rs | 4 +-- drivers/graphics/virtio-gpud/src/scheme.rs | 6 ++--- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index eab0be9c3e..9fdb6d40bb 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -108,7 +108,9 @@ pub trait GraphicsAdapter: Sized + Debug { damage: Damage, ) -> syscall::Result<()>; - fn hw_cursor_size(&self) -> Option<(u32, u32)>; + // FIXME replace this with an actual plane marked as cursor plane once we + // support planes internally. + fn has_cursor_plane(&self) -> bool; fn handle_cursor(&mut self, cursor: &CursorPlane, dirty_fb: bool); } @@ -273,7 +275,7 @@ struct GraphicsSchemeInner { struct VtState { connector_state: Vec>, crtc_state: Vec>, - cursor_plane: CursorPlane, + cursor_plane: Option>, } enum Handle { @@ -287,6 +289,7 @@ enum Handle { impl GraphicsSchemeInner { fn get_or_create_vt<'a>( + adapter: &T, objects: &KmsObjects, vts: &'a mut HashMap>, vt: usize, @@ -300,13 +303,13 @@ impl GraphicsSchemeInner { .crtcs() .map(|crtc| crtc.lock().unwrap().state.clone()) .collect(), - cursor_plane: CursorPlane { + cursor_plane: adapter.has_cursor_plane().then(|| CursorPlane { x: 0, y: 0, hot_x: 0, hot_y: 0, buffer: None, - }, + }), }) } @@ -323,7 +326,8 @@ impl GraphicsSchemeInner { self.active_vt = vt; - let vt_state = GraphicsSchemeInner::get_or_create_vt(&self.objects, &mut self.vts, vt); + let vt_state = + GraphicsSchemeInner::get_or_create_vt(&self.adapter, &self.objects, &mut self.vts, vt); for (connector_idx, connector_state) in vt_state.connector_state.iter().enumerate() { let connector_id = self.objects.connector_ids()[connector_idx]; @@ -370,8 +374,8 @@ impl GraphicsSchemeInner { .crtc_id = crtc_id; } - if self.adapter.hw_cursor_size().is_some() { - self.adapter.handle_cursor(&vt_state.cursor_plane, true); + if let Some(cursor_plane) = &vt_state.cursor_plane { + self.adapter.handle_cursor(cursor_plane, true); } } } @@ -406,7 +410,7 @@ impl SchemeSync for GraphicsSchemeInner { .map_err(|_| Error::new(EINVAL))?; // Ensure the VT exists such that the rest of the methods can freely access it. - Self::get_or_create_vt(&self.objects, &mut self.vts, vt); + Self::get_or_create_vt(&self.adapter, &self.objects, &mut self.vts, vt); Handle::V2 { vt, @@ -597,7 +601,9 @@ impl SchemeSync for GraphicsSchemeInner { ipc::MODE_CURSOR => ipc::DrmModeCursor::with(payload, |data| { let vt_state = self.vts.get_mut(vt).unwrap(); - let cursor_plane = &mut vt_state.cursor_plane; + let Some(cursor_plane) = &mut vt_state.cursor_plane else { + return Err(Error::new(EINVAL)); + }; let update_buffer = data.flags() & DRM_MODE_CURSOR_BO != 0; if update_buffer { @@ -909,7 +915,9 @@ impl SchemeSync for GraphicsSchemeInner { ipc::MODE_CURSOR2 => ipc::DrmModeCursor2::with(payload, |data| { let vt_state = self.vts.get_mut(vt).unwrap(); - let cursor_plane = &mut vt_state.cursor_plane; + let Some(cursor_plane) = &mut vt_state.cursor_plane else { + return Err(Error::new(EINVAL)); + }; let update_buffer = data.flags() & DRM_MODE_CURSOR_BO != 0; if update_buffer { diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index e2655aae27..7a90d6933e 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -102,8 +102,8 @@ impl GraphicsAdapter for Device { Ok(()) } - fn hw_cursor_size(&self) -> Option<(u32, u32)> { - None + fn has_cursor_plane(&self) -> bool { + false } fn handle_cursor(&mut self, _cursor: &CursorPlane, _dirty_fb: bool) { diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 5bf2be9125..9c9713b229 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -138,8 +138,8 @@ impl GraphicsAdapter for FbAdapter { Ok(()) } - fn hw_cursor_size(&self) -> Option<(u32, u32)> { - None + fn has_cursor_plane(&self) -> bool { + false } fn handle_cursor(&mut self, _cursor: &CursorPlane, _dirty_fb: bool) { diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index 22a985ee4e..0f88a66e91 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -246,7 +246,7 @@ impl VirtGpuAdapter<'_> { fn disable_cursor(&mut self) { if self.hidden_cursor.is_none() { - let (width, height) = self.hw_cursor_size().unwrap(); + let (width, height) = (64, 64); let (cursor, stride) = self.create_dumb_buffer(width, height); unsafe { core::ptr::write_bytes( @@ -480,8 +480,8 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> { }) } - fn hw_cursor_size(&self) -> Option<(u32, u32)> { - Some((64, 64)) + fn has_cursor_plane(&self) -> bool { + true } fn handle_cursor(&mut self, cursor: &CursorPlane, dirty_fb: bool) {