From f6b5efc270ea946419e46302eb0cb47ccfa5fa23 Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Wed, 7 Feb 2024 20:29:36 +0000 Subject: [PATCH 1/8] mipmap levels can be 0 and they should be interpreted as 1 --- crates/bevy_render/src/texture/dds.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_render/src/texture/dds.rs b/crates/bevy_render/src/texture/dds.rs index 16f1aa7240f97..4d0eaf811d2e9 100644 --- a/crates/bevy_render/src/texture/dds.rs +++ b/crates/bevy_render/src/texture/dds.rs @@ -45,7 +45,7 @@ pub fn dds_buffer_to_image( depth_or_array_layers, } .physical_size(texture_format); - image.texture_descriptor.mip_level_count = dds.get_num_mipmap_levels(); + image.texture_descriptor.mip_level_count = std::cmp::max(dds.get_num_mipmap_levels(),1); image.texture_descriptor.format = texture_format; image.texture_descriptor.dimension = if dds.get_depth() > 1 { TextureDimension::D3 From 449448e53d138e750e318ccbc2215825b59cce4c Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Wed, 7 Feb 2024 20:35:12 +0000 Subject: [PATCH 2/8] formatting --- crates/bevy_render/src/texture/dds.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_render/src/texture/dds.rs b/crates/bevy_render/src/texture/dds.rs index 4d0eaf811d2e9..6f5513f849ffe 100644 --- a/crates/bevy_render/src/texture/dds.rs +++ b/crates/bevy_render/src/texture/dds.rs @@ -45,7 +45,7 @@ pub fn dds_buffer_to_image( depth_or_array_layers, } .physical_size(texture_format); - image.texture_descriptor.mip_level_count = std::cmp::max(dds.get_num_mipmap_levels(),1); + image.texture_descriptor.mip_level_count = std::cmp::max(dds.get_num_mipmap_levels(), 1); image.texture_descriptor.format = texture_format; image.texture_descriptor.dimension = if dds.get_depth() > 1 { TextureDimension::D3 From 59467cb423d2e06000fa9dc371afb2d0ca31fffb Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Wed, 7 Feb 2024 22:41:34 +0000 Subject: [PATCH 3/8] Warn on mipmap levels being 0 --- crates/bevy_render/src/texture/dds.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/crates/bevy_render/src/texture/dds.rs b/crates/bevy_render/src/texture/dds.rs index 6f5513f849ffe..e130ad972c54a 100644 --- a/crates/bevy_render/src/texture/dds.rs +++ b/crates/bevy_render/src/texture/dds.rs @@ -45,7 +45,12 @@ pub fn dds_buffer_to_image( depth_or_array_layers, } .physical_size(texture_format); - image.texture_descriptor.mip_level_count = std::cmp::max(dds.get_num_mipmap_levels(), 1); + let mut mip_map_level = dds.get_num_mipmap_levels(); + if mip_map_level == 0 { + warn!("Mipmap levels for texture are 0, bumping them to 1"); + mip_map_level = 1; + } + image.texture_descriptor.mip_level_count = mip_map_level; image.texture_descriptor.format = texture_format; image.texture_descriptor.dimension = if dds.get_depth() > 1 { TextureDimension::D3 From 0854b639c92d3f6012ff1f8a01e9156146934f72 Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Thu, 8 Feb 2024 17:33:24 +0000 Subject: [PATCH 4/8] Address feedback --- crates/bevy_render/src/texture/dds.rs | 15 ++++++++++----- crates/bevy_render/src/texture/image.rs | 7 ++++++- crates/bevy_render/src/texture/image_loader.rs | 2 ++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/crates/bevy_render/src/texture/dds.rs b/crates/bevy_render/src/texture/dds.rs index e130ad972c54a..6cf91d1353c71 100644 --- a/crates/bevy_render/src/texture/dds.rs +++ b/crates/bevy_render/src/texture/dds.rs @@ -7,6 +7,8 @@ use wgpu::{ use super::{CompressedImageFormats, Image, TextureError}; pub fn dds_buffer_to_image( + #[cfg(debug_assertions)] + name: String, buffer: &[u8], supported_compressed_formats: CompressedImageFormats, is_srgb: bool, @@ -45,11 +47,14 @@ pub fn dds_buffer_to_image( depth_or_array_layers, } .physical_size(texture_format); - let mut mip_map_level = dds.get_num_mipmap_levels(); - if mip_map_level == 0 { - warn!("Mipmap levels for texture are 0, bumping them to 1"); - mip_map_level = 1; - } + let mip_map_level = match dds.get_num_mipmap_levels() { + 0 => { + #[cfg(debug_assertions)] + warn_once!("Mipmap levels for texture {} are 0, bumping them to 1", name); + 1 + }, + t => t, + }; image.texture_descriptor.mip_level_count = mip_map_level; image.texture_descriptor.format = texture_format; image.texture_descriptor.dimension = if dds.get_depth() > 1 { diff --git a/crates/bevy_render/src/texture/image.rs b/crates/bevy_render/src/texture/image.rs index 9f29c72018ff0..04495c48b93df 100644 --- a/crates/bevy_render/src/texture/image.rs +++ b/crates/bevy_render/src/texture/image.rs @@ -643,6 +643,8 @@ impl Image { /// Load a bytes buffer in a [`Image`], according to type `image_type`, using the `image` /// crate pub fn from_buffer( + #[cfg(debug_assertions)] + name: String, buffer: &[u8], image_type: ImageType, #[allow(unused_variables)] supported_compressed_formats: CompressedImageFormats, @@ -664,7 +666,10 @@ impl Image { basis_buffer_to_image(buffer, supported_compressed_formats, is_srgb)? } #[cfg(feature = "dds")] - ImageFormat::Dds => dds_buffer_to_image(buffer, supported_compressed_formats, is_srgb)?, + ImageFormat::Dds => dds_buffer_to_image( + #[cfg(debug_assertions)] + name, + buffer, supported_compressed_formats, is_srgb)?, #[cfg(feature = "ktx2")] ImageFormat::Ktx2 => { ktx2_buffer_to_image(buffer, supported_compressed_formats, is_srgb)? diff --git a/crates/bevy_render/src/texture/image_loader.rs b/crates/bevy_render/src/texture/image_loader.rs index d2d5899b6617a..d9d0e19f89b26 100644 --- a/crates/bevy_render/src/texture/image_loader.rs +++ b/crates/bevy_render/src/texture/image_loader.rs @@ -102,6 +102,8 @@ impl AssetLoader for ImageLoader { ImageFormatSetting::Format(format) => ImageType::Format(format), }; Ok(Image::from_buffer( + #[cfg(debug_assertions)] + load_context.path().display().to_string(), &bytes, image_type, self.supported_compressed_formats, From c4d727460b13b04364d9c7c5a137f29eeabdae63 Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Thu, 8 Feb 2024 17:34:54 +0000 Subject: [PATCH 5/8] cargo fmt --- crates/bevy_render/src/texture/dds.rs | 10 ++++++---- crates/bevy_render/src/texture/image.rs | 10 ++++++---- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/crates/bevy_render/src/texture/dds.rs b/crates/bevy_render/src/texture/dds.rs index 6cf91d1353c71..3239caccecbd1 100644 --- a/crates/bevy_render/src/texture/dds.rs +++ b/crates/bevy_render/src/texture/dds.rs @@ -7,8 +7,7 @@ use wgpu::{ use super::{CompressedImageFormats, Image, TextureError}; pub fn dds_buffer_to_image( - #[cfg(debug_assertions)] - name: String, + #[cfg(debug_assertions)] name: String, buffer: &[u8], supported_compressed_formats: CompressedImageFormats, is_srgb: bool, @@ -50,9 +49,12 @@ pub fn dds_buffer_to_image( let mip_map_level = match dds.get_num_mipmap_levels() { 0 => { #[cfg(debug_assertions)] - warn_once!("Mipmap levels for texture {} are 0, bumping them to 1", name); + warn_once!( + "Mipmap levels for texture {} are 0, bumping them to 1", + name + ); 1 - }, + } t => t, }; image.texture_descriptor.mip_level_count = mip_map_level; diff --git a/crates/bevy_render/src/texture/image.rs b/crates/bevy_render/src/texture/image.rs index 04495c48b93df..28aca6882ed39 100644 --- a/crates/bevy_render/src/texture/image.rs +++ b/crates/bevy_render/src/texture/image.rs @@ -643,8 +643,7 @@ impl Image { /// Load a bytes buffer in a [`Image`], according to type `image_type`, using the `image` /// crate pub fn from_buffer( - #[cfg(debug_assertions)] - name: String, + #[cfg(debug_assertions)] name: String, buffer: &[u8], image_type: ImageType, #[allow(unused_variables)] supported_compressed_formats: CompressedImageFormats, @@ -668,8 +667,11 @@ impl Image { #[cfg(feature = "dds")] ImageFormat::Dds => dds_buffer_to_image( #[cfg(debug_assertions)] - name, - buffer, supported_compressed_formats, is_srgb)?, + name, + buffer, + supported_compressed_formats, + is_srgb, + )?, #[cfg(feature = "ktx2")] ImageFormat::Ktx2 => { ktx2_buffer_to_image(buffer, supported_compressed_formats, is_srgb)? From 8824b13a9e546d9985945f4a0e06868390e3e155 Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Thu, 8 Feb 2024 18:02:42 +0000 Subject: [PATCH 6/8] Proper gating of the new param --- crates/bevy_core_pipeline/src/tonemapping/mod.rs | 2 ++ crates/bevy_gltf/src/loader.rs | 8 ++++++++ crates/bevy_render/src/texture/image.rs | 2 +- crates/bevy_render/src/texture/image_loader.rs | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/crates/bevy_core_pipeline/src/tonemapping/mod.rs b/crates/bevy_core_pipeline/src/tonemapping/mod.rs index 0c230deb05c79..0045d9e05047e 100644 --- a/crates/bevy_core_pipeline/src/tonemapping/mod.rs +++ b/crates/bevy_core_pipeline/src/tonemapping/mod.rs @@ -355,6 +355,8 @@ fn setup_tonemapping_lut_image(bytes: &[u8], image_type: ImageType) -> Image { ..default() }); Image::from_buffer( + #[cfg(all(debug_assertions, feature = "dds"))] + "Tonemapping LUT sampler".to_string(), bytes, image_type, CompressedImageFormats::NONE, diff --git a/crates/bevy_gltf/src/loader.rs b/crates/bevy_gltf/src/loader.rs index e04eb97eb91c6..2ce9c2162c8c7 100644 --- a/crates/bevy_gltf/src/loader.rs +++ b/crates/bevy_gltf/src/loader.rs @@ -733,12 +733,18 @@ async fn load_image<'a, 'b>( ) -> Result { let is_srgb = !linear_textures.contains(&gltf_texture.index()); let sampler_descriptor = texture_sampler(&gltf_texture); + #[cfg(all(debug_assertions, feature = "dds"))] + let name = gltf_texture + .name() + .map_or("Unknown GLTF Texture".to_string(), |s| s.to_string()); match gltf_texture.source().source() { gltf::image::Source::View { view, mime_type } => { let start = view.offset(); let end = view.offset() + view.length(); let buffer = &buffer_data[view.buffer().index()][start..end]; let image = Image::from_buffer( + #[cfg(all(debug_assertions, feature = "dds"))] + name, buffer, ImageType::MimeType(mime_type), supported_compressed_formats, @@ -761,6 +767,8 @@ async fn load_image<'a, 'b>( let image_type = ImageType::MimeType(data_uri.mime_type); Ok(ImageOrPath::Image { image: Image::from_buffer( + #[cfg(all(debug_assertions, feature = "dds"))] + name, &bytes, mime_type.map(ImageType::MimeType).unwrap_or(image_type), supported_compressed_formats, diff --git a/crates/bevy_render/src/texture/image.rs b/crates/bevy_render/src/texture/image.rs index 28aca6882ed39..aef212100c21b 100644 --- a/crates/bevy_render/src/texture/image.rs +++ b/crates/bevy_render/src/texture/image.rs @@ -643,7 +643,7 @@ impl Image { /// Load a bytes buffer in a [`Image`], according to type `image_type`, using the `image` /// crate pub fn from_buffer( - #[cfg(debug_assertions)] name: String, + #[cfg(all(debug_assertions, feature = "dds"))] name: String, buffer: &[u8], image_type: ImageType, #[allow(unused_variables)] supported_compressed_formats: CompressedImageFormats, diff --git a/crates/bevy_render/src/texture/image_loader.rs b/crates/bevy_render/src/texture/image_loader.rs index d9d0e19f89b26..44a4fdb9251cf 100644 --- a/crates/bevy_render/src/texture/image_loader.rs +++ b/crates/bevy_render/src/texture/image_loader.rs @@ -102,7 +102,7 @@ impl AssetLoader for ImageLoader { ImageFormatSetting::Format(format) => ImageType::Format(format), }; Ok(Image::from_buffer( - #[cfg(debug_assertions)] + #[cfg(all(debug_assertions, feature = "dds"))] load_context.path().display().to_string(), &bytes, image_type, From 567f782b37facab71b4c3e201016d76a0bb35198 Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Thu, 8 Feb 2024 18:16:51 +0000 Subject: [PATCH 7/8] Add features where needed and check all features --- crates/bevy_core_pipeline/Cargo.toml | 1 + crates/bevy_gltf/Cargo.toml | 1 + crates/bevy_render/src/texture/dds.rs | 2 ++ 3 files changed, 4 insertions(+) diff --git a/crates/bevy_core_pipeline/Cargo.toml b/crates/bevy_core_pipeline/Cargo.toml index 7151f7e437cb1..dcee2df7f550b 100644 --- a/crates/bevy_core_pipeline/Cargo.toml +++ b/crates/bevy_core_pipeline/Cargo.toml @@ -13,6 +13,7 @@ license = "MIT OR Apache-2.0" keywords = ["bevy"] [features] +dds = [] trace = [] webgl = [] webgpu = [] diff --git a/crates/bevy_gltf/Cargo.toml b/crates/bevy_gltf/Cargo.toml index 05cbd9a940e2a..78306fd6db3a9 100644 --- a/crates/bevy_gltf/Cargo.toml +++ b/crates/bevy_gltf/Cargo.toml @@ -9,6 +9,7 @@ license = "MIT OR Apache-2.0" keywords = ["bevy"] [features] +dds = [] pbr_transmission_textures = [] [dependencies] diff --git a/crates/bevy_render/src/texture/dds.rs b/crates/bevy_render/src/texture/dds.rs index 3239caccecbd1..b3ae1e7cfeb87 100644 --- a/crates/bevy_render/src/texture/dds.rs +++ b/crates/bevy_render/src/texture/dds.rs @@ -1,3 +1,5 @@ +#[cfg(debug_assertions)] +use bevy_utils::warn_once; use ddsfile::{Caps2, D3DFormat, Dds, DxgiFormat}; use std::io::Cursor; use wgpu::{ From 7817131a5659d984370bc86da9128aa8f7e76ad9 Mon Sep 17 00:00:00 2001 From: Pablo Alcubilla Date: Thu, 8 Feb 2024 19:05:12 +0000 Subject: [PATCH 8/8] Correctly propagate the new features --- crates/bevy_internal/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/bevy_internal/Cargo.toml b/crates/bevy_internal/Cargo.toml index 32c0068f64a38..a92f3f6ba07ae 100644 --- a/crates/bevy_internal/Cargo.toml +++ b/crates/bevy_internal/Cargo.toml @@ -34,7 +34,7 @@ jpeg = ["bevy_render/jpeg"] bmp = ["bevy_render/bmp"] webp = ["bevy_render/webp"] basis-universal = ["bevy_render/basis-universal"] -dds = ["bevy_render/dds"] +dds = ["bevy_render/dds", "bevy_core_pipeline/dds", "bevy_gltf/dds"] pnm = ["bevy_render/pnm"] ktx2 = ["bevy_render/ktx2"] # For ktx2 supercompression