Basically, @giomasce proposal of specifying shader models for tests individually.
Supersedes !418.
---
To make the shader_runner expressive enough to handle SM1 and SM6 shader models on tests, we need to intercept the shader model ranges for which we want to run the tests with the ranges that each backend is capable of running, this is complicated.
So, to make it more clear, the test's shader models are specified individually, and runner->minimum_shader_model and runner->maximum_shader_model are replaced with just runner->current_shader_model.
The supported ranges are removed from the backends (except for d3d12, which handles them internally) and their check_requirements functions is always assumed to exist and return either true or false for just a single shader model.
Something that must be kept in mind with these changes is that if two tests with different shader models rely on the same resources, these resources must be either specified twice, or after a [require] directive that includes all the pertaining models. This was necessary for gather.shader_test and gather-offset.shader_test.
---
The following patches would change: ``` run_compilation_tests(SHADER_MODEL_4_0, SHADER_MODEL_5_1, NULL); ``` to ``` run_compilation_tests(SHADER_MODEL_2_0, SHADER_MODEL_5_1, NULL); ``` for Unix and non-cross builds, so we can test SM1 compilation even if we don't have a backend available that can actually run the tests. Some improvements to the qualifiers are required before that, to mark sm1 todos properly.
Once we have a proper SM1 runner, maybe we could get rid of run_compilation_tests().
From: Francisco Casas fcasas@codeweavers.com
To make the shader_runner expressive enough to handle SM1 and SM6 shader models on tests, we need to intercept the shader model ranges for which we want to run the tests with the ranges that each backend is capable of running, this is complicated.
So, to make it more clear, the test's shader models are specified individually, and runner->minimum_shader_model and runner->maximum_shader_model are replaced with just runner->current_shader_model.
The supported ranges are removed from the backends (except for d3d12) and their check_requirements functions is always assumed to exist and return either true or false for just a single shader model.
Something that must be kept in mind with these changes is that if two tests with different shader models rely on the same resources, these resources must be either specified twice, or after a [require] directive that includes all the pertaining models. This was necessary for gather.shader_test and gather-offset.shader_test. --- tests/hlsl/all.shader_test | 3 +- tests/hlsl/any.shader_test | 3 +- .../hlsl/arithmetic-float-uniform.shader_test | 3 +- tests/hlsl/arithmetic-float.shader_test | 3 +- tests/hlsl/arithmetic-int.shader_test | 6 +- tests/hlsl/arithmetic-uint.shader_test | 3 +- tests/hlsl/asfloat.shader_test | 3 +- tests/hlsl/asuint.shader_test | 3 +- tests/hlsl/bitwise.shader_test | 3 +- tests/hlsl/bool-cast.shader_test | 3 +- tests/hlsl/bool-semantics.shader_test | 3 +- tests/hlsl/cast-to-float.shader_test | 3 +- tests/hlsl/cast-to-half.shader_test | 3 +- tests/hlsl/cast-to-int.shader_test | 3 +- tests/hlsl/cast-to-uint.shader_test | 3 +- tests/hlsl/cbuffer.shader_test | 6 +- tests/hlsl/combined-samplers.shader_test | 6 +- tests/hlsl/compute.shader_test | 3 +- tests/hlsl/conditional.shader_test | 4 +- tests/hlsl/d3dcolor-to-ubyte4.shader_test | 3 +- tests/hlsl/ddxddy.shader_test | 7 +- tests/hlsl/duplicate-modifiers.shader_test | 3 +- tests/hlsl/entry-point-semantics.shader_test | 10 +- tests/hlsl/floor.shader_test | 3 +- tests/hlsl/function-cast.shader_test | 3 +- tests/hlsl/fwidth.shader_test | 4 +- tests/hlsl/gather-offset.shader_test | 12 +- tests/hlsl/gather.shader_test | 12 +- tests/hlsl/getdimensions.shader_test | 3 +- tests/hlsl/half.shader_test | 3 + .../initializer-implicit-array.shader_test | 6 +- tests/hlsl/initializer-objects.shader_test | 3 +- tests/hlsl/intrinsic-override.shader_test | 2 +- tests/hlsl/is-front-face.shader_test | 3 +- tests/hlsl/ldexp.shader_test | 3 +- tests/hlsl/lerp.shader_test | 3 +- tests/hlsl/load-level.shader_test | 3 +- tests/hlsl/majority-pragma.shader_test | 18 +++ tests/hlsl/matrix-semantics.shader_test | 3 +- tests/hlsl/minimum-precision.shader_test | 3 +- tests/hlsl/nointerpolation.shader_test | 3 +- tests/hlsl/numthreads.shader_test | 3 +- tests/hlsl/object-field-offsets.shader_test | 3 +- tests/hlsl/object-parameters.shader_test | 6 +- tests/hlsl/object-references.shader_test | 6 +- tests/hlsl/register-reservations.shader_test | 6 +- tests/hlsl/sample-grad.shader_test | 3 +- tests/hlsl/sample-level.shader_test | 4 +- tests/hlsl/sampler-offset.shader_test | 3 +- tests/hlsl/sampler.shader_test | 3 + .../shader-interstage-interface.shader_test | 3 +- tests/hlsl/side-effects.shader_test | 3 +- tests/hlsl/sign.shader_test | 3 +- tests/hlsl/static-initializer.shader_test | 3 +- tests/hlsl/struct-array.shader_test | 3 +- tests/hlsl/swizzle-constant-prop.shader_test | 3 +- tests/hlsl/texture-load-offset.shader_test | 3 +- tests/hlsl/texture-load-typed.shader_test | 3 +- tests/hlsl/texture-load.shader_test | 3 +- tests/hlsl/texture-ordering.shader_test | 6 +- tests/hlsl/trunc.shader_test | 3 +- tests/hlsl/uav-load.shader_test | 3 +- tests/hlsl/uav-out-param.shader_test | 3 +- tests/hlsl/uav-rwbuffer.shader_test | 3 +- tests/hlsl/uav-rwstructuredbuffer.shader_test | 3 +- tests/hlsl/uav-rwtexture.shader_test | 3 +- tests/hlsl/uniform-parameters.shader_test | 3 +- tests/shader_runner.c | 103 ++++++++++-------- tests/shader_runner.h | 7 +- tests/shader_runner_d3d11.c | 14 ++- tests/shader_runner_d3d12.c | 35 ++++-- tests/shader_runner_d3d9.c | 11 +- tests/shader_runner_vulkan.c | 14 ++- 73 files changed, 300 insertions(+), 155 deletions(-)
diff --git a/tests/hlsl/all.shader_test b/tests/hlsl/all.shader_test index 564cc5b00..7988e5585 100644 --- a/tests/hlsl/all.shader_test +++ b/tests/hlsl/all.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float4 f; diff --git a/tests/hlsl/any.shader_test b/tests/hlsl/any.shader_test index 9b8b922c9..5863e0cd4 100644 --- a/tests/hlsl/any.shader_test +++ b/tests/hlsl/any.shader_test @@ -49,7 +49,8 @@ todo(sm>=6) draw quad probe all rgba (1.0, 1.0, 1.0, 1.0)
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform uint4 b; diff --git a/tests/hlsl/arithmetic-float-uniform.shader_test b/tests/hlsl/arithmetic-float-uniform.shader_test index 8aaca621a..9d227cb1e 100644 --- a/tests/hlsl/arithmetic-float-uniform.shader_test +++ b/tests/hlsl/arithmetic-float-uniform.shader_test @@ -74,7 +74,8 @@ probe all rgba (5.0, -2.1, 4.0, 0.0) 4
[require] % Infinities are not allowed in SM1 -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float2 a; diff --git a/tests/hlsl/arithmetic-float.shader_test b/tests/hlsl/arithmetic-float.shader_test index 71835082c..304a5d9f0 100644 --- a/tests/hlsl/arithmetic-float.shader_test +++ b/tests/hlsl/arithmetic-float.shader_test @@ -65,7 +65,8 @@ probe all rgba (5.0, -2.1, 4.0, 0.0) 6
[require] % Infinities are not allowed in SM1 -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4 main() : SV_TARGET diff --git a/tests/hlsl/arithmetic-int.shader_test b/tests/hlsl/arithmetic-int.shader_test index f2044c42c..24369e7f5 100644 --- a/tests/hlsl/arithmetic-int.shader_test +++ b/tests/hlsl/arithmetic-int.shader_test @@ -103,9 +103,8 @@ draw quad probe all rgba (0.0, 0.0, 0.0, 0.0)
[require] -shader model >= 4.0 +shader model 4.0 % dxcompiler performs this calculation on unsigned values and emits zero. -shader model < 6.0
[pixel shader] float4 main() : SV_TARGET @@ -121,7 +120,8 @@ draw quad probe all rgba (-2147483648.0, -2147483648.0, -2147483648.0, -2147483648.0)
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4 main() : sv_target diff --git a/tests/hlsl/arithmetic-uint.shader_test b/tests/hlsl/arithmetic-uint.shader_test index c245d447d..143b851f0 100644 --- a/tests/hlsl/arithmetic-uint.shader_test +++ b/tests/hlsl/arithmetic-uint.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4 main() : SV_TARGET diff --git a/tests/hlsl/asfloat.shader_test b/tests/hlsl/asfloat.shader_test index d2c0f9aab..5cb6b1723 100644 --- a/tests/hlsl/asfloat.shader_test +++ b/tests/hlsl/asfloat.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float f; diff --git a/tests/hlsl/asuint.shader_test b/tests/hlsl/asuint.shader_test index 0a2e39e53..e61470fb5 100644 --- a/tests/hlsl/asuint.shader_test +++ b/tests/hlsl/asuint.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float f; diff --git a/tests/hlsl/bitwise.shader_test b/tests/hlsl/bitwise.shader_test index 20a9db55f..8348a3bec 100644 --- a/tests/hlsl/bitwise.shader_test +++ b/tests/hlsl/bitwise.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4 main() : SV_TARGET diff --git a/tests/hlsl/bool-cast.shader_test b/tests/hlsl/bool-cast.shader_test index dc75ea376..eb2aae6ea 100644 --- a/tests/hlsl/bool-cast.shader_test +++ b/tests/hlsl/bool-cast.shader_test @@ -15,7 +15,8 @@ probe all rgba (0.0, 0.0, 1.0, 1.0)
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] diff --git a/tests/hlsl/bool-semantics.shader_test b/tests/hlsl/bool-semantics.shader_test index d8df96a2a..a49bf163b 100644 --- a/tests/hlsl/bool-semantics.shader_test +++ b/tests/hlsl/bool-semantics.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[input layout] 0 r32g32b32a32 uint apple diff --git a/tests/hlsl/cast-to-float.shader_test b/tests/hlsl/cast-to-float.shader_test index 7c32acfa3..58746baae 100644 --- a/tests/hlsl/cast-to-float.shader_test +++ b/tests/hlsl/cast-to-float.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int i; diff --git a/tests/hlsl/cast-to-half.shader_test b/tests/hlsl/cast-to-half.shader_test index 1579c63f3..ce257ed23 100644 --- a/tests/hlsl/cast-to-half.shader_test +++ b/tests/hlsl/cast-to-half.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int i; diff --git a/tests/hlsl/cast-to-int.shader_test b/tests/hlsl/cast-to-int.shader_test index ae566a039..bff1399fe 100644 --- a/tests/hlsl/cast-to-int.shader_test +++ b/tests/hlsl/cast-to-int.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float f; diff --git a/tests/hlsl/cast-to-uint.shader_test b/tests/hlsl/cast-to-uint.shader_test index dece99b75..320293f19 100644 --- a/tests/hlsl/cast-to-uint.shader_test +++ b/tests/hlsl/cast-to-uint.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float f; diff --git a/tests/hlsl/cbuffer.shader_test b/tests/hlsl/cbuffer.shader_test index 59dda97a5..b6be7cdb4 100644 --- a/tests/hlsl/cbuffer.shader_test +++ b/tests/hlsl/cbuffer.shader_test @@ -37,7 +37,8 @@ probe all rgba (1.0, 2.0, 3.0, 4.0) % SM1 buffer offset allocation follows different rules than SM4. % Those would have to be tested separately. [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader fail] @@ -696,7 +697,8 @@ float4 main() : sv_target
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[texture 0] size (1, 1) diff --git a/tests/hlsl/combined-samplers.shader_test b/tests/hlsl/combined-samplers.shader_test index 235537594..24077297d 100644 --- a/tests/hlsl/combined-samplers.shader_test +++ b/tests/hlsl/combined-samplers.shader_test @@ -1,6 +1,5 @@ [require] -shader model >= 4.0 -shader model < 6.0 +shader model 4.0 options: backcompat
@@ -134,8 +133,7 @@ probe all rgba (1, 1, 1, 11)
[require] -shader model >= 5.0 -shader model < 6.0 +shader model 5.0 options: backcompat
diff --git a/tests/hlsl/compute.shader_test b/tests/hlsl/compute.shader_test index 2f2af9fc8..78bbb0e39 100644 --- a/tests/hlsl/compute.shader_test +++ b/tests/hlsl/compute.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[uav 0] format r32 float diff --git a/tests/hlsl/conditional.shader_test b/tests/hlsl/conditional.shader_test index 4175813bd..6d9bc5a2f 100644 --- a/tests/hlsl/conditional.shader_test +++ b/tests/hlsl/conditional.shader_test @@ -72,7 +72,9 @@ float main() : sv_target
% Using older profiles fails to compile with forced control flow instruction [require] -shader model >= 3.0 +shader model 3.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float4 u; diff --git a/tests/hlsl/d3dcolor-to-ubyte4.shader_test b/tests/hlsl/d3dcolor-to-ubyte4.shader_test index 01b7f2f64..2e20d8d66 100644 --- a/tests/hlsl/d3dcolor-to-ubyte4.shader_test +++ b/tests/hlsl/d3dcolor-to-ubyte4.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform float4 u; diff --git a/tests/hlsl/ddxddy.shader_test b/tests/hlsl/ddxddy.shader_test index ba7215ca0..aecf22ea3 100644 --- a/tests/hlsl/ddxddy.shader_test +++ b/tests/hlsl/ddxddy.shader_test @@ -1,5 +1,7 @@ [require] -shader model >= 3.0 +shader model 3.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4 main(float4 pos : sv_position) : sv_target @@ -40,7 +42,8 @@ probe (150, 150) rgba (-226.0, -47.0, 45.0, 0.0)
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader] diff --git a/tests/hlsl/duplicate-modifiers.shader_test b/tests/hlsl/duplicate-modifiers.shader_test index bf1d9c1b8..c4184e3cd 100644 --- a/tests/hlsl/duplicate-modifiers.shader_test +++ b/tests/hlsl/duplicate-modifiers.shader_test @@ -1,6 +1,7 @@ % Returns (0.1, 0.3, 0.2, 0.4) with dxcompiler [require] -shader model < 6.0 +shader model 2.0 +shader model 4.0
[pixel shader] typedef const precise row_major float2x2 mat_t; diff --git a/tests/hlsl/entry-point-semantics.shader_test b/tests/hlsl/entry-point-semantics.shader_test index d177b0376..3836cbaa2 100644 --- a/tests/hlsl/entry-point-semantics.shader_test +++ b/tests/hlsl/entry-point-semantics.shader_test @@ -106,7 +106,8 @@ probe (0, 0) rgba (10.0, 11.0, 30.0, 31.0)
% dxcompiler emits correct array addressing. [require] -shader model < 6.0 +shader model 2.0 +shader model 4.0
% Arrays (even multi-dimensional) of struct elements are allowed. The fields in the different struct @@ -151,7 +152,9 @@ todo(sm>=6) probe (0, 0) rgba (10.0, 11.0, 20.0, 21.0)
[require] -% reset requirements +shader model 2.0 +shader model 4.0 +shader model 6.0
[pixel shader fail] @@ -301,7 +304,8 @@ float4 main(in uint2 a : TEXCOORD0, in int2 b : TEXCOORD0, in int2x1 c : TEXCOOR
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader fail] diff --git a/tests/hlsl/floor.shader_test b/tests/hlsl/floor.shader_test index deb9acf91..302190036 100644 --- a/tests/hlsl/floor.shader_test +++ b/tests/hlsl/floor.shader_test @@ -28,7 +28,8 @@ todo(sm>=6) draw quad probe all rgba (6.0, 7.0, -1.0, 3.0) 4
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int4 u; diff --git a/tests/hlsl/function-cast.shader_test b/tests/hlsl/function-cast.shader_test index a2b9cf4f4..093b97692 100644 --- a/tests/hlsl/function-cast.shader_test +++ b/tests/hlsl/function-cast.shader_test @@ -70,7 +70,8 @@ todo draw quad probe all rgba (-1.0, -1.0, 2.0, 4.0)
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader todo] uniform int4 i; diff --git a/tests/hlsl/fwidth.shader_test b/tests/hlsl/fwidth.shader_test index d4c20f4e0..3baa29a06 100644 --- a/tests/hlsl/fwidth.shader_test +++ b/tests/hlsl/fwidth.shader_test @@ -1,5 +1,7 @@ [require] -shader model >= 3.0 +shader model 3.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4 main(float4 pos : sv_position) : sv_target diff --git a/tests/hlsl/gather-offset.shader_test b/tests/hlsl/gather-offset.shader_test index 6360d1fc8..cc414e3e0 100644 --- a/tests/hlsl/gather-offset.shader_test +++ b/tests/hlsl/gather-offset.shader_test @@ -1,5 +1,7 @@ [require] -shader model >= 4.1 +shader model 4.1 +shader model 5.0 +shader model 6.0
[sampler 0] @@ -13,6 +15,11 @@ size (3, 3) 0.0 0.2 0.0 0.4 0.1 0.2 0.5 0.0 0.2 0.2 0.0 0.4
+[require] +shader model 4.1 +shader model 6.0 + + [pixel shader] sampler s; Texture2D t; @@ -42,7 +49,8 @@ probe all rgba (0.0, 0.1, 0.1, 0.0)
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader] diff --git a/tests/hlsl/gather.shader_test b/tests/hlsl/gather.shader_test index 9cfc2d599..7eeee39a0 100644 --- a/tests/hlsl/gather.shader_test +++ b/tests/hlsl/gather.shader_test @@ -1,5 +1,7 @@ [require] -shader model >= 4.1 +shader model 4.1 +shader model 5.0 +shader model 6.0
[sampler 0] @@ -13,6 +15,11 @@ size (3, 3) 0.0 0.2 0.0 0.4 0.1 0.2 0.5 0.0 0.2 0.2 0.0 0.4
+[require] +shader model 4.1 +shader model 6.0 + + [pixel shader] sampler s; Texture2D t; @@ -42,7 +49,8 @@ probe all rgba (0.1, 0.2, 0.2, 0.1)
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader] diff --git a/tests/hlsl/getdimensions.shader_test b/tests/hlsl/getdimensions.shader_test index 01d12f87a..b068d668a 100644 --- a/tests/hlsl/getdimensions.shader_test +++ b/tests/hlsl/getdimensions.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] size (2, 3) diff --git a/tests/hlsl/half.shader_test b/tests/hlsl/half.shader_test index 956102359..29f299fff 100644 --- a/tests/hlsl/half.shader_test +++ b/tests/hlsl/half.shader_test @@ -7,6 +7,9 @@ float4 main() : sv_target }
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: backcompat
[pixel shader] diff --git a/tests/hlsl/initializer-implicit-array.shader_test b/tests/hlsl/initializer-implicit-array.shader_test index fff2b8fdf..094abb08f 100644 --- a/tests/hlsl/initializer-implicit-array.shader_test +++ b/tests/hlsl/initializer-implicit-array.shader_test @@ -13,7 +13,8 @@ probe all rgba (50, 60, 70, 80)
% dxcompiler emits a nop shader which returns immediately. [require] -shader model < 6.0 +shader model 2.0 +shader model 4.0
[pixel shader] float4 main() : sv_target @@ -198,7 +199,8 @@ float4 main() : sv_target
% dxcompiler crashes. [require] -shader model < 6.0 +shader model 2.0 +shader model 4.0
[pixel shader fail] diff --git a/tests/hlsl/initializer-objects.shader_test b/tests/hlsl/initializer-objects.shader_test index 514a7cebb..9b2b86f44 100644 --- a/tests/hlsl/initializer-objects.shader_test +++ b/tests/hlsl/initializer-objects.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] size (3, 3) diff --git a/tests/hlsl/intrinsic-override.shader_test b/tests/hlsl/intrinsic-override.shader_test index b95f80e7f..852a65474 100644 --- a/tests/hlsl/intrinsic-override.shader_test +++ b/tests/hlsl/intrinsic-override.shader_test @@ -32,7 +32,7 @@ probe all rgba (0.3, 0.3, 0.3, 0.4)
[require] -shader model >= 6.0 +shader model 6.0
[pixel shader]
diff --git a/tests/hlsl/is-front-face.shader_test b/tests/hlsl/is-front-face.shader_test index 162d4e634..4464df6d2 100644 --- a/tests/hlsl/is-front-face.shader_test +++ b/tests/hlsl/is-front-face.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[input layout] 0 r32g32 float sv_position diff --git a/tests/hlsl/ldexp.shader_test b/tests/hlsl/ldexp.shader_test index 2db624067..e784748c0 100644 --- a/tests/hlsl/ldexp.shader_test +++ b/tests/hlsl/ldexp.shader_test @@ -14,7 +14,8 @@ todo(sm>=6) draw quad probe all rgba (2.0, 0.00292968750, 4096.0, 6.33825300e+030) 2
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int4 x; diff --git a/tests/hlsl/lerp.shader_test b/tests/hlsl/lerp.shader_test index 27c45fe7d..aed7a5dc9 100644 --- a/tests/hlsl/lerp.shader_test +++ b/tests/hlsl/lerp.shader_test @@ -16,7 +16,8 @@ todo(sm>=6) draw quad probe all rgba (2.0, -10.0, -2.0, 76.25)
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int4 x; diff --git a/tests/hlsl/load-level.shader_test b/tests/hlsl/load-level.shader_test index 9df2f01fb..3e2b30a77 100644 --- a/tests/hlsl/load-level.shader_test +++ b/tests/hlsl/load-level.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] size (2, 2) diff --git a/tests/hlsl/majority-pragma.shader_test b/tests/hlsl/majority-pragma.shader_test index f7baa90b9..a6298ed3a 100644 --- a/tests/hlsl/majority-pragma.shader_test +++ b/tests/hlsl/majority-pragma.shader_test @@ -226,6 +226,9 @@ probe all rgba (0.3, 0.4, 0.5, 0.6)
% Compiler options [require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: row-major
[pixel shader] @@ -249,6 +252,9 @@ todo(sm>=6) draw quad probe all rgba (0.2, 0.3, 0.6, 0.7) 1
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: column-major
[pixel shader] @@ -271,6 +277,9 @@ todo(sm>=6) draw quad probe all rgba (0.2, 0.3, 0.6, 0.7) 1
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: row-major
[pixel shader] @@ -293,6 +302,9 @@ todo(sm>=6) draw quad probe all rgba (0.5, 0.9, 0.6, 1.0) 1
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: column-major
[pixel shader] @@ -321,6 +333,9 @@ todo(sm>=6) draw quad probe all rgba (0.3, 0.4, 2.5, 2.9) 1
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: row-major
[pixel shader] @@ -349,6 +364,9 @@ todo(sm>=6) draw quad probe all rgba (1.2, 1.6, 3.1, 3.2) 1
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: column-major row-major
[pixel shader] diff --git a/tests/hlsl/matrix-semantics.shader_test b/tests/hlsl/matrix-semantics.shader_test index e19b6b48c..f5f32d9e2 100644 --- a/tests/hlsl/matrix-semantics.shader_test +++ b/tests/hlsl/matrix-semantics.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] float4x1 main() : sv_target diff --git a/tests/hlsl/minimum-precision.shader_test b/tests/hlsl/minimum-precision.shader_test index e5053e3d1..0bb608f86 100644 --- a/tests/hlsl/minimum-precision.shader_test +++ b/tests/hlsl/minimum-precision.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] diff --git a/tests/hlsl/nointerpolation.shader_test b/tests/hlsl/nointerpolation.shader_test index a3c9edfd1..ff9b0d191 100644 --- a/tests/hlsl/nointerpolation.shader_test +++ b/tests/hlsl/nointerpolation.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[input layout] 0 r32g32b32a32 float texcoord diff --git a/tests/hlsl/numthreads.shader_test b/tests/hlsl/numthreads.shader_test index fb11dc480..09850f456 100644 --- a/tests/hlsl/numthreads.shader_test +++ b/tests/hlsl/numthreads.shader_test @@ -1,7 +1,8 @@ % Test allowed syntax for the "numthreads" attribute.
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[compute shader]
diff --git a/tests/hlsl/object-field-offsets.shader_test b/tests/hlsl/object-field-offsets.shader_test index d1741c3e4..eebd1c790 100644 --- a/tests/hlsl/object-field-offsets.shader_test +++ b/tests/hlsl/object-field-offsets.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader] struct apple { diff --git a/tests/hlsl/object-parameters.shader_test b/tests/hlsl/object-parameters.shader_test index 0d279fb27..2e049aef8 100644 --- a/tests/hlsl/object-parameters.shader_test +++ b/tests/hlsl/object-parameters.shader_test @@ -9,7 +9,8 @@ float4 main(out Texture2D tex : TEXTURE) : sv_target
% dxcompiler crashes. [require] -shader model < 6.0 +shader model 2.0 +shader model 4.0
[pixel shader fail todo] @@ -25,7 +26,8 @@ float4 main(inout params x) : sv_target
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader todo fail(sm>=6)] diff --git a/tests/hlsl/object-references.shader_test b/tests/hlsl/object-references.shader_test index ff405559c..0fec47089 100644 --- a/tests/hlsl/object-references.shader_test +++ b/tests/hlsl/object-references.shader_test @@ -11,7 +11,8 @@ float4 main() : sv_target
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] @@ -216,7 +217,8 @@ float4 main(Texture2D tex2) : sv_target
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[texture 0] diff --git a/tests/hlsl/register-reservations.shader_test b/tests/hlsl/register-reservations.shader_test index 9539b05ff..c2c0ad0fd 100644 --- a/tests/hlsl/register-reservations.shader_test +++ b/tests/hlsl/register-reservations.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] @@ -159,7 +160,8 @@ probe all rgba (2.0, 2.0, 2.0, 99.0)
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[texture 0] size (2, 2) diff --git a/tests/hlsl/sample-grad.shader_test b/tests/hlsl/sample-grad.shader_test index 298037a77..bbad6efee 100644 --- a/tests/hlsl/sample-grad.shader_test +++ b/tests/hlsl/sample-grad.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[sampler 0] filter linear linear linear diff --git a/tests/hlsl/sample-level.shader_test b/tests/hlsl/sample-level.shader_test index c91c65493..1a252da69 100644 --- a/tests/hlsl/sample-level.shader_test +++ b/tests/hlsl/sample-level.shader_test @@ -1,5 +1,7 @@ [require] -shader model >= 3.0 +shader model 3.0 +shader model 4.0 +shader model 6.0
[sampler 0] filter linear linear linear diff --git a/tests/hlsl/sampler-offset.shader_test b/tests/hlsl/sampler-offset.shader_test index 498a8ed3a..128055c38 100644 --- a/tests/hlsl/sampler-offset.shader_test +++ b/tests/hlsl/sampler-offset.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[sampler 0] filter point point point diff --git a/tests/hlsl/sampler.shader_test b/tests/hlsl/sampler.shader_test index caff7b2fa..a56033e3c 100644 --- a/tests/hlsl/sampler.shader_test +++ b/tests/hlsl/sampler.shader_test @@ -51,6 +51,9 @@ float4 main() : sv_target }
[require] +shader model 2.0 +shader model 4.0 +shader model 6.0 options: backcompat
[pixel shader fail(sm>=6)] diff --git a/tests/hlsl/shader-interstage-interface.shader_test b/tests/hlsl/shader-interstage-interface.shader_test index 271eb3bbe..22f66e3b3 100644 --- a/tests/hlsl/shader-interstage-interface.shader_test +++ b/tests/hlsl/shader-interstage-interface.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[input layout] 0 r32g32 float SV_POSITION diff --git a/tests/hlsl/side-effects.shader_test b/tests/hlsl/side-effects.shader_test index f41e98510..0b6515c1b 100644 --- a/tests/hlsl/side-effects.shader_test +++ b/tests/hlsl/side-effects.shader_test @@ -29,7 +29,8 @@ probe all rgba (11.0, 11.0, 11.0, 11.0)
% dxcompiler performs the first call to func() before the array index call. [require] -shader model < 6.0 +shader model 2.0 +shader model 4.0
[pixel shader] diff --git a/tests/hlsl/sign.shader_test b/tests/hlsl/sign.shader_test index 54b953681..6adca4b72 100644 --- a/tests/hlsl/sign.shader_test +++ b/tests/hlsl/sign.shader_test @@ -46,7 +46,8 @@ probe all rgba (1.0, 1.0, 1.0, 1.0)
[require] % SM1-3 doesn't support integral types -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int f; diff --git a/tests/hlsl/static-initializer.shader_test b/tests/hlsl/static-initializer.shader_test index 217444308..d9aecfd48 100644 --- a/tests/hlsl/static-initializer.shader_test +++ b/tests/hlsl/static-initializer.shader_test @@ -167,7 +167,8 @@ probe all rgba (1, 2, 3, 4)
[require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[uav 1] diff --git a/tests/hlsl/struct-array.shader_test b/tests/hlsl/struct-array.shader_test index 4097f3835..45a1a9f50 100644 --- a/tests/hlsl/struct-array.shader_test +++ b/tests/hlsl/struct-array.shader_test @@ -1,7 +1,8 @@ % In SM4, array elements are always aligned to the next vec4, although structs are not.
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform struct diff --git a/tests/hlsl/swizzle-constant-prop.shader_test b/tests/hlsl/swizzle-constant-prop.shader_test index a0ec18e45..1af18d1c4 100644 --- a/tests/hlsl/swizzle-constant-prop.shader_test +++ b/tests/hlsl/swizzle-constant-prop.shader_test @@ -2,7 +2,8 @@ % make sure that we can do so.
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] diff --git a/tests/hlsl/texture-load-offset.shader_test b/tests/hlsl/texture-load-offset.shader_test index f32b2191f..7c972f98f 100644 --- a/tests/hlsl/texture-load-offset.shader_test +++ b/tests/hlsl/texture-load-offset.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] size (3, 3) diff --git a/tests/hlsl/texture-load-typed.shader_test b/tests/hlsl/texture-load-typed.shader_test index 67a13f10d..4e2194109 100644 --- a/tests/hlsl/texture-load-typed.shader_test +++ b/tests/hlsl/texture-load-typed.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader fail] texture<float> t; diff --git a/tests/hlsl/texture-load.shader_test b/tests/hlsl/texture-load.shader_test index 8609828b8..a3bfe858f 100644 --- a/tests/hlsl/texture-load.shader_test +++ b/tests/hlsl/texture-load.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[texture 0] size (2, 2) diff --git a/tests/hlsl/texture-ordering.shader_test b/tests/hlsl/texture-ordering.shader_test index 24cd986ca..c6253e63d 100644 --- a/tests/hlsl/texture-ordering.shader_test +++ b/tests/hlsl/texture-ordering.shader_test @@ -1,6 +1,5 @@ [require] -shader model >= 4.0 -shader model < 6.0 +shader model 4.0
[sampler 0] filter linear linear linear @@ -85,8 +84,7 @@ size (1, 1) % table, and may be larger than the "bind count".
[require] -shader model >= 4.0 -shader model < 6.0 +shader model 4.0 options: backcompat
[pixel shader] diff --git a/tests/hlsl/trunc.shader_test b/tests/hlsl/trunc.shader_test index a359cd03a..9e471a8bd 100644 --- a/tests/hlsl/trunc.shader_test +++ b/tests/hlsl/trunc.shader_test @@ -31,7 +31,8 @@ todo(sm>=6) draw quad probe all rgba (6.0, 7.0, 0.0, 3.0)
[require] -shader model >= 4.0 +shader model 4.0 +shader model 6.0
[pixel shader] uniform int4 u; diff --git a/tests/hlsl/uav-load.shader_test b/tests/hlsl/uav-load.shader_test index 9088ffa0d..0da5f5406 100644 --- a/tests/hlsl/uav-load.shader_test +++ b/tests/hlsl/uav-load.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[uav 0] format r32 float diff --git a/tests/hlsl/uav-out-param.shader_test b/tests/hlsl/uav-out-param.shader_test index 796c4bf1f..c9a2e4ea5 100644 --- a/tests/hlsl/uav-out-param.shader_test +++ b/tests/hlsl/uav-out-param.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[uav 0] format r32g32b32a32 float diff --git a/tests/hlsl/uav-rwbuffer.shader_test b/tests/hlsl/uav-rwbuffer.shader_test index b476c7854..959b8c998 100644 --- a/tests/hlsl/uav-rwbuffer.shader_test +++ b/tests/hlsl/uav-rwbuffer.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
% UAVs are implicitly allocated starting from the highest render target slot. % They cannot overlap render target slots, and also cannot be allocated any diff --git a/tests/hlsl/uav-rwstructuredbuffer.shader_test b/tests/hlsl/uav-rwstructuredbuffer.shader_test index 904d15514..0e0d9eaa6 100644 --- a/tests/hlsl/uav-rwstructuredbuffer.shader_test +++ b/tests/hlsl/uav-rwstructuredbuffer.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader todo] struct s diff --git a/tests/hlsl/uav-rwtexture.shader_test b/tests/hlsl/uav-rwtexture.shader_test index 76535bd59..1589177c1 100644 --- a/tests/hlsl/uav-rwtexture.shader_test +++ b/tests/hlsl/uav-rwtexture.shader_test @@ -1,5 +1,6 @@ [require] -shader model >= 5.0 +shader model 5.0 +shader model 6.0
[pixel shader fail(sm<6)] RWTexture2D<float4> u; diff --git a/tests/hlsl/uniform-parameters.shader_test b/tests/hlsl/uniform-parameters.shader_test index 1951987f0..08a4e60c7 100644 --- a/tests/hlsl/uniform-parameters.shader_test +++ b/tests/hlsl/uniform-parameters.shader_test @@ -1,8 +1,7 @@ % 'uniform' in the parameter list is not supported in SM >= 6.0.
[require] -shader model >= 4.0 -shader model < 6.0 +shader model 4.0
[pixel shader] float4 main(uniform float f, uniform int i, uniform uint u, uniform half h) : sv_target diff --git a/tests/shader_runner.c b/tests/shader_runner.c index 59c1408c4..fa631588d 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -64,6 +64,17 @@ typedef int HRESULT;
struct test_options test_options = {0};
+static const char *const model_strings[] = +{ + [SHADER_MODEL_2_0] = "2.0", + [SHADER_MODEL_3_0] = "3.0", + [SHADER_MODEL_4_0] = "4.0", + [SHADER_MODEL_4_1] = "4.1", + [SHADER_MODEL_5_0] = "5.0", + [SHADER_MODEL_5_1] = "5.1", + [SHADER_MODEL_6_0] = "6.0", +}; + void fatal_error(const char *format, ...) { va_list args; @@ -128,39 +139,18 @@ static bool match_directive_substring(const char *line, const char *token, const return true; }
-static void parse_require_directive(struct shader_runner *runner, const char *line) +static void parse_require_directive(struct shader_runner *runner, const char *line, bool *skip_tests) { - bool less_than = false; unsigned int i;
- if (match_string(line, "shader model >=", &line) - || (less_than = match_string(line, "shader model <", &line))) + if (match_string(line, "shader model", &line)) { - static const char *const model_strings[] = - { - [SHADER_MODEL_2_0] = "2.0", - [SHADER_MODEL_3_0] = "3.0", - [SHADER_MODEL_4_0] = "4.0", - [SHADER_MODEL_4_1] = "4.1", - [SHADER_MODEL_5_0] = "5.0", - [SHADER_MODEL_5_1] = "5.1", - [SHADER_MODEL_6_0] = "6.0", - }; - for (i = 0; i < ARRAY_SIZE(model_strings); ++i) { if (match_string(line, model_strings[i], &line)) { - if (less_than) - { - if (!i) - fatal_error("Shader model < '%s' is invalid.\n", line); - runner->maximum_shader_model = min(runner->maximum_shader_model, i - 1); - } - else - { - runner->minimum_shader_model = max(runner->minimum_shader_model, i); - } + if (i == runner->current_shader_model) + *skip_tests = false; return; } } @@ -499,9 +489,9 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) if (match_string(line, "todo", &line)) runner->is_todo = true; else if (match_string(line, "todo(sm<6)", &line)) - runner->is_todo = runner->minimum_shader_model < SHADER_MODEL_6_0; + runner->is_todo = runner->current_shader_model < SHADER_MODEL_6_0; else if (match_string(line, "todo(sm>=6)", &line)) - runner->is_todo = runner->minimum_shader_model >= SHADER_MODEL_6_0; + runner->is_todo = runner->current_shader_model >= SHADER_MODEL_6_0;
if (match_string(line, "dispatch", &line)) { @@ -937,7 +927,7 @@ result_release: static void compile_shader(struct shader_runner *runner, IDxcCompiler3 *dxc_compiler, const char *source, size_t len, enum shader_type type, HRESULT expect) { - bool use_dxcompiler = runner->minimum_shader_model >= SHADER_MODEL_6_0; + bool use_dxcompiler = runner->current_shader_model >= SHADER_MODEL_6_0; ID3D10Blob *blob = NULL, *errors = NULL; char profile[7]; HRESULT hr; @@ -960,7 +950,7 @@ static void compile_shader(struct shader_runner *runner, IDxcCompiler3 *dxc_comp } else { - sprintf(profile, "%s_%s", shader_type_string(type), shader_models[runner->minimum_shader_model]); + sprintf(profile, "%s_%s", shader_type_string(type), shader_models[runner->current_shader_model]); hr = D3DCompile(source, len, NULL, NULL, NULL, "main", profile, runner->compile_options, 0, &blob, &errors); } hr = map_unidentified_hrs(hr); @@ -990,7 +980,7 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum /* 'todo' is not meaningful when dxcompiler is in use, so it has no '(sm<6) qualifier. */ if (match_directive_substring(src, "todo", &src)) { - if (runner->minimum_shader_model >= SHADER_MODEL_6_0) + if (runner->current_shader_model >= SHADER_MODEL_6_0) continue; if (state == STATE_SHADER_COMPUTE) state = STATE_SHADER_COMPUTE_TODO; @@ -1005,17 +995,17 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum } else if (match_directive_substring(src, "fail(sm<6)", &src)) { - if (runner->minimum_shader_model < SHADER_MODEL_6_0) + if (runner->current_shader_model < SHADER_MODEL_6_0) *expect_hr = E_FAIL; } else if (match_directive_substring(src, "fail(sm>=6)", &src)) { - if (runner->minimum_shader_model >= SHADER_MODEL_6_0) + if (runner->current_shader_model >= SHADER_MODEL_6_0) *expect_hr = E_FAIL; } else if (match_directive_substring(src, "notimpl(sm<6)", &src)) { - if (runner->minimum_shader_model < SHADER_MODEL_6_0) + if (runner->current_shader_model < SHADER_MODEL_6_0) *expect_hr = E_NOTIMPL; } else @@ -1030,8 +1020,8 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum return state; }
-void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler, - enum shader_model minimum_shader_model, enum shader_model maximum_shader_model) +static void run_shader_tests_with_model(struct shader_runner *runner, const struct shader_runner_ops *ops, + void *dxc_compiler, enum shader_model model) { size_t shader_source_size = 0, shader_source_len = 0; struct resource_params current_resource; @@ -1040,8 +1030,8 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o unsigned int i, line_number = 0; char *shader_source = NULL; HRESULT expect_hr = S_OK; - bool skip_tests = false; char line_buffer[256]; + bool skip_tests; FILE *f;
if (!test_options.filename) @@ -1052,8 +1042,21 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o
memset(runner, 0, sizeof(*runner)); runner->ops = ops; - runner->minimum_shader_model = minimum_shader_model; - runner->maximum_shader_model = maximum_shader_model; + + runner->current_shader_model = model; + + /* Default shader models. */ + skip_tests = true; + if (runner->current_shader_model == SHADER_MODEL_2_0) + skip_tests = false; + if (runner->current_shader_model == SHADER_MODEL_4_0) + skip_tests = false; + if (runner->current_shader_model == SHADER_MODEL_6_0) + skip_tests = false; + + assert(runner->ops->check_requirements); + if (!runner->ops->check_requirements(runner)) + skip_tests = true;
for (;;) { @@ -1073,11 +1076,9 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o break;
case STATE_REQUIRE: - if (runner->maximum_shader_model < runner->minimum_shader_model - || (runner->ops->check_requirements && !runner->ops->check_requirements(runner))) - { + if (!runner->ops->check_requirements(runner)) skip_tests = true; - } + break;
case STATE_RESOURCE: @@ -1215,10 +1216,8 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o else if (!strcmp(line, "[require]\n")) { state = STATE_REQUIRE; - runner->minimum_shader_model = minimum_shader_model; - runner->maximum_shader_model = maximum_shader_model; runner->compile_options = 0; - skip_tests = false; + skip_tests = true; } else if (match_directive_substring(line, "[pixel shader", &line)) { @@ -1365,7 +1364,7 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o }
case STATE_REQUIRE: - parse_require_directive(runner, line); + parse_require_directive(runner, line, &skip_tests); break;
case STATE_RESOURCE: @@ -1400,6 +1399,18 @@ void run_shader_tests(struct shader_runner *runner, const struct shader_runner_o fclose(f); }
+void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler) +{ + unsigned int i; + + for (i = SHADER_MODEL_2_0; i <= SHADER_MODEL_6_0; ++i) + { + vkd3d_test_push_context("Model %s", model_strings[i]); + run_shader_tests_with_model(runner, ops, dxc_compiler, i); + vkd3d_test_pop_context(); + } +} + #ifdef _WIN32 static void print_dll_version(const char *file_name) { diff --git a/tests/shader_runner.h b/tests/shader_runner.h index 3efbcf362..90202c6a7 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -118,8 +118,8 @@ struct shader_runner char *vs_source; char *ps_source; char *cs_source; - enum shader_model minimum_shader_model; - enum shader_model maximum_shader_model; + + enum shader_model current_shader_model;
bool last_render_failed;
@@ -163,8 +163,7 @@ void init_resource(struct resource *resource, const struct resource_params *para HRESULT dxc_compiler_compile_shader(void *dxc_compiler, enum shader_type type, unsigned int compile_options, const char *hlsl, ID3D10Blob **blob_out, ID3D10Blob **errors_out);
-void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler, - enum shader_model minimum_shader_model, enum shader_model maximum_shader_model); +void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler);
#ifdef _WIN32 void run_shader_tests_d3d9(void); diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index bd9d363ce..fa05b7491 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -80,15 +80,13 @@ static ID3D10Blob *compile_shader(const struct d3d11_shader_runner *runner, cons
static const char *const shader_models[] = { - [SHADER_MODEL_2_0] = "4_0", - [SHADER_MODEL_3_0] = "4_0", [SHADER_MODEL_4_0] = "4_0", [SHADER_MODEL_4_1] = "4_1", [SHADER_MODEL_5_0] = "5_0", [SHADER_MODEL_5_1] = "5_1", };
- sprintf(profile, "%s_%s", type, shader_models[runner->r.minimum_shader_model]); + sprintf(profile, "%s_%s", type, shader_models[runner->r.current_shader_model]); hr = D3DCompile(source, strlen(source), NULL, NULL, NULL, "main", profile, runner->r.compile_options, 0, &blob, &errors); ok(hr == S_OK, "Failed to compile shader, hr %#lx.\n", hr); if (errors) @@ -100,6 +98,13 @@ static ID3D10Blob *compile_shader(const struct d3d11_shader_runner *runner, cons return blob; }
+static bool d3d11_runner_check_requirements(struct shader_runner *r) +{ + enum shader_model model = r->current_shader_model; + + return (SHADER_MODEL_4_0 <= model) && (model < SHADER_MODEL_6_0); +} + static IDXGIAdapter *create_adapter(void) { IDXGIFactory4 *factory4; @@ -724,6 +729,7 @@ static void d3d11_runner_release_readback(struct shader_runner *r, struct resour
static const struct shader_runner_ops d3d11_runner_ops = { + .check_requirements = d3d11_runner_check_requirements, .create_resource = d3d11_runner_create_resource, .destroy_resource = d3d11_runner_destroy_resource, .dispatch = d3d11_runner_dispatch, @@ -747,7 +753,7 @@ void run_shader_tests_d3d11(void) init_adapter_info(); if (init_test_context(&runner)) { - run_shader_tests(&runner.r, &d3d11_runner_ops, NULL, SHADER_MODEL_2_0, SHADER_MODEL_5_1); + run_shader_tests(&runner.r, &d3d11_runner_ops, NULL); destroy_test_context(&runner); } } diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 8453617ef..1427aac79 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -45,6 +45,9 @@ struct d3d12_shader_runner
struct test_context test_context;
+ enum shader_model minimum_shader_model; + enum shader_model maximum_shader_model; + ID3D12DescriptorHeap *heap, *rtv_heap;
ID3D12CommandQueue *compute_queue; @@ -67,8 +70,6 @@ static ID3D10Blob *compile_shader(const struct d3d12_shader_runner *runner, cons
static const char *const shader_models[] = { - [SHADER_MODEL_2_0] = "4_0", - [SHADER_MODEL_3_0] = "4_0", [SHADER_MODEL_4_0] = "4_0", [SHADER_MODEL_4_1] = "4_1", [SHADER_MODEL_5_0] = "5_0", @@ -76,14 +77,15 @@ static ID3D10Blob *compile_shader(const struct d3d12_shader_runner *runner, cons [SHADER_MODEL_6_0] = "6_0", };
- if (runner->r.minimum_shader_model >= SHADER_MODEL_6_0) + + if (runner->r.current_shader_model >= SHADER_MODEL_6_0) { assert(runner->dxc_compiler); hr = dxc_compiler_compile_shader(runner->dxc_compiler, type, runner->r.compile_options, source, &blob, &errors); } else { - sprintf(profile, "%s_%s", shader_type_string(type), shader_models[runner->r.minimum_shader_model]); + sprintf(profile, "%s_%s", shader_type_string(type), shader_models[runner->r.current_shader_model]); hr = D3DCompile(source, strlen(source), NULL, NULL, NULL, "main", profile, runner->r.compile_options, 0, &blob, &errors); } ok(FAILED(hr) == !blob, "Got unexpected hr %#x, blob %p.\n", hr, blob); @@ -96,6 +98,22 @@ static ID3D10Blob *compile_shader(const struct d3d12_shader_runner *runner, cons return blob; }
+static bool d3d12_runner_check_requirements(struct shader_runner *r) +{ + struct d3d12_shader_runner *runner = d3d12_shader_runner(r); + enum shader_model model = r->current_shader_model; + + if (model < runner->minimum_shader_model) + return false; + if (model > runner->maximum_shader_model) + return false; + + if (!runner->dxc_compiler) + return (SHADER_MODEL_4_0 <= model) && (model < SHADER_MODEL_6_0); + else + return (SHADER_MODEL_4_0 <= model) && (model <= SHADER_MODEL_6_0); +} + #define MAX_RESOURCE_DESCRIPTORS (MAX_RESOURCES * 2)
static struct resource *d3d12_runner_create_resource(struct shader_runner *r, const struct resource_params *params) @@ -323,7 +341,7 @@ static bool d3d12_runner_dispatch(struct shader_runner *r, unsigned int x, unsig size_t i;
cs_code = compile_shader(runner, runner->r.cs_source, SHADER_TYPE_CS); - todo_if(runner->r.is_todo && runner->r.minimum_shader_model < SHADER_MODEL_6_0) ok(cs_code, "Failed to compile shader.\n"); + todo_if(runner->r.is_todo && runner->r.current_shader_model < SHADER_MODEL_6_0) ok(cs_code, "Failed to compile shader.\n"); if (!cs_code) return false;
@@ -407,7 +425,7 @@ static bool d3d12_runner_draw(struct shader_runner *r,
ps_code = compile_shader(runner, runner->r.ps_source, SHADER_TYPE_PS); vs_code = compile_shader(runner, runner->r.vs_source, SHADER_TYPE_VS); - todo_if(runner->r.is_todo && runner->r.minimum_shader_model < SHADER_MODEL_6_0) + todo_if(runner->r.is_todo && runner->r.current_shader_model < SHADER_MODEL_6_0) ok(ps_code && vs_code, "Failed to compile shaders.\n");
if (!ps_code || !vs_code) @@ -567,6 +585,7 @@ static void d3d12_runner_release_readback(struct shader_runner *r, struct resour
static const struct shader_runner_ops d3d12_runner_ops = { + .check_requirements = d3d12_runner_check_requirements, .create_resource = d3d12_runner_create_resource, .destroy_resource = d3d12_runner_destroy_resource, .dispatch = d3d12_runner_dispatch, @@ -596,6 +615,8 @@ void run_shader_tests_d3d12(void *dxc_compiler, enum shader_model minimum_shader device = runner.test_context.device;
runner.dxc_compiler = dxc_compiler; + runner.minimum_shader_model = minimum_shader_model; + runner.maximum_shader_model = maximum_shader_model;
runner.compute_queue = create_command_queue(device, D3D12_COMMAND_LIST_TYPE_COMPUTE, D3D12_COMMAND_QUEUE_PRIORITY_NORMAL); @@ -608,7 +629,7 @@ void run_shader_tests_d3d12(void *dxc_compiler, enum shader_model minimum_shader runner.compute_allocator, NULL, &IID_ID3D12GraphicsCommandList, (void **)&runner.compute_list); ok(hr == S_OK, "Failed to create command list, hr %#x.\n", hr);
- run_shader_tests(&runner.r, &d3d12_runner_ops, dxc_compiler, minimum_shader_model, maximum_shader_model); + run_shader_tests(&runner.r, &d3d12_runner_ops, dxc_compiler);
ID3D12GraphicsCommandList_Release(runner.compute_list); ID3D12CommandAllocator_Release(runner.compute_allocator); diff --git a/tests/shader_runner_d3d9.c b/tests/shader_runner_d3d9.c index 0b33c1c53..fe7abc327 100644 --- a/tests/shader_runner_d3d9.c +++ b/tests/shader_runner_d3d9.c @@ -68,7 +68,7 @@ static ID3D10Blob *compile_shader(const struct d3d9_shader_runner *runner, const [SHADER_MODEL_3_0] = "3_0", };
- sprintf(profile, "%s_%s", type, shader_models[runner->r.minimum_shader_model]); + sprintf(profile, "%s_%s", type, shader_models[runner->r.current_shader_model]); hr = D3DCompile(source, strlen(source), NULL, NULL, NULL, "main", profile, runner->r.compile_options, 0, &blob, &errors); ok(hr == S_OK, "Failed to compile shader, hr %#lx.\n", hr); if (errors) @@ -185,12 +185,9 @@ static D3DTEXTUREADDRESS sampler_address_to_d3d9(D3D12_TEXTURE_ADDRESS_MODE addr
static bool d3d9_runner_check_requirements(struct shader_runner *r) { - struct d3d9_shader_runner *runner = d3d9_shader_runner(r); - - if (runner->r.minimum_shader_model >= SHADER_MODEL_4_0) - return false; + enum shader_model model = r->current_shader_model;
- return true; + return (SHADER_MODEL_2_0 <= model) && (model < SHADER_MODEL_4_0); }
static struct resource *d3d9_runner_create_resource(struct shader_runner *r, const struct resource_params *params) @@ -541,7 +538,7 @@ void run_shader_tests_d3d9(void)
init_adapter_info(); init_test_context(&runner); - run_shader_tests(&runner.r, &d3d9_runner_ops, NULL, SHADER_MODEL_2_0, SHADER_MODEL_3_0); + run_shader_tests(&runner.r, &d3d9_runner_ops, NULL); destroy_test_context(&runner); } FreeLibrary(d3d9_module); diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index f89b4d624..a82178c04 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -83,6 +83,13 @@ static struct vulkan_shader_runner *vulkan_shader_runner(struct shader_runner *r
#define VK_CALL(f) (runner->f)
+static bool vulkan_runner_check_requirements(struct shader_runner *r) +{ + enum shader_model model = r->current_shader_model; + + return (SHADER_MODEL_4_0 <= model) && (model < SHADER_MODEL_6_0); +} + static void begin_command_buffer(struct vulkan_shader_runner *runner) { VkCommandBufferBeginInfo buffer_begin_desc = {.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO}; @@ -395,8 +402,6 @@ static bool compile_shader(const struct vulkan_shader_runner *runner, const char
static const char *const shader_models[] = { - [SHADER_MODEL_2_0] = "4_0", - [SHADER_MODEL_3_0] = "4_0", [SHADER_MODEL_4_0] = "4_0", [SHADER_MODEL_4_1] = "4_1", [SHADER_MODEL_5_0] = "5_0", @@ -439,7 +444,7 @@ static bool compile_shader(const struct vulkan_shader_runner *runner, const char }
hlsl_info.entry_point = "main"; - sprintf(profile, "%s_%s", type, shader_models[runner->r.minimum_shader_model]); + sprintf(profile, "%s_%s", type, shader_models[runner->r.current_shader_model]); hlsl_info.profile = profile;
ret = vkd3d_shader_compile(&info, dxbc, &messages); @@ -1157,6 +1162,7 @@ static void vulkan_runner_release_readback(struct shader_runner *r, struct resou
static const struct shader_runner_ops vulkan_runner_ops = { + .check_requirements = vulkan_runner_check_requirements, .create_resource = vulkan_runner_create_resource, .destroy_resource = vulkan_runner_destroy_resource, .dispatch = vulkan_runner_dispatch, @@ -1384,7 +1390,7 @@ void run_shader_tests_vulkan(void) if (!init_vulkan_runner(&runner)) return;
- run_shader_tests(&runner.r, &vulkan_runner_ops, NULL, SHADER_MODEL_2_0, SHADER_MODEL_5_1); + run_shader_tests(&runner.r, &vulkan_runner_ops, NULL);
cleanup_vulkan_runner(&runner); }
From: Francisco Casas fcasas@codeweavers.com
This would allow us to test compilation of SM1 shaders even if we don't have an available backend that can run them. --- tests/shader_runner.c | 73 ++++++++++++++++++++++++++++-------- tests/shader_runner.h | 2 +- tests/shader_runner_d3d11.c | 2 +- tests/shader_runner_d3d12.c | 2 +- tests/shader_runner_d3d9.c | 2 +- tests/shader_runner_vulkan.c | 2 +- 6 files changed, 63 insertions(+), 20 deletions(-)
diff --git a/tests/shader_runner.c b/tests/shader_runner.c index fa631588d..feabf0113 100644 --- a/tests/shader_runner.c +++ b/tests/shader_runner.c @@ -501,6 +501,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) if (ret < 3) fatal_error("Malformed dispatch arguments '%s'.\n", line);
+ assert(runner->ops->dispatch); runner->last_render_failed = !runner->ops->dispatch(runner, x, y, z); } else if (match_string(line, "draw quad", &line)) @@ -533,6 +534,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) params.height = RENDER_TARGET_HEIGHT; params.level_count = 1;
+ assert(runner->ops->create_resource); set_resource(runner, runner->ops->create_resource(runner, ¶ms)); }
@@ -552,11 +554,13 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) params.data = malloc(sizeof(quad)); memcpy(params.data, quad, sizeof(quad)); params.data_size = sizeof(quad); + assert(runner->ops->create_resource); set_resource(runner, runner->ops->create_resource(runner, ¶ms));
if (!runner->vs_source) runner->vs_source = strdup(vs_source);
+ assert(runner->ops->draw); runner->last_render_failed = !runner->ops->draw(runner, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST, 3); } else if (match_string(line, "draw", &line)) @@ -578,6 +582,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) params.height = RENDER_TARGET_HEIGHT; params.level_count = 1;
+ assert(runner->ops->create_resource); set_resource(runner, runner->ops->create_resource(runner, ¶ms)); }
@@ -592,6 +597,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) if (line == rest) fatal_error("Malformed vertex count '%s'.\n", line);
+ assert(runner->ops->draw); runner->last_render_failed = !runner->ops->draw(runner, topology, vertex_count); } else if (match_string(line, "probe", &line)) @@ -640,6 +646,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) resource = get_resource(runner, RESOURCE_TYPE_RENDER_TARGET, 0); }
+ assert(runner->ops->get_resource_readback); rb = runner->ops->get_resource_readback(runner, resource);
if (match_string(line, "all", &line)) @@ -688,6 +695,7 @@ static void parse_test_directive(struct shader_runner *runner, const char *line) fatal_error("Malformed probe arguments '%s'.\n", line); }
+ assert(runner->ops->release_readback); runner->ops->release_readback(runner, rb); } else if (match_string(line, "uniform", &line)) @@ -934,8 +942,8 @@ static void compile_shader(struct shader_runner *runner, IDxcCompiler3 *dxc_comp
static const char *const shader_models[] = { - [SHADER_MODEL_2_0] = "4_0", - [SHADER_MODEL_3_0] = "4_0", + [SHADER_MODEL_2_0] = "2_0", + [SHADER_MODEL_3_0] = "3_0", [SHADER_MODEL_4_0] = "4_0", [SHADER_MODEL_4_1] = "4_1", [SHADER_MODEL_5_0] = "5_0", @@ -1021,7 +1029,7 @@ static enum parse_state read_shader_directive(struct shader_runner *runner, enum }
static void run_shader_tests_with_model(struct shader_runner *runner, const struct shader_runner_ops *ops, - void *dxc_compiler, enum shader_model model) + void *dxc_compiler, enum shader_model model, bool compilation_check) { size_t shader_source_size = 0, shader_source_len = 0; struct resource_params current_resource; @@ -1054,9 +1062,12 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru if (runner->current_shader_model == SHADER_MODEL_6_0) skip_tests = false;
- assert(runner->ops->check_requirements); - if (!runner->ops->check_requirements(runner)) - skip_tests = true; + if (runner->ops) + { + assert(runner->ops->check_requirements); + if (!runner->ops->check_requirements(runner)) + skip_tests = true; + }
for (;;) { @@ -1076,7 +1087,7 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru break;
case STATE_REQUIRE: - if (!runner->ops->check_requirements(runner)) + if (runner->ops && !runner->ops->check_requirements(runner)) skip_tests = true;
break; @@ -1087,14 +1098,15 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru * textures with data type other than float). */ if (!skip_tests) { - set_resource(runner, runner->ops->create_resource(runner, ¤t_resource)); + if (runner->ops) + set_resource(runner, runner->ops->create_resource(runner, ¤t_resource)); } free(current_resource.data); break;
case STATE_SHADER_COMPUTE: case STATE_SHADER_COMPUTE_TODO: - if (!skip_tests) + if (!skip_tests && compilation_check) { todo_if (state == STATE_SHADER_COMPUTE_TODO) compile_shader(runner, dxc_compiler, shader_source, shader_source_len, SHADER_TYPE_CS, @@ -1109,7 +1121,7 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru
case STATE_SHADER_PIXEL: case STATE_SHADER_PIXEL_TODO: - if (!skip_tests) + if (!skip_tests && compilation_check) { todo_if (state == STATE_SHADER_PIXEL_TODO) compile_shader(runner, dxc_compiler, shader_source, shader_source_len, SHADER_TYPE_PS, @@ -1124,7 +1136,7 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru
case STATE_SHADER_VERTEX: case STATE_SHADER_VERTEX_TODO: - if (!skip_tests) + if (!skip_tests && compilation_check) { todo_if (state == STATE_SHADER_VERTEX_TODO) compile_shader(runner, dxc_compiler, shader_source, shader_source_len, SHADER_TYPE_VS, @@ -1378,7 +1390,7 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru case STATE_TEST: /* Compilation which fails with dxcompiler is not 'todo', therefore the tests are * not 'todo' either. They cannot run, so skip them entirely. */ - if (!skip_tests && SUCCEEDED(expect_hr)) + if (!skip_tests && !compilation_check && SUCCEEDED(expect_hr)) parse_test_directive(runner, line); break; } @@ -1392,6 +1404,7 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru free(runner->ps_source); for (i = 0; i < runner->resource_count; ++i) { + assert(runner->ops); if (runner->resources[i]) runner->ops->destroy_resource(runner, runner->resources[i]); } @@ -1399,18 +1412,33 @@ static void run_shader_tests_with_model(struct shader_runner *runner, const stru fclose(f); }
-void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler) +static void run_shader_tests_range(struct shader_runner *runner, const struct shader_runner_ops *ops, + enum shader_model minimum_shader_model, enum shader_model maximum_shader_model, + bool compilation_check, void *dxc_compiler) { unsigned int i;
- for (i = SHADER_MODEL_2_0; i <= SHADER_MODEL_6_0; ++i) + for (i = minimum_shader_model; i <= maximum_shader_model; ++i) { vkd3d_test_push_context("Model %s", model_strings[i]); - run_shader_tests_with_model(runner, ops, dxc_compiler, i); + run_shader_tests_with_model(runner, ops, dxc_compiler, i, compilation_check); vkd3d_test_pop_context(); } }
+void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops) +{ + run_shader_tests_range(runner, ops, SHADER_MODEL_2_0, SHADER_MODEL_6_0, false, NULL); +} + +static void run_compilation_tests(enum shader_model minimum_shader_model, enum shader_model maximum_shader_model, + void *dxc_compiler) +{ + struct shader_runner runner = {0}; + + run_shader_tests_range(&runner, NULL, minimum_shader_model, maximum_shader_model, true, dxc_compiler); +} + #ifdef _WIN32 static void print_dll_version(const char *file_name) { @@ -1509,6 +1537,9 @@ START_TEST(shader_runner) #if defined(VKD3D_CROSSTEST) trace("Running tests from a Windows cross build\n");
+ trace("Compiling shaders with d3dcompiler_47.dll\n"); + run_compilation_tests(SHADER_MODEL_2_0, SHADER_MODEL_5_1, NULL); + trace("Compiling shaders with d3dcompiler_47.dll and executing with d3d9.dll\n"); run_shader_tests_d3d9();
@@ -1526,6 +1557,9 @@ START_TEST(shader_runner) #elif defined(_WIN32) trace("Running tests from a Windows non-cross build\n");
+ trace("Compiling shaders with vkd3d_shader.\n"); + run_compilation_tests(SHADER_MODEL_4_0, SHADER_MODEL_5_1, NULL); + trace("Compiling shaders with vkd3d-shader and executing with d3d9.dll\n"); run_shader_tests_d3d9();
@@ -1537,6 +1571,9 @@ START_TEST(shader_runner)
if ((dxc_compiler = dxcompiler_create())) { + trace("Compiling shaders with dxcompiler\n"); + run_compilation_tests(SHADER_MODEL_6_0, SHADER_MODEL_6_0, dxc_compiler); + trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); run_shader_tests_d3d12(dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0); IDxcCompiler3_Release(dxc_compiler); @@ -1548,6 +1585,9 @@ START_TEST(shader_runner) #else trace("Running tests from a Unix build\n");
+ trace("Compiling shaders with vkd3d_shader.\n"); + run_compilation_tests(SHADER_MODEL_4_0, SHADER_MODEL_5_1, NULL); + trace("Compiling shaders with vkd3d-shader and executing with Vulkan\n"); run_shader_tests_vulkan();
@@ -1556,6 +1596,9 @@ START_TEST(shader_runner)
if ((dxc_compiler = dxcompiler_create())) { + trace("Compiling shaders with dxcompiler\n"); + run_compilation_tests(SHADER_MODEL_6_0, SHADER_MODEL_6_0, dxc_compiler); + trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); run_shader_tests_d3d12(dxc_compiler, SHADER_MODEL_6_0, SHADER_MODEL_6_0); IDxcCompiler3_Release(dxc_compiler); diff --git a/tests/shader_runner.h b/tests/shader_runner.h index 90202c6a7..23e8af441 100644 --- a/tests/shader_runner.h +++ b/tests/shader_runner.h @@ -163,7 +163,7 @@ void init_resource(struct resource *resource, const struct resource_params *para HRESULT dxc_compiler_compile_shader(void *dxc_compiler, enum shader_type type, unsigned int compile_options, const char *hlsl, ID3D10Blob **blob_out, ID3D10Blob **errors_out);
-void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops, void *dxc_compiler); +void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops);
#ifdef _WIN32 void run_shader_tests_d3d9(void); diff --git a/tests/shader_runner_d3d11.c b/tests/shader_runner_d3d11.c index fa05b7491..4e2a92e8f 100644 --- a/tests/shader_runner_d3d11.c +++ b/tests/shader_runner_d3d11.c @@ -753,7 +753,7 @@ void run_shader_tests_d3d11(void) init_adapter_info(); if (init_test_context(&runner)) { - run_shader_tests(&runner.r, &d3d11_runner_ops, NULL); + run_shader_tests(&runner.r, &d3d11_runner_ops); destroy_test_context(&runner); } } diff --git a/tests/shader_runner_d3d12.c b/tests/shader_runner_d3d12.c index 1427aac79..8ce5f6e5e 100644 --- a/tests/shader_runner_d3d12.c +++ b/tests/shader_runner_d3d12.c @@ -629,7 +629,7 @@ void run_shader_tests_d3d12(void *dxc_compiler, enum shader_model minimum_shader runner.compute_allocator, NULL, &IID_ID3D12GraphicsCommandList, (void **)&runner.compute_list); ok(hr == S_OK, "Failed to create command list, hr %#x.\n", hr);
- run_shader_tests(&runner.r, &d3d12_runner_ops, dxc_compiler); + run_shader_tests(&runner.r, &d3d12_runner_ops);
ID3D12GraphicsCommandList_Release(runner.compute_list); ID3D12CommandAllocator_Release(runner.compute_allocator); diff --git a/tests/shader_runner_d3d9.c b/tests/shader_runner_d3d9.c index fe7abc327..4aebd8cf1 100644 --- a/tests/shader_runner_d3d9.c +++ b/tests/shader_runner_d3d9.c @@ -538,7 +538,7 @@ void run_shader_tests_d3d9(void)
init_adapter_info(); init_test_context(&runner); - run_shader_tests(&runner.r, &d3d9_runner_ops, NULL); + run_shader_tests(&runner.r, &d3d9_runner_ops); destroy_test_context(&runner); } FreeLibrary(d3d9_module); diff --git a/tests/shader_runner_vulkan.c b/tests/shader_runner_vulkan.c index a82178c04..bed82cf51 100644 --- a/tests/shader_runner_vulkan.c +++ b/tests/shader_runner_vulkan.c @@ -1390,7 +1390,7 @@ void run_shader_tests_vulkan(void) if (!init_vulkan_runner(&runner)) return;
- run_shader_tests(&runner.r, &vulkan_runner_ops, NULL); + run_shader_tests(&runner.r, &vulkan_runner_ops);
cleanup_vulkan_runner(&runner); }
Giovanni Mascellani (@giomasce) commented about tests/shader_runner.c:
memset(runner, 0, sizeof(*runner)); runner->ops = ops;
- runner->minimum_shader_model = minimum_shader_model;
- runner->maximum_shader_model = maximum_shader_model;
- runner->current_shader_model = model;
- /* Default shader models. */
- skip_tests = true;
- if (runner->current_shader_model == SHADER_MODEL_2_0)
skip_tests = false;
- if (runner->current_shader_model == SHADER_MODEL_4_0)
skip_tests = false;
- if (runner->current_shader_model == SHADER_MODEL_6_0)
skip_tests = false;
This means that you have to declare the standard shaders models as soon as you have a `[require]` directive, even it was just for other settings. Rather, I'd say that we want to first parse the whole `[require]` block and, if no shader model is requested, use the default; otherwise, use the requested ones.
Giovanni Mascellani (@giomasce) commented about tests/shader_runner_d3d12.c:
device = runner.test_context.device; runner.dxc_compiler = dxc_compiler;
- runner.minimum_shader_model = minimum_shader_model;
- runner.maximum_shader_model = maximum_shader_model;
It seems that here you're keeping the minimum and maximum shader model just to account for the fact that the DXC compiler might or might not exist. Can't you just test that in `d3d12_runner_check_requirements()`?
Giovanni Mascellani (@giomasce) commented about tests/shader_runner.c:
vkd3d_test_pop_context(); }
}
+void run_shader_tests(struct shader_runner *runner, const struct shader_runner_ops *ops) +{
- run_shader_tests_range(runner, ops, SHADER_MODEL_2_0, SHADER_MODEL_6_0, false, NULL);
+}
+static void run_compilation_tests(enum shader_model minimum_shader_model, enum shader_model maximum_shader_model,
void *dxc_compiler)
+{
- struct shader_runner runner = {0};
- run_shader_tests_range(&runner, NULL, minimum_shader_model, maximum_shader_model, true, dxc_compiler);
+}
Instead of introducing a flag that must be checked throughout the runner, I'd rather introduce another runner ops that just compiles and does nothing else.
Also, it doesn't make sense to run pure compilation tests on crosstest and Windows builds, given that all the shader models are natively supported there anyway.
Giovanni Mascellani (@giomasce) commented about tests/shader_runner.c:
if (ret < 3) fatal_error("Malformed dispatch arguments '%s'.\n", line);
assert(runner->ops->dispatch);
I don't think all the `assert()`'s make sense. We can safely assume that ops are always defined, there is no need to check (or document) that. We don't usually check virtual function calls, AFAIA.
On Thu Nov 9 13:09:20 2023 +0000, Giovanni Mascellani wrote:
This means that you have to declare the standard shaders models as soon as you have a `[require]` directive, even it was just for other settings. Rather, I'd say that we want to first parse the whole `[require]` block and, if no shader model is requested, use the default; otherwise, use the requested ones.
Yep, I agree this can be better.
On Tue Nov 7 12:57:56 2023 +0000, Giovanni Mascellani wrote:
It seems that here you're keeping the minimum and maximum shader model just to account for the fact that the DXC compiler might or might not exist. Can't you just test that in `d3d12_runner_check_requirements()`?
Currently the only way we are identifying the runner in the test files are trace messages like the following: ``` trace("Compiling shaders with vkd3d-shader and executing with vkd3d\n"); trace("Compiling shaders with dxcompiler and executing with vkd3d\n"); ``` To be consistent with these, the tests that use vkd3d-shader as a compiler must be separated from the tests that use dxcompiler.
I would like more the `d3d12_runner_check_requirements()` alternative, but we would have to add the compiler and the runner using vkd3d_test_push_context(), instead of using these separator trace messages, which is something that I also like but may bring even more discussion.
Instead of introducing a flag that must be checked throughout the runner, I'd rather introduce another runner ops that just compiles and does nothing else.
Okay, but we would need a flag in the runner to discriminate whether it is a compilation-only runner, otherwise we must either define all the [test] related ops as empty functions or allowing them to be NULL, which means adding a lot of checks.
Also, it doesn't make sense to run pure compilation tests on crosstest and Windows builds, given that all the shader models are natively supported there anyway.
I am not sure I understand this, the Windows "non-cross" builds use vkd3d-shader, instead of the native compiler right?
Also, I think that it makes some sense to run compilation tests even with the native compiler, because we can make sure that we didn't made a mistake when writing the tests, or that fail/notimpl tests indeed fail.
On Tue Nov 7 12:57:57 2023 +0000, Giovanni Mascellani wrote:
I don't think all the `assert()`'s make sense. We can safely assume that ops are always defined, there is no need to check (or document) that. We don't usually check virtual function calls, AFAIA.
Hmm, right, these asserts are probably a remnant from when I tried the idea of making a separate compilation-only runner with NULL functions.
It was resolved to run SM1 compilation tests by just extending the vulkan runner to SM1 and make it retrieve "todo" and keep working on the ranges approach.
So I am marking this as a Draft until I have the new implementation, I still replied to Gio's comments.
This merge request was closed by Francisco Casas.
Superseded by !473.