diff --git a/crates/bevy_render/src/render_graph/nodes/window_swapchain_node.rs b/crates/bevy_render/src/render_graph/nodes/window_swapchain_node.rs index f0c557fea1..bcc6410500 100644 --- a/crates/bevy_render/src/render_graph/nodes/window_swapchain_node.rs +++ b/crates/bevy_render/src/render_graph/nodes/window_swapchain_node.rs @@ -68,7 +68,7 @@ impl Node for WindowSwapChainNode { render_resource_context.create_swap_chain(window); } - let swap_chain_texture = render_resource_context.next_swap_chain_texture(window.id); + let swap_chain_texture = render_resource_context.next_swap_chain_texture(&window); output.set( WINDOW_TEXTURE, RenderResourceId::Texture(swap_chain_texture), diff --git a/crates/bevy_render/src/renderer/headless_render_resource_context.rs b/crates/bevy_render/src/renderer/headless_render_resource_context.rs index 318e7c8ebe..a18488c101 100644 --- a/crates/bevy_render/src/renderer/headless_render_resource_context.rs +++ b/crates/bevy_render/src/renderer/headless_render_resource_context.rs @@ -6,7 +6,7 @@ use crate::{ texture::{SamplerDescriptor, TextureDescriptor}, }; use bevy_asset::{Assets, Handle, HandleUntyped}; -use bevy_window::{Window, WindowId}; +use bevy_window::Window; use std::{ collections::HashMap, ops::Range, @@ -35,7 +35,7 @@ impl HeadlessRenderResourceContext { impl RenderResourceContext for HeadlessRenderResourceContext { fn create_swap_chain(&self, _window: &Window) {} - fn next_swap_chain_texture(&self, _window_id: WindowId) -> TextureId { + fn next_swap_chain_texture(&self, _window: &Window) -> TextureId { TextureId::new() } fn drop_swap_chain_texture(&self, _render_resource: TextureId) {} diff --git a/crates/bevy_render/src/renderer/render_resource_context.rs b/crates/bevy_render/src/renderer/render_resource_context.rs index 54b67f0397..a68b74ef1e 100644 --- a/crates/bevy_render/src/renderer/render_resource_context.rs +++ b/crates/bevy_render/src/renderer/render_resource_context.rs @@ -5,13 +5,13 @@ use crate::{ texture::{SamplerDescriptor, TextureDescriptor}, }; use bevy_asset::{Assets, Handle, HandleUntyped}; -use bevy_window::{Window, WindowId}; +use bevy_window::Window; use downcast_rs::{impl_downcast, Downcast}; use std::ops::Range; pub trait RenderResourceContext: Downcast + Send + Sync + 'static { fn create_swap_chain(&self, window: &Window); - fn next_swap_chain_texture(&self, window_id: WindowId) -> TextureId; + fn next_swap_chain_texture(&self, window: &Window) -> TextureId; fn drop_swap_chain_texture(&self, resource: TextureId); fn drop_all_swap_chain_textures(&self); fn create_sampler(&self, sampler_descriptor: &SamplerDescriptor) -> SamplerId; diff --git a/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs b/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs index a21125bfca..baa33c3062 100644 --- a/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs +++ b/crates/bevy_wgpu/src/renderer/wgpu_render_resource_context.rs @@ -127,6 +127,17 @@ impl WgpuRenderResourceContext { let bind_group_layout = self.device.create_bind_group_layout(&wgpu_descriptor); bind_group_layouts.insert(descriptor.id, bind_group_layout); } + + fn try_next_swap_chain_texture(&self, window_id: bevy_window::WindowId) -> Option { + let mut window_swap_chains = self.resources.window_swap_chains.write().unwrap(); + let mut swap_chain_outputs = self.resources.swap_chain_frames.write().unwrap(); + + let window_swap_chain = window_swap_chains.get_mut(&window_id).unwrap(); + let next_texture = window_swap_chain.get_next_frame().ok()?; + let id = TextureId::new(); + swap_chain_outputs.insert(id, next_texture); + Some(id) + } } impl RenderResourceContext for WgpuRenderResourceContext { @@ -252,16 +263,14 @@ impl RenderResourceContext for WgpuRenderResourceContext { window_swap_chains.insert(window.id, swap_chain); } - fn next_swap_chain_texture(&self, window_id: bevy_window::WindowId) -> TextureId { - let mut window_swap_chains = self.resources.window_swap_chains.write().unwrap(); - let mut swap_chain_outputs = self.resources.swap_chain_frames.write().unwrap(); - - let window_swap_chain = window_swap_chains.get_mut(&window_id).unwrap(); - let next_texture = window_swap_chain.get_next_frame().unwrap(); - - let id = TextureId::new(); - swap_chain_outputs.insert(id, next_texture); - id + fn next_swap_chain_texture(&self, window: &bevy_window::Window) -> TextureId { + if let Some(texture_id) = self.try_next_swap_chain_texture(window.id) { + texture_id + } else { + self.resources.window_swap_chains.write().unwrap().remove(&window.id); + self.create_swap_chain(window); + self.try_next_swap_chain_texture(window.id).expect("Failed to acquire next swap chain texture!") + } } fn drop_swap_chain_texture(&self, texture: TextureId) {