From ee1b5377db96c81c445b2d942739aa0b09a76c02 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:45:21 +0100 Subject: [PATCH] drivers/graphics: Remove KmsObject and rename KmsObjectKind to KmsObject --- .../driver-graphics/src/kms/objects.rs | 45 ++++++------------- .../driver-graphics/src/kms/properties.rs | 32 +++++++------ 2 files changed, 29 insertions(+), 48 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 55b6f7fdb4..737a1ce129 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -39,14 +39,9 @@ impl KmsObjects { objects } - pub(crate) fn add>>(&mut self, data: U) -> KmsObjectId { + pub(crate) fn add>>(&mut self, data: U) -> KmsObjectId { let id = self.next_id; - self.objects.insert( - id, - Arc::new(KmsObject { - kind: Box::new(data.into()), - }), - ); + self.objects.insert(id, Arc::new(data.into())); self.next_id.0 += 1; id @@ -54,10 +49,10 @@ impl KmsObjects { pub(crate) fn get<'a, U: 'a>(&'a self, id: KmsObjectId) -> Result<&'a U> where - &'a U: TryFrom<&'a KmsObjectKind>, + &'a U: TryFrom<&'a KmsObject>, { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - if let Ok(object) = (&*object.kind).try_into() { + if let Ok(object) = (&**object).try_into() { Ok(object) } else { Err(Error::new(EINVAL)) @@ -66,7 +61,7 @@ impl KmsObjects { pub fn object_type(&self, id: KmsObjectId) -> Result { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - Ok(object.kind.object_type()) + Ok(object.object_type()) } pub fn add_crtc(&mut self, driver_data: T::Crtc) -> KmsObjectId { @@ -109,11 +104,10 @@ impl KmsObjects { } pub fn remove_framebuffer(&mut self, id: KmsObjectId) -> Result<()> { - let kind = match self.objects.get(&id).map(|object| &**object) { - Some(KmsObject { kind, .. }) => kind, - _ => return Err(Error::new(EINVAL)), + let Some(object) = self.objects.get(&id).map(|object| &**object) else { + return Err(Error::new(EINVAL)); }; - let KmsObjectKind::Framebuffer(_) = **kind else { + let KmsObject::Framebuffer(_) = object else { return Err(Error::new(EINVAL)); }; self.objects.remove(&id).unwrap(); @@ -146,27 +140,16 @@ impl From for u64 { } } -#[derive(Debug)] -pub(crate) struct KmsObject { - kind: Box>, -} - -impl KmsObject { - pub(super) fn kind(&self) -> &KmsObjectKind { - &self.kind - } -} - macro_rules! define_object_kinds { (<$T:ident> $( $variant:ident($data:ty) = $type:ident, )*) => { #[derive(Debug)] - pub(crate) enum KmsObjectKind<$T: GraphicsAdapter> { + pub(crate) enum KmsObject<$T: GraphicsAdapter> { $($variant($data),)* } - impl<$T: GraphicsAdapter> KmsObjectKind<$T> { + impl<$T: GraphicsAdapter> KmsObject<$T> { fn object_type(&self) -> u32 { match self { $(Self::$variant(_) => $type,)* @@ -175,18 +158,18 @@ macro_rules! define_object_kinds { } $( - impl<$T: GraphicsAdapter> From<$data> for KmsObjectKind<$T> { + impl<$T: GraphicsAdapter> From<$data> for KmsObject<$T> { fn from(value: $data) -> Self { Self::$variant(value) } } - impl<'a, $T: GraphicsAdapter> TryFrom<&'a KmsObjectKind<$T>> for &'a $data { + impl<'a, $T: GraphicsAdapter> TryFrom<&'a KmsObject<$T>> for &'a $data { type Error = (); - fn try_from(value: &'a KmsObjectKind) -> Result { + fn try_from(value: &'a KmsObject) -> Result { match value { - KmsObjectKind::$variant(data) => Ok(data), + KmsObject::$variant(data) => Ok(data), _ => Err(()), } } diff --git a/drivers/graphics/driver-graphics/src/kms/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs index b9205b75b7..403772c4e4 100644 --- a/drivers/graphics/driver-graphics/src/kms/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -8,7 +8,7 @@ use drm_sys::{ }; use syscall::{Error, Result, EINVAL}; -use crate::kms::objects::{KmsObjectId, KmsObjects}; +use crate::kms::objects::{KmsObject, KmsObjectId, KmsObjects}; use crate::GraphicsAdapter; impl KmsObjects { @@ -52,39 +52,37 @@ impl KmsObjects { pub fn set_object_property(&mut self, object: KmsObjectId, property: KmsObjectId, value: u64) { let object = self.objects.get_mut(&object).unwrap(); // FIXME validate property existence and value - match object.kind() { - super::objects::KmsObjectKind::Crtc(crtc) => { + match &**object { + KmsObject::Crtc(crtc) => { for (prop, val) in crtc.lock().unwrap().properties.iter_mut() { if *prop == property { *val = value; } } } - super::objects::KmsObjectKind::Connector(connector) => { + KmsObject::Connector(connector) => { for (prop, val) in connector.lock().unwrap().properties.iter_mut() { if *prop == property { *val = value; } } } - super::objects::KmsObjectKind::Encoder(_) - | super::objects::KmsObjectKind::Property(_) - | super::objects::KmsObjectKind::Framebuffer(_) - | super::objects::KmsObjectKind::Blob(_) => unreachable!(), + KmsObject::Encoder(_) + | KmsObject::Property(_) + | KmsObject::Framebuffer(_) + | KmsObject::Blob(_) => unreachable!(), } } pub fn get_object_properties_data(&self, id: KmsObjectId) -> Result<(Vec, Vec)> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - let props = match object.kind() { - super::objects::KmsObjectKind::Crtc(crtc) => crtc.lock().unwrap().properties.clone(), - super::objects::KmsObjectKind::Connector(connector) => { - connector.lock().unwrap().properties.clone() - } - super::objects::KmsObjectKind::Encoder(_) => vec![], - super::objects::KmsObjectKind::Property(_) => vec![], - super::objects::KmsObjectKind::Framebuffer(_) => vec![], - super::objects::KmsObjectKind::Blob(_) => vec![], + let props = match &**object { + KmsObject::Crtc(crtc) => crtc.lock().unwrap().properties.clone(), + KmsObject::Connector(connector) => connector.lock().unwrap().properties.clone(), + KmsObject::Encoder(_) => vec![], + KmsObject::Property(_) => vec![], + KmsObject::Framebuffer(_) => vec![], + KmsObject::Blob(_) => vec![], }; Ok(( props.iter().map(|&(id, _)| id.0).collect::>(),