Skip to content

Regression: wgpu 23 adds extra dispatch on Vulkan for indirect buffer copy, breaks binding reuse #6567

Open
@djeedai

Description

@djeedai

Description

On Vulkan (win11) with wgpu 23, every single of my indirect dispatch is now preceded by a vkCmdDispatch that I never dispatched myself. The dispatch seems to copy the indirect args from my buffer into a wgpu-owned buffer. The dispatch occurs just-in-time, after all bindings have been set for my own indirect dispatch, which means I get:

  1. set_pipeline (my pipeline)
  2. bunch of set_bind_group (my bind groups)
  3. set_pipeline (wgpu)
  4. bunch of set_bind_group (wgpu)
  5. vkCmdDispatch
  6. same as 1.
  7. same as 2.
  8. vkCmdIndirectDispatch

Step 3 to 5 didn't exist before, and not only look useless (why does wgpu copy my indirect params, I already took care of maintaining a buffer for them, it's not to have that work ignored) but also adds a lot of unnecessary state changes (steps 1. and 2., overwritten by 3. and 4.) which are slow.

Repro steps

git clone https://github.com/djeedai/bevy_hanabi.git -b u/bevy15
cargo r --example firework --no-default-features --features="bevy/bevy_winit bevy/bevy_pbr 3d "

Expected vs observed behavior

Same as previously, no step 3. and 4. above, which do not correspond to any API call made from Rust.

Extra materials

RenderDoc capture:
wgpu-extra-dispatch-vulkan-win11.zip

The follow results from a single indirect dispatch (I never called dispatch_workgroup() (non-indirect)):
image

Pipeline state of the injected (non-indirect) dispatch, showing it copies from my buffer to a wgpu one:
image

Platform

wgpu 23, win11, bevy 0.15-rc.3

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: performanceHow fast things goarea: validationIssues related to validation, diagnostics, and error handling

    Type

    No type

    Projects

    Status

    Todo

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions