Skip to content

Bevy app with pbr_transmission_textures crashes on macOS/Metal after PCSS PR merge #15345

@coreh

Description

@coreh

Bevy version

417e6cc

Relevant system information

SystemInfo { os: "MacOS 15.0 ", kernel: "24.0.0", cpu: "Apple M1 Max", core_count: "10", memory: "32.0 GiB" }`
AdapterInfo { name: "Apple M1 Max", vendor: 0, device: 0, device_type: IntegratedGpu, driver: "", driver_info: "", backend: Metal }

What you did

cargo run --example 3d_scene --features pbr_transmission_textures

What went wrong

Resource limit exceeded: StageInfo { stage: Fragment, counters: ResourceData { buffers: 13, textures: 38, samplers: 17 }, pc_buffer: None, pc_limit: 0, sizes_buffer: Some(12), need_sizes_buffer: true, resources: {ResourceBinding { group: 0, binding: 0 }: BindTarget { buffer: Some(0), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 1 }: BindTarget { buffer: Some(1), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 2 }: BindTarget { buffer: None, texture: Some(0), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 3 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(0)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 4 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(1)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 5 }: BindTarget { buffer: None, texture: Some(1), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 6 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(2)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 7 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(3)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 8 }: BindTarget { buffer: Some(2), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 9 }: BindTarget { buffer: Some(3), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 10 }: BindTarget { buffer: Some(4), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 11 }: BindTarget { buffer: Some(5), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 12 }: BindTarget { buffer: Some(6), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 13 }: BindTarget { buffer: Some(7), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 15 }: BindTarget { buffer: Some(8), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 16 }: BindTarget { buffer: None, texture: Some(2), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 17 }: BindTarget { buffer: None, texture: Some(3), sampler: None, binding_array_size: Some(8), mutable: false }, ResourceBinding { group: 0, binding: 18 }: BindTarget { buffer: None, texture: Some(11), sampler: None, binding_array_size: Some(8), mutable: false }, ResourceBinding { group: 0, binding: 19 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(4)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 20 }: BindTarget { buffer: Some(9), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 21 }: BindTarget { buffer: None, texture: Some(19), sampler: None, binding_array_size: Some(8), mutable: false }, ResourceBinding { group: 0, binding: 22 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(5)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 23 }: BindTarget { buffer: None, texture: Some(27), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 24 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(6)), binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 29 }: BindTarget { buffer: None, texture: Some(28), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 0, binding: 30 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(7)), binding_array_size: None, mutable: false }, ResourceBinding { group: 1, binding: 0 }: BindTarget { buffer: Some(10), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 0 }: BindTarget { buffer: Some(11), texture: None, sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 1 }: BindTarget { buffer: None, texture: Some(29), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 2 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(8)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 3 }: BindTarget { buffer: None, texture: Some(30), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 4 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(9)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 5 }: BindTarget { buffer: None, texture: Some(31), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 6 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(10)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 7 }: BindTarget { buffer: None, texture: Some(32), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 8 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(11)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 9 }: BindTarget { buffer: None, texture: Some(33), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 10 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(12)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 11 }: BindTarget { buffer: None, texture: Some(34), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 12 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(13)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 15 }: BindTarget { buffer: None, texture: Some(35), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 16 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(14)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 17 }: BindTarget { buffer: None, texture: Some(36), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 18 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(15)), binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 19 }: BindTarget { buffer: None, texture: Some(37), sampler: None, binding_array_size: None, mutable: false }, ResourceBinding { group: 2, binding: 20 }: BindTarget { buffer: None, texture: None, sampler: Some(Resource(16)), binding_array_size: None, mutable: false }} }    
2024-09-21T03:11:45.569610Z ERROR log: Handling wgpu errors as fatal by default

Additional information

Looks like we're exceeding the limit on bindings. We might need to gate PCSS bindings on a feature flag, or change how we set up the bindings to only bind the actually used textures/samplers.

Edit: Looking a bit more into it, it looks like we're not hitting the texture limit. The limit is exclusively on samplers, maybe we can virtualize the samplers, as suggested here: google/filament#5788

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-RenderingDrawing game state to the screenC-BugAn unexpected or incorrect behaviorO-MacOSSpecific to the MacOS (Apple) desktop operating systemS-Needs-DesignThis issue requires design work to think about how it would best be accomplished

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions