Commit Graph

6542 Commits

Author SHA1 Message Date
Francisco Casas
412f91a14c vkd3d-shader/hlsl: Always work with the extern resource's component type.
We need to distinguish between the data type of a resource and the data
type of its components. These are usually the same except for 4.0
profiles where an array (or multi-dimensional array) of resources is
still considered a single resource, so it is possible for it to hold
more than one component.

In the latter case, we often need to access the type of a single
component (all components have the same type) instead of the type of the
whole array which often doesn't contain the required information, such
as sampler dimension.

This patch replaces the extern_resource.data_type field with the
extern_resource.component_type field, which points to the type of a
single component in the resource. Using it relieves many other code
paths from considering the possibility of the resource being an array.

This fixes runtime errors reported by UBSan, such as this:

    vkd3d/libs/vkd3d-shader/tpf.c:6075:87: runtime error: load of value 7, which is not a valid value for type '_Bool'

when trying to compile shaders that contain UAV arrays on 4.0 profiles.

Before this commit, tpf.c accesses the

    hlsl_type->e.resource.rasteriser_ordered

field, but on 4.0 and 4.1 profiles these code paths can also be reached
by UAV arrays which are HLSL_CLASS_ARRAY and this field is not supposed
to be accessed.

By coincidence, the value of hlsl_type->e.array.elements_count was being
read because these fields have the same offset in the hlsl_type.e union.
2024-08-14 21:57:21 +02:00
Henri Verbeet
9cf479d4bb vkd3d: Do not include assert.h. 2024-08-13 21:20:28 +02:00
Henri Verbeet
114578fc8a vkd3d-shader/fx: Replace assert() with VKD3D_ASSERT(). 2024-08-13 21:20:28 +02:00
Henri Verbeet
cd9879f237 vkd3d-common: Replace assert() with VKD3D_ASSERT(). 2024-08-13 21:20:28 +02:00
Francisco Casas
355d4c4a86 vkd3d-shader/hlsl: Skip writing string default values.
This causes a crash in the native compiler, but can only happen in
ps_5_0 were it is possible to declare structs that are both used in the
shader and contain strings.

    struct
    {
        float a;
        string b;
    } apple = {1, "foobar"};

    float4 main() : sv_target
    {
        return apple.a;
    }

In our case, hlsl_type_get_component_offset() triggered an assertion
failure because it does not expect the string type. So this is replaced
by an hlsl_error().
2024-08-13 21:19:04 +02:00
Francisco Casas
094e298c1c vkd3d-shader/hlsl: Parse string default values. 2024-08-13 21:19:01 +02:00
Francisco Casas
f8108a4753 tests: Add additional string tests. 2024-08-13 21:16:46 +02:00
Nikolay Sivov
e0b5fe1288 vkd3d-shader/hlsl: Add a test for assigning to DSV and RTV variables.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-13 21:11:48 +02:00
Nikolay Sivov
b4d957f848 vkd3d-shader/hlsl: Handle NULL constants.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-13 21:10:45 +02:00
Nikolay Sivov
d945d5e78c vkd3d-shader/hlsl: Check MS texture declaration without sample count only for used variables.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-13 21:10:29 +02:00
Anna (navi) Figueiredo Gomes
80b2a2eb55 vkd3d-shader/ir: Periodically flush buffers when tracing blocks.
Avoids overflowing the output buffer for the trace in cases where the
output is too long, which raises an exception.
2024-08-12 14:19:13 +02:00
Nikolay Sivov
b0ca3627bf vkd3d-shader/fx: Turn assignments to arrays to element assignments for certain states. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
25e1c3e374 vkd3d-shader/fx: Explicitly handle bool values in state entries. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
c81223d086 vkd3d-shader/fx: Handle states of a BlendState object. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
2affc8f5c5 vkd3d-shader/fx: Run full set of constants passes on state block entries values. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
f1e65ecc83 vkd3d-shader/fx: Enable writing BlendState variables. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
91e88fac2e vkd3d-shader/hlsl: Add parser support for BlendState type. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
1be0d99b76 vkd3d-shader/fx: Check destination array index when checking for duplicate state entries. 2024-08-12 14:15:14 +02:00
Nikolay Sivov
b23874dad6 vkd3d-shader/hlsl: Add parser support for GeometryShader type.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-08 23:42:37 +02:00
Nikolay Sivov
de48960b33 vkd3d-shader/fx: Add support for the OMSetRenderTargets() state. 2024-08-08 23:42:37 +02:00
Nikolay Sivov
c565a60b9e vkd3d-shader/fx: Add an array size field to the states description table. 2024-08-08 23:42:37 +02:00
Nikolay Sivov
d55a709992 vkd3d-shader/fx: Use more descriptive names for FX-specific types. 2024-08-08 23:42:37 +02:00
Nikolay Sivov
9fb23b9090 vkd3d-shader/fx: Handle "Texture" field of the sampler state objects.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-08 23:42:37 +02:00
Giovanni Mascellani
8b6ab9627d vkd3d-shader: Replace assert() with VKD3D_ASSERT() in vkd3d_shader_private.h. 2024-08-08 23:39:23 +02:00
Giovanni Mascellani
27bceec965 vkd3d-shader: Replace assert() with VKD3D_ASSERT() in vkd3d_shader_main.c. 2024-08-08 23:39:23 +02:00
Giovanni Mascellani
0294aa62f3 vkd3d-shader: Replace assert() with VKD3D_ASSERT() in tpf.c. 2024-08-08 23:38:02 +02:00
Giovanni Mascellani
d5126b4d98 vkd3d-shader: Replace assert() with VKD3D_ASSERT() in spirv.c. 2024-08-08 23:36:23 +02:00
Victor Chiletto
8c3a5e5458 vkd3d-shader/hlsl: Implement f16tof32 intrinsic. 2024-08-08 23:35:02 +02:00
Victor Chiletto
693e89c74e vkd3d-shader/hlsl: Push a new scope when compiling internal functions.
This allows for typedef usage without interfering with user code.
Thanks Zeb for the suggestion.
2024-08-08 23:35:02 +02:00
Francisco Casas
016be7e591 vkd3d-shader/hlsl: Lower non-constant row_major matrix loads for SM1. 2024-08-08 23:33:33 +02:00
Francisco Casas
87f01f5205 vkd3d-shader/hlsl: Remove SM1 fixme for matrix writemasks.
hlsl_ir_store instructions don't use writemasks for whole matrices.
2024-08-08 23:32:03 +02:00
Francisco Casas
9f515a9daa vkd3d-shader/hlsl: Lower non-constant array loads for SM1.
This is achieved by means of creating a variable storing zero,
loading every array element, comparing if the non-constant index
matches the index of that element at runtime, and in that case
store the corresponding element in the variable.

This seems to be the same strategy that the native compiler uses.
2024-08-08 23:30:39 +02:00
Francisco Casas
e0cfd8f86a tests: Add additional non-constant array indexing tests. 2024-08-08 23:28:31 +02:00
Francisco Casas
eb2d320596 vkd3d-shader/hlsl: Avoid dereferencing rel_offset if it is NULL.
We are currently using &offset_node->loc when offset_node is NULL.

A NULL dereference of rel_offset can also happen if
hlsl_offset_from_deref() fails because the dereference is out of
bounds.
2024-08-08 23:28:31 +02:00
Francisco Casas
51abec8c99 tests: Introduce VKD3D_TEST_DETAILED for the test driver.
Useful to know which tests on which backends were skipped.
2024-08-07 15:54:36 +02:00
Francisco Casas
9dec7403d9 tests/shader-runner: Add missing trace for wave_ops caps. 2024-08-07 15:54:36 +02:00
Francisco Casas
2efc79bb81 tests: Report tests skipped because of missing capabilities. 2024-08-07 15:54:36 +02:00
Francisco Casas
84676c378f tests: Add missing double precission require directives.
Otherwise these tests fail on Intel UHD Graphics 770.
2024-08-07 15:54:36 +02:00
Francisco Casas
e8354ac499 vkd3d-shader/hlsl: Parse string type. 2024-08-07 15:53:07 +02:00
Francisco Casas
652db433e1 vkd3d-shader/hlsl: Parse string escape sequences. 2024-08-07 15:51:43 +02:00
Francisco Casas
090df488ba vkd3d-shader/hlsl: Parse string constants. 2024-08-07 15:48:59 +02:00
Francisco Casas
4b2e847d11 tests: Test string escape sequences. 2024-08-07 15:45:24 +02:00
Nikolay Sivov
c44a18b3d1 vkd3d-shader/fx: Add support for SetDomainShader(), SetComputeShader(), and SetHullShader() states.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-06 16:54:19 +02:00
Nikolay Sivov
1559237780 vkd3d-shader/fx: Fix state block entry array shifting when decomposing.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-06 16:54:19 +02:00
Nikolay Sivov
7c3677b114 vkd3d-shader/hlsl: Add parser support for ComputeShader, DomainShader, and HullShader types.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-06 16:54:19 +02:00
Nikolay Sivov
2cbad81b55 vkd3d-shader/fx: Handle SetRasterizerState().
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-06 16:54:19 +02:00
Giovanni Mascellani
784e69a366 vkd3d: Check the entire root signature for register conflicts.
Not just each descriptor table individually.
2024-08-06 16:53:06 +02:00
Nikolay Sivov
a3f4785720 vkd3d-shader/fx: Decompose function-style state assignments to individual states.
Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
2024-08-05 16:01:33 +02:00
Stefan Dösinger
d4c2a7f22b vkd3d: Pass a proper struct shader_cache_key * to rb_put() in vkd3d_shader_cache_add_entry(). 2024-08-05 15:59:53 +02:00
Giovanni Mascellani
46aec9fba8 vkd3d-shader: Replace assert() with VKD3D_ASSERT() in preproc.y. 2024-08-05 15:57:56 +02:00