surface: include current time in frame requests
This commit is contained in:
parent
bb9e6ba3b5
commit
ae87b3ef7a
7 changed files with 12 additions and 11 deletions
|
|
@ -925,7 +925,7 @@ impl MetalConnector {
|
||||||
rr.output_id = node.id;
|
rr.output_id = node.id;
|
||||||
let fb =
|
let fb =
|
||||||
self.prepare_present_fb(&mut rr, buffer, &plane, &node, try_direct_scanout)?;
|
self.prepare_present_fb(&mut rr, buffer, &plane, &node, try_direct_scanout)?;
|
||||||
rr.dispatch_frame_requests();
|
rr.dispatch_frame_requests(self.state.now_msec());
|
||||||
let (crtc_x, crtc_y, crtc_w, crtc_h, src_width, src_height) =
|
let (crtc_x, crtc_y, crtc_w, crtc_h, src_width, src_height) =
|
||||||
match &fb.direct_scanout_data {
|
match &fb.direct_scanout_data {
|
||||||
None => {
|
None => {
|
||||||
|
|
|
||||||
|
|
@ -24,10 +24,10 @@ impl WlCallback {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_done(&self) {
|
pub fn send_done(&self, data: u32) {
|
||||||
self.client.event(Done {
|
self.client.event(Done {
|
||||||
self_id: self.id,
|
self_id: self.id,
|
||||||
callback_data: 0,
|
callback_data: data,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ impl WlDisplayRequestHandler for WlDisplay {
|
||||||
let cb = Rc::new(WlCallback::new(req.callback, &self.client));
|
let cb = Rc::new(WlCallback::new(req.callback, &self.client));
|
||||||
track!(self.client, cb);
|
track!(self.client, cb);
|
||||||
self.client.add_client_obj(&cb)?;
|
self.client.add_client_obj(&cb)?;
|
||||||
cb.send_done();
|
cb.send_done(0);
|
||||||
self.client.remove_obj(&*cb)?;
|
self.client.remove_obj(&*cb)?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1227,8 +1227,9 @@ impl WlSurface {
|
||||||
self.ext.get().after_apply_commit();
|
self.ext.get().after_apply_commit();
|
||||||
if self.visible.get() {
|
if self.visible.get() {
|
||||||
if self.buffer_presented.get() {
|
if self.buffer_presented.get() {
|
||||||
|
let now = self.client.state.now_msec() as _;
|
||||||
for fr in self.frame_requests.borrow_mut().drain(..) {
|
for fr in self.frame_requests.borrow_mut().drain(..) {
|
||||||
fr.send_done();
|
fr.send_done(now);
|
||||||
let _ = fr.client.remove_obj(&*fr);
|
let _ = fr.client.remove_obj(&*fr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -86,11 +86,11 @@ impl Cursor for CursorSurface {
|
||||||
let extents = self.surface.extents.get();
|
let extents = self.surface.extents.get();
|
||||||
renderer.render_surface(&self.surface, -extents.x1(), -extents.y1(), None);
|
renderer.render_surface(&self.surface, -extents.x1(), -extents.y1(), None);
|
||||||
|
|
||||||
struct FrameRequests;
|
struct FrameRequests(u64);
|
||||||
impl NodeVisitorBase for FrameRequests {
|
impl NodeVisitorBase for FrameRequests {
|
||||||
fn visit_surface(&mut self, node: &Rc<WlSurface>) {
|
fn visit_surface(&mut self, node: &Rc<WlSurface>) {
|
||||||
for fr in node.frame_requests.borrow_mut().drain(..) {
|
for fr in node.frame_requests.borrow_mut().drain(..) {
|
||||||
fr.send_done();
|
fr.send_done(self.0 as _);
|
||||||
let _ = fr.client.remove_obj(fr.deref());
|
let _ = fr.client.remove_obj(fr.deref());
|
||||||
}
|
}
|
||||||
for fr in node.presentation_feedback.borrow_mut().drain(..) {
|
for fr in node.presentation_feedback.borrow_mut().drain(..) {
|
||||||
|
|
@ -100,7 +100,7 @@ impl Cursor for CursorSurface {
|
||||||
node.node_visit_children(self);
|
node.node_visit_children(self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
FrameRequests.visit_surface(&self.surface);
|
FrameRequests(self.surface.client.state.now_msec()).visit_surface(&self.surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn extents_at_scale(&self, scale: Scale) -> Rect {
|
fn extents_at_scale(&self, scale: Scale) -> Rect {
|
||||||
|
|
|
||||||
|
|
@ -48,9 +48,9 @@ impl Default for RenderResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl RenderResult {
|
impl RenderResult {
|
||||||
pub fn dispatch_frame_requests(&mut self) {
|
pub fn dispatch_frame_requests(&mut self, now: u64) {
|
||||||
for fr in self.frame_requests.drain(..) {
|
for fr in self.frame_requests.drain(..) {
|
||||||
fr.send_done();
|
fr.send_done(now as _);
|
||||||
let _ = fr.client.remove_obj(&*fr);
|
let _ = fr.client.remove_obj(&*fr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -856,7 +856,7 @@ impl State {
|
||||||
render_hw_cursor,
|
render_hw_cursor,
|
||||||
)?;
|
)?;
|
||||||
output.perform_screencopies(tex, !render_hw_cursor, 0, 0, None);
|
output.perform_screencopies(tex, !render_hw_cursor, 0, 0, None);
|
||||||
rr.dispatch_frame_requests();
|
rr.dispatch_frame_requests(self.now_msec());
|
||||||
Ok(sync_file)
|
Ok(sync_file)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue