Implement indirect draw and dispatch.
Describe the pull request
This PR adds support for indirect draw (both indexed and non-indexed) and dispatch. Buffers can be marked with BufferUsage::Indirect to indicate that they store indirect draw commands. New structures (IndirectBatch, IndirectIndexedBatch and IndirectDispatch) have been added, which are not required but recommended to be used to record indirect commands into indirect draw/dispatch buffers, as the command layout is defined by convention.
The Indirect sample shows how to use a compute shader to perform GPU culling to write an indirect buffer, which is then executed on the graphics pipeline to draw simple geometries.
Additionally, some improvements have been made to simplify recording of indirect draw buffers:
- [x] ~~Buffers now support counter variables (which allows to use
AppendStructuredBufferand similar descriptor types).~~ - [x] In Vulkan, unbounded descriptor arrays are no longer required to have pre-defined maximum sizes.
- [x] Shader reflection has been improved to better differ between structured and byte address buffers (though they are semantically the same in Vulkan most of the times anyway).
Related issues
- Closes #73.
Blocking for now, as we wait for SM 6.8 support in DXC to release (and preferably ship with Vulkan SDK). Implementing a workaround for instance indexing in DirectX backend would fragment interfaces too much, with the alternative in form of a SV_StartInstanceLocation vertex shader input waiting to be released.
I've merged all upstream changes and did some final tests, however I keep this blocked until a new Vulkan SDK ships with a recent DXC binary supporting Shader Model 6.8.