Cache depth texture based on usage (#9565)

# Objective

- Currently, the depth textures are cached based on the target. If
multiple camera have the same target but a different
`depth_texture_usage` bevy will just use the same texture and ignore
that setting.

## Solution

- Add the usage as a cache key
This commit is contained in:
IceSentry 2023-09-04 11:26:05 -04:00 committed by GitHub
parent 9309d89bb8
commit d516a27dc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -340,8 +340,22 @@ pub fn prepare_core_3d_depth_textures(
),
>,
) {
let mut render_target_usage = HashMap::default();
for (_, camera, depth_prepass, camera_3d) in &views_3d {
// Default usage required to write to the depth texture
let mut usage: TextureUsages = camera_3d.depth_texture_usages.into();
if depth_prepass.is_some() {
// Required to read the output of the prepass
usage |= TextureUsages::COPY_SRC;
}
render_target_usage
.entry(camera.target.clone())
.and_modify(|u| *u |= usage)
.or_insert_with(|| usage);
}
let mut textures = HashMap::default();
for (entity, camera, depth_prepass, camera_3d) in &views_3d {
for (entity, camera, _, _) in &views_3d {
let Some(physical_target_size) = camera.physical_target_size else {
continue;
};
@ -349,13 +363,6 @@ pub fn prepare_core_3d_depth_textures(
let cached_texture = textures
.entry(camera.target.clone())
.or_insert_with(|| {
// Default usage required to write to the depth texture
let mut usage = camera_3d.depth_texture_usages.into();
if depth_prepass.is_some() {
// Required to read the output of the prepass
usage |= TextureUsages::COPY_SRC;
}
// The size of the depth texture
let size = Extent3d {
depth_or_array_layers: 1,
@ -363,6 +370,10 @@ pub fn prepare_core_3d_depth_textures(
height: physical_target_size.y,
};
let usage = *render_target_usage
.get(&camera.target.clone())
.expect("The depth texture usage should already exist for this target");
let descriptor = TextureDescriptor {
label: Some("view_depth_texture"),
size,