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},
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);
}
}
}

View file

@ -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);
}
}

View file

@ -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<RefCell<OutBufferSwapchain>>,
flush_request: 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 is_xwayland: bool,
pub secure: bool,

View file

@ -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<Client>) {
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<Client>) {
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>) {
let display = data.display().unwrap();
let recv = async {

View file

@ -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<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;
#[allow(dead_code)]
pub const KIND_HW_CLOCK: u32 = 0x2;