drivers/graphics: Dedup property value conversion code

This will make it easier to change the way properties are represented
internally.
This commit is contained in:
bjorn3
2026-03-19 19:45:55 +01:00
parent b89fbd224c
commit 4ccdb59a47
3 changed files with 18 additions and 27 deletions
@@ -20,7 +20,7 @@ pub struct KmsObjects<T: GraphicsAdapter> {
pub(crate) encoders: Vec<KmsObjectId>,
crtcs: Vec<KmsObjectId>,
framebuffers: Vec<KmsObjectId>,
pub(crate) objects: HashMap<KmsObjectId, Arc<KmsObjectData<T>>>,
pub(crate) objects: HashMap<KmsObjectId, Arc<KmsObject<T>>>,
_marker: PhantomData<T>,
}
@@ -43,7 +43,7 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
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<T: GraphicsAdapter> KmsObjects<T> {
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<KmsObjectId> for u64 {
}
#[derive(Debug)]
pub(crate) struct KmsObjectData<T: GraphicsAdapter> {
pub(crate) struct KmsObject<T: GraphicsAdapter> {
kind: Box<KmsObjectKind<T>>,
pub(crate) properties: Mutex<Vec<(KmsObjectId, u64)>>,
}
@@ -169,7 +169,6 @@ macro_rules! define_object_kinds {
}
}
$(
impl<$T: GraphicsAdapter> From<$data> for KmsObjectKind<$T> {
fn from(value: $data) -> Self {
@@ -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<T: GraphicsAdapter> KmsObjects<T> {
}
}
pub fn get_object_properties(
&self,
id: KmsObjectId,
) -> Result<&Mutex<Vec<(KmsObjectId, u64)>>> {
pub fn get_object_properties_data(&self, id: KmsObjectId) -> Result<(Vec<u32>, Vec<u64>)> {
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::<Vec<_>>(),
props.iter().map(|&(_, value)| value).collect::<Vec<_>>(),
))
}
pub fn add_blob(&mut self, data: Vec<u8>) -> KmsObjectId {
+8 -16
View File
@@ -634,15 +634,11 @@ impl<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
.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::<Vec<_>>());
data.set_prop_values_ptr(
&props.iter().map(|&(_, value)| value).collect::<Vec<_>>(),
);
.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<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
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::<Vec<_>>());
data.set_prop_values_ptr(
&props.iter().map(|&(_, value)| value).collect::<Vec<_>>(),
);
.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)
})