Move DisplayHandle creation into GraphicsScheme::new

This commit is contained in:
bjorn3
2026-03-04 20:13:25 +01:00
parent 70fe985736
commit 48c652f5d1
9 changed files with 63 additions and 78 deletions
Generated
-3
View File
@@ -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",
+51 -31
View File
@@ -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<T: GraphicsAdapter> {
inner: GraphicsSchemeInner<T>,
inputd_handle: DisplayHandle,
state: SchemeState,
}
impl<T: GraphicsAdapter> GraphicsScheme<T> {
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<T: GraphicsAdapter> GraphicsScheme<T> {
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<T: GraphicsAdapter> GraphicsScheme<T> {
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<T: GraphicsAdapter> GraphicsScheme<T> {
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")
}
}
}
-1
View File
@@ -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
+3 -13
View File
@@ -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();
-1
View File
@@ -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]
+4 -13
View File
@@ -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()
-1
View File
@@ -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
+3 -10
View File
@@ -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()
+2 -5
View File
@@ -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<Queue<'a>>,
transport: Arc<dyn Transport>,
has_edid: bool,
) -> Result<(GraphicsScheme<VirtGpuAdapter<'a>>, DisplayHandle), Error> {
) -> Result<GraphicsScheme<VirtGpuAdapter<'a>>, 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))
}
}