diff --git a/crates/bevy_render/src/renderer/mod.rs b/crates/bevy_render/src/renderer/mod.rs index f4cd4ad07be5d..e5ab90f87b190 100644 --- a/crates/bevy_render/src/renderer/mod.rs +++ b/crates/bevy_render/src/renderer/mod.rs @@ -84,14 +84,17 @@ pub fn render_system( world.resource_scope(|world, mut windows: Mut| { let views = state.get(world); - for (view_target, camera) in views.iter() { - if let Some(NormalizedRenderTarget::Window(window)) = camera.target - && view_target.needs_present() - { - let Some(window) = windows.get_mut(&window.entity()) else { - continue; - }; + for window in windows.values_mut() { + let view_needs_present = views.iter().any(|(view_target, camera)| { + matches!( + camera.target, + Some(NormalizedRenderTarget::Window(w)) if w.entity() == window.entity + ) && view_target.needs_present() + }); + + if view_needs_present || window.needs_initial_present { window.present(); + window.needs_initial_present = false; } } }); diff --git a/crates/bevy_render/src/view/window/mod.rs b/crates/bevy_render/src/view/window/mod.rs index 02cc0f6c7fde5..626a45a295083 100644 --- a/crates/bevy_render/src/view/window/mod.rs +++ b/crates/bevy_render/src/view/window/mod.rs @@ -64,6 +64,11 @@ pub struct ExtractedWindow { pub size_changed: bool, pub present_mode_changed: bool, pub alpha_mode: CompositeAlphaMode, + /// Whether this window needs an initial buffer commit. + /// + /// On Wayland, windows must present at least once before they are shown. + /// See + pub needs_initial_present: bool, } impl ExtractedWindow { @@ -145,6 +150,7 @@ fn extract_windows( swap_chain_texture_view_format: None, present_mode_changed: false, alpha_mode: window.composite_alpha_mode, + needs_initial_present: true, }); if extracted_window.swap_chain_texture.is_none() {