From 4ccdb59a478f0d2b0b8fda32d20faabcc24d0c49 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Thu, 19 Mar 2026 19:45:55 +0100 Subject: [PATCH] drivers/graphics: Dedup property value conversion code This will make it easier to change the way properties are represented internally. --- .../driver-graphics/src/kms/objects.rs | 9 ++++--- .../driver-graphics/src/kms/properties.rs | 12 +++++----- drivers/graphics/driver-graphics/src/lib.rs | 24 +++++++------------ 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 799873aabd..0ac387cd32 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -20,7 +20,7 @@ pub struct KmsObjects { pub(crate) encoders: Vec, crtcs: Vec, framebuffers: Vec, - pub(crate) objects: HashMap>>, + pub(crate) objects: HashMap>>, _marker: PhantomData, } @@ -43,7 +43,7 @@ impl KmsObjects { let id = self.next_id; self.objects.insert( id, - Arc::new(KmsObjectData { + Arc::new(KmsObject { kind: Box::new(data.into()), properties: Mutex::new(vec![]), }), @@ -110,7 +110,7 @@ impl KmsObjects { pub fn remove_framebuffer(&mut self, id: KmsObjectId) -> Result<()> { let kind = match self.objects.get(&id).map(|object| &**object) { - Some(KmsObjectData { kind, .. }) => kind, + Some(KmsObject { kind, .. }) => kind, _ => return Err(Error::new(EINVAL)), }; let KmsObjectKind::Framebuffer(_) = **kind else { @@ -147,7 +147,7 @@ impl From for u64 { } #[derive(Debug)] -pub(crate) struct KmsObjectData { +pub(crate) struct KmsObject { kind: Box>, pub(crate) properties: Mutex>, } @@ -169,7 +169,6 @@ macro_rules! define_object_kinds { } } - $( impl<$T: GraphicsAdapter> From<$data> for KmsObjectKind<$T> { fn from(value: $data) -> Self { diff --git a/drivers/graphics/driver-graphics/src/kms/properties.rs b/drivers/graphics/driver-graphics/src/kms/properties.rs index 77e16275af..296ded5831 100644 --- a/drivers/graphics/driver-graphics/src/kms/properties.rs +++ b/drivers/graphics/driver-graphics/src/kms/properties.rs @@ -1,7 +1,6 @@ use std::ffi::c_char; use std::fmt::Debug; use std::mem; -use std::sync::Mutex; use drm_sys::{ DRM_MODE_DPMS_OFF, DRM_MODE_DPMS_ON, DRM_MODE_DPMS_STANDBY, DRM_MODE_DPMS_SUSPEND, @@ -66,12 +65,13 @@ impl KmsObjects { } } - pub fn get_object_properties( - &self, - id: KmsObjectId, - ) -> Result<&Mutex>> { + pub fn get_object_properties_data(&self, id: KmsObjectId) -> Result<(Vec, Vec)> { let object = self.objects.get(&id).ok_or(Error::new(EINVAL))?; - Ok(&object.properties) + let props = object.properties.lock().unwrap(); + Ok(( + props.iter().map(|&(id, _)| id.0).collect::>(), + props.iter().map(|&(_, value)| value).collect::>(), + )) } pub fn add_blob(&mut self, data: Vec) -> KmsObjectId { diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 9a1086d0e6..9bc0882e2c 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -634,15 +634,11 @@ impl SchemeSync for GraphicsSchemeInner { .unwrap(); data.set_encoders_ptr(&[connector.encoder_id.0]); data.set_modes_ptr(&connector.modes); - let props = self + let (props, prop_vals) = self .objects - .get_object_properties(KmsObjectId(data.connector_id()))? - .lock() - .unwrap(); - data.set_props_ptr(&props.iter().map(|&(id, _)| id.0).collect::>()); - data.set_prop_values_ptr( - &props.iter().map(|&(_, value)| value).collect::>(), - ); + .get_object_properties_data(KmsObjectId(data.connector_id()))?; + data.set_props_ptr(&props); + data.set_prop_values_ptr(&prop_vals); data.set_connector_type(data.connector_type()); data.set_connector_type_id(data.connector_type_id()); data.set_connection(connector.connection as u32); @@ -899,15 +895,11 @@ impl SchemeSync for GraphicsSchemeInner { return Ok(0); } - let props = self + let (props, prop_vals) = self .objects - .get_object_properties(KmsObjectId(data.obj_id()))? - .lock() - .unwrap(); - data.set_props_ptr(&props.iter().map(|&(id, _)| id.0).collect::>()); - data.set_prop_values_ptr( - &props.iter().map(|&(_, value)| value).collect::>(), - ); + .get_object_properties_data(KmsObjectId(data.obj_id()))?; + data.set_props_ptr(&props); + data.set_prop_values_ptr(&prop_vals); data.set_obj_type(self.objects.object_type(KmsObjectId(data.obj_id()))?); Ok(0) })