From ecd000f15fce3a0b6d7dee76969e15b0589a037c Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Thu, 21 Mar 2024 14:52:10 +0100 Subject: [PATCH 01/11] Use downlevel flags to identify need for CubeArray textures # Conflicts: # crates/bevy_pbr/Cargo.toml # crates/bevy_pbr/src/render/light.rs # crates/bevy_pbr/src/render/mesh.rs # crates/bevy_pbr/src/render/mesh_view_bindings.rs # crates/bevy_render/src/render_resource/pipeline_cache.rs --- crates/bevy_pbr/Cargo.toml | 8 +++ crates/bevy_pbr/src/render/light.rs | 55 ++++++++++--------- crates/bevy_pbr/src/render/mesh.rs | 11 ++-- .../bevy_pbr/src/render/mesh_view_bindings.rs | 26 ++++----- .../src/render_resource/pipeline_cache.rs | 2 +- 5 files changed, 56 insertions(+), 46 deletions(-) diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index d75be9f3c9d07..3a80270eeaee9 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -51,6 +51,14 @@ bincode = "1" range-alloc = "0.1" nonmax = "0.5" static_assertions = "1" +wgpu = { version = "0.19.3", default-features = false, features = [ + "wgsl", + "dx12", + "metal", + "naga", + "naga-ir", + "fragile-send-sync-non-atomic-wasm", +] } [lints] workspace = true diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index e616ee250c19f..bb630a6ea85b6 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -12,7 +12,7 @@ use bevy_render::{ render_graph::{Node, NodeRunError, RenderGraphContext}, render_phase::*, render_resource::*, - renderer::{RenderContext, RenderDevice, RenderQueue}, + renderer::{RenderAdapter, RenderContext, RenderDevice, RenderQueue}, texture::*, view::{ExtractedView, RenderLayers, ViewVisibility, VisibleEntities}, Extract, @@ -23,6 +23,7 @@ use bevy_utils::tracing::info_span; use bevy_utils::tracing::{error, warn}; use nonmax::NonMaxU32; use std::{hash::Hash, num::NonZeroU64, ops::Range}; +use wgpu::DownlevelFlags; use crate::*; @@ -681,6 +682,7 @@ pub fn prepare_lights( mut texture_cache: ResMut, render_device: Res, render_queue: Res, + render_adapter: Res, mut global_light_meta: ResMut, mut light_meta: ResMut, views: Query< @@ -1208,34 +1210,35 @@ pub fn prepare_lights( } } + let point_light_texture_descriptor = if render_adapter.get_downlevel_capabilities().flags.contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) { + &TextureViewDescriptor { + label: Some("point_light_shadow_map_array_texture_view"), + format: None, + dimension: Some(TextureViewDimension::CubeArray), + aspect: TextureAspect::DepthOnly, + base_mip_level: 0, + mip_level_count: None, + base_array_layer: 0, + array_layer_count: None, + } + } else { + &TextureViewDescriptor { + label: Some("point_light_shadow_map_array_texture_view"), + format: None, + dimension: Some(TextureViewDimension::Cube), + aspect: TextureAspect::DepthOnly, + base_mip_level: 0, + mip_level_count: None, + base_array_layer: 0, + array_layer_count: None, + } + }; + let point_light_depth_texture_view = point_light_depth_texture .texture - .create_view(&TextureViewDescriptor { - label: Some("point_light_shadow_map_array_texture_view"), - format: None, - // NOTE: iOS Simulator is missing CubeArray support so we use Cube instead. - // See https://github.com/bevyengine/bevy/pull/12052 - remove if support is added. - #[cfg(all( - not(feature = "ios_simulator"), - any( - not(feature = "webgl"), - not(target_arch = "wasm32"), - feature = "webgpu" - ) - ))] - dimension: Some(TextureViewDimension::CubeArray), - #[cfg(any( - feature = "ios_simulator", - all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")) - ))] - dimension: Some(TextureViewDimension::Cube), - aspect: TextureAspect::DepthOnly, - base_mip_level: 0, - mip_level_count: None, - base_array_layer: 0, - array_layer_count: None, - }); + .create_view(point_light_texture_descriptor); + let directional_light_depth_texture_view = directional_light_depth_texture .texture .create_view(&TextureViewDescriptor { diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 6ba0bf5528d71..dfecab47280f5 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -21,8 +21,10 @@ use bevy_render::{ render_asset::RenderAssets, render_phase::{PhaseItem, RenderCommand, RenderCommandResult, TrackedRenderPass}, render_resource::*, - renderer::{RenderDevice, RenderQueue}, - texture::{BevyDefault, DefaultImageSampler, GpuImage, ImageSampler, TextureFormatPixelInfo}, + renderer::{RenderAdapter, RenderDevice, RenderQueue}, + texture::{ + BevyDefault, DefaultImageSampler, GpuImage, Image, ImageSampler, TextureFormatPixelInfo, + }, view::{ViewTarget, ViewUniformOffset, ViewVisibility}, Extract, }; @@ -369,15 +371,16 @@ impl FromWorld for MeshPipeline { fn from_world(world: &mut World) -> Self { let mut system_state: SystemState<( Res, + Res, Res, Res, )> = SystemState::new(world); - let (render_device, default_sampler, render_queue) = system_state.get_mut(world); + let (render_device, render_adapter, default_sampler, render_queue) = system_state.get_mut(world); let clustered_forward_buffer_binding_type = render_device .get_supported_read_only_binding_type(CLUSTERED_FORWARD_STORAGE_BUFFER_COUNT); let view_layouts = - generate_view_layouts(&render_device, clustered_forward_buffer_binding_type); + generate_view_layouts(&render_device, &render_adapter, clustered_forward_buffer_binding_type); // A 1x1x1 'all 1.0' texture to use as a dummy texture to use in place of optional StandardMaterial textures let dummy_white_gpu_image = { diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index 7d8f129dab366..6446101884ca8 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -20,6 +20,8 @@ use bevy_render::{ texture::{BevyDefault, FallbackImage, FallbackImageMsaa, FallbackImageZero, Image}, view::{Msaa, ViewUniform, ViewUniforms}, }; +use bevy_render::renderer::RenderAdapter; +use wgpu::DownlevelFlags; #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] use bevy_render::render_resource::binding_types::texture_cube; @@ -171,7 +173,9 @@ fn layout_entries( clustered_forward_buffer_binding_type: BufferBindingType, layout_key: MeshPipelineViewLayoutKey, render_device: &RenderDevice, + render_adapter: &RenderAdapter ) -> Vec { + let mut entries = DynamicBindGroupLayoutEntries::new_with_indices( ShaderStages::FRAGMENT, ( @@ -185,20 +189,11 @@ fn layout_entries( // Point Shadow Texture Cube Array ( 2, - #[cfg(all( - not(feature = "ios_simulator"), - any( - not(feature = "webgl"), - not(target_arch = "wasm32"), - feature = "webgpu" - ) - ))] - texture_cube_array(TextureSampleType::Depth), - #[cfg(any( - feature = "ios_simulator", - all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")) - ))] - texture_cube(TextureSampleType::Depth), + if render_adapter.get_downlevel_capabilities().flags.contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) { + texture_cube_array(TextureSampleType::Depth) + } else { + texture_cube(TextureSampleType::Depth) + }, ), // Point Shadow Texture Array Sampler (3, sampler(SamplerBindingType::Comparison)), @@ -322,11 +317,12 @@ fn layout_entries( /// [`MeshPipelineViewLayoutKey`] flags. pub fn generate_view_layouts( render_device: &RenderDevice, + render_adapter: &RenderAdapter, clustered_forward_buffer_binding_type: BufferBindingType, ) -> [MeshPipelineViewLayout; MeshPipelineViewLayoutKey::COUNT] { array::from_fn(|i| { let key = MeshPipelineViewLayoutKey::from_bits_truncate(i as u32); - let entries = layout_entries(clustered_forward_buffer_binding_type, key, render_device); + let entries = layout_entries(clustered_forward_buffer_binding_type, key, render_device, render_adapter); #[cfg(debug_assertions)] let texture_count: usize = entries diff --git a/crates/bevy_render/src/render_resource/pipeline_cache.rs b/crates/bevy_render/src/render_resource/pipeline_cache.rs index f24ab7d8b578d..fc8e7803c365c 100644 --- a/crates/bevy_render/src/render_resource/pipeline_cache.rs +++ b/crates/bevy_render/src/render_resource/pipeline_cache.rs @@ -286,7 +286,7 @@ impl ShaderCache { shader_defs.push("SIXTEEN_BYTE_ALIGNMENT".into()); } - if cfg!(feature = "ios_simulator") { + if !self.composer.capabilities.contains(Capabilities::CUBE_ARRAY_TEXTURES) { shader_defs.push("NO_CUBE_ARRAY_TEXTURES_SUPPORT".into()); } From d27fab8fa2f890b5a1814bd9fbed616a57dfe71e Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Tue, 2 Apr 2024 16:00:49 +0200 Subject: [PATCH 02/11] Keep features array empty for WGPU # Conflicts: # crates/bevy_pbr/Cargo.toml --- crates/bevy_pbr/Cargo.toml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index 3a80270eeaee9..2847853c84c89 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -51,14 +51,7 @@ bincode = "1" range-alloc = "0.1" nonmax = "0.5" static_assertions = "1" -wgpu = { version = "0.19.3", default-features = false, features = [ - "wgsl", - "dx12", - "metal", - "naga", - "naga-ir", - "fragile-send-sync-non-atomic-wasm", -] } +wgpu = { version = "0.19.3", default-features = false, features = [] } [lints] workspace = true From 2bcb0060ed7d096055d3357b8d051b3ddc4e9858 Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Tue, 2 Apr 2024 16:31:50 +0200 Subject: [PATCH 03/11] Fix CI errors --- crates/bevy_pbr/src/render/light.rs | 19 +++++++++++-------- crates/bevy_pbr/src/render/mesh.rs | 14 ++++++++------ .../bevy_pbr/src/render/mesh_view_bindings.rs | 18 +++++++++++++----- .../src/render_resource/pipeline_cache.rs | 6 +++++- 4 files changed, 37 insertions(+), 20 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index bb630a6ea85b6..e39b74862f11e 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -1210,7 +1210,11 @@ pub fn prepare_lights( } } - let point_light_texture_descriptor = if render_adapter.get_downlevel_capabilities().flags.contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) { + let point_light_texture_descriptor = if render_adapter + .get_downlevel_capabilities() + .flags + .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) + { &TextureViewDescriptor { label: Some("point_light_shadow_map_array_texture_view"), format: None, @@ -1221,7 +1225,7 @@ pub fn prepare_lights( base_array_layer: 0, array_layer_count: None, } - } else { + } else { &TextureViewDescriptor { label: Some("point_light_shadow_map_array_texture_view"), format: None, @@ -1231,13 +1235,12 @@ pub fn prepare_lights( mip_level_count: None, base_array_layer: 0, array_layer_count: None, - } - }; + } + }; - let point_light_depth_texture_view = - point_light_depth_texture - .texture - .create_view(point_light_texture_descriptor); + let point_light_depth_texture_view = point_light_depth_texture + .texture + .create_view(point_light_texture_descriptor); let directional_light_depth_texture_view = directional_light_depth_texture .texture diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index dfecab47280f5..a58b3d9fc2a20 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -22,9 +22,7 @@ use bevy_render::{ render_phase::{PhaseItem, RenderCommand, RenderCommandResult, TrackedRenderPass}, render_resource::*, renderer::{RenderAdapter, RenderDevice, RenderQueue}, - texture::{ - BevyDefault, DefaultImageSampler, GpuImage, Image, ImageSampler, TextureFormatPixelInfo, - }, + texture::{BevyDefault, DefaultImageSampler, GpuImage, ImageSampler, TextureFormatPixelInfo}, view::{ViewTarget, ViewUniformOffset, ViewVisibility}, Extract, }; @@ -375,12 +373,16 @@ impl FromWorld for MeshPipeline { Res, Res, )> = SystemState::new(world); - let (render_device, render_adapter, default_sampler, render_queue) = system_state.get_mut(world); + let (render_device, render_adapter, default_sampler, render_queue) = + system_state.get_mut(world); let clustered_forward_buffer_binding_type = render_device .get_supported_read_only_binding_type(CLUSTERED_FORWARD_STORAGE_BUFFER_COUNT); - let view_layouts = - generate_view_layouts(&render_device, &render_adapter, clustered_forward_buffer_binding_type); + let view_layouts = generate_view_layouts( + &render_device, + &render_adapter, + clustered_forward_buffer_binding_type, + ); // A 1x1x1 'all 1.0' texture to use as a dummy texture to use in place of optional StandardMaterial textures let dummy_white_gpu_image = { diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index 6446101884ca8..1488c00d037bb 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -12,6 +12,7 @@ use bevy_ecs::{ entity::Entity, system::{Commands, Query, Res}, }; +use bevy_render::renderer::RenderAdapter; use bevy_render::{ globals::{GlobalsBuffer, GlobalsUniform}, render_asset::RenderAssets, @@ -20,7 +21,6 @@ use bevy_render::{ texture::{BevyDefault, FallbackImage, FallbackImageMsaa, FallbackImageZero, Image}, view::{Msaa, ViewUniform, ViewUniforms}, }; -use bevy_render::renderer::RenderAdapter; use wgpu::DownlevelFlags; #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] @@ -173,9 +173,8 @@ fn layout_entries( clustered_forward_buffer_binding_type: BufferBindingType, layout_key: MeshPipelineViewLayoutKey, render_device: &RenderDevice, - render_adapter: &RenderAdapter + render_adapter: &RenderAdapter, ) -> Vec { - let mut entries = DynamicBindGroupLayoutEntries::new_with_indices( ShaderStages::FRAGMENT, ( @@ -189,7 +188,11 @@ fn layout_entries( // Point Shadow Texture Cube Array ( 2, - if render_adapter.get_downlevel_capabilities().flags.contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) { + if render_adapter + .get_downlevel_capabilities() + .flags + .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) + { texture_cube_array(TextureSampleType::Depth) } else { texture_cube(TextureSampleType::Depth) @@ -322,7 +325,12 @@ pub fn generate_view_layouts( ) -> [MeshPipelineViewLayout; MeshPipelineViewLayoutKey::COUNT] { array::from_fn(|i| { let key = MeshPipelineViewLayoutKey::from_bits_truncate(i as u32); - let entries = layout_entries(clustered_forward_buffer_binding_type, key, render_device, render_adapter); + let entries = layout_entries( + clustered_forward_buffer_binding_type, + key, + render_device, + render_adapter, + ); #[cfg(debug_assertions)] let texture_count: usize = entries diff --git a/crates/bevy_render/src/render_resource/pipeline_cache.rs b/crates/bevy_render/src/render_resource/pipeline_cache.rs index fc8e7803c365c..6c987b43c82b4 100644 --- a/crates/bevy_render/src/render_resource/pipeline_cache.rs +++ b/crates/bevy_render/src/render_resource/pipeline_cache.rs @@ -286,7 +286,11 @@ impl ShaderCache { shader_defs.push("SIXTEEN_BYTE_ALIGNMENT".into()); } - if !self.composer.capabilities.contains(Capabilities::CUBE_ARRAY_TEXTURES) { + if !self + .composer + .capabilities + .contains(Capabilities::CUBE_ARRAY_TEXTURES) + { shader_defs.push("NO_CUBE_ARRAY_TEXTURES_SUPPORT".into()); } From 1d369cf6cf1181309c83363eb8115d001008ddab Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Tue, 2 Apr 2024 16:42:43 +0200 Subject: [PATCH 04/11] Re-export wgpu::DownlevelFlags from bevy_render --- crates/bevy_pbr/Cargo.toml | 1 - crates/bevy_pbr/src/render/light.rs | 2 +- crates/bevy_pbr/src/render/mesh_view_bindings.rs | 2 +- crates/bevy_render/src/lib.rs | 1 + 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/crates/bevy_pbr/Cargo.toml b/crates/bevy_pbr/Cargo.toml index 2847853c84c89..d75be9f3c9d07 100644 --- a/crates/bevy_pbr/Cargo.toml +++ b/crates/bevy_pbr/Cargo.toml @@ -51,7 +51,6 @@ bincode = "1" range-alloc = "0.1" nonmax = "0.5" static_assertions = "1" -wgpu = { version = "0.19.3", default-features = false, features = [] } [lints] workspace = true diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index e39b74862f11e..02c39d473b9b2 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -23,7 +23,7 @@ use bevy_utils::tracing::info_span; use bevy_utils::tracing::{error, warn}; use nonmax::NonMaxU32; use std::{hash::Hash, num::NonZeroU64, ops::Range}; -use wgpu::DownlevelFlags; +use bevy_render::DownlevelFlags; use crate::*; diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index 1488c00d037bb..b8d715e5dadc2 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -21,7 +21,7 @@ use bevy_render::{ texture::{BevyDefault, FallbackImage, FallbackImageMsaa, FallbackImageZero, Image}, view::{Msaa, ViewUniform, ViewUniforms}, }; -use wgpu::DownlevelFlags; +use bevy_render::DownlevelFlags; #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] use bevy_render::render_resource::binding_types::texture_cube; diff --git a/crates/bevy_render/src/lib.rs b/crates/bevy_render/src/lib.rs index 78b8638571cca..27fc94a61abbc 100644 --- a/crates/bevy_render/src/lib.rs +++ b/crates/bevy_render/src/lib.rs @@ -55,6 +55,7 @@ pub mod prelude { use bevy_ecs::schedule::ScheduleBuildSettings; use bevy_utils::prelude::default; pub use extract_param::Extract; +pub use wgpu::DownlevelFlags; use bevy_hierarchy::ValidParentCheckPlugin; use bevy_window::{PrimaryWindow, RawHandleWrapper}; From 2e9876d38f323f06c7c28d8ce764d81e6a6fe8a3 Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Tue, 2 Apr 2024 16:43:50 +0200 Subject: [PATCH 05/11] Formatting --- crates/bevy_pbr/src/render/light.rs | 2 +- crates/bevy_pbr/src/render/mesh_view_bindings.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 02c39d473b9b2..dbf9604a36749 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -3,6 +3,7 @@ use bevy_core_pipeline::core_3d::{Transparent3d, CORE_3D_DEPTH_FORMAT}; use bevy_ecs::prelude::*; use bevy_ecs::{entity::EntityHashMap, system::lifetimeless::Read}; use bevy_math::{Mat4, UVec3, UVec4, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; +use bevy_render::DownlevelFlags; use bevy_render::{ camera::Camera, diagnostic::RecordDiagnostics, @@ -23,7 +24,6 @@ use bevy_utils::tracing::info_span; use bevy_utils::tracing::{error, warn}; use nonmax::NonMaxU32; use std::{hash::Hash, num::NonZeroU64, ops::Range}; -use bevy_render::DownlevelFlags; use crate::*; diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index b8d715e5dadc2..288ffc3c1c894 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -13,6 +13,7 @@ use bevy_ecs::{ system::{Commands, Query, Res}, }; use bevy_render::renderer::RenderAdapter; +use bevy_render::DownlevelFlags; use bevy_render::{ globals::{GlobalsBuffer, GlobalsUniform}, render_asset::RenderAssets, @@ -21,7 +22,6 @@ use bevy_render::{ texture::{BevyDefault, FallbackImage, FallbackImageMsaa, FallbackImageZero, Image}, view::{Msaa, ViewUniform, ViewUniforms}, }; -use bevy_render::DownlevelFlags; #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] use bevy_render::render_resource::binding_types::texture_cube; From 254fcb395b6d8631ce2fd5e0359c12cd56af58a2 Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Thu, 23 May 2024 15:33:11 +0200 Subject: [PATCH 06/11] Merge fixes --- crates/bevy_pbr/src/render/light.rs | 9 +++++---- crates/bevy_pbr/src/render/mesh.rs | 4 +--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 75581835fecc2..0099b8bbe69e5 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -4,8 +4,6 @@ use bevy_ecs::entity::EntityHashSet; use bevy_ecs::prelude::*; use bevy_ecs::{entity::EntityHashMap, system::lifetimeless::Read}; use bevy_math::{Mat4, UVec3, UVec4, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; -use bevy_render::renderer::RenderAdapter; -use bevy_render::renderer::RenderDevice; use bevy_render::mesh::Mesh; use bevy_render::{ DownlevelFlags, @@ -17,7 +15,7 @@ use bevy_render::{ render_graph::{Node, NodeRunError, RenderGraphContext}, render_phase::*, render_resource::*, - renderer::{RenderContext, RenderQueue}, + renderer::{RenderContext, RenderDevice, RenderAdapter, RenderQueue}, texture::*, view::{ExtractedView, RenderLayers, ViewVisibility, VisibleEntities, WithMesh}, Extract, @@ -1277,7 +1275,10 @@ pub fn prepare_lights( } } - let point_light_texture_descriptor = if true + let point_light_texture_descriptor = if render_adapter + .get_downlevel_capabilities() + .flags + .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) { &TextureViewDescriptor { label: Some("point_light_shadow_map_array_texture_view"), diff --git a/crates/bevy_pbr/src/render/mesh.rs b/crates/bevy_pbr/src/render/mesh.rs index 6f89ce30ac34c..af3e3f78eb099 100644 --- a/crates/bevy_pbr/src/render/mesh.rs +++ b/crates/bevy_pbr/src/render/mesh.rs @@ -13,7 +13,6 @@ use bevy_ecs::{ system::{lifetimeless::*, SystemParamItem, SystemState}, }; use bevy_math::{Affine3, Rect, UVec2, Vec3, Vec4}; -use bevy_render::renderer::RenderAdapter; use bevy_render::{ batching::{ gpu_preprocessing::{ @@ -1065,13 +1064,12 @@ impl FromWorld for MeshPipeline { fn from_world(world: &mut World) -> Self { let mut system_state: SystemState<( Res, - Res, Res, Res, Res, )> = SystemState::new(world); - let (render_device, render_adapter, default_sampler, render_queue, view_layouts) = + let (render_device, default_sampler, render_queue, view_layouts) = system_state.get_mut(world); let clustered_forward_buffer_binding_type = render_device From b4c793d34137e17f04fc71ea20f702068d7958df Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Thu, 23 May 2024 15:37:34 +0200 Subject: [PATCH 07/11] Formatting --- crates/bevy_pbr/src/render/light.rs | 9 ++++----- crates/bevy_pbr/src/render/mesh_view_bindings.rs | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 0099b8bbe69e5..c99f1ce2cca38 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -6,7 +6,6 @@ use bevy_ecs::{entity::EntityHashMap, system::lifetimeless::Read}; use bevy_math::{Mat4, UVec3, UVec4, Vec2, Vec3, Vec3Swizzles, Vec4, Vec4Swizzles}; use bevy_render::mesh::Mesh; use bevy_render::{ - DownlevelFlags, camera::Camera, diagnostic::RecordDiagnostics, mesh::GpuMesh, @@ -15,10 +14,10 @@ use bevy_render::{ render_graph::{Node, NodeRunError, RenderGraphContext}, render_phase::*, render_resource::*, - renderer::{RenderContext, RenderDevice, RenderAdapter, RenderQueue}, + renderer::{RenderAdapter, RenderContext, RenderDevice, RenderQueue}, texture::*, view::{ExtractedView, RenderLayers, ViewVisibility, VisibleEntities, WithMesh}, - Extract, + DownlevelFlags, Extract, }; use bevy_transform::{components::GlobalTransform, prelude::Transform}; #[cfg(feature = "trace")] @@ -684,14 +683,14 @@ pub(crate) fn spot_light_projection_matrix(angle: f32) -> Mat4 { pub struct PrepareLightsWarningEmitted { max_directional_lights: bool, - max_cascades_per_light: bool + max_cascades_per_light: bool, } impl Default for PrepareLightsWarningEmitted { fn default() -> Self { Self { max_directional_lights: false, - max_cascades_per_light: false + max_cascades_per_light: false, } } } diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index d08ec053701b5..4ebc3ef756db4 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -16,16 +16,16 @@ use bevy_ecs::{ }; use bevy_math::Vec4; use bevy_render::{ - DownlevelFlags, globals::{GlobalsBuffer, GlobalsUniform}, render_asset::RenderAssets, render_resource::{binding_types::*, *}, - renderer::{RenderDevice, RenderAdapter}, + renderer::{RenderAdapter, RenderDevice}, texture::{BevyDefault, FallbackImage, FallbackImageMsaa, FallbackImageZero, GpuImage}, view::{ Msaa, RenderVisibilityRanges, ViewUniform, ViewUniforms, VISIBILITY_RANGES_STORAGE_BUFFER_COUNT, }, + DownlevelFlags, }; #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] @@ -366,7 +366,7 @@ impl FromWorld for MeshPipelineViewLayouts { visibility_ranges_buffer_binding_type, key, render_device, - render_adapter + render_adapter, ); #[cfg(debug_assertions)] let texture_count: usize = entries @@ -414,7 +414,7 @@ pub fn generate_view_layouts( visibility_ranges_buffer_binding_type, key, render_device, - render_adapter + render_adapter, ); #[cfg(debug_assertions)] From 3b442eaefc9fd48f3e95a2714be4c26cbe04cefe Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Thu, 23 May 2024 15:49:24 +0200 Subject: [PATCH 08/11] Fix CI errors --- crates/bevy_pbr/src/render/light.rs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index c99f1ce2cca38..b589c84c1a880 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -681,20 +681,12 @@ pub(crate) fn spot_light_projection_matrix(angle: f32) -> Mat4 { Mat4::perspective_infinite_reverse_rh(angle * 2.0, 1.0, POINT_LIGHT_NEAR_Z) } +#[derive(Default)] pub struct PrepareLightsWarningEmitted { max_directional_lights: bool, max_cascades_per_light: bool, } -impl Default for PrepareLightsWarningEmitted { - fn default() -> Self { - Self { - max_directional_lights: false, - max_cascades_per_light: false, - } - } -} - #[allow(clippy::too_many_arguments)] pub fn prepare_lights( mut commands: Commands, @@ -770,7 +762,7 @@ pub fn prepare_lights( directional_lights.len(), MAX_DIRECTIONAL_LIGHTS ); - (*warning_emitted).max_directional_lights = true; + warning_emitted.max_directional_lights = true; } if !warning_emitted.max_cascades_per_light @@ -782,7 +774,7 @@ pub fn prepare_lights( "The number of cascades configured for a directional light exceeds the supported limit of {}.", MAX_CASCADES_PER_LIGHT ); - (*warning_emitted).max_cascades_per_light = true; + warning_emitted.max_cascades_per_light = true; } let point_light_count = point_lights From a8baafd39b8dff80956eca336196a6375ee522cd Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Wed, 19 Jun 2024 12:50:48 +0200 Subject: [PATCH 09/11] Fix WebGL2 not picking the correct texture formats --- crates/bevy_pbr/src/render/light.rs | 15 ++++++++++++--- .../bevy_pbr/src/render/mesh_view_bindings.rs | 19 ++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 0dd37698464e0..0436e48e17d54 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -1095,11 +1095,20 @@ pub fn prepare_lights( } } - let point_light_texture_descriptor = if render_adapter + #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] + let supports_cube_array_textures = false; + + #[cfg(any( + not(feature = "webgl"), + not(target_arch = "wasm32"), + feature = "webgpu" + ))] + let supports_cube_array_textures = render_adapter .get_downlevel_capabilities() .flags - .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) - { + .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES); + + let point_light_texture_descriptor = if supports_cube_array_textures { &TextureViewDescriptor { label: Some("point_light_shadow_map_array_texture_view"), format: None, diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index a8742453a939f..44c0fc7962a7a 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -187,6 +187,19 @@ fn layout_entries( render_device: &RenderDevice, render_adapter: &RenderAdapter, ) -> Vec { + #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] + let supports_cube_array_textures = false; + + #[cfg(any( + not(feature = "webgl"), + not(target_arch = "wasm32"), + feature = "webgpu" + ))] + let supports_cube_array_textures = render_adapter + .get_downlevel_capabilities() + .flags + .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES); + let mut entries = DynamicBindGroupLayoutEntries::new_with_indices( ShaderStages::FRAGMENT, ( @@ -200,11 +213,7 @@ fn layout_entries( // Point Shadow Texture Cube Array ( 2, - if render_adapter - .get_downlevel_capabilities() - .flags - .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES) - { + if supports_cube_array_textures { texture_cube_array(TextureSampleType::Depth) } else { texture_cube(TextureSampleType::Depth) From 75a4296c232cfa57f4ad89380593954a318dff21 Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Wed, 19 Jun 2024 12:58:30 +0200 Subject: [PATCH 10/11] Fix warnings --- crates/bevy_pbr/src/render/light.rs | 16 ++++++++++++++-- crates/bevy_pbr/src/render/mesh_view_bindings.rs | 15 ++++++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index 0436e48e17d54..ae6ac0c6d592b 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -14,11 +14,18 @@ use bevy_render::{ render_graph::{Node, NodeRunError, RenderGraphContext}, render_phase::*, render_resource::*, - renderer::{RenderAdapter, RenderContext, RenderDevice, RenderQueue}, + renderer::{RenderContext, RenderDevice, RenderQueue}, texture::*, view::{ExtractedView, RenderLayers, ViewVisibility, VisibleEntities, WithMesh}, - DownlevelFlags, Extract, + Extract, }; +#[cfg(any( + not(feature = "webgl"), + not(target_arch = "wasm32"), + feature = "webgpu" +))] +use bevy_render::{renderer::RenderAdapter, DownlevelFlags}; + use bevy_transform::{components::GlobalTransform, prelude::Transform}; #[cfg(feature = "trace")] use bevy_utils::tracing::info_span; @@ -520,6 +527,11 @@ pub fn prepare_lights( mut texture_cache: ResMut, render_device: Res, render_queue: Res, + #[cfg(any( + not(feature = "webgl"), + not(target_arch = "wasm32"), + feature = "webgpu" + ))] render_adapter: Res, mut global_light_meta: ResMut, mut light_meta: ResMut, diff --git a/crates/bevy_pbr/src/render/mesh_view_bindings.rs b/crates/bevy_pbr/src/render/mesh_view_bindings.rs index 44c0fc7962a7a..575d7aba1300a 100644 --- a/crates/bevy_pbr/src/render/mesh_view_bindings.rs +++ b/crates/bevy_pbr/src/render/mesh_view_bindings.rs @@ -25,9 +25,15 @@ use bevy_render::{ Msaa, RenderVisibilityRanges, ViewUniform, ViewUniforms, VISIBILITY_RANGES_STORAGE_BUFFER_COUNT, }, - DownlevelFlags, }; +#[cfg(any( + not(feature = "webgl"), + not(target_arch = "wasm32"), + feature = "webgpu" +))] +use bevy_render::DownlevelFlags; + #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] use bevy_render::render_resource::binding_types::texture_cube; #[cfg(debug_assertions)] @@ -185,7 +191,14 @@ fn layout_entries( visibility_ranges_buffer_binding_type: BufferBindingType, layout_key: MeshPipelineViewLayoutKey, render_device: &RenderDevice, + #[cfg(any( + not(feature = "webgl"), + not(target_arch = "wasm32"), + feature = "webgpu" + ))] render_adapter: &RenderAdapter, + #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] + _render_adapter: &RenderAdapter, ) -> Vec { #[cfg(all(feature = "webgl", target_arch = "wasm32", not(feature = "webgpu")))] let supports_cube_array_textures = false; From 01b5f8843dca92df176c8a7d6d13cbcc45146c89 Mon Sep 17 00:00:00 2001 From: Sam Pettersson Date: Thu, 20 Jun 2024 08:20:10 +0200 Subject: [PATCH 11/11] Update descriptor according to PR feedback --- crates/bevy_pbr/src/render/light.rs | 35 +++++++++++------------------ 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/crates/bevy_pbr/src/render/light.rs b/crates/bevy_pbr/src/render/light.rs index ae6ac0c6d592b..52f98f64976ef 100644 --- a/crates/bevy_pbr/src/render/light.rs +++ b/crates/bevy_pbr/src/render/light.rs @@ -1120,28 +1120,19 @@ pub fn prepare_lights( .flags .contains(DownlevelFlags::CUBE_ARRAY_TEXTURES); - let point_light_texture_descriptor = if supports_cube_array_textures { - &TextureViewDescriptor { - label: Some("point_light_shadow_map_array_texture_view"), - format: None, - dimension: Some(TextureViewDimension::CubeArray), - aspect: TextureAspect::DepthOnly, - base_mip_level: 0, - mip_level_count: None, - base_array_layer: 0, - array_layer_count: None, - } - } else { - &TextureViewDescriptor { - label: Some("point_light_shadow_map_array_texture_view"), - format: None, - dimension: Some(TextureViewDimension::Cube), - aspect: TextureAspect::DepthOnly, - base_mip_level: 0, - mip_level_count: None, - base_array_layer: 0, - array_layer_count: None, - } + let point_light_texture_descriptor = &TextureViewDescriptor { + label: Some("point_light_shadow_map_array_texture_view"), + format: None, + dimension: if supports_cube_array_textures { + Some(TextureViewDimension::CubeArray) + } else { + Some(TextureViewDimension::Cube) + }, + aspect: TextureAspect::DepthOnly, + base_mip_level: 0, + mip_level_count: None, + base_array_layer: 0, + array_layer_count: None, }; let point_light_depth_texture_view = point_light_depth_texture