drivers/graphics: Move property values into individual objects

This commit is contained in:
bjorn3
2026-03-19 22:26:55 +01:00
parent 4ccdb59a47
commit 79e9e0987d
7 changed files with 56 additions and 38 deletions
@@ -2,10 +2,13 @@ use std::ffi::c_char;
use std::fmt::Debug;
use std::sync::Mutex;
use drm_sys::{drm_mode_modeinfo, DRM_MODE_CONNECTOR_Unknown, DRM_MODE_TYPE_PREFERRED};
use drm_sys::{
drm_mode_modeinfo, DRM_MODE_CONNECTOR_Unknown, DRM_MODE_DPMS_ON, DRM_MODE_TYPE_PREFERRED,
};
use syscall::Result;
use crate::kms::objects::{KmsObjectId, KmsObjects};
use crate::kms::properties::{DPMS, EDID};
use crate::GraphicsAdapter;
impl<T: GraphicsAdapter> KmsObjects<T> {
@@ -35,6 +38,7 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
mm_width: 0,
mm_height: 0,
subpixel: DrmSubpixelOrder::Unknown,
properties: vec![(EDID, 0), (DPMS, DRM_MODE_DPMS_ON as u64)],
driver_data,
}));
self.connectors.push(connector_id);
@@ -68,7 +72,7 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
}
#[derive(Debug)]
pub struct KmsConnector<T: Debug> {
pub struct KmsConnector<T> {
pub encoder_id: KmsObjectId,
pub modes: Vec<drm_mode_modeinfo>,
pub connector_type: u32,
@@ -77,6 +81,7 @@ pub struct KmsConnector<T: Debug> {
pub mm_width: u32,
pub mm_height: u32,
pub subpixel: DrmSubpixelOrder,
pub properties: Vec<(KmsObjectId, u64)>,
pub driver_data: T,
}
@@ -45,7 +45,6 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
id,
Arc::new(KmsObject {
kind: Box::new(data.into()),
properties: Mutex::new(vec![]),
}),
);
self.next_id.0 += 1;
@@ -78,6 +77,7 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
fb_id: KmsObjectId::INVALID,
gamma_size: 0,
mode: None,
properties: vec![],
driver_data,
}));
self.crtcs.push(id);
@@ -149,7 +149,12 @@ impl From<KmsObjectId> for u64 {
#[derive(Debug)]
pub(crate) struct KmsObject<T: GraphicsAdapter> {
kind: Box<KmsObjectKind<T>>,
pub(crate) properties: Mutex<Vec<(KmsObjectId, u64)>>,
}
impl<T: GraphicsAdapter> KmsObject<T> {
pub(super) fn kind(&self) -> &KmsObjectKind<T> {
&self.kind
}
}
macro_rules! define_object_kinds {
@@ -207,6 +212,7 @@ pub struct KmsCrtc<T> {
pub fb_id: KmsObjectId,
pub gamma_size: u32,
pub mode: Option<drm_mode_modeinfo>,
pub properties: Vec<(KmsObjectId, u64)>,
pub driver_data: T,
}
@@ -49,25 +49,43 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
self.get(id)
}
pub fn add_object_property(&mut self, object: KmsObjectId, property: KmsObjectId, value: u64) {
let object = self.objects.get_mut(&object).unwrap();
// FIXME validate property uniqueness and value
object.properties.lock().unwrap().push((property, value));
}
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
for (prop, val) in object.properties.lock().unwrap().iter_mut() {
if *prop == property {
*val = value;
match object.kind() {
super::objects::KmsObjectKind::Crtc(crtc) => {
for (prop, val) in crtc.lock().unwrap().properties.iter_mut() {
if *prop == property {
*val = value;
}
}
}
super::objects::KmsObjectKind::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!(),
}
}
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))?;
let props = object.properties.lock().unwrap();
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![],
};
Ok((
props.iter().map(|&(id, _)| id.0).collect::<Vec<_>>(),
props.iter().map(|&(_, value)| value).collect::<Vec<_>>(),
+6 -5
View File
@@ -634,17 +634,18 @@ impl<T: GraphicsAdapter> SchemeSync for GraphicsSchemeInner<T> {
.unwrap();
data.set_encoders_ptr(&[connector.encoder_id.0]);
data.set_modes_ptr(&connector.modes);
let (props, prop_vals) = self
.objects
.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);
data.set_mm_width(connector.mm_width);
data.set_mm_height(connector.mm_width);
data.set_subpixel(connector.subpixel as u32);
drop(connector);
let (props, prop_vals) = self
.objects
.get_object_properties_data(KmsObjectId(data.connector_id()))?;
data.set_props_ptr(&props);
data.set_prop_values_ptr(&prop_vals);
Ok(0)
}),
ipc::MODE_GET_PROPERTY => ipc::DrmModeGetProperty::with(payload, |mut data| {
+2 -6
View File
@@ -7,11 +7,8 @@ use std::sync::Mutex;
use driver_graphics::kms::connector::KmsConnectorStatus;
use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects};
use driver_graphics::kms::properties::DPMS;
use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter};
use drm_sys::{
drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, DRM_MODE_DPMS_ON,
};
use drm_sys::{drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT};
use syscall::{error::EINVAL, PAGE_SIZE};
use super::Device;
@@ -41,8 +38,7 @@ impl GraphicsAdapter for Device {
for (framebuffer_id, _) in self.framebuffers.iter().enumerate() {
let crtc = objects.add_crtc(());
let connector = objects.add_connector(Connector { framebuffer_id }, &[crtc]);
objects.add_object_property(connector, DPMS, DRM_MODE_DPMS_ON.into());
objects.add_connector(Connector { framebuffer_id }, &[crtc]);
}
}
+2 -6
View File
@@ -5,11 +5,8 @@ use std::sync::Mutex;
use driver_graphics::kms::connector::KmsConnectorStatus;
use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects};
use driver_graphics::kms::properties::DPMS;
use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter};
use drm_sys::{
drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, DRM_MODE_DPMS_ON,
};
use drm_sys::{drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT};
use syscall::{EINVAL, PAGE_SIZE};
#[derive(Debug)]
@@ -43,7 +40,7 @@ impl GraphicsAdapter for FbAdapter {
for (framebuffer_id, framebuffer) in self.framebuffers.iter().enumerate() {
let crtc = objects.add_crtc(());
let connector = objects.add_connector(
objects.add_connector(
Connector {
width: framebuffer.width as u32,
height: framebuffer.height as u32,
@@ -51,7 +48,6 @@ impl GraphicsAdapter for FbAdapter {
},
&[crtc],
);
objects.add_object_property(connector, DPMS, DRM_MODE_DPMS_ON.into());
}
}
+3 -7
View File
@@ -4,11 +4,11 @@ use std::sync::{Arc, Mutex};
use common::{dma::Dma, sgl};
use driver_graphics::kms::connector::KmsConnectorStatus;
use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects};
use driver_graphics::kms::properties::{DPMS, EDID};
use driver_graphics::kms::properties::EDID;
use driver_graphics::{Buffer as DrmBuffer, CursorPlane, Damage, GraphicsAdapter, GraphicsScheme};
use drm_sys::{
drm_mode_modeinfo, DRM_CAP_CURSOR_HEIGHT, DRM_CAP_CURSOR_WIDTH, DRM_CAP_DUMB_BUFFER,
DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT, DRM_MODE_DPMS_ON,
DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT,
};
use syscall::{EINVAL, PAGE_SIZE};
@@ -287,11 +287,7 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> {
for display_id in 0..self.config.num_scanouts.get() {
let crtc = objects.add_crtc(());
let connector = objects.add_connector(VirtGpuConnector { display_id }, &[crtc]);
if self.has_edid {
objects.add_object_property(connector, EDID, 0);
}
objects.add_object_property(connector, DPMS, DRM_MODE_DPMS_ON.into());
objects.add_connector(VirtGpuConnector { display_id }, &[crtc]);
}
}