diff --git a/drivers/graphics/driver-graphics/src/kms/connector.rs b/drivers/graphics/driver-graphics/src/kms/connector.rs index c9542edce4..76bf65fa3e 100644 --- a/drivers/graphics/driver-graphics/src/kms/connector.rs +++ b/drivers/graphics/driver-graphics/src/kms/connector.rs @@ -58,15 +58,13 @@ impl KmsObjects { &self.connectors } - pub fn connectors( - &self, - ) -> impl Iterator>> + use<'_, T> { + pub fn connectors(&self) -> impl Iterator>> + use<'_, T> { self.connectors .iter() .map(|&id| self.get_connector(id).unwrap()) } - pub fn get_connector(&self, id: KmsObjectId) -> Result<&Mutex>> { + pub fn get_connector(&self, id: KmsObjectId) -> Result<&Mutex>> { self.get(id) } @@ -88,7 +86,7 @@ impl KmsConnectorDriver for () { } #[derive(Debug)] -pub struct KmsConnector { +pub struct KmsConnector { pub encoder_id: KmsObjectId, pub modes: Vec, pub connector_type: u32, @@ -99,18 +97,18 @@ pub struct KmsConnector { pub subpixel: DrmSubpixelOrder, pub properties: Vec>, pub edid: KmsObjectId, - pub state: KmsConnectorState, - pub driver_data: T, + pub state: KmsConnectorState, + pub driver_data: T::Connector, } #[derive(Debug, Clone)] -pub struct KmsConnectorState { +pub struct KmsConnectorState { pub dpms: KmsDpms, pub crtc_id: KmsObjectId, - pub driver_data: T, + pub driver_data: ::State, } -define_object_props!(object, KmsConnector { +define_object_props!(object, KmsConnector { EDID { get => u64::from(object.edid.0), } @@ -122,9 +120,9 @@ define_object_props!(object, KmsConnector { } }); -impl KmsConnector { +impl KmsConnector { 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 KmsConnector { 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 KmsConnector { // 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)] diff --git a/drivers/graphics/driver-graphics/src/kms/objects.rs b/drivers/graphics/driver-graphics/src/kms/objects.rs index 7a761f1bff..5dd4b4ca79 100644 --- a/drivers/graphics/driver-graphics/src/kms/objects.rs +++ b/drivers/graphics/driver-graphics/src/kms/objects.rs @@ -92,20 +92,17 @@ impl KmsObjects { &self.crtcs } - pub fn crtcs(&self) -> impl Iterator>> + use<'_, T> { + pub fn crtcs(&self) -> impl Iterator>> + use<'_, T> { self.crtcs .iter() - .map(|&id| self.get::>>(id).unwrap()) + .map(|&id| self.get::>>(id).unwrap()) } - pub fn get_crtc(&self, id: KmsObjectId) -> Result<&Mutex>> { + pub fn get_crtc(&self, id: KmsObjectId) -> Result<&Mutex>> { self.get(id) } - pub fn add_framebuffer( - &mut self, - fb: KmsFramebuffer, - ) -> KmsObjectId { + pub fn add_framebuffer(&mut self, fb: KmsFramebuffer) -> KmsObjectId { let id = self.add(fb); self.framebuffers.push(id); id @@ -127,10 +124,7 @@ impl KmsObjects { &self.framebuffers } - pub fn get_framebuffer( - &self, - id: KmsObjectId, - ) -> Result<&KmsFramebuffer> { + pub fn get_framebuffer(&self, id: KmsObjectId) -> Result<&KmsFramebuffer> { self.get(id) } } @@ -187,11 +181,11 @@ macro_rules! define_object_kinds { } define_object_kinds! { - Crtc(Mutex>) = DRM_MODE_OBJECT_CRTC, - Connector(Mutex>) = DRM_MODE_OBJECT_CONNECTOR, + Crtc(Mutex>) = DRM_MODE_OBJECT_CRTC, + Connector(Mutex>) = DRM_MODE_OBJECT_CONNECTOR, Encoder(KmsEncoder) = DRM_MODE_OBJECT_ENCODER, Property(KmsProperty) = DRM_MODE_OBJECT_PROPERTY, - Framebuffer(KmsFramebuffer) = DRM_MODE_OBJECT_FB, + Framebuffer(KmsFramebuffer) = DRM_MODE_OBJECT_FB, Blob(KmsBlob) = DRM_MODE_OBJECT_BLOB, } @@ -204,30 +198,30 @@ impl KmsCrtcDriver for () { } #[derive(Debug)] -pub struct KmsCrtc { +pub struct KmsCrtc { pub crtc_index: u32, pub gamma_size: u32, pub properties: Vec>, - pub state: KmsCrtcState, - pub driver_data: T, + pub state: KmsCrtcState, + pub driver_data: T::Crtc, } #[derive(Debug, Clone)] -pub struct KmsCrtcState { +pub struct KmsCrtcState { pub fb_id: KmsObjectId, pub mode: Option, - pub driver_data: T, + pub driver_data: ::State, } -define_object_props!(object, KmsCrtc {}); +define_object_props!(object, KmsCrtc {}); #[derive(Debug)] -pub struct KmsFramebuffer { +pub struct KmsFramebuffer { pub width: u32, pub height: u32, pub pitch: u32, pub bpp: u32, pub depth: u32, - pub buffer: Arc, - pub driver_data: T, + pub buffer: Arc, + pub driver_data: T::Framebuffer, } diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 44aad7eb90..bdefaba6f2 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -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, - crtc: &Mutex>, + crtc: &Mutex>, mode: Option, - framebuffer: Option<&objects::KmsFramebuffer>, + framebuffer: Option<&objects::KmsFramebuffer>, damage: Damage, ); @@ -250,8 +250,7 @@ impl GraphicsScheme { .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, diff --git a/drivers/graphics/ihdgd/src/device/scheme.rs b/drivers/graphics/ihdgd/src/device/scheme.rs index 14bb0f01d0..f4851a0c5b 100644 --- a/drivers/graphics/ihdgd/src/device/scheme.rs +++ b/drivers/graphics/ihdgd/src/device/scheme.rs @@ -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, - crtc: &Mutex>, + crtc: &Mutex>, mode: Option, - buffer: Option<&objects::KmsFramebuffer>, + buffer: Option<&KmsFramebuffer>, damage: Damage, ) { let mut crtc = crtc.lock().unwrap(); diff --git a/drivers/graphics/vesad/src/scheme.rs b/drivers/graphics/vesad/src/scheme.rs index 061bc255bc..8905460282 100644 --- a/drivers/graphics/vesad/src/scheme.rs +++ b/drivers/graphics/vesad/src/scheme.rs @@ -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, - crtc: &Mutex>, + crtc: &Mutex>, mode: Option, - buffer: Option<&objects::KmsFramebuffer>, + buffer: Option<&KmsFramebuffer>, damage: Damage, ) { let mut crtc = crtc.lock().unwrap(); diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index 4a828c9803..91dc1c8ef3 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -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, - crtc: &Mutex>, + crtc: &Mutex>, mode: Option, - framebuffer: Option<&objects::KmsFramebuffer>, + framebuffer: Option<&KmsFramebuffer>, damage: Damage, ) { futures::executor::block_on(async {