Module: vkd3d
Branch: master
Commit: 6835e8176ff81b1c4d9f42b1050506ab9dcdf7ee
URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/6835e8176ff81b1c4d9f42b105050…
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(-)