From 5e21e00059c4a5b06febbe50af96ef2156218115 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 6 May 2022 17:15:13 +0200 Subject: [PATCH] config: generate graphics-initialized event in the frontend --- src/backend.rs | 1 - src/backends/metal.rs | 7 ++----- src/backends/x.rs | 4 ---- src/compositor.rs | 1 + src/ifs/wl_buffer.rs | 2 +- src/it/test_backend.rs | 23 +++++++++++++++------- src/it/test_config.rs | 4 +++- src/it/test_utils/test_expected_event.rs | 1 + src/it/testrun.rs | 2 +- src/it/tests.rs | 2 ++ src/it/tests/t0002_window.rs | 2 +- src/it/tests/t0003_multi_window.rs | 2 +- src/it/tests/t0007_subsurface.rs | 2 +- src/it/tests/t0012_subsurface_focus.rs | 2 +- src/it/tests/t0013_graphics_initialized.rs | 18 +++++++++++++++++ src/state.rs | 7 +++++++ src/tasks/backend.rs | 5 ----- 17 files changed, 56 insertions(+), 29 deletions(-) create mode 100644 src/it/tests/t0013_graphics_initialized.rs diff --git a/src/backend.rs b/src/backend.rs index 0c877e0f..36e8b7d5 100644 --- a/src/backend.rs +++ b/src/backend.rs @@ -121,7 +121,6 @@ pub enum InputDeviceAccelProfile { } pub enum BackendEvent { - GraphicsInitialized, NewConnector(Rc), NewInputDevice(Rc), } diff --git a/src/backends/metal.rs b/src/backends/metal.rs index ba5b9733..0a8cff95 100644 --- a/src/backends/metal.rs +++ b/src/backends/metal.rs @@ -6,8 +6,8 @@ use { crate::{ async_engine::{AsyncError, AsyncFd, SpawnedFuture}, backend::{ - Backend, BackendEvent, InputDevice, InputDeviceAccelProfile, InputDeviceCapability, - InputDeviceId, InputEvent, KeyState, TransformMatrix, + Backend, InputDevice, InputDeviceAccelProfile, InputDeviceCapability, InputDeviceId, + InputEvent, KeyState, TransformMatrix, }, backends::metal::video::{MetalDrmDevice, MetalRenderContext, PendingDrmDevice}, dbus::{DbusError, SignalHandler}, @@ -141,9 +141,6 @@ impl MetalBackend { if let Err(e) = self.enumerate_devices() { return Err(MetalError::Enumerate(Box::new(e))); } - self.state - .backend_events - .push(BackendEvent::GraphicsInitialized); pending().await } } diff --git a/src/backends/x.rs b/src/backends/x.rs index f6990d60..ee99c66f 100644 --- a/src/backends/x.rs +++ b/src/backends/x.rs @@ -266,10 +266,6 @@ pub struct XBackend { impl XBackend { async fn run(self: Rc) -> Result<(), XBackendError> { - self.state - .backend_events - .push(BackendEvent::GraphicsInitialized); - self.query_devices(INPUT_DEVICE_ALL_MASTER).await?; let _events = self.state.eng.spawn(self.clone().event_handler()); diff --git a/src/compositor.rs b/src/compositor.rs index 8b31a3d1..8650d9ff 100644 --- a/src/compositor.rs +++ b/src/compositor.rs @@ -128,6 +128,7 @@ fn start_compositor2( el: el.clone(), render_ctx: Default::default(), render_ctx_version: NumCell::new(1), + render_ctx_ever_initialized: Cell::new(false), cursors: Default::default(), wheel, clients: Clients::new(), diff --git a/src/ifs/wl_buffer.rs b/src/ifs/wl_buffer.rs index 509c4ab2..cba05ae0 100644 --- a/src/ifs/wl_buffer.rs +++ b/src/ifs/wl_buffer.rs @@ -13,7 +13,7 @@ use { errorfmt::ErrorFmt, }, video::dmabuf::DmaBuf, - wire::{jay_screenshot::Dmabuf, wl_buffer::*, WlBufferId}, + wire::{wl_buffer::*, WlBufferId}, }, std::{ cell::{Cell, RefCell}, diff --git a/src/it/test_backend.rs b/src/it/test_backend.rs index 8329abdc..25e28339 100644 --- a/src/it/test_backend.rs +++ b/src/it/test_backend.rs @@ -8,12 +8,12 @@ use { }, compositor::TestFuture, fixed::Fixed, + it::test_error::TestResult, render::{RenderContext, RenderError}, state::State, time::Time, utils::{ - clonecell::CloneCell, copyhashmap::CopyHashMap, errorfmt::ErrorFmt, oserror::OsError, - syncqueue::SyncQueue, + clonecell::CloneCell, copyhashmap::CopyHashMap, oserror::OsError, syncqueue::SyncQueue, }, video::drm::{ConnectorType, Drm}, }, @@ -41,6 +41,7 @@ pub struct TestBackend { pub default_connector: Rc, pub default_mouse: Rc, pub default_kb: Rc, + pub render_context_installed: Cell, } impl TestBackend { @@ -92,10 +93,21 @@ impl TestBackend { default_connector, default_mouse, default_kb, + render_context_installed: Cell::new(false), } } - pub fn install_default(&self) { + pub fn install_render_context(&self) -> TestResult { + if self.render_context_installed.get() { + return Ok(()); + } + self.create_render_context()?; + self.render_context_installed.set(true); + Ok(()) + } + + pub fn install_default(&self) -> TestResult { + self.install_render_context()?; self.state .backend_events .push(BackendEvent::NewConnector(self.default_connector.clone())); @@ -121,6 +133,7 @@ impl TestBackend { self.state .backend_events .push(BackendEvent::NewInputDevice(self.default_mouse.clone())); + Ok(()) } fn create_render_context(&self) -> Result<(), TestBackendError> { @@ -175,11 +188,7 @@ impl TestBackend { impl Backend for TestBackend { fn run(self: Rc) -> SpawnedFuture>> { let future = (self.test_future)(&self.state); - let slf = self.clone(); self.state.eng.spawn(async move { - if let Err(e) = slf.create_render_context() { - log::error!("Could not create render context: {}", ErrorFmt(e)); - } let future: Pin<_> = future.into(); future.await; Ok(()) diff --git a/src/it/test_config.rs b/src/it/test_config.rs index 6ffc744b..92c9f5d3 100644 --- a/src/it/test_config.rs +++ b/src/it/test_config.rs @@ -38,6 +38,7 @@ where srv: Cell::new(None), responses: Default::default(), invoked_shortcuts: Default::default(), + graphics_initialized: Cell::new(false), }); let old = CONFIG; CONFIG = tc.deref(); @@ -99,7 +100,7 @@ unsafe extern "C" fn handle_msg(data: *const u8, msg: *const u8, size: usize) { ServerMessage::NewConnector { .. } => {} ServerMessage::DelConnector { .. } => {} ServerMessage::TimerExpired { .. } => {} - ServerMessage::GraphicsInitialized => {} + ServerMessage::GraphicsInitialized => tc.graphics_initialized.set(true), ServerMessage::Clear => tc.clear(), } } @@ -115,6 +116,7 @@ pub struct TestConfig { srv: Cell>, responses: Stack, pub invoked_shortcuts: CopyHashMap<(SeatId, ModifiedKeySym), ()>, + pub graphics_initialized: Cell, } macro_rules! get_response { diff --git a/src/it/test_utils/test_expected_event.rs b/src/it/test_utils/test_expected_event.rs index de5b7d17..a083adcb 100644 --- a/src/it/test_utils/test_expected_event.rs +++ b/src/it/test_utils/test_expected_event.rs @@ -17,6 +17,7 @@ impl TestExpectedEvent { } } + #[allow(dead_code)] pub fn last(&self) -> TestResult { match self.data.events.borrow_mut().pop_back() { Some(t) => Ok(t), diff --git a/src/it/testrun.rs b/src/it/testrun.rs index fd44eff3..4d33ede3 100644 --- a/src/it/testrun.rs +++ b/src/it/testrun.rs @@ -105,7 +105,7 @@ impl TestRun { } pub async fn create_default_setup(&self) -> Result { - self.backend.install_default(); + self.backend.install_default()?; let seat = self.get_seat("default")?; self.state.eng.yield_now().await; let output = match self.state.outputs.lock().values().next() { diff --git a/src/it/tests.rs b/src/it/tests.rs index 42610c4f..15861bc3 100644 --- a/src/it/tests.rs +++ b/src/it/tests.rs @@ -38,6 +38,7 @@ mod t0009_tab_focus; mod t0010_fullscreen_focus; mod t0011_set_keymap; mod t0012_subsurface_focus; +mod t0013_graphics_initialized; pub trait TestCase: Sync { fn name(&self) -> &'static str; @@ -68,5 +69,6 @@ pub fn tests() -> Vec<&'static dyn TestCase> { t0010_fullscreen_focus, t0011_set_keymap, t0012_subsurface_focus, + t0013_graphics_initialized, } } diff --git a/src/it/tests/t0002_window.rs b/src/it/tests/t0002_window.rs index fe72dae6..0f5c8555 100644 --- a/src/it/tests/t0002_window.rs +++ b/src/it/tests/t0002_window.rs @@ -11,7 +11,7 @@ testcase!(); /// Create and map a single surface async fn test(run: Rc) -> Result<(), TestError> { - run.backend.install_default(); + run.backend.install_default()?; let client = run.create_client().await?; diff --git a/src/it/tests/t0003_multi_window.rs b/src/it/tests/t0003_multi_window.rs index adf48b34..64a2027f 100644 --- a/src/it/tests/t0003_multi_window.rs +++ b/src/it/tests/t0003_multi_window.rs @@ -11,7 +11,7 @@ testcase!(); /// Create and map two surfaces async fn test(run: Rc) -> Result<(), TestError> { - run.backend.install_default(); + run.backend.install_default()?; let client = run.create_client().await?; diff --git a/src/it/tests/t0007_subsurface.rs b/src/it/tests/t0007_subsurface.rs index f2ba6a33..0866140c 100644 --- a/src/it/tests/t0007_subsurface.rs +++ b/src/it/tests/t0007_subsurface.rs @@ -11,7 +11,7 @@ testcase!(); /// Test subsurface positioning async fn test(run: Rc) -> Result<(), TestError> { - run.backend.install_default(); + run.backend.install_default()?; let seat = run.get_seat("default")?; diff --git a/src/it/tests/t0012_subsurface_focus.rs b/src/it/tests/t0012_subsurface_focus.rs index d000c86f..2655c59a 100644 --- a/src/it/tests/t0012_subsurface_focus.rs +++ b/src/it/tests/t0012_subsurface_focus.rs @@ -32,7 +32,7 @@ async fn test(run: Rc) -> TestResult { run.cfg.set_fullscreen(ds.seat.id(), true)?; client.sync().await; - window.map().await; + window.map().await?; ds.mouse.rel(-1000.0, -1000.0); diff --git a/src/it/tests/t0013_graphics_initialized.rs b/src/it/tests/t0013_graphics_initialized.rs new file mode 100644 index 00000000..78176f19 --- /dev/null +++ b/src/it/tests/t0013_graphics_initialized.rs @@ -0,0 +1,18 @@ +use { + crate::it::{test_error::TestResult, testrun::TestRun}, + std::rc::Rc, +}; + +testcase!(); + +async fn test(run: Rc) -> TestResult { + run.sync().await; + + tassert!(!run.cfg.graphics_initialized.get()); + + run.backend.install_render_context()?; + + tassert!(run.cfg.graphics_initialized.get()); + + Ok(()) +} diff --git a/src/state.rs b/src/state.rs index 4a457eda..c68ef766 100644 --- a/src/state.rs +++ b/src/state.rs @@ -63,6 +63,7 @@ pub struct State { pub el: Rc, pub render_ctx: CloneCell>>, pub render_ctx_version: NumCell, + pub render_ctx_ever_initialized: Cell, pub cursors: CloneCell>>, pub wheel: Rc, pub clients: Clients, @@ -251,6 +252,12 @@ impl State { for seat in seats.values() { seat.render_ctx_changed(); } + + if ctx.is_some() && !self.render_ctx_ever_initialized.replace(true) { + if let Some(config) = self.config.get() { + config.graphics_initialized(); + } + } } pub fn add_global(&self, global: &Rc) { diff --git a/src/tasks/backend.rs b/src/tasks/backend.rs index 20c27e7f..02dad2e9 100644 --- a/src/tasks/backend.rs +++ b/src/tasks/backend.rs @@ -23,11 +23,6 @@ impl BackendEventHandler { match event { BackendEvent::NewConnector(connector) => connector::handle(&self.state, &connector), BackendEvent::NewInputDevice(s) => input_device::handle(&self.state, s), - BackendEvent::GraphicsInitialized => { - if let Some(config) = self.state.config.get() { - config.graphics_initialized(); - } - } } } }