diff --git a/graphics/src/compositor.rs b/graphics/src/compositor.rs index 363d651d..847578cf 100644 --- a/graphics/src/compositor.rs +++ b/graphics/src/compositor.rs @@ -80,6 +80,7 @@ pub trait Compositor: Sized { viewport: &Viewport, background_color: Color, overlay: &[T], + on_pre_present: impl FnOnce(), ) -> Result<(), SurfaceError>; /// Screenshots the current [`Renderer`] primitives to an offscreen texture, and returns the bytes of @@ -193,6 +194,7 @@ impl Compositor for () { _viewport: &Viewport, _background_color: Color, _overlay: &[T], + _on_pre_present: impl FnOnce(), ) -> Result<(), SurfaceError> { Ok(()) } diff --git a/renderer/src/fallback.rs b/renderer/src/fallback.rs index 82fc74ed..e8eb3327 100644 --- a/renderer/src/fallback.rs +++ b/renderer/src/fallback.rs @@ -322,6 +322,7 @@ where viewport: &graphics::Viewport, background_color: Color, overlay: &[T], + on_pre_present: impl FnOnce(), ) -> Result<(), compositor::SurfaceError> { match (self, renderer, surface) { ( @@ -334,6 +335,7 @@ where viewport, background_color, overlay, + on_pre_present, ), ( Self::Secondary(compositor), @@ -345,6 +347,7 @@ where viewport, background_color, overlay, + on_pre_present, ), _ => unreachable!(), } diff --git a/tiny_skia/src/window/compositor.rs b/tiny_skia/src/window/compositor.rs index 6c144be0..b0c369fb 100644 --- a/tiny_skia/src/window/compositor.rs +++ b/tiny_skia/src/window/compositor.rs @@ -114,8 +114,16 @@ impl crate::graphics::Compositor for Compositor { viewport: &Viewport, background_color: Color, overlay: &[T], + on_pre_present: impl FnOnce(), ) -> Result<(), compositor::SurfaceError> { - present(renderer, surface, viewport, background_color, overlay) + present( + renderer, + surface, + viewport, + background_color, + overlay, + on_pre_present, + ) } fn screenshot>( @@ -146,6 +154,7 @@ pub fn present>( viewport: &Viewport, background_color: Color, overlay: &[T], + on_pre_present: impl FnOnce(), ) -> Result<(), compositor::SurfaceError> { let physical_size = viewport.physical_size(); @@ -206,6 +215,7 @@ pub fn present>( overlay, ); + on_pre_present(); buffer.present().map_err(|_| compositor::SurfaceError::Lost) } diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs index bc932b44..107aa1f5 100644 --- a/wgpu/src/window/compositor.rs +++ b/wgpu/src/window/compositor.rs @@ -221,6 +221,7 @@ pub fn present>( viewport: &Viewport, background_color: Color, overlay: &[T], + on_pre_present: impl FnOnce(), ) -> Result<(), compositor::SurfaceError> { match surface.get_current_texture() { Ok(frame) => { @@ -249,6 +250,7 @@ pub fn present>( let _ = compositor.engine.submit(&compositor.queue, encoder); // Present the frame + on_pre_present(); frame.present(); Ok(()) @@ -365,8 +367,17 @@ impl graphics::Compositor for Compositor { viewport: &Viewport, background_color: Color, overlay: &[T], + on_pre_present: impl FnOnce(), ) -> Result<(), compositor::SurfaceError> { - present(self, renderer, surface, viewport, background_color, overlay) + present( + self, + renderer, + surface, + viewport, + background_color, + overlay, + on_pre_present, + ) } fn screenshot>( diff --git a/winit/src/program.rs b/winit/src/program.rs index a1b8b579..e541b79b 100644 --- a/winit/src/program.rs +++ b/winit/src/program.rs @@ -892,6 +892,7 @@ async fn run_instance( window.state.viewport(), window.state.background_color(), &debug.overlay(), + || window.raw.pre_present_notify(), ) { Ok(()) => { debug.render_finished();