On Tue Aug 8 20:11:16 2023 +0000, Esme Povirk wrote:
> Wouldn't this be implied by the transitive property?
I based this off the checks in `test_tiff_properties`, which did all three checks.
I could certainly remove one to avoid redundancy.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/3524#note_41713
Recap:
I implemented relative addressing in !229, but I was suggested to handle register indexes by moving all the registers to the heap, which I did in my [nonconst-offsets-6](https://gitlab.winehq.org/fcasas/vkd3d/-/commits/noncon… branch. A part of this implementation required !269, but I was asked to try to turn the sm4 register structs into the vkd3d-shader register structs instead, to get closer to a common low level IR.
This is the first part of that transformation. The whole thing is in my [use_vkd3d_reg_4](https://gitlab.winehq.org/fcasas/vkd3d/-/commits/use_vkd3d… branch.
~~This is built on top of !225 (the first two patches), so it may be good to get that upstream first.~~
---
This patch series aims to do the following replacements:
```
struct sm4_register -> struct vkd3d_shader_register
struct sm4_dst_register -> struct vkd3d_shader_dst_param
struct sm4_src_register -> struct vkd3d_shader_src_param
```
to get us closer to a common level IR and simplify the implementation of relative-addressing.
To achieve this, the fields in the sm4 register structs are replaced with fields in the vkd3d-shader structs or removed altogether, one at the time.
As can be seen when looking at the whole branch, it is possible to do this transformation without having to add additional fields to `struct vkd3d_shader_register`, by restricting each register type to a single `enum vkd3d_sm4_dimension` (and its src registers to a single `enum vkd3d_sm4_swizzle_type`) by default.
The only exception we need so far is for sampler registers: They always have dimension NONE, except when used as arguments of gather instructions, in which case they have dimension VEC4 and SCALAR swizzle. This, and similar exceptions we may find in the future, can be handled using the opcode_info, as in 7/8 [81e17506](https://gitlab.winehq.org/fcasas/vkd3d/-/commit/81e17506ba2cb1fbf….
--
v7: vkd3d-shader/tpf: Get rid of sm4_register.dim.
vkd3d-shader/tpf: Use 's' in src_info to expect sampler register with vec4 dimension.
vkd3d-shader/tpf: Separate dst register write function.
vkd3d-shader/tpf: Separate src register write function.
vkd3d-shader/tpf: Make register_type_table an array of structs with lookup tables.
vkd3d-shader/tpf: Introduce struct tpf_writer to group sm4 write arguments.
vkd3d-shader/tpf: Use struct vkd3d_shader_register_index in sm4_register.idx[].
vkd3d-shader/tpf: Allow passing NULL register type on hlsl_sm4_register_from_semantic().
vkd3d-shader/tpf: Use enum vkd3d_shader_register_type in sm4_register.type.
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/281
There are two motivations for this:
* First, the structure *almost* corresponds to D3D12_SHADER_INPUT_BIND_DESC, and
if more elements were included, it could be used as-is for shader reflection.
There is the quirk that currently we return scan information based on the
shader instructions, whereas d3dcompiler shader reflection expects to get it
from the shader reflection data (i.e. the RDEF chunk), which is particularly
relevant in the case that the RDEF chunk is stripped.
That said, even if we have to introduce an extra scan API to account for this
difference, being able to reuse the same structure seems like a benefit.
In order to reuse this structure, we need to add the following elements:
- Register ID (added in part 1 of this series)
- Sample count (added in part 2 of this series)
- Flags or resource types to distinguish between typed, raw, and structured
buffers. I have not decided which representation makes the most sense;
opinions are welcome.
* Second, I think it makes sense to use this reflection information internally
in spirv.c (and potentially other compiler backends) to declare resources in
the target environment, instead of parsing DCL instructions. The idea here is
that this allows backends to be more agnostic as to how resources are declared
(or inferred) in the frontend, while avoiding the need to synthesize those DCL
instructions in the frontend either [especially since epenthesizing
instructions is more expensive than converting them to NOPs.]
In order to do that, we will need vkd3d_shader_scan_descriptor_info1 to cover
everything that is currently covered by DCL instructions. This needs the same
elements as above (register ID and sample count), but also:
- Structure stride (added in part 2 of this series)
- Constant buffer used width (added in part 2 of this series)
I don't currently have a proof-of-concept using these new elements. On the other
hand, since it's just an extension of an existing API, I figured that seemed
less critical.
This does conflict trivially with 280; I'm submitting it now since 280 is
accepted, but due to Alexandre's vacation may not be committed soon, and since
this is new API I'd rather get comments early anyway.
--
v2: vkd3d-shader: Get rid of the uav_ranges array.
vkd3d-shader: Add register ID to struct vkd3d_shader_descriptor_info1.
vkd3d-shader: Introduce struct vkd3d_shader_scan_descriptor_info1.
vkd3d-shader: Centralize cleanup on error in scan_with_parser().
vkd3d-shader: Factor more code into vkd3d_shader_scan_get_uav_descriptor_info().
https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/295