1
0
Fork 0
forked from wry/wry

wl_surface: handle frame callback cleanup automatically

This commit is contained in:
Julian Orth 2026-02-28 01:44:19 +01:00
parent d87a5827b5
commit 7b0dc8879a
2 changed files with 27 additions and 12 deletions

View file

@ -310,7 +310,7 @@ pub struct WlSurface {
pub buf_y: NumCell<i32>, pub buf_y: NumCell<i32>,
pub children: RefCell<Option<Box<ParentData>>>, pub children: RefCell<Option<Box<ParentData>>>,
ext: CloneCell<Rc<dyn SurfaceExt>>, ext: CloneCell<Rc<dyn SurfaceExt>>,
frame_requests: RefCell<Vec<Rc<WlCallback>>>, frame_requests: RefCell<Vec<FrameRequest>>,
presentation_feedback: RefCell<Vec<Rc<WpPresentationFeedback>>>, presentation_feedback: RefCell<Vec<Rc<WpPresentationFeedback>>>,
latched_presentation_feedback: RefCell<Vec<Rc<WpPresentationFeedback>>>, latched_presentation_feedback: RefCell<Vec<Rc<WpPresentationFeedback>>>,
seat_state: NodeSeatState, seat_state: NodeSeatState,
@ -465,7 +465,7 @@ struct PendingState {
offset: (i32, i32), offset: (i32, i32),
opaque_region: Option<Option<Rc<Region>>>, opaque_region: Option<Option<Rc<Region>>>,
input_region: Option<Option<Rc<Region>>>, input_region: Option<Option<Rc<Region>>>,
frame_request: Vec<Rc<WlCallback>>, frame_request: Vec<FrameRequest>,
damage_full: bool, damage_full: bool,
buffer_damage: Vec<Rect>, buffer_damage: Vec<Rect>,
surface_damage: Vec<Rect>, surface_damage: Vec<Rect>,
@ -1094,7 +1094,10 @@ impl WlSurfaceRequestHandler for WlSurface {
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)?;
self.pending.borrow_mut().frame_request.push(cb); self.pending
.borrow_mut()
.frame_request
.push(FrameRequest { now: 0, cb });
Ok(()) Ok(())
} }
@ -2197,10 +2200,10 @@ efrom!(WlSurfaceError, CommitTimelineError);
impl VblankListener for WlSurface { impl VblankListener for WlSurface {
fn after_vblank(self: Rc<Self>) { fn after_vblank(self: Rc<Self>) {
if self.visible.get() { if self.visible.get() {
let now = self.client.state.now_msec(); let now = self.client.state.now_msec() as u32;
for fr in self.frame_requests.borrow_mut().drain(..) { for mut fr in self.frame_requests.borrow_mut().drain(..) {
fr.send_done(now as _); fr.now = now;
let _ = fr.client.remove_obj(&*fr); drop(fr);
} }
} }
if self.clear_fifo_on_vblank.take() { if self.clear_fifo_on_vblank.take() {
@ -2274,3 +2277,15 @@ impl PresentationListener for WlSurface {
self.presentation_listener.detach(); self.presentation_listener.detach();
} }
} }
pub struct FrameRequest {
now: u32,
cb: Rc<WlCallback>,
}
impl Drop for FrameRequest {
fn drop(&mut self) {
self.cb.send_done(self.now);
let _ = self.cb.client.remove_obj(&*self.cb);
}
}

View file

@ -96,12 +96,12 @@ 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(u64); struct FrameRequests(u32);
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 mut fr in node.frame_requests.borrow_mut().drain(..) {
fr.send_done(self.0 as _); fr.now = self.0;
let _ = fr.client.remove_obj(fr.deref()); drop(fr);
} }
for fr in node.presentation_feedback.borrow_mut().drain(..) { for fr in node.presentation_feedback.borrow_mut().drain(..) {
fr.send_discarded(); fr.send_discarded();
@ -114,7 +114,7 @@ impl Cursor for CursorSurface {
node.node_visit_children(self); node.node_visit_children(self);
} }
} }
FrameRequests(self.surface.client.state.now_msec()).visit_surface(&self.surface); FrameRequests(self.surface.client.state.now_msec() as u32).visit_surface(&self.surface);
} }
fn extents_at_scale(&self, scale: Scale) -> Rect { fn extents_at_scale(&self, scale: Scale) -> Rect {