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:
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user