drivers/graphics: Make objects generic over GraphicsAdapter rather than specific driver data

This commit is contained in:
bjorn3
2026-03-20 20:41:04 +01:00
parent 5e7fc9d71a
commit d08300c8b5
6 changed files with 69 additions and 78 deletions
@@ -58,15 +58,13 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
&self.connectors
}
pub fn connectors(
&self,
) -> impl Iterator<Item = &Mutex<KmsConnector<T::Connector>>> + use<'_, T> {
pub fn connectors(&self) -> impl Iterator<Item = &Mutex<KmsConnector<T>>> + use<'_, T> {
self.connectors
.iter()
.map(|&id| self.get_connector(id).unwrap())
}
pub fn get_connector(&self, id: KmsObjectId) -> Result<&Mutex<KmsConnector<T::Connector>>> {
pub fn get_connector(&self, id: KmsObjectId) -> Result<&Mutex<KmsConnector<T>>> {
self.get(id)
}
@@ -88,7 +86,7 @@ impl KmsConnectorDriver for () {
}
#[derive(Debug)]
pub struct KmsConnector<T: KmsConnectorDriver> {
pub struct KmsConnector<T: GraphicsAdapter> {
pub encoder_id: KmsObjectId,
pub modes: Vec<drm_mode_modeinfo>,
pub connector_type: u32,
@@ -99,18 +97,18 @@ pub struct KmsConnector<T: KmsConnectorDriver> {
pub subpixel: DrmSubpixelOrder,
pub properties: Vec<KmsPropertyData<Self>>,
pub edid: KmsObjectId,
pub state: KmsConnectorState<T::State>,
pub driver_data: T,
pub state: KmsConnectorState<T>,
pub driver_data: T::Connector,
}
#[derive(Debug, Clone)]
pub struct KmsConnectorState<T> {
pub struct KmsConnectorState<T: GraphicsAdapter> {
pub dpms: KmsDpms,
pub crtc_id: KmsObjectId,
pub driver_data: T,
pub driver_data: <T::Connector as KmsConnectorDriver>::State,
}
define_object_props!(object, KmsConnector<T: KmsConnectorDriver> {
define_object_props!(object, KmsConnector<T: GraphicsAdapter> {
EDID {
get => u64::from(object.edid.0),
}
@@ -122,9 +120,9 @@ define_object_props!(object, KmsConnector<T: KmsConnectorDriver> {
}
});
impl<T: KmsConnectorDriver> KmsConnector<T> {
impl<T: GraphicsAdapter> KmsConnector<T> {
pub fn update_from_size(&mut self, width: u32, height: u32) {
self.modes = vec![Self::modeinfo_for_size(width, height)];
self.modes = vec![modeinfo_for_size(width, height)];
}
pub fn update_from_edid(&mut self, edid: &[u8]) {
@@ -151,7 +149,7 @@ impl<T: KmsConnectorDriver> KmsConnector<T> {
match descriptor {
edid::Descriptor::DetailedTiming(detailed_timing) => {
// FIXME extract full information
Some(Self::modeinfo_for_size(
Some(modeinfo_for_size(
u32::from(detailed_timing.horizontal_active_pixels),
u32::from(detailed_timing.vertical_active_lines),
))
@@ -168,40 +166,40 @@ impl<T: KmsConnectorDriver> KmsConnector<T> {
// FIXME update the EDID property
}
}
pub(crate) fn modeinfo_for_size(width: u32, height: u32) -> drm_mode_modeinfo {
let mut modeinfo = drm_mode_modeinfo {
// The actual visible display size
hdisplay: width as u16,
vdisplay: height as u16,
pub(crate) fn modeinfo_for_size(width: u32, height: u32) -> drm_mode_modeinfo {
let mut modeinfo = drm_mode_modeinfo {
// The actual visible display size
hdisplay: width as u16,
vdisplay: height as u16,
// These are used to calculate the refresh rate
clock: 60 * width * height / 1000,
htotal: width as u16,
vtotal: height as u16,
vscan: 0,
vrefresh: 60,
// These are used to calculate the refresh rate
clock: 60 * width * height / 1000,
htotal: width as u16,
vtotal: height as u16,
vscan: 0,
vrefresh: 60,
type_: drm_sys::DRM_MODE_TYPE_PREFERRED | drm_sys::DRM_MODE_TYPE_DRIVER,
name: [0; 32],
type_: drm_sys::DRM_MODE_TYPE_PREFERRED | drm_sys::DRM_MODE_TYPE_DRIVER,
name: [0; 32],
// These only matter when modesetting physical display adapters. For
// those we should be able to parse the EDID blob.
hsync_start: width as u16,
hsync_end: width as u16,
hskew: 0,
vsync_start: height as u16,
vsync_end: height as u16,
flags: 0,
};
// These only matter when modesetting physical display adapters. For
// those we should be able to parse the EDID blob.
hsync_start: width as u16,
hsync_end: width as u16,
hskew: 0,
vsync_start: height as u16,
vsync_end: height as u16,
flags: 0,
};
let name = format!("{width}x{height}").into_bytes();
for (to, from) in modeinfo.name.iter_mut().zip(name) {
*to = from as c_char;
}
modeinfo
let name = format!("{width}x{height}").into_bytes();
for (to, from) in modeinfo.name.iter_mut().zip(name) {
*to = from as c_char;
}
modeinfo
}
#[derive(Debug, Copy, Clone)]
@@ -92,20 +92,17 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
&self.crtcs
}
pub fn crtcs(&self) -> impl Iterator<Item = &Mutex<KmsCrtc<T::Crtc>>> + use<'_, T> {
pub fn crtcs(&self) -> impl Iterator<Item = &Mutex<KmsCrtc<T>>> + use<'_, T> {
self.crtcs
.iter()
.map(|&id| self.get::<Mutex<KmsCrtc<T::Crtc>>>(id).unwrap())
.map(|&id| self.get::<Mutex<KmsCrtc<T>>>(id).unwrap())
}
pub fn get_crtc(&self, id: KmsObjectId) -> Result<&Mutex<KmsCrtc<T::Crtc>>> {
pub fn get_crtc(&self, id: KmsObjectId) -> Result<&Mutex<KmsCrtc<T>>> {
self.get(id)
}
pub fn add_framebuffer(
&mut self,
fb: KmsFramebuffer<T::Framebuffer, T::Buffer>,
) -> KmsObjectId {
pub fn add_framebuffer(&mut self, fb: KmsFramebuffer<T>) -> KmsObjectId {
let id = self.add(fb);
self.framebuffers.push(id);
id
@@ -127,10 +124,7 @@ impl<T: GraphicsAdapter> KmsObjects<T> {
&self.framebuffers
}
pub fn get_framebuffer(
&self,
id: KmsObjectId,
) -> Result<&KmsFramebuffer<T::Framebuffer, T::Buffer>> {
pub fn get_framebuffer(&self, id: KmsObjectId) -> Result<&KmsFramebuffer<T>> {
self.get(id)
}
}
@@ -187,11 +181,11 @@ macro_rules! define_object_kinds {
}
define_object_kinds! { <T>
Crtc(Mutex<KmsCrtc<T::Crtc>>) = DRM_MODE_OBJECT_CRTC,
Connector(Mutex<KmsConnector<T::Connector>>) = DRM_MODE_OBJECT_CONNECTOR,
Crtc(Mutex<KmsCrtc<T>>) = DRM_MODE_OBJECT_CRTC,
Connector(Mutex<KmsConnector<T>>) = DRM_MODE_OBJECT_CONNECTOR,
Encoder(KmsEncoder) = DRM_MODE_OBJECT_ENCODER,
Property(KmsProperty) = DRM_MODE_OBJECT_PROPERTY,
Framebuffer(KmsFramebuffer<T::Framebuffer, T::Buffer>) = DRM_MODE_OBJECT_FB,
Framebuffer(KmsFramebuffer<T>) = DRM_MODE_OBJECT_FB,
Blob(KmsBlob) = DRM_MODE_OBJECT_BLOB,
}
@@ -204,30 +198,30 @@ impl KmsCrtcDriver for () {
}
#[derive(Debug)]
pub struct KmsCrtc<T: KmsCrtcDriver> {
pub struct KmsCrtc<T: GraphicsAdapter> {
pub crtc_index: u32,
pub gamma_size: u32,
pub properties: Vec<KmsPropertyData<Self>>,
pub state: KmsCrtcState<T::State>,
pub driver_data: T,
pub state: KmsCrtcState<T>,
pub driver_data: T::Crtc,
}
#[derive(Debug, Clone)]
pub struct KmsCrtcState<T> {
pub struct KmsCrtcState<T: GraphicsAdapter> {
pub fb_id: KmsObjectId,
pub mode: Option<drm_mode_modeinfo>,
pub driver_data: T,
pub driver_data: <T::Crtc as KmsCrtcDriver>::State,
}
define_object_props!(object, KmsCrtc<T: KmsCrtcDriver> {});
define_object_props!(object, KmsCrtc<T: GraphicsAdapter> {});
#[derive(Debug)]
pub struct KmsFramebuffer<T, Buf> {
pub struct KmsFramebuffer<T: GraphicsAdapter> {
pub width: u32,
pub height: u32,
pub pitch: u32,
pub bpp: u32,
pub depth: u32,
pub buffer: Arc<Buf>,
pub driver_data: T,
pub buffer: Arc<T::Buffer>,
pub driver_data: T::Framebuffer,
}
+4 -5
View File
@@ -21,7 +21,7 @@ use redox_scheme::{CallerCtx, OpenResult, RequestKind, SignalBehavior, Socket};
use syscall::schemev2::NewFdFlags;
use syscall::{Error, MapFlags, Result, EACCES, EAGAIN, EBADF, EINVAL, ENOENT, EOPNOTSUPP};
use crate::kms::connector::{KmsConnector, KmsConnectorDriver};
use crate::kms::connector::{self, KmsConnectorDriver};
use crate::kms::objects::{self, KmsCrtc, KmsCrtcDriver, KmsObjectId, KmsObjects};
use crate::kms::properties::KmsPropertyKind;
@@ -102,9 +102,9 @@ pub trait GraphicsAdapter: Sized + Debug {
fn set_crtc(
&mut self,
objects: &KmsObjects<Self>,
crtc: &Mutex<KmsCrtc<Self::Crtc>>,
crtc: &Mutex<KmsCrtc<Self>>,
mode: Option<drm_mode_modeinfo>,
framebuffer: Option<&objects::KmsFramebuffer<Self::Framebuffer, Self::Buffer>>,
framebuffer: Option<&objects::KmsFramebuffer<Self>>,
damage: Damage,
);
@@ -250,8 +250,7 @@ impl<T: GraphicsAdapter> GraphicsScheme<T> {
.expect("removed framebuffers should be unset")
});
let mode =
fb.map(|fb| KmsConnector::<()>::modeinfo_for_size(fb.width, fb.height));
let mode = fb.map(|fb| connector::modeinfo_for_size(fb.width, fb.height));
self.inner.adapter.set_crtc(
&self.inner.objects,
+3 -3
View File
@@ -6,7 +6,7 @@ use std::ptr::{self, NonNull};
use std::sync::Mutex;
use driver_graphics::kms::connector::{KmsConnectorDriver, KmsConnectorStatus};
use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects};
use driver_graphics::kms::objects::{KmsCrtc, KmsFramebuffer, KmsObjectId, KmsObjects};
use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter};
use drm_sys::{drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT};
use syscall::{error::EINVAL, PAGE_SIZE};
@@ -84,9 +84,9 @@ impl GraphicsAdapter for Device {
fn set_crtc(
&mut self,
objects: &KmsObjects<Self>,
crtc: &Mutex<KmsCrtc<Self::Crtc>>,
crtc: &Mutex<KmsCrtc<Self>>,
mode: Option<drm_mode_modeinfo>,
buffer: Option<&objects::KmsFramebuffer<Self::Framebuffer, Self::Buffer>>,
buffer: Option<&KmsFramebuffer<Self>>,
damage: Damage,
) {
let mut crtc = crtc.lock().unwrap();
+3 -3
View File
@@ -4,7 +4,7 @@ use std::ptr::{self, NonNull};
use std::sync::Mutex;
use driver_graphics::kms::connector::{KmsConnectorDriver, KmsConnectorStatus};
use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects};
use driver_graphics::kms::objects::{KmsCrtc, KmsFramebuffer, KmsObjectId, KmsObjects};
use driver_graphics::{Buffer, CursorPlane, Damage, GraphicsAdapter};
use drm_sys::{drm_mode_modeinfo, DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT};
use syscall::{EINVAL, PAGE_SIZE};
@@ -92,9 +92,9 @@ impl GraphicsAdapter for FbAdapter {
fn set_crtc(
&mut self,
objects: &KmsObjects<Self>,
crtc: &Mutex<KmsCrtc<Self::Crtc>>,
crtc: &Mutex<KmsCrtc<Self>>,
mode: Option<drm_mode_modeinfo>,
buffer: Option<&objects::KmsFramebuffer<Self::Framebuffer, Self::Buffer>>,
buffer: Option<&KmsFramebuffer<Self>>,
damage: Damage,
) {
let mut crtc = crtc.lock().unwrap();
+3 -3
View File
@@ -3,7 +3,7 @@ use std::sync::{Arc, Mutex};
use common::{dma::Dma, sgl};
use driver_graphics::kms::connector::{KmsConnectorDriver, KmsConnectorStatus};
use driver_graphics::kms::objects::{self, KmsCrtc, KmsObjectId, KmsObjects};
use driver_graphics::kms::objects::{KmsCrtc, KmsFramebuffer, KmsObjectId, KmsObjects};
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,
@@ -405,9 +405,9 @@ impl<'a> GraphicsAdapter for VirtGpuAdapter<'a> {
fn set_crtc(
&mut self,
objects: &KmsObjects<Self>,
crtc: &Mutex<KmsCrtc<Self::Crtc>>,
crtc: &Mutex<KmsCrtc<Self>>,
mode: Option<drm_mode_modeinfo>,
framebuffer: Option<&objects::KmsFramebuffer<Self::Framebuffer, Self::Buffer>>,
framebuffer: Option<&KmsFramebuffer<Self>>,
damage: Damage,
) {
futures::executor::block_on(async {