diff --git a/Cargo.lock b/Cargo.lock index fa19866677..6ff506e4f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1088,7 +1088,6 @@ dependencies = [ "edid", "embedded-hal", "graphics-ipc", - "inputd", "libredox", "log", "nb 1.1.0", @@ -2514,7 +2513,6 @@ dependencies = [ "driver-graphics", "drm-sys", "graphics-ipc", - "inputd", "libredox", "orbclient", "ransid", @@ -2571,7 +2569,6 @@ dependencies = [ "edid", "futures", "graphics-ipc", - "inputd", "libredox", "log", "orbclient", diff --git a/drivers/graphics/driver-graphics/src/lib.rs b/drivers/graphics/driver-graphics/src/lib.rs index 7d2e990b25..01b9f7b2cb 100644 --- a/drivers/graphics/driver-graphics/src/lib.rs +++ b/drivers/graphics/driver-graphics/src/lib.rs @@ -7,6 +7,7 @@ use std::fs::File; use std::io::{self, Write}; use std::mem; use std::mem::transmute; +use std::os::fd::BorrowedFd; use std::sync::Arc; use drm_sys::{ @@ -17,7 +18,7 @@ use drm_sys::{ }; use graphics_ipc::v1::CursorDamage; use graphics_ipc::v2::Damage; -use inputd::{VtEvent, VtEventKind}; +use inputd::{DisplayHandle, VtEventKind}; use libredox::Fd; use redox_scheme::scheme::{register_scheme_inner, SchemeState, SchemeSync}; use redox_scheme::{CallerCtx, OpenResult, RequestKind, SignalBehavior, Socket}; @@ -91,11 +92,12 @@ pub trait CursorFramebuffer {} pub struct GraphicsScheme { inner: GraphicsSchemeInner, + inputd_handle: DisplayHandle, state: SchemeState, } impl GraphicsScheme { - pub fn new(mut adapter: T, scheme_name: String) -> Self { + pub fn new(mut adapter: T, scheme_name: String, early: bool) -> Self { assert!(scheme_name.starts_with("display")); let socket = Socket::nonblock().expect("failed to create graphics scheme"); @@ -142,8 +144,15 @@ impl GraphicsScheme { register_scheme_inner(&inner.socket, &inner.scheme_name, cap_id) .expect("failed to register graphics scheme root"); + let display_handle = if early { + DisplayHandle::new_early(&inner.scheme_name).unwrap() + } else { + DisplayHandle::new(&inner.scheme_name).unwrap() + }; + Self { inner, + inputd_handle: display_handle, state: SchemeState::new(), } } @@ -152,6 +161,10 @@ impl GraphicsScheme { self.inner.socket.inner() } + pub fn inputd_event_handle(&self) -> BorrowedFd<'_> { + self.inputd_handle.inner() + } + pub fn adapter(&self) -> &T { &self.inner.adapter } @@ -176,44 +189,51 @@ impl GraphicsScheme { self.inner.standard_properties } - pub fn handle_vt_event(&mut self, vt_event: VtEvent) { - match vt_event.kind { - VtEventKind::Activate => { - log::info!("activate {}", vt_event.vt); + pub fn handle_vt_events(&mut self) { + while let Some(vt_event) = self + .inputd_handle + .read_vt_event() + .expect("driver-graphics: failed to read display handle") + { + match vt_event.kind { + VtEventKind::Activate => { + log::info!("activate {}", vt_event.vt); - // Disable the kernel graphical debug writing once switching vt's for the - // first time. This way the kernel graphical debug remains enabled if the - // userspace logging infrastructure doesn't start up because for example a - // kernel panic happened prior to it starting up or logd crashed. - if let Some(mut disable_graphical_debug) = self.inner.disable_graphical_debug.take() - { - let _ = disable_graphical_debug.write(&[1]); - } + // Disable the kernel graphical debug writing once switching vt's for the + // first time. This way the kernel graphical debug remains enabled if the + // userspace logging infrastructure doesn't start up because for example a + // kernel panic happened prior to it starting up or logd crashed. + if let Some(mut disable_graphical_debug) = + self.inner.disable_graphical_debug.take() + { + let _ = disable_graphical_debug.write(&[1]); + } - self.inner.active_vt = vt_event.vt; + self.inner.active_vt = vt_event.vt; - let vt_state = GraphicsSchemeInner::get_or_create_vt( - &mut self.inner.adapter, - &mut self.inner.vts, - vt_event.vt, - ); - - for (display_id, fb) in vt_state.display_fbs.iter().enumerate() { - GraphicsSchemeInner::update_whole_screen( + let vt_state = GraphicsSchemeInner::get_or_create_vt( &mut self.inner.adapter, - display_id, - fb, + &mut self.inner.vts, + vt_event.vt, ); + + for (display_id, fb) in vt_state.display_fbs.iter().enumerate() { + GraphicsSchemeInner::update_whole_screen( + &mut self.inner.adapter, + display_id, + fb, + ); + } + + if let Some(cursor_plane) = &vt_state.cursor_plane { + self.inner.adapter.handle_cursor(cursor_plane, true); + } } - if let Some(cursor_plane) = &vt_state.cursor_plane { - self.inner.adapter.handle_cursor(cursor_plane, true); + VtEventKind::Resize => { + log::warn!("driver-graphics: resize is not implemented yet") } } - - VtEventKind::Resize => { - log::warn!("driver-graphics: resize is not implemented yet") - } } } diff --git a/drivers/graphics/ihdgd/Cargo.toml b/drivers/graphics/ihdgd/Cargo.toml index 50b5ceb5c9..c4a3aefc42 100644 --- a/drivers/graphics/ihdgd/Cargo.toml +++ b/drivers/graphics/ihdgd/Cargo.toml @@ -20,7 +20,6 @@ common = { path = "../../common" } daemon = { path = "../../../daemon" } driver-graphics = { path = "../driver-graphics" } graphics-ipc = { path = "../graphics-ipc" } -inputd = { path = "../../inputd" } pcid = { path = "../../pcid" } libredox.workspace = true diff --git a/drivers/graphics/ihdgd/src/main.rs b/drivers/graphics/ihdgd/src/main.rs index 02451ba719..5a4f856eed 100644 --- a/drivers/graphics/ihdgd/src/main.rs +++ b/drivers/graphics/ihdgd/src/main.rs @@ -1,6 +1,5 @@ use driver_graphics::GraphicsScheme; use event::{user_data, EventQueue}; -use inputd::DisplayHandle; use pcid_interface::{irq_helpers::pci_allocate_interrupt_vector, PciFunctionHandle}; use std::{ io::{Read, Write}, @@ -35,9 +34,7 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { let irq_file = pci_allocate_interrupt_vector(&mut pcid_handle, "ihdgd"); - let mut inputd_display_handle = DisplayHandle::new(format!("display.ihdg.{}", name)).unwrap(); - - let mut scheme = GraphicsScheme::new(device, format!("display.ihdg.{}", name)); + let mut scheme = GraphicsScheme::new(device, format!("display.ihdg.{}", name), false); user_data! { enum Source { @@ -51,7 +48,7 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { EventQueue::new().expect("ihdgd: failed to create event queue"); event_queue .subscribe( - inputd_display_handle.inner().as_raw_fd() as usize, + scheme.inputd_event_handle().as_raw_fd() as usize, Source::Input, event::EventFlags::READ, ) @@ -81,14 +78,7 @@ fn daemon(daemon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> ! { .chain(event_queue.map(|e| e.expect("ihdgd: failed to get next event").user_data)) { match event { - Source::Input => { - while let Some(vt_event) = inputd_display_handle - .read_vt_event() - .expect("ihdgd: failed to read display handle") - { - scheme.handle_vt_event(vt_event); - } - } + Source::Input => scheme.handle_vt_events(), Source::Irq => { let mut irq = [0; 8]; irq_file.irq_handle().read(&mut irq).unwrap(); diff --git a/drivers/graphics/vesad/Cargo.toml b/drivers/graphics/vesad/Cargo.toml index 1b56f4ae97..4ee5a8671a 100644 --- a/drivers/graphics/vesad/Cargo.toml +++ b/drivers/graphics/vesad/Cargo.toml @@ -14,7 +14,6 @@ common = { path = "../../common" } daemon = { path = "../../../daemon" } driver-graphics = { path = "../driver-graphics" } graphics-ipc = { path = "../graphics-ipc" } -inputd = { path = "../../inputd" } libredox.workspace = true [features] diff --git a/drivers/graphics/vesad/src/main.rs b/drivers/graphics/vesad/src/main.rs index 5b3fc7e34c..a4c07d1ee5 100644 --- a/drivers/graphics/vesad/src/main.rs +++ b/drivers/graphics/vesad/src/main.rs @@ -3,7 +3,6 @@ extern crate syscall; use driver_graphics::GraphicsScheme; use event::{user_data, EventQueue}; -use inputd::DisplayHandle; use std::collections::HashMap; use std::env; use std::os::fd::AsRawFd; @@ -84,9 +83,8 @@ fn daemon(daemon: daemon::Daemon) -> ! { }; } - let mut inputd_display_handle = DisplayHandle::new_early("display.vesa").unwrap(); - - let mut scheme = GraphicsScheme::new(FbAdapter { framebuffers }, "display.vesa".to_owned()); + let mut scheme = + GraphicsScheme::new(FbAdapter { framebuffers }, "display.vesa".to_owned(), true); user_data! { enum Source { @@ -99,7 +97,7 @@ fn daemon(daemon: daemon::Daemon) -> ! { EventQueue::new().expect("vesad: failed to create event queue"); event_queue .subscribe( - inputd_display_handle.inner().as_raw_fd() as usize, + scheme.inputd_event_handle().as_raw_fd() as usize, Source::Input, event::EventFlags::READ, ) @@ -122,14 +120,7 @@ fn daemon(daemon: daemon::Daemon) -> ! { .chain(event_queue.map(|e| e.expect("vesad: failed to get next event").user_data)) { match event { - Source::Input => { - while let Some(vt_event) = inputd_display_handle - .read_vt_event() - .expect("vesad: failed to read display handle") - { - scheme.handle_vt_event(vt_event); - } - } + Source::Input => scheme.handle_vt_events(), Source::Scheme => { scheme .tick() diff --git a/drivers/graphics/virtio-gpud/Cargo.toml b/drivers/graphics/virtio-gpud/Cargo.toml index f215d8ea1a..c67f427f26 100644 --- a/drivers/graphics/virtio-gpud/Cargo.toml +++ b/drivers/graphics/virtio-gpud/Cargo.toml @@ -19,7 +19,6 @@ driver-graphics = { path = "../driver-graphics" } graphics-ipc = { path = "../graphics-ipc" } virtio-core = { path = "../../virtio-core" } pcid = { path = "../../pcid" } -inputd = { path = "../../inputd" } redox_event.workspace = true redox_syscall.workspace = true diff --git a/drivers/graphics/virtio-gpud/src/main.rs b/drivers/graphics/virtio-gpud/src/main.rs index 0c8927903c..0796055534 100644 --- a/drivers/graphics/virtio-gpud/src/main.rs +++ b/drivers/graphics/virtio-gpud/src/main.rs @@ -525,7 +525,7 @@ fn deamon(deamon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> anyhow: device.transport.run_device(); - let (mut scheme, mut inputd_handle) = scheme::GpuScheme::new( + let mut scheme = scheme::GpuScheme::new( config, control_queue.clone(), cursor_queue.clone(), @@ -546,7 +546,7 @@ fn deamon(deamon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> anyhow: EventQueue::new().expect("virtio-gpud: failed to create event queue"); event_queue .subscribe( - inputd_handle.inner().as_raw_fd() as usize, + scheme.inputd_event_handle().as_raw_fd() as usize, Source::Input, event::EventFlags::READ, ) @@ -572,14 +572,7 @@ fn deamon(deamon: daemon::Daemon, mut pcid_handle: PciFunctionHandle) -> anyhow: .chain(event_queue.map(|e| e.expect("virtio-gpud: failed to get next event").user_data)) { match event { - Source::Input => { - while let Some(vt_event) = inputd_handle - .read_vt_event() - .expect("virtio-gpud: failed to read display handle") - { - scheme.handle_vt_event(vt_event); - } - } + Source::Input => scheme.handle_vt_events(), Source::Scheme => { scheme .tick() diff --git a/drivers/graphics/virtio-gpud/src/scheme.rs b/drivers/graphics/virtio-gpud/src/scheme.rs index fc9b3ff3db..0ef55158f7 100644 --- a/drivers/graphics/virtio-gpud/src/scheme.rs +++ b/drivers/graphics/virtio-gpud/src/scheme.rs @@ -10,7 +10,6 @@ use driver_graphics::{ use drm_sys::{DRM_MODE_DPMS_ON, DRM_MODE_TYPE_PREFERRED}; use graphics_ipc::v1::Damage; use graphics_ipc::v2::ipc::{DRM_CAP_DUMB_BUFFER, DRM_CLIENT_CAP_CURSOR_PLANE_HOTSPOT}; -use inputd::DisplayHandle; use syscall::{EINVAL, PAGE_SIZE}; @@ -560,7 +559,7 @@ impl<'a> GpuScheme { cursor_queue: Arc>, transport: Arc, has_edid: bool, - ) -> Result<(GraphicsScheme>, DisplayHandle), Error> { + ) -> Result>, Error> { let adapter = VirtGpuAdapter { config, control_queue, @@ -570,8 +569,6 @@ impl<'a> GpuScheme { displays: vec![], }; - let scheme = GraphicsScheme::new(adapter, "display.virtio-gpu".to_owned()); - let handle = DisplayHandle::new("display.virtio-gpu").unwrap(); - Ok((scheme, handle)) + Ok(GraphicsScheme::new(adapter, "display.virtio-gpu".to_owned(), false)) } }