Description
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:
- set_pipeline (my pipeline)
- bunch of set_bind_group (my bind groups)
- set_pipeline (wgpu)
- bunch of set_bind_group (wgpu)
- vkCmdDispatch
- same as 1.
- same as 2.
- 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)):
Pipeline state of the injected (non-indirect) dispatch, showing it copies from my buffer to a wgpu one:
Platform
wgpu 23, win11, bevy 0.15-rc.3
Metadata
Metadata
Assignees
Type
Projects
Status