Merge branch 'inputd_improvements' into 'main'

Couple of inputd related improvements

See merge request redox-os/base!214
This commit is contained in:
Jeremy Soller
2026-04-05 07:55:19 -06:00
5 changed files with 67 additions and 116 deletions
+66 -78
View File
@@ -213,84 +213,7 @@ impl<T: GraphicsAdapter> GraphicsScheme<T> {
.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]);
}
self.inner.active_vt = vt_event.vt;
let vt_state = GraphicsSchemeInner::get_or_create_vt(
&self.inner.objects,
&mut self.inner.vts,
vt_event.vt,
);
for (connector_idx, connector_state) in
vt_state.connector_state.iter().enumerate()
{
let connector_id = self.inner.objects.connector_ids()[connector_idx];
let mut connector = self
.inner
.objects
.get_connector(connector_id)
.unwrap()
.lock()
.unwrap();
connector.state = connector_state.clone();
}
for (crtc_idx, crtc_state) in vt_state.crtc_state.iter().enumerate() {
let crtc_id = self.inner.objects.crtc_ids()[crtc_idx];
let crtc = self.inner.objects.get_crtc(crtc_id).unwrap();
let connector_id = self.inner.objects.connector_ids()[crtc_idx];
let fb = crtc_state.fb_id.map(|fb_id| {
self.inner
.objects
.get_framebuffer(fb_id)
.expect("removed framebuffers should be unset")
});
self.inner
.adapter
.set_crtc(
&self.inner.objects,
crtc,
crtc_state.clone(),
Damage {
x: 0,
y: 0,
width: fb.map_or(0, |fb| fb.width),
height: fb.map_or(0, |fb| fb.height),
},
)
.unwrap();
self.inner
.objects
.get_connector(connector_id)
.unwrap()
.lock()
.unwrap()
.state
.crtc_id = crtc_id;
}
if self.inner.adapter.hw_cursor_size().is_some() {
self.inner
.adapter
.handle_cursor(&vt_state.cursor_plane, true);
}
}
VtEventKind::Activate => self.inner.activate_vt(vt_event.vt),
}
}
}
@@ -387,6 +310,71 @@ impl<T: GraphicsAdapter> GraphicsSchemeInner<T> {
},
})
}
fn activate_vt(&mut self, vt: usize) {
log::info!("activate {}", 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.disable_graphical_debug.take() {
let _ = disable_graphical_debug.write(&[1]);
}
self.active_vt = vt;
let vt_state = GraphicsSchemeInner::get_or_create_vt(&self.objects, &mut self.vts, vt);
for (connector_idx, connector_state) in vt_state.connector_state.iter().enumerate() {
let connector_id = self.objects.connector_ids()[connector_idx];
let mut connector = self
.objects
.get_connector(connector_id)
.unwrap()
.lock()
.unwrap();
connector.state = connector_state.clone();
}
for (crtc_idx, crtc_state) in vt_state.crtc_state.iter().enumerate() {
let crtc_id = self.objects.crtc_ids()[crtc_idx];
let crtc = self.objects.get_crtc(crtc_id).unwrap();
let connector_id = self.objects.connector_ids()[crtc_idx];
let fb = crtc_state.fb_id.map(|fb_id| {
self.objects
.get_framebuffer(fb_id)
.expect("removed framebuffers should be unset")
});
self.adapter
.set_crtc(
&self.objects,
crtc,
crtc_state.clone(),
Damage {
x: 0,
y: 0,
width: fb.map_or(0, |fb| fb.width),
height: fb.map_or(0, |fb| fb.height),
},
)
.unwrap();
self.objects
.get_connector(connector_id)
.unwrap()
.lock()
.unwrap()
.state
.crtc_id = crtc_id;
}
if self.adapter.hw_cursor_size().is_some() {
self.adapter.handle_cursor(&vt_state.cursor_plane, true);
}
}
}
const MAP_FAKE_OFFSET_MULTIPLIER: usize = 0x10_000_000;
+1 -3
View File
@@ -1,6 +1,4 @@
use std::{mem, ptr, slice};
use common::dma::Dma;
use std::{ptr, slice};
use crate::device::ggtt::GlobalGtt;
use crate::device::MmioRegion;
-28
View File
@@ -59,27 +59,6 @@ impl ConsumerHandle {
self.0.as_fd()
}
pub fn open_display(&self) -> io::Result<File> {
let mut buffer = [0; 1024];
let fd = self.0.as_raw_fd();
let written = libredox::call::fpath(fd as usize, &mut buffer)?;
assert!(written <= buffer.len());
let display_path = std::str::from_utf8(&buffer[..written])
.expect("init: display path UTF-8 check failed")
.to_owned();
let display_file =
libredox::call::open(&display_path, (O_CLOEXEC | O_NONBLOCK | O_RDWR) as _, 0)
.map(|socket| unsafe { File::from_raw_fd(socket as RawFd) })
.unwrap_or_else(|err| {
panic!("failed to open display {}: {}", display_path, err);
});
Ok(display_file)
}
pub fn open_display_v2(&self) -> io::Result<File> {
let mut buffer = [0; 1024];
let fd = self.0.as_raw_fd();
@@ -167,9 +146,6 @@ impl DisplayHandle {
let mut event = VtEvent {
kind: VtEventKind::Activate,
vt: usize::MAX,
width: u32::MAX,
height: u32::MAX,
stride: u32::MAX,
};
let nread = self.0.read(unsafe { any_as_u8_slice_mut(&mut event) })?;
@@ -219,10 +195,6 @@ pub enum VtEventKind {
pub struct VtEvent {
pub kind: VtEventKind,
pub vt: usize,
pub width: u32,
pub height: u32,
pub stride: u32,
}
pub struct ProducerHandle(File);
-6
View File
@@ -122,9 +122,6 @@ impl InputScheme {
pending.push(VtEvent {
kind: VtEventKind::Activate,
vt: new_active,
width: 0,
height: 0,
stride: 0,
});
*notified = false;
}
@@ -250,9 +247,6 @@ impl SchemeSync for InputScheme {
vec![VtEvent {
kind: VtEventKind::Activate,
vt: active_vt,
width: 0,
height: 0,
stride: 0,
}]
} else {
vec![]
-1
View File
@@ -6,7 +6,6 @@ requires_weak = ["10_inputd.service"]
cmd = "vesad"
inherit_envs = [
"FRAMEBUFFER_ADDR",
"FRAMEBUFFER_VIRT",
"FRAMEBUFFER_WIDTH",
"FRAMEBUFFER_HEIGHT",
"FRAMEBUFFER_STRIDE",