drivers/graphics: Move property values into individual objects
This commit is contained in:
@@ -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<_>>(),
|
||||
|
||||
@@ -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| {
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user