Move DisplayHandle creation into GraphicsScheme::new
This commit is contained in:
Generated
-3
@@ -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",
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user