Commit Graph

8457 Commits

Author SHA1 Message Date
Francisco Casas
32b622d7a5 vkd3d-shader/dxil: Also map destination write masks for system values.
Currently, on what we consider normalized vsir, destination write masks
are not relative to the signature element's mask, even though source
swizzles are. Also for most instructions, the source swizzles are masked
by the destination write mask, as given by vsir_src_is_masked().

The DXIL parser however, is not derelativizing the destination write
masks for system value signature elements, so we fix that to make it
consistent with how other front-ends are handled.

For instance, when the test introduced in commit
ca5bc63e5e is compiled to DXIL using DXC,
and then parsed using vkd3d-compiler, we get the following store
instructions:

    vs_6_0
    .input
    .param POSITION.xyzw, v0.xyzw, float
    .output
    .param SV_Position.xyzw, o0.xyzw, float, POS
    .param SV_CullDistance.x, o1.x, float, CULLDST
    .param SV_ClipDistance.y, o1.y, float, CLIPDST
    .descriptors
    .text
    label l1
        ...
        mov o1.x <v4:f32>, sr1 <s:f32>
        mov o2.x <v4:f32>, sr2 <s:f32> // Note the .x write mask!
        ret

whereas, when compiling using FXC and parsing the TPF using
vkd3d-compiler we get:

    vs_4_0
    .input
    .param POSITION.xyzw, v0.xyzw, float
    .output
    .param SV_POSITION.xyzw, o0.xyzw, float, POS
    .param SV_CULLDISTANCE.x, o1.x, float, CULLDST
    .param SV_CLIPDISTANCE.y, o1.y, float, CLIPDST
    .descriptors
    .text
    label l1
        mov o0.xyzw <v4:f32>, v0.xyzw <v4:f32>
        mov o1.x <v4:f32>, v0.x <v4:f32>
        mov o2.y <v4:f32>, v0.y <v4:f32> // Note the .y write mask.
        ret

This only really matters for cases where we have a system value semantic
whose mask doesn't start at .x, which is very rare. For instance, it
requires the clip/cull distance combo, which share registers, so one of
them pushes the other to start on another component.

According to the tests, the only thing relying on this behaviour is the
handling of private variables for system value semantics on the SPIR-V
backend, which expects destination write masks as if the element started
at .x even though it might not. This is modified then.
2025-10-29 13:14:54 +01:00
Francisco Casas
bc63aaf52d tests/shader_runner_gl: Enable used GL_CLIP_DISTANCEs.
Here I am just printing a trace message on the rare situation where
GL_MAX_CLIP_DISTANCES is less than we need.

The maximum in Direct3D is given by D3D#_CLIP_OR_CULL_DISTANCE_COUNT which
is 8, which seems expectable here.

Alternatively we could add a clip-distance capability and only enable
it if gl_maxClipDistances is >= 8.

Another potential problem is that OpenGL expects the gl_ClipDistance[]
array to be the same size on every shader it is declared, which is a
restriction I am not sure Direct3D has with its SV_ClipDistance
components.

Co-authored-by: Anna (navi) Figueiredo Gomes <agomes@codeweavers.com>
2025-10-29 13:13:44 +01:00
Francisco Casas
ca5bc63e5e tests/hlsl: Add a simpler clip/cull distance test. 2025-10-29 12:26:33 +01:00
Francisco Casas
cb7dac4d65 tests/shader_runner: Introduce a "cull-distance" capability. 2025-10-29 12:24:50 +01:00
Giovanni Mascellani
d3f658d410 tests/hlsl: Skip a tessellation test that is buggy on WARP with SM>=6. 2025-10-28 16:51:20 +01:00
Giovanni Mascellani
84c4a4f835 tests/hlsl: Do not test overflowing a float-to-half typed buffer read.
Native implementations do not behave consistently.
2025-10-28 16:48:21 +01:00
Giovanni Mascellani
b3f5bfdb7e vkd3d-shader/msl: Retrieve the CBV register space from the descriptor information. 2025-10-28 16:46:33 +01:00
Giovanni Mascellani
957c6728f1 vkd3d-shader/msl: Return a raw index from msl_get_binding().
In the future that will involve some computation, and it will not
necessarily correspond to a struct vkd3d_shader_descriptor_binding
object.
2025-10-28 16:42:14 +01:00
Giovanni Mascellani
491fecc6a3 vkd3d-shader/msl: Introduce msl_get_binding(). 2025-10-28 16:36:33 +01:00
Elizabeth Figura
94c9595196 vkd3d-shader/hlsl: Use replace_ir() for fold_conditional_identities(). 2025-10-28 16:30:49 +01:00
Elizabeth Figura
1f40222a0d vkd3d-shader/hlsl: Use replace_ir() for hlsl_fold_constant_exprs(). 2025-10-28 16:30:49 +01:00
Elizabeth Figura
6e8eeb8f7a vkd3d-shader/hlsl: Use replace_ir() for hlsl_fold_constant_identities(). 2025-10-28 16:30:49 +01:00
Elizabeth Figura
bdb31a4983 vkd3d-shader/hlsl: Use replace_ir() for hlsl_fold_constant_swizzles(). 2025-10-28 16:30:49 +01:00
Elizabeth Figura
deb7a67d67 vkd3d-shader/hlsl: Introduce hlsl_block_add_constant(). 2025-10-28 16:30:49 +01:00
Giovanni Mascellani
dedb14e55e tests/hlsl: Tweak hyperbolic functions tests on WARP.
WARP seems to be completely off for large argument values. The
difference quickly becomes of order of magnitudes, not ULPs. So
we ensure we test hyperbolic functions mostly for small arguments,
and skip WARP for large arguments.
2025-10-27 19:01:09 +01:00
Giovanni Mascellani
ca81ffe088 tests/hlsl: Add SM6 behaviour in sm1-const-folding.shader_test.
Which fortunately looks saner than previous shader models.
2025-10-27 19:01:00 +01:00
Giovanni Mascellani
f72307fc9f tests/hlsl: Evaluate asin() with larger error tolerance on SM6.
It currently fails with WARP.
2025-10-27 18:59:13 +01:00
Giovanni Mascellani
85a1fb6e47 tests/hlsl: Use explicit infinities in half.shader_test.
We used to need workarounds when we used scanf() to parse float
numbers, but now we use strtof() which supports "inf" properly.
On the other hand, on some platforms it is the workaround that
now fails with a range error.
2025-10-27 18:57:37 +01:00
Giovanni Mascellani
2b68f488f4 tests/hlsl: Do not test some details of float-to-half conversion.
Native implementations do not behave consistently.
2025-10-27 18:55:58 +01:00
Giovanni Mascellani
303790875b tests/hlsl: Use explicit infinities in cast-to-half.shader_test.
We used to need workarounds when we used scanf() to parse float
numbers, but now we use strtof() which supports "inf" properly.
On the other hand, on some platforms it is the workaround that
now fails with a range error.
2025-10-27 18:53:38 +01:00
Giovanni Mascellani
6654b88407 vkd3d-shader/ir: Check that no modifier is added to a vsir program after lowering. 2025-10-27 18:48:33 +01:00
Giovanni Mascellani
b41e99c036 vkd3d-shader/ir: Use VSIR_OP_SATURATE in insert_fragment_fog_before_ret(). 2025-10-27 18:43:33 +01:00
Giovanni Mascellani
d503fbfd79 vkd3d-shader/ir: Use VSIR_OP_SATURATE in vsir_program_normalise_ps1_output(). 2025-10-27 18:43:33 +01:00
Giovanni Mascellani
617ebb9826 vkd3d-shader/ir: Explicitly assert that vsir_program_normalise_ps1_output() runs before I/O normalization. 2025-10-27 18:43:33 +01:00
Giovanni Mascellani
c1991ba785 vkd3d-shader/ir: Use VSIR_OP_SATURATE in vsir_program_lower_texcoord(). 2025-10-27 18:43:33 +01:00