drivers/graphics: Introduce define_object_props helper macro

This commit is contained in:
bjorn3
2026-03-19 22:56:46 +01:00
parent dcf1e5cdd6
commit e49dc8e8be
3 changed files with 35 additions and 14 deletions
@@ -9,7 +9,7 @@ use drm_sys::{
use syscall::Result;
use crate::kms::objects::{KmsObjectId, KmsObjects};
use crate::kms::properties::{KmsPropertyData, DPMS, EDID};
use crate::kms::properties::{define_object_props, KmsPropertyData, DPMS, EDID};
use crate::GraphicsAdapter;
impl<T: GraphicsAdapter> KmsObjects<T> {
@@ -39,23 +39,13 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
mm_width: 0,
mm_height: 0,
subpixel: DrmSubpixelOrder::Unknown,
properties: vec![],
properties: KmsConnector::base_properties(),
dpms: KmsDpms::Off,
edid: KmsObjectId::INVALID,
driver_data,
}));
self.connectors.push(connector_id);
let mut connector = self.get_connector(connector_id).unwrap().lock().unwrap();
connector.properties.push(KmsPropertyData {
id: DPMS,
getter: |connector| connector.dpms as u64,
});
connector.properties.push(KmsPropertyData {
id: EDID,
getter: |connector| connector.edid.0.into(),
});
connector_id
}
@@ -100,6 +90,15 @@ pub struct KmsConnector<T> {
pub driver_data: T,
}
define_object_props!(object, KmsConnector<T> {
EDID {
get => u64::from(object.edid.0),
}
DPMS {
get => object.dpms as u64,
}
});
impl<T> KmsConnector<T> {
pub fn update_from_size(&mut self, width: u32, height: u32) {
self.modes = vec![Self::modeinfo_for_size(width, height)];
@@ -10,7 +10,9 @@ use drm_sys::{
use syscall::{Error, Result, EINVAL};
use crate::kms::connector::{KmsConnector, KmsEncoder};
use crate::kms::properties::{init_standard_props, KmsBlob, KmsProperty, KmsPropertyData};
use crate::kms::properties::{
define_object_props, init_standard_props, KmsBlob, KmsProperty, KmsPropertyData,
};
use crate::GraphicsAdapter;
#[derive(Debug)]
@@ -72,7 +74,7 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
fb_id: KmsObjectId::INVALID,
gamma_size: 0,
mode: None,
properties: vec![],
properties: KmsCrtc::base_properties(),
driver_data,
}));
self.crtcs.push(id);
@@ -199,6 +201,8 @@ pub struct KmsCrtc<T> {
pub driver_data: T,
}
define_object_props!(object, KmsCrtc<T> {});
#[derive(Debug)]
pub struct KmsFramebuffer<T, Buf> {
pub width: u32,
@@ -220,3 +220,21 @@ define_properties! {
SRC_H: range { 0, u64::from(u32::MAX) } [atomic],
FB_DAMAGE_CLIPS: blob [atomic],
}
macro_rules! define_object_props {
($object:ident, $obj:ident$(<$($T:ident),*>)? { $(
$prop:ident {
get => $get:expr,
}
)* }) => {
impl$(<$($T),*>)? $obj$(<$($T),*>)? {
pub(super) fn base_properties() -> Vec<KmsPropertyData<Self>> {
vec![$(KmsPropertyData {
id: $prop,
getter: |$object| $get
}),*]
}
}
};
}
pub(super) use define_object_props;