Notify window before presentation

This commit is contained in:
Héctor Ramón Jiménez 2025-03-18 18:22:39 +01:00
parent 363b0e903a
commit 31b98ee3eb
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
5 changed files with 29 additions and 2 deletions

View file

@ -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(())
}

View file

@ -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!(),
}

View file

@ -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<T: AsRef<str>>(
@ -146,6 +154,7 @@ pub fn present<T: AsRef<str>>(
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<T: AsRef<str>>(
overlay,
);
on_pre_present();
buffer.present().map_err(|_| compositor::SurfaceError::Lost)
}

View file

@ -221,6 +221,7 @@ pub fn present<T: AsRef<str>>(
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<T: AsRef<str>>(
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<T: AsRef<str>>(

View file

@ -892,6 +892,7 @@ async fn run_instance<P, C>(
window.state.viewport(),
window.state.background_color(),
&debug.overlay(),
|| window.raw.pre_present_notify(),
) {
Ok(()) => {
debug.render_finished();