Skip to content

Commit 6a4e0c8

Browse files
authored
Fix several regressions from recent rendering changes. (#16890)
This commit fixes the following regressions: 1. Transmission-specific calls to shader lighting functions didn't pass the `enable_diffuse` parameter, breaking the `transmission` example. 2. The combination of bindless `StandardMaterial` and bindless lightmaps caused us to blow past the 128 texture limit on M1/M2 chips in some cases, in particular the `depth_of_field` example. gfx-rs/wgpu#3334 should fix this, but in the meantime this patch reduces the number of bindless lightmaps from 16 to 4 in order to stay under the limit. 3. The renderer was crashing on startup on Adreno 610 chips. This PR simply disables bindless on Adreno 610 and lower.
1 parent 2027700 commit 6a4e0c8

File tree

12 files changed

+80
-51
lines changed

12 files changed

+80
-51
lines changed

crates/bevy_pbr/src/light_probe/environment_map.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ use bevy_render::{
6363
BindGroupLayoutEntryBuilder, Sampler, SamplerBindingType, Shader, ShaderStages,
6464
TextureSampleType, TextureView,
6565
},
66-
renderer::RenderDevice,
66+
renderer::{RenderAdapter, RenderDevice},
6767
texture::{FallbackImage, GpuImage},
6868
};
6969

@@ -232,10 +232,11 @@ impl ExtractInstance for EnvironmentMapIds {
232232
/// specular binding arrays respectively, in addition to the sampler.
233233
pub(crate) fn get_bind_group_layout_entries(
234234
render_device: &RenderDevice,
235+
render_adapter: &RenderAdapter,
235236
) -> [BindGroupLayoutEntryBuilder; 4] {
236237
let mut texture_cube_binding =
237238
binding_types::texture_cube(TextureSampleType::Float { filterable: true });
238-
if binding_arrays_are_usable(render_device) {
239+
if binding_arrays_are_usable(render_device, render_adapter) {
239240
texture_cube_binding =
240241
texture_cube_binding.count(NonZero::<u32>::new(MAX_VIEW_LIGHT_PROBES as _).unwrap());
241242
}
@@ -256,8 +257,9 @@ impl<'a> RenderViewEnvironmentMapBindGroupEntries<'a> {
256257
images: &'a RenderAssets<GpuImage>,
257258
fallback_image: &'a FallbackImage,
258259
render_device: &RenderDevice,
260+
render_adapter: &RenderAdapter,
259261
) -> RenderViewEnvironmentMapBindGroupEntries<'a> {
260-
if binding_arrays_are_usable(render_device) {
262+
if binding_arrays_are_usable(render_device, render_adapter) {
261263
let mut diffuse_texture_views = vec![];
262264
let mut specular_texture_views = vec![];
263265
let mut sampler = None;

crates/bevy_pbr/src/light_probe/irradiance_volume.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ use bevy_render::{
140140
binding_types, BindGroupLayoutEntryBuilder, Sampler, SamplerBindingType, Shader,
141141
TextureSampleType, TextureView,
142142
},
143-
renderer::RenderDevice,
143+
renderer::{RenderAdapter, RenderDevice},
144144
texture::{FallbackImage, GpuImage},
145145
};
146146
use bevy_utils::default;
@@ -242,8 +242,9 @@ impl<'a> RenderViewIrradianceVolumeBindGroupEntries<'a> {
242242
images: &'a RenderAssets<GpuImage>,
243243
fallback_image: &'a FallbackImage,
244244
render_device: &RenderDevice,
245+
render_adapter: &RenderAdapter,
245246
) -> RenderViewIrradianceVolumeBindGroupEntries<'a> {
246-
if binding_arrays_are_usable(render_device) {
247+
if binding_arrays_are_usable(render_device, render_adapter) {
247248
RenderViewIrradianceVolumeBindGroupEntries::get_multiple(
248249
render_view_irradiance_volumes,
249250
images,
@@ -328,10 +329,11 @@ impl<'a> RenderViewIrradianceVolumeBindGroupEntries<'a> {
328329
/// respectively.
329330
pub(crate) fn get_bind_group_layout_entries(
330331
render_device: &RenderDevice,
332+
render_adapter: &RenderAdapter,
331333
) -> [BindGroupLayoutEntryBuilder; 2] {
332334
let mut texture_3d_binding =
333335
binding_types::texture_3d(TextureSampleType::Float { filterable: true });
334-
if binding_arrays_are_usable(render_device) {
336+
if binding_arrays_are_usable(render_device, render_adapter) {
335337
texture_3d_binding =
336338
texture_3d_binding.count(NonZero::<u32>::new(MAX_VIEW_LIGHT_PROBES as _).unwrap());
337339
}

crates/bevy_pbr/src/light_probe/mod.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use bevy_render::{
2020
primitives::{Aabb, Frustum},
2121
render_asset::RenderAssets,
2222
render_resource::{DynamicUniformBuffer, Sampler, Shader, ShaderType, TextureView},
23-
renderer::{RenderDevice, RenderQueue},
23+
renderer::{RenderAdapter, RenderDevice, RenderQueue},
2424
settings::WgpuFeatures,
2525
sync_world::RenderEntity,
2626
texture::{FallbackImage, GpuImage},
@@ -778,15 +778,20 @@ pub(crate) fn add_cubemap_texture_view<'a>(
778778
/// enough texture bindings available in the fragment shader.
779779
///
780780
/// 3. If binding arrays aren't supported on the hardware, then we obviously
781-
/// can't use them.
781+
/// can't use them. Adreno <= 610 claims to support bindless, but seems to be
782+
/// too buggy to be usable.
782783
///
783784
/// 4. If binding arrays are supported on the hardware, but they can only be
784785
/// accessed by uniform indices, that's not good enough, and we bail out.
785786
///
786787
/// If binding arrays aren't usable, we disable reflection probes and limit the
787788
/// number of irradiance volumes in the scene to 1.
788-
pub(crate) fn binding_arrays_are_usable(render_device: &RenderDevice) -> bool {
789+
pub(crate) fn binding_arrays_are_usable(
790+
render_device: &RenderDevice,
791+
render_adapter: &RenderAdapter,
792+
) -> bool {
789793
!cfg!(feature = "shader_format_glsl")
794+
&& bevy_render::get_adreno_model(render_adapter).is_none_or(|model| model > 610)
790795
&& render_device.limits().max_storage_textures_per_shader_stage
791796
>= (STANDARD_MATERIAL_FRAGMENT_SHADER_MIN_TEXTURE_BINDINGS + MAX_VIEW_LIGHT_PROBES)
792797
as u32

crates/bevy_pbr/src/lightmap/lightmap.wgsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
#import bevy_pbr::mesh_bindings::mesh
44

55
#ifdef MULTIPLE_LIGHTMAPS_IN_ARRAY
6-
@group(1) @binding(4) var lightmaps_textures: binding_array<texture_2d<f32>>;
7-
@group(1) @binding(5) var lightmaps_samplers: binding_array<sampler>;
6+
@group(1) @binding(4) var lightmaps_textures: binding_array<texture_2d<f32>, 4>;
7+
@group(1) @binding(5) var lightmaps_samplers: binding_array<sampler, 4>;
88
#else // MULTIPLE_LIGHTMAPS_IN_ARRAY
99
@group(1) @binding(4) var lightmaps_texture: texture_2d<f32>;
1010
@group(1) @binding(5) var lightmaps_sampler: sampler;

crates/bevy_pbr/src/lightmap/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ use bevy_reflect::{std_traits::ReflectDefault, Reflect};
5050
use bevy_render::{
5151
render_asset::RenderAssets,
5252
render_resource::{Sampler, Shader, TextureView, WgpuSampler, WgpuTextureView},
53+
renderer::RenderAdapter,
5354
sync_world::MainEntity,
5455
texture::{FallbackImage, GpuImage},
5556
view::ViewVisibility,
@@ -71,7 +72,7 @@ pub const LIGHTMAP_SHADER_HANDLE: Handle<Shader> =
7172
///
7273
/// If bindless textures aren't in use, then only a single lightmap can be bound
7374
/// at a time.
74-
pub const LIGHTMAPS_PER_SLAB: usize = 16;
75+
pub const LIGHTMAPS_PER_SLAB: usize = 4;
7576

7677
/// A plugin that provides an implementation of lightmaps.
7778
pub struct LightmapPlugin;
@@ -332,7 +333,9 @@ impl Default for Lightmap {
332333
impl FromWorld for RenderLightmaps {
333334
fn from_world(world: &mut World) -> Self {
334335
let render_device = world.resource::<RenderDevice>();
335-
let bindless_supported = binding_arrays_are_usable(render_device);
336+
let render_adapter = world.resource::<RenderAdapter>();
337+
338+
let bindless_supported = binding_arrays_are_usable(render_device, render_adapter);
336339

337340
RenderLightmaps {
338341
render_lightmaps: default(),

crates/bevy_pbr/src/render/mesh.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ use bevy_render::{
3434
RenderCommandResult, SortedRenderPhasePlugin, TrackedRenderPass,
3535
},
3636
render_resource::*,
37-
renderer::{RenderDevice, RenderQueue},
37+
renderer::{RenderAdapter, RenderDevice, RenderQueue},
3838
texture::DefaultImageSampler,
3939
view::{
4040
prepare_view_targets, NoFrustumCulling, NoIndirectDrawing, RenderVisibilityRanges,
@@ -1484,11 +1484,12 @@ impl FromWorld for MeshPipeline {
14841484
fn from_world(world: &mut World) -> Self {
14851485
let mut system_state: SystemState<(
14861486
Res<RenderDevice>,
1487+
Res<RenderAdapter>,
14871488
Res<DefaultImageSampler>,
14881489
Res<RenderQueue>,
14891490
Res<MeshPipelineViewLayouts>,
14901491
)> = SystemState::new(world);
1491-
let (render_device, default_sampler, render_queue, view_layouts) =
1492+
let (render_device, render_adapter, default_sampler, render_queue, view_layouts) =
14921493
system_state.get_mut(world);
14931494

14941495
let clustered_forward_buffer_binding_type = render_device
@@ -1532,9 +1533,9 @@ impl FromWorld for MeshPipeline {
15321533
view_layouts: view_layouts.clone(),
15331534
clustered_forward_buffer_binding_type,
15341535
dummy_white_gpu_image,
1535-
mesh_layouts: MeshLayouts::new(&render_device),
1536+
mesh_layouts: MeshLayouts::new(&render_device, &render_adapter),
15361537
per_object_buffer_batch_size: GpuArrayBuffer::<MeshUniform>::batch_size(&render_device),
1537-
binding_arrays_are_usable: binding_arrays_are_usable(&render_device),
1538+
binding_arrays_are_usable: binding_arrays_are_usable(&render_device, &render_adapter),
15381539
skins_use_uniform_buffers: skin::skins_use_uniform_buffers(&render_device),
15391540
}
15401541
}

crates/bevy_pbr/src/render/mesh_bindings.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
//! Bind group layout related definitions for the mesh pipeline.
22
33
use bevy_math::Mat4;
4-
use bevy_render::{mesh::morph::MAX_MORPH_WEIGHTS, render_resource::*, renderer::RenderDevice};
4+
use bevy_render::{
5+
mesh::morph::MAX_MORPH_WEIGHTS,
6+
render_resource::*,
7+
renderer::{RenderAdapter, RenderDevice},
8+
};
59

610
use crate::{binding_arrays_are_usable, render::skin::MAX_JOINTS, LightmapSlab};
711

@@ -194,10 +198,10 @@ impl MeshLayouts {
194198
/// Prepare the layouts used by the default bevy [`Mesh`].
195199
///
196200
/// [`Mesh`]: bevy_render::prelude::Mesh
197-
pub fn new(render_device: &RenderDevice) -> Self {
201+
pub fn new(render_device: &RenderDevice, render_adapter: &RenderAdapter) -> Self {
198202
MeshLayouts {
199203
model_only: Self::model_only_layout(render_device),
200-
lightmapped: Self::lightmapped_layout(render_device),
204+
lightmapped: Self::lightmapped_layout(render_device, render_adapter),
201205
skinned: Self::skinned_layout(render_device),
202206
skinned_motion: Self::skinned_motion_layout(render_device),
203207
morphed: Self::morphed_layout(render_device),
@@ -329,8 +333,11 @@ impl MeshLayouts {
329333
)
330334
}
331335

332-
fn lightmapped_layout(render_device: &RenderDevice) -> BindGroupLayout {
333-
if binding_arrays_are_usable(render_device) {
336+
fn lightmapped_layout(
337+
render_device: &RenderDevice,
338+
render_adapter: &RenderAdapter,
339+
) -> BindGroupLayout {
340+
if binding_arrays_are_usable(render_device, render_adapter) {
334341
render_device.create_bind_group_layout(
335342
"lightmapped_mesh_layout",
336343
&BindGroupLayoutEntries::with_indices(

crates/bevy_pbr/src/render/mesh_view_bindings.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,8 @@ fn layout_entries(
312312
);
313313

314314
// EnvironmentMapLight
315-
let environment_map_entries = environment_map::get_bind_group_layout_entries(render_device);
315+
let environment_map_entries =
316+
environment_map::get_bind_group_layout_entries(render_device, render_adapter);
316317
entries = entries.extend_with_indices((
317318
(17, environment_map_entries[0]),
318319
(18, environment_map_entries[1]),
@@ -323,7 +324,7 @@ fn layout_entries(
323324
// Irradiance volumes
324325
if IRRADIANCE_VOLUMES_ARE_USABLE {
325326
let irradiance_volume_entries =
326-
irradiance_volume::get_bind_group_layout_entries(render_device);
327+
irradiance_volume::get_bind_group_layout_entries(render_device, render_adapter);
327328
entries = entries.extend_with_indices((
328329
(21, irradiance_volume_entries[0]),
329330
(22, irradiance_volume_entries[1]),
@@ -493,6 +494,7 @@ pub struct MeshViewBindGroup {
493494
pub fn prepare_mesh_view_bind_groups(
494495
mut commands: Commands,
495496
render_device: Res<RenderDevice>,
497+
render_adapter: Res<RenderAdapter>,
496498
mesh_pipeline: Res<MeshPipeline>,
497499
shadow_samplers: Res<ShadowSamplers>,
498500
(light_meta, global_light_meta): (Res<LightMeta>, Res<GlobalClusterableObjectMeta>),
@@ -607,6 +609,7 @@ pub fn prepare_mesh_view_bind_groups(
607609
&images,
608610
&fallback_image,
609611
&render_device,
612+
&render_adapter,
610613
);
611614

612615
match environment_map_bind_group_entries {
@@ -642,6 +645,7 @@ pub fn prepare_mesh_view_bind_groups(
642645
&images,
643646
&fallback_image,
644647
&render_device,
648+
&render_adapter,
645649
))
646650
} else {
647651
None

crates/bevy_pbr/src/render/pbr_functions.wgsl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,7 @@ fn apply_pbr_lighting(
443443
}
444444

445445
let transmitted_light_contrib =
446-
lighting::point_light(light_id, &transmissive_lighting_input);
446+
lighting::point_light(light_id, &transmissive_lighting_input, enable_diffuse);
447447
transmitted_light += transmitted_light_contrib * transmitted_shadow;
448448
#endif
449449
}
@@ -501,7 +501,7 @@ fn apply_pbr_lighting(
501501
}
502502

503503
let transmitted_light_contrib =
504-
lighting::spot_light(light_id, &transmissive_lighting_input);
504+
lighting::spot_light(light_id, &transmissive_lighting_input, enable_diffuse);
505505
transmitted_light += transmitted_light_contrib * transmitted_shadow;
506506
#endif
507507
}
@@ -557,7 +557,7 @@ fn apply_pbr_lighting(
557557
}
558558

559559
let transmitted_light_contrib =
560-
lighting::directional_light(i, &transmissive_lighting_input);
560+
lighting::directional_light(i, &transmissive_lighting_input, enable_diffuse);
561561
transmitted_light += transmitted_light_contrib * transmitted_shadow;
562562
#endif
563563
}

crates/bevy_pbr/src/ssr/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ use bevy_render::{
3636
ShaderStages, ShaderType, SpecializedRenderPipeline, SpecializedRenderPipelines,
3737
TextureFormat, TextureSampleType,
3838
},
39-
renderer::{RenderContext, RenderDevice, RenderQueue},
39+
renderer::{RenderAdapter, RenderContext, RenderDevice, RenderQueue},
4040
view::{ExtractedView, Msaa, ViewTarget, ViewUniformOffset},
4141
Render, RenderApp, RenderSet,
4242
};
@@ -354,6 +354,7 @@ impl FromWorld for ScreenSpaceReflectionsPipeline {
354354
fn from_world(world: &mut World) -> Self {
355355
let mesh_view_layouts = world.resource::<MeshPipelineViewLayouts>().clone();
356356
let render_device = world.resource::<RenderDevice>();
357+
let render_adapter = world.resource::<RenderAdapter>();
357358

358359
// Create the bind group layout.
359360
let bind_group_layout = render_device.create_bind_group_layout(
@@ -404,7 +405,7 @@ impl FromWorld for ScreenSpaceReflectionsPipeline {
404405
depth_linear_sampler,
405406
depth_nearest_sampler,
406407
bind_group_layout,
407-
binding_arrays_are_usable: binding_arrays_are_usable(render_device),
408+
binding_arrays_are_usable: binding_arrays_are_usable(render_device, render_adapter),
408409
}
409410
}
410411
}

0 commit comments

Comments
 (0)