Module: vkd3d Branch: master Commit: 6835e8176ff81b1c4d9f42b1050506ab9dcdf7ee URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/6835e8176ff81b1c4d9f42b1050506... Author: Conor McCarthy <cmccarthy(a)codeweavers.com> Date: Wed Apr 26 15:27:08 2023 +1000 vkd3d-shader/ir: Normalise signatures and input/output registers to the Shader Model 6 pattern. In Shader Model 6 each signature element can span a range of register indices, or 'rows', and system values do not share a register index with non-system values. Inputs and outputs are referenced by element index instead of register index. This patch merges multiple signature elements into a single element under the following conditions: - The register index in a load or store is specified dynamically by including a relative address parameter with a base register index. The dcl_index_range instruction is used to identify these. - A register declaration is split across multiple elements which declare different components of the register. - A patch constant function writes tessellation factors. These are an array in SPIR-V, but in SM 5.x each factor is declared as a separate register, and these are dynamically indexed by the fork/join instance id. Elimination of multiple fork/join phases converts the indices to constants, but merging the signature elements into a single arrayed element matches the SPIR-V output. All references to input/output register indices are converted to element indices. If a relative address is present, the element index is moved up a slot so it cannot be confused with a constant offset. Existing code only handles register index relative addressing for tessellation factors. This patch adds generic support for it. --- libs/vkd3d-shader/dxbc.c | 2 + libs/vkd3d-shader/ir.c | 615 +++++++++++++++++++++++++++ libs/vkd3d-shader/spirv.c | 688 ++++++++++--------------------- libs/vkd3d-shader/vkd3d_shader_private.h | 9 + tests/d3d12.c | 1 - 5 files changed, 845 insertions(+), 470 deletions(-)