autocommit 2022-04-28 14:26:32 CEST
This commit is contained in:
parent
8065075d21
commit
a8ad097f8b
5 changed files with 28 additions and 102 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue