Now that we can write HLSL intrinsics in HLSL, cleaning up missing functions becomes much easier.
This commit also extends the trigonometry tests a little bit to make sure that tan works right.
-- v4: vkd3d-shader/hlsl: Implement intrinsic tan.
From: Petrichor Park ppark@codeweavers.com
This commit also extends the trigonometry tests a little bit to make sure that tan works right. --- libs/vkd3d-shader/hlsl.y | 14 ++++++ tests/hlsl/out-of-bounds-float.shader_test | 9 ++++ tests/hlsl/trigonometry.shader_test | 50 ++++++++++++++-------- 3 files changed, 56 insertions(+), 17 deletions(-) create mode 100644 tests/hlsl/out-of-bounds-float.shader_test
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index 161d1ab42..d620dbd5d 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -3419,6 +3419,19 @@ static bool intrinsic_step(struct hlsl_ctx *ctx, return !!add_implicit_conversion(ctx, params->instrs, ge, type, loc); }
+static bool intrinsic_tan(struct hlsl_ctx *ctx, + const struct parse_initializer *params, const struct vkd3d_shader_location *loc) +{ + struct hlsl_ir_node *arg = params->args[0], *sin, *cos; + if (!(sin = add_unary_arithmetic_expr(ctx, params->instrs, HLSL_OP1_SIN, arg, loc))) + return false; + + if (!(cos = add_unary_arithmetic_expr(ctx, params->instrs, HLSL_OP1_COS, arg, loc))) + return false; + + return !!add_binary_arithmetic_expr(ctx, params->instrs, HLSL_OP2_DIV, sin, cos, loc); +} + static bool intrinsic_tex(struct hlsl_ctx *ctx, const struct parse_initializer *params, const struct vkd3d_shader_location *loc, const char *name, enum hlsl_sampler_dim dim) { @@ -3652,6 +3665,7 @@ intrinsic_functions[] = {"smoothstep", 3, true, intrinsic_smoothstep}, {"sqrt", 1, true, intrinsic_sqrt}, {"step", 2, true, intrinsic_step}, + {"tan", 1, true, intrinsic_tan}, {"tex2D", -1, false, intrinsic_tex2D}, {"tex3D", -1, false, intrinsic_tex3D}, {"texCUBE", -1, false, intrinsic_texCUBE}, diff --git a/tests/hlsl/out-of-bounds-float.shader_test b/tests/hlsl/out-of-bounds-float.shader_test new file mode 100644 index 000000000..505317447 --- /dev/null +++ b/tests/hlsl/out-of-bounds-float.shader_test @@ -0,0 +1,9 @@ +[pixel shader] +float4 main() : sv_target { + float x = .12345; + return float4(x, 0.0, 0.0, 0.0); +} + +[test] +draw quad +probe all rgba (0.12345, 0.0, 0.0, 0.0) diff --git a/tests/hlsl/trigonometry.shader_test b/tests/hlsl/trigonometry.shader_test index 09933d3b7..f283c538c 100644 --- a/tests/hlsl/trigonometry.shader_test +++ b/tests/hlsl/trigonometry.shader_test @@ -8,27 +8,27 @@ void main(out float tex : texcoord, inout float4 pos : sv_position) float4 main(float tex : texcoord) : sv_target { tex = floor(tex + 0.25); - return float4(sin(tex), cos(tex), 0, 0); + return float4(sin(tex), cos(tex), tan(tex), 0); }
[test] draw quad -probe ( 0, 0) rgba ( 0.00000000, 1.00000000, 0.0, 0.0) -probe ( 1, 0) rgba ( 0.84147098, 0.54030231, 0.0, 0.0) 1024 -probe ( 2, 0) rgba ( 0.90929743, -0.41614684, 0.0, 0.0) 1024 -probe ( 3, 0) rgba ( 0.14112001, -0.98999250, 0.0, 0.0) 1024 -probe ( 4, 0) rgba (-0.75680250, -0.65364362, 0.0, 0.0) 1024 -probe ( 5, 0) rgba (-0.95892427, 0.28366219, 0.0, 0.0) 1024 -probe ( 6, 0) rgba (-0.27941550, 0.96017029, 0.0, 0.0) 1024 -probe ( 7, 0) rgba ( 0.65698660, 0.75390225, 0.0, 0.0) 1024 -probe ( 8, 0) rgba ( 0.98935825, -0.14550003, 0.0, 0.0) 1024 -probe ( 9, 0) rgba ( 0.41211849, -0.91113026, 0.0, 0.0) 1024 -probe (10, 0) rgba (-0.54402111, -0.83907153, 0.0, 0.0) 1024 -probe (11, 0) rgba (-0.99999021, 0.00442570, 0.0, 0.0) 2048 -probe (12, 0) rgba (-0.53657292, 0.84385396, 0.0, 0.0) 1024 -probe (13, 0) rgba ( 0.42016704, 0.90744678, 0.0, 0.0) 1024 -probe (14, 0) rgba ( 0.99060736, 0.13673722, 0.0, 0.0) 1024 -probe (15, 0) rgba ( 0.65028784, -0.75968791, 0.0, 0.0) 1024 +probe ( 0, 0) rgba ( 0.00000000, 1.00000000, 0.00000000, 0.0) +probe ( 1, 0) rgba ( 0.84147098, 0.54030231, 1.55740772, 0.0) 1024 +probe ( 2, 0) rgba ( 0.90929743, -0.41614684, -2.18503986, 0.0) 1024 +probe ( 3, 0) rgba ( 0.14112001, -0.98999250, -0.14254654, 0.0) 1024 +probe ( 4, 0) rgba (-0.75680250, -0.65364362, 1.15782128, 0.0) 1024 +probe ( 5, 0) rgba (-0.95892427, 0.28366219, -3.38051501, 0.0) 1024 +probe ( 6, 0) rgba (-0.27941550, 0.96017029, -0.29100619, 0.0) 1024 +probe ( 7, 0) rgba ( 0.65698660, 0.75390225, 0.87144798, 0.0) 1024 +probe ( 8, 0) rgba ( 0.98935825, -0.14550003, -6.79971146, 0.0) 1024 +probe ( 9, 0) rgba ( 0.41211849, -0.91113026, -0.45231566, 0.0) 1024 +probe (10, 0) rgba (-0.54402111, -0.83907153, 0.64836083, 0.0) 1024 +probe (11, 0) rgba (-0.99999021, 0.00442570, -225.95084645, 0.0) 2048 +probe (12, 0) rgba (-0.53657292, 0.84385396, -0.63585993, 0.0) 1024 +probe (13, 0) rgba ( 0.42016704, 0.90744678, 0.46302113, 0.0) 1024 +probe (14, 0) rgba ( 0.99060736, 0.13673722, 7.24460662, 0.0) 1024 +probe (15, 0) rgba ( 0.65028784, -0.75968791, -0.85599340, 0.0) 1024
[pixel shader] @@ -57,3 +57,19 @@ float4 main() : sv_target uniform 0 float4 0.0 0.78539816 1.57079632 2.35619449 draw quad probe all rgba (1000.0, 707.0, -0.0, -707.0) + + +[pixel shader] +uniform float4 a; + +float4 main() : sv_target +{ + return round(1000 * tan(a)); +} + +[test] +% tan(pi/2) is an asymtote and therefore undefined +% so check 0, pi/4, 3pi/4, pi +uniform 0 float4 0.0 0.78539816 2.35619449 3.14159265 +draw quad +probe all rgba (0, 1000, -1000.0, 0)
Giovanni Mascellani (@giomasce) commented about libs/vkd3d-shader/hlsl.y:
return !!add_implicit_conversion(ctx, params->instrs, ge, type, loc);
}
+static bool intrinsic_tan(struct hlsl_ctx *ctx,
const struct parse_initializer *params, const struct vkd3d_shader_location *loc)
+{
- struct hlsl_ir_node *arg = params->args[0], *sin, *cos;
- if (!(sin = add_unary_arithmetic_expr(ctx, params->instrs, HLSL_OP1_SIN, arg, loc)))
Nitpick: please add an empty line here too (between declarations and code).
Giovanni Mascellani (@giomasce) commented about tests/hlsl/out-of-bounds-float.shader_test:
+[pixel shader] +float4 main() : sv_target {
- float x = .12345;
- return float4(x, 0.0, 0.0, 0.0);
+}
+[test] +draw quad +probe all rgba (0.12345, 0.0, 0.0, 0.0)
What is this supposed to test? Why does it belong to this commit? Also, notice that if you don't add it to `Makefile.am` it won't be considered for running the tests.
On Wed Sep 6 09:11:06 2023 +0000, Giovanni Mascellani wrote:
What is this supposed to test? Why does it belong to this commit? Also, notice that if you don't add it to `Makefile.am` it won't be considered for running the tests.
I thought I omitted that from the patch set. So sorry.