Merge branch 'inputd_improvements' into 'main'
Couple of inputd related improvements See merge request redox-os/base!214
This commit is contained in:
@@ -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,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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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![]
|
||||
|
||||
@@ -6,7 +6,6 @@ requires_weak = ["10_inputd.service"]
|
||||
cmd = "vesad"
|
||||
inherit_envs = [
|
||||
"FRAMEBUFFER_ADDR",
|
||||
"FRAMEBUFFER_VIRT",
|
||||
"FRAMEBUFFER_WIDTH",
|
||||
"FRAMEBUFFER_HEIGHT",
|
||||
"FRAMEBUFFER_STRIDE",
|
||||
|
||||
Reference in New Issue
Block a user