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},
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue