mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
754: Implement MultiDrawIndirect Extensions r=kvark a=cwfitzgerald **Connections** Closes #742. **Description** These extensions, especially when combined with binding indexing, allow the creation of extremely cpu-efficient gpu powered pipelines. Adds two extensions allowing various types of multi-draw-indirect - MULTI_DRAW_INDIRECT (giving `multi_draw_indirect` and `multi_draw_indexed_indirect`) - MULTI_DRAW_INDIRECT_COUNT (giving `multi_draw_indirect_count` and `multi_draw_indexed_indirect_count`) This adds what I believe to be an extra restriction on the `*count` family of functions when compared to the underlying api. The buffer _must_ be large enough to draw `max_count` draws, even if that many draws are never drawn. This makes these operations no more unsafe than indirect would be, which is currently safe. I did not implement these for renderbundles, but there's no reason they couldn't work, so those branches are marked with `unimplemented` as opposed to `unreachable`. Additional Changes: - Added some validation to the normal `draw_*_indirect` functions to prevent buffer overruns. - The DX12 gfx-hal backend requires the strides to _always_ be non-zero, so I modified the normal indirect draws to use explicit strides. - Made device limits and features `pub(crate)` as they need to be checked in random places in the code. **Testing** The change was tested using a modified version of wgpu-rs's texture-array example using a variety of permutations. I have not been able to test regular MULTI_DRAW_INDIRECT on mac, but I see no reason why that wouldn't work. https://github.com/gfx-rs/wgpu-rs/pull/414 Co-authored-by: Connor Fitzgerald <connorwadefitzgerald@gmail.com>