1
0
Fork 0
forked from wry/wry

autocommit 2022-04-28 14:26:32 CEST

This commit is contained in:
Julian Orth 2022-04-28 14:26:32 +02:00
parent 8065075d21
commit a8ad097f8b
5 changed files with 28 additions and 102 deletions

View file

@ -7,7 +7,7 @@ use {
backends::metal::{DrmId, MetalBackend, MetalError}, backends::metal::{DrmId, MetalBackend, MetalError},
edid::Descriptor, edid::Descriptor,
format::{Format, XRGB8888}, format::{Format, XRGB8888},
ifs::wp_presentation_feedback::ExecutedPresentation, ifs::wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC},
render::{Framebuffer, RenderContext, RenderResult}, render::{Framebuffer, RenderContext, RenderResult},
state::State, state::State,
utils::{ utils::{
@ -191,7 +191,8 @@ impl MetalConnector {
&mut rr, &mut rr,
); );
for fr in rr.frame_requests.drain(..) { 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(); let mut changes = self.master.change();
@ -829,21 +830,28 @@ impl MetalBackend {
{ {
let global = self.state.outputs.get(&connector.connector_id); let global = self.state.outputs.get(&connector.connector_id);
let mut rr = connector.render_result.borrow_mut(); let mut rr = connector.render_result.borrow_mut();
for fb in rr.presentation_feedbacks.drain(..) { if let Some(g) = &global {
match &global { let refresh = connector.refresh.get();
Some(g) => { let bindings = g.node.global.bindings.borrow_mut();
fb.client for fb in rr.presentation_feedbacks.drain(..) {
.dispatch_presentation_feedback if let Some(bindings) = bindings.get(&fb.client.id) {
.push(ExecutedPresentation { for binding in bindings.values() {
feedback: fb.clone(), fb.send_sync_output(binding);
output: g.node.global.clone(), }
tv_sec: tv_sec as _,
tv_nsec: tv_usec * 1000,
seq: sequence as _,
refresh: connector.refresh.get(),
})
} }
_ => 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);
} }
} }
} }

View file

@ -686,7 +686,8 @@ impl XBackend {
rr.deref_mut(), rr.deref_mut(),
); );
for fr in rr.frame_requests.drain(..) { for fr in rr.frame_requests.drain(..) {
fr.client.dispatch_frame_requests.push(fr.clone()); fr.send_done();
let _ = fr.client.remove_obj(&*fr);
} }
} }

View file

@ -3,12 +3,7 @@ use {
crate::{ crate::{
async_engine::{AsyncFd, SpawnedFuture}, async_engine::{AsyncFd, SpawnedFuture},
client::{error::LookupError, objects::Objects}, client::{error::LookupError, objects::Objects},
ifs::{ ifs::{wl_display::WlDisplay, wl_registry::WlRegistry},
wl_callback::WlCallback,
wl_display::WlDisplay,
wl_registry::WlRegistry,
wp_presentation_feedback::{ExecutedPresentation, WpPresentationFeedback},
},
leaks::Tracker, leaks::Tracker,
object::{Interface, Object, ObjectId, WL_DISPLAY_ID}, object::{Interface, Object, ObjectId, WL_DISPLAY_ID},
state::State, state::State,
@ -18,7 +13,6 @@ use {
copyhashmap::Locked, copyhashmap::Locked,
errorfmt::ErrorFmt, errorfmt::ErrorFmt,
numcell::NumCell, numcell::NumCell,
queue::AsyncQueue,
trim::AsciiTrim, trim::AsciiTrim,
}, },
wire::WlRegistryId, wire::WlRegistryId,
@ -136,9 +130,6 @@ impl Clients {
swapchain: Default::default(), swapchain: Default::default(),
flush_request: Default::default(), flush_request: Default::default(),
shutdown: Default::default(), shutdown: Default::default(),
dispatch_frame_requests: AsyncQueue::new(),
discard_presentation_feedback: Default::default(),
dispatch_presentation_feedback: Default::default(),
tracker: Default::default(), tracker: Default::default(),
is_xwayland, is_xwayland,
secure, secure,
@ -212,7 +203,6 @@ pub struct ClientHolder {
impl Drop for ClientHolder { impl Drop for ClientHolder {
fn drop(&mut self) { fn drop(&mut self) {
self.data.objects.destroy(); self.data.objects.destroy();
self.data.dispatch_frame_requests.clear();
self.data.flush_request.clear(); self.data.flush_request.clear();
self.data.shutdown.clear(); self.data.shutdown.clear();
} }
@ -245,9 +235,6 @@ pub struct Client {
swapchain: Rc<RefCell<OutBufferSwapchain>>, swapchain: Rc<RefCell<OutBufferSwapchain>>,
flush_request: AsyncEvent, flush_request: AsyncEvent,
shutdown: AsyncEvent, shutdown: AsyncEvent,
pub dispatch_frame_requests: AsyncQueue<Rc<WlCallback>>,
pub discard_presentation_feedback: AsyncQueue<Rc<WpPresentationFeedback>>,
pub dispatch_presentation_feedback: AsyncQueue<ExecutedPresentation>,
pub tracker: Tracker<Client>, pub tracker: Tracker<Client>,
pub is_xwayland: bool, pub is_xwayland: bool,
pub secure: bool, pub secure: bool,

View file

@ -2,7 +2,6 @@ use {
crate::{ crate::{
async_engine::Phase, async_engine::Phase,
client::{Client, ClientError}, client::{Client, ClientError},
ifs::wp_presentation_feedback::{KIND_HW_COMPLETION, KIND_VSYNC},
object::ObjectId, object::ObjectId,
utils::{ utils::{
buffd::{BufFdIn, BufFdOut, MsgParser}, buffd::{BufFdIn, BufFdOut, MsgParser},
@ -16,20 +15,13 @@ use {
pub async fn client(data: Rc<Client>) { pub async fn client(data: Rc<Client>) {
let mut recv = data.state.eng.spawn(receive(data.clone())).fuse(); 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 mut shutdown = data.shutdown.triggered().fuse();
let _send = data.state.eng.spawn2(Phase::PostLayout, send(data.clone())); let _send = data.state.eng.spawn2(Phase::PostLayout, send(data.clone()));
select! { select! {
_ = recv => { }, _ = recv => { },
_ = dispatch_fr => { },
_ = shutdown => { }, _ = shutdown => { },
} }
drop(recv); drop(recv);
drop(dispatch_fr);
drop(discard_fb);
drop(dispatch_fb);
data.flush_request.trigger(); data.flush_request.trigger();
match data.state.eng.timeout(5000) { match data.state.eng.timeout(5000) {
Ok(timeout) => { Ok(timeout) => {
@ -43,56 +35,6 @@ pub async fn client(data: Rc<Client>) {
data.state.clients.kill(data.id); data.state.clients.kill(data.id);
} }
async fn dispatch_fr(data: Rc<Client>) {
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<Client>) {
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<Client>) {
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<Client>) { async fn receive(data: Rc<Client>) {
let display = data.display().unwrap(); let display = data.display().unwrap();
let recv = async { let recv = async {

View file

@ -1,10 +1,7 @@
use { use {
crate::{ crate::{
client::Client, client::Client,
ifs::{ ifs::{wl_output::WlOutput, wl_surface::WlSurface},
wl_output::{WlOutput, WlOutputGlobal},
wl_surface::WlSurface,
},
leaks::Tracker, leaks::Tracker,
object::Object, object::Object,
wire::{wp_presentation_feedback::*, WpPresentationFeedbackId}, wire::{wp_presentation_feedback::*, WpPresentationFeedbackId},
@ -20,15 +17,6 @@ pub struct WpPresentationFeedback {
pub tracker: Tracker<Self>, pub tracker: Tracker<Self>,
} }
pub struct ExecutedPresentation {
pub feedback: Rc<WpPresentationFeedback>,
pub output: Rc<WlOutputGlobal>,
pub tv_sec: u64,
pub tv_nsec: u32,
pub seq: u64,
pub refresh: u32,
}
pub const KIND_VSYNC: u32 = 0x1; pub const KIND_VSYNC: u32 = 0x1;
#[allow(dead_code)] #[allow(dead_code)]
pub const KIND_HW_CLOCK: u32 = 0x2; pub const KIND_HW_CLOCK: u32 = 0x2;