diff --git a/crates/bevy_core_pipeline/src/lib.rs b/crates/bevy_core_pipeline/src/lib.rs index 8fa6be9f299c2..352bdf1196b2b 100644 --- a/crates/bevy_core_pipeline/src/lib.rs +++ b/crates/bevy_core_pipeline/src/lib.rs @@ -415,6 +415,7 @@ pub fn prepare_core_views_system( * bit depth for better performance */ usage: TextureUsages::RENDER_ATTACHMENT, }, + false, ); commands.entity(entity).insert(ViewDepthTexture { texture: cached_texture.texture, diff --git a/crates/bevy_core_pipeline/src/main_pass_driver.rs b/crates/bevy_core_pipeline/src/main_pass_driver.rs index f317b4d0bd16e..c4347ef14eab1 100644 --- a/crates/bevy_core_pipeline/src/main_pass_driver.rs +++ b/crates/bevy_core_pipeline/src/main_pass_driver.rs @@ -14,17 +14,17 @@ impl Node for MainPassDriverNode { _render_context: &mut RenderContext, world: &World, ) -> Result<(), NodeRunError> { - if let Some(camera_2d) = world.resource::>().get() { + if let Some(camera_3d) = world.resource::>().get() { graph.run_sub_graph( - crate::draw_2d_graph::NAME, - vec![SlotValue::Entity(camera_2d)], + crate::draw_3d_graph::NAME, + vec![SlotValue::Entity(camera_3d)], )?; } - if let Some(camera_3d) = world.resource::>().get() { + if let Some(camera_2d) = world.resource::>().get() { graph.run_sub_graph( - crate::draw_3d_graph::NAME, - vec![SlotValue::Entity(camera_3d)], + crate::draw_2d_graph::NAME, + vec![SlotValue::Entity(camera_2d)], )?; } diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index a1b527faa5e54..5ef66befe05c7 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -770,6 +770,7 @@ pub fn prepare_lights( label: Some("point_light_shadow_map_texture"), usage: TextureUsages::RENDER_ATTACHMENT | TextureUsages::TEXTURE_BINDING, }, + false, ); let directional_light_depth_texture = texture_cache.get( &render_device, @@ -788,6 +789,7 @@ pub fn prepare_lights( label: Some("directional_light_shadow_map_texture"), usage: TextureUsages::RENDER_ATTACHMENT | TextureUsages::TEXTURE_BINDING, }, + false, ); let mut view_lights = Vec::new(); diff --git a/crates/bevy_render/src/texture/texture_cache.rs b/crates/bevy_render/src/texture/texture_cache.rs index 43cac472c154f..740ae7e2f2aca 100644 --- a/crates/bevy_render/src/texture/texture_cache.rs +++ b/crates/bevy_render/src/texture/texture_cache.rs @@ -6,13 +6,14 @@ use bevy_ecs::prelude::ResMut; use bevy_utils::{Entry, HashMap}; use wgpu::{TextureDescriptor, TextureViewDescriptor}; -/// The internal representation of a [`CachedTexture`] used to track whether it was recently used -/// and is currently taken. +/// The internal representation of a [`CachedTexture`] used to track whether it was recently used, +/// is currently taken and is it shared. struct CachedTextureMeta { texture: Texture, default_view: TextureView, taken: bool, frames_since_last_use: usize, + shared: bool, } /// A cached GPU [`Texture`] with corresponding [`TextureView`]. @@ -31,17 +32,18 @@ pub struct TextureCache { } impl TextureCache { - /// Retrieves a texture that matches the `descriptor`. If no matching one is found a new - /// [`CachedTexture`] is created. + /// Retrieves a free or shared texture that matches the `descriptor`. If no matching one is found + /// a new [`CachedTexture`] is created. pub fn get( &mut self, render_device: &RenderDevice, descriptor: TextureDescriptor<'static>, + shared: bool, ) -> CachedTexture { match self.textures.entry(descriptor) { Entry::Occupied(mut entry) => { for texture in entry.get_mut().iter_mut() { - if !texture.taken { + if (shared && texture.shared) || !texture.taken { texture.frames_since_last_use = 0; texture.taken = true; return CachedTexture { @@ -58,6 +60,7 @@ impl TextureCache { default_view: default_view.clone(), frames_since_last_use: 0, taken: true, + shared, }); CachedTexture { texture, @@ -72,6 +75,7 @@ impl TextureCache { default_view: default_view.clone(), taken: true, frames_since_last_use: 0, + shared, }]); CachedTexture { texture, diff --git a/crates/bevy_render/src/view/mod.rs b/crates/bevy_render/src/view/mod.rs index ba712a31943cd..2c780c783f37f 100644 --- a/crates/bevy_render/src/view/mod.rs +++ b/crates/bevy_render/src/view/mod.rs @@ -200,6 +200,7 @@ fn prepare_view_targets( format: TextureFormat::bevy_default(), usage: TextureUsages::RENDER_ATTACHMENT, }, + true, ); Some(sampled_texture.default_view.clone()) } else {