LiteFX icon indicating copy to clipboard operation
LiteFX copied to clipboard

Implement indirect draw and dispatch.

Open crud89 opened this issue 1 year ago • 1 comments

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 AppendStructuredBuffer and 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.

crud89 avatar Jan 11 '24 18:01 crud89

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.

crud89 avatar Jan 13 '24 11:01 crud89

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.

crud89 avatar May 05 '24 15:05 crud89