From a8ad097f8b141f9477402bac07b2a0ae87eb8458 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Thu, 28 Apr 2022 14:26:32 +0200 Subject: [PATCH] autocommit 2022-04-28 14:26:32 CEST --- src/backends/metal/video.rs | 40 ++++++++++++-------- src/backends/x.rs | 3 +- src/client.rs | 15 +------- src/client/tasks.rs | 58 ----------------------------- src/ifs/wp_presentation_feedback.rs | 14 +------ 5 files changed, 28 insertions(+), 102 deletions(-) diff --git a/src/backends/metal/video.rs b/src/backends/metal/video.rs index 88a2d03b..375d3ff4 100644 --- a/src/backends/metal/video.rs +++ b/src/backends/metal/video.rs @@ -7,7 +7,7 @@ use { backends::metal::{DrmId, MetalBackend, MetalError}, edid::Descriptor, format::{Format, XRGB8888}, - ifs::wp_presentation_feedback::ExecutedPresentation, + ifs::wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC}, render::{Framebuffer, RenderContext, RenderResult}, state::State, utils::{ @@ -191,7 +191,8 @@ impl MetalConnector { &mut rr, ); for fr in rr.frame_requests.drain(..) { - fr.client.dispatch_frame_requests.push(fr.clone()); + fr.send_done(); + let _ = fr.client.remove_obj(&*fr); } } let mut changes = self.master.change(); @@ -829,21 +830,28 @@ impl MetalBackend { { let global = self.state.outputs.get(&connector.connector_id); let mut rr = connector.render_result.borrow_mut(); - for fb in rr.presentation_feedbacks.drain(..) { - match &global { - Some(g) => { - fb.client - .dispatch_presentation_feedback - .push(ExecutedPresentation { - feedback: fb.clone(), - output: g.node.global.clone(), - tv_sec: tv_sec as _, - tv_nsec: tv_usec * 1000, - seq: sequence as _, - refresh: connector.refresh.get(), - }) + if let Some(g) = &global { + let refresh = connector.refresh.get(); + let bindings = g.node.global.bindings.borrow_mut(); + for fb in rr.presentation_feedbacks.drain(..) { + if let Some(bindings) = bindings.get(&fb.client.id) { + for binding in bindings.values() { + fb.send_sync_output(binding); + } } - _ => fb.client.discard_presentation_feedback.push(fb.clone()), + fb.send_presented( + tv_sec as _, + tv_usec * 1000, + refresh, + sequence as _, + KIND_VSYNC | KIND_HW_COMPLETION, + ); + let _ = fb.client.remove_obj(&*fb); + } + } else { + for fb in rr.presentation_feedbacks.drain(..) { + fb.send_discarded(); + let _ = fb.client.remove_obj(&*fb); } } } diff --git a/src/backends/x.rs b/src/backends/x.rs index 598579ba..c1aa2ac1 100644 --- a/src/backends/x.rs +++ b/src/backends/x.rs @@ -686,7 +686,8 @@ impl XBackend { rr.deref_mut(), ); for fr in rr.frame_requests.drain(..) { - fr.client.dispatch_frame_requests.push(fr.clone()); + fr.send_done(); + let _ = fr.client.remove_obj(&*fr); } } diff --git a/src/client.rs b/src/client.rs index e4e1893f..2fa10ac5 100644 --- a/src/client.rs +++ b/src/client.rs @@ -3,12 +3,7 @@ use { crate::{ async_engine::{AsyncFd, SpawnedFuture}, client::{error::LookupError, objects::Objects}, - ifs::{ - wl_callback::WlCallback, - wl_display::WlDisplay, - wl_registry::WlRegistry, - wp_presentation_feedback::{ExecutedPresentation, WpPresentationFeedback}, - }, + ifs::{wl_display::WlDisplay, wl_registry::WlRegistry}, leaks::Tracker, object::{Interface, Object, ObjectId, WL_DISPLAY_ID}, state::State, @@ -18,7 +13,6 @@ use { copyhashmap::Locked, errorfmt::ErrorFmt, numcell::NumCell, - queue::AsyncQueue, trim::AsciiTrim, }, wire::WlRegistryId, @@ -136,9 +130,6 @@ impl Clients { swapchain: Default::default(), flush_request: Default::default(), shutdown: Default::default(), - dispatch_frame_requests: AsyncQueue::new(), - discard_presentation_feedback: Default::default(), - dispatch_presentation_feedback: Default::default(), tracker: Default::default(), is_xwayland, secure, @@ -212,7 +203,6 @@ pub struct ClientHolder { impl Drop for ClientHolder { fn drop(&mut self) { self.data.objects.destroy(); - self.data.dispatch_frame_requests.clear(); self.data.flush_request.clear(); self.data.shutdown.clear(); } @@ -245,9 +235,6 @@ pub struct Client { swapchain: Rc>, flush_request: AsyncEvent, shutdown: AsyncEvent, - pub dispatch_frame_requests: AsyncQueue>, - pub discard_presentation_feedback: AsyncQueue>, - pub dispatch_presentation_feedback: AsyncQueue, pub tracker: Tracker, pub is_xwayland: bool, pub secure: bool, diff --git a/src/client/tasks.rs b/src/client/tasks.rs index 844cfa39..98aea2d0 100644 --- a/src/client/tasks.rs +++ b/src/client/tasks.rs @@ -2,7 +2,6 @@ use { crate::{ async_engine::Phase, client::{Client, ClientError}, - ifs::wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC}, object::ObjectId, utils::{ buffd::{BufFdIn, BufFdOut, MsgParser}, @@ -16,20 +15,13 @@ use { pub async fn client(data: Rc) { let mut recv = data.state.eng.spawn(receive(data.clone())).fuse(); - let mut dispatch_fr = data.state.eng.spawn(dispatch_fr(data.clone())).fuse(); - let discard_fb = data.state.eng.spawn(discard_fb(data.clone())).fuse(); - let dispatch_fb = data.state.eng.spawn(dispatch_fb(data.clone())).fuse(); let mut shutdown = data.shutdown.triggered().fuse(); let _send = data.state.eng.spawn2(Phase::PostLayout, send(data.clone())); select! { _ = recv => { }, - _ = dispatch_fr => { }, _ = shutdown => { }, } drop(recv); - drop(dispatch_fr); - drop(discard_fb); - drop(dispatch_fb); data.flush_request.trigger(); match data.state.eng.timeout(5000) { Ok(timeout) => { @@ -43,56 +35,6 @@ pub async fn client(data: Rc) { data.state.clients.kill(data.id); } -async fn dispatch_fr(data: Rc) { - loop { - let mut fr = data.dispatch_frame_requests.pop().await; - loop { - fr.send_done(); - if let Err(e) = data.remove_obj(&*fr) { - log::error!("Could not remove frame object: {}", ErrorFmt(e)); - return; - } - fr = match data.dispatch_frame_requests.try_pop() { - Some(f) => f, - _ => break, - }; - } - data.flush(); - } -} - -async fn discard_fb(data: Rc) { - loop { - data.discard_presentation_feedback.non_empty().await; - while let Some(fr) = data.discard_presentation_feedback.try_pop() { - fr.send_discarded(); - let _ = data.remove_obj(&*fr); - } - } -} - -async fn dispatch_fb(data: Rc) { - loop { - data.dispatch_presentation_feedback.non_empty().await; - while let Some(fr) = data.dispatch_presentation_feedback.try_pop() { - let bindings = fr.output.bindings.borrow_mut(); - if let Some(bindings) = bindings.get(&data.id) { - for binding in bindings.values() { - fr.feedback.send_sync_output(binding); - } - } - fr.feedback.send_presented( - fr.tv_sec, - fr.tv_nsec, - fr.refresh, - fr.seq, - KIND_VSYNC | KIND_HW_COMPLETION, - ); - let _ = data.remove_obj(&*fr.feedback); - } - } -} - async fn receive(data: Rc) { let display = data.display().unwrap(); let recv = async { diff --git a/src/ifs/wp_presentation_feedback.rs b/src/ifs/wp_presentation_feedback.rs index 99cd1c8c..7db03676 100644 --- a/src/ifs/wp_presentation_feedback.rs +++ b/src/ifs/wp_presentation_feedback.rs @@ -1,10 +1,7 @@ use { crate::{ client::Client, - ifs::{ - wl_output::{WlOutput, WlOutputGlobal}, - wl_surface::WlSurface, - }, + ifs::{wl_output::WlOutput, wl_surface::WlSurface}, leaks::Tracker, object::Object, wire::{wp_presentation_feedback::*, WpPresentationFeedbackId}, @@ -20,15 +17,6 @@ pub struct WpPresentationFeedback { pub tracker: Tracker, } -pub struct ExecutedPresentation { - pub feedback: Rc, - pub output: Rc, - pub tv_sec: u64, - pub tv_nsec: u32, - pub seq: u64, - pub refresh: u32, -} - pub const KIND_VSYNC: u32 = 0x1; #[allow(dead_code)] pub const KIND_HW_CLOCK: u32 = 0x2;