From 55b4d4b89ae8738c6b95d975c29e7415fe2323da Mon Sep 17 00:00:00 2001 From: Victor Brekenfeld Date: Sun, 16 May 2021 20:08:10 +0200 Subject: [PATCH] shm: Release buffer as soon as possible --- anvil/src/drawing.rs | 12 ++++++++++-- anvil/src/winit.rs | 14 +++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/anvil/src/drawing.rs b/anvil/src/drawing.rs index 8fc2997..51fbc8a 100644 --- a/anvil/src/drawing.rs +++ b/anvil/src/drawing.rs @@ -24,13 +24,15 @@ use smithay::{ use crate::shell::{MyCompositorToken, MyWindowMap, SurfaceData}; struct BufferTextures { - buffer: wl_buffer::WlBuffer, + buffer: Option, texture: T, } impl Drop for BufferTextures { fn drop(&mut self) { - self.buffer.release(); + if let Some(buffer) = self.buffer.take() { + buffer.release(); + } } } @@ -86,6 +88,12 @@ where if let Some(buffer) = data.current_state.buffer.take() { match renderer.import_buffer(&buffer, Some(&attributes), egl_buffer_reader) { Ok(m) => { + let buffer = if smithay::wayland::shm::with_buffer_contents(&buffer, |_,_| ()).is_ok() { + buffer.release(); + None + } else { + Some(buffer) + }; data.texture = Some(Box::new(BufferTextures { buffer, texture: m }) as Box) } diff --git a/anvil/src/winit.rs b/anvil/src/winit.rs index eb4a15b..aa3af49 100644 --- a/anvil/src/winit.rs +++ b/anvil/src/winit.rs @@ -94,13 +94,6 @@ pub fn run_winit( break; } - // Send frame events so that client start drawing their next frame - state - .window_map - .borrow() - .send_frames(start_time.elapsed().as_millis() as u32); - display.borrow_mut().flush_clients(&mut state); - // drawing logic { let mut renderer = renderer.borrow_mut(); @@ -174,6 +167,13 @@ pub fn run_winit( } } + // Send frame events so that client start drawing their next frame + state + .window_map + .borrow() + .send_frames(start_time.elapsed().as_millis() as u32); + display.borrow_mut().flush_clients(&mut state); + if event_loop .dispatch(Some(Duration::from_millis(16)), &mut state) .is_err()