From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/hlsl.y | 12 ++++++++++++ libs/vkd3d-shader/hlsl_sm4.c | 5 +++++ tests/trigonometry.shader_test | 10 +++++----- 3 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index eea1d698..6beb80e4 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -2387,6 +2387,17 @@ static bool intrinsic_clamp(struct hlsl_ctx *ctx, return !!add_binary_arithmetic_expr(ctx, params->instrs, HLSL_OP2_MIN, max, params->args[2], loc); }
+static bool intrinsic_cos(struct hlsl_ctx *ctx, + const struct parse_initializer *params, const struct vkd3d_shader_location *loc) +{ + struct hlsl_ir_node *arg; + + if (!(arg = intrinsic_float_convert_arg(ctx, params, params->args[0], loc))) + return false; + + return !!add_unary_arithmetic_expr(ctx, params->instrs, HLSL_OP1_COS, arg, loc); +} + static bool intrinsic_cross(struct hlsl_ctx *ctx, const struct parse_initializer *params, const struct vkd3d_shader_location *loc) { @@ -2844,6 +2855,7 @@ intrinsic_functions[] = {"abs", 1, true, intrinsic_abs}, {"asuint", -1, true, intrinsic_asuint}, {"clamp", 3, true, intrinsic_clamp}, + {"cos", 1, true, intrinsic_cos}, {"cross", 2, true, intrinsic_cross}, {"dot", 2, true, intrinsic_dot}, {"floor", 1, true, intrinsic_floor}, diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index c7231826..e06f4b15 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1698,6 +1698,11 @@ static void write_sm4_expr(struct hlsl_ctx *ctx, write_sm4_cast(ctx, buffer, expr); break;
+ case HLSL_OP1_COS: + assert(type_is_float(dst_type)); + write_sm4_unary_op_with_two_destinations(buffer, VKD3D_SM4_OP_SINCOS, &expr->node, 1, arg1); + break; + case HLSL_OP1_EXP2: assert(type_is_float(dst_type)); write_sm4_unary_op(buffer, VKD3D_SM4_OP_EXP, &expr->node, arg1, 0); diff --git a/tests/trigonometry.shader_test b/tests/trigonometry.shader_test index 919eea20..09933d3b 100644 --- a/tests/trigonometry.shader_test +++ b/tests/trigonometry.shader_test @@ -4,7 +4,7 @@ void main(out float tex : texcoord, inout float4 pos : sv_position) tex = (pos.x + 1) * 320; }
-[pixel shader todo] +[pixel shader] float4 main(float tex : texcoord) : sv_target { tex = floor(tex + 0.25); @@ -12,7 +12,7 @@ float4 main(float tex : texcoord) : sv_target }
[test] -todo draw quad +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 @@ -45,7 +45,7 @@ draw quad probe all rgba (0.0, 500.0, 500.0, 0.0)
-[pixel shader todo] +[pixel shader] uniform float4 a;
float4 main() : sv_target @@ -55,5 +55,5 @@ float4 main() : sv_target
[test] uniform 0 float4 0.0 0.78539816 1.57079632 2.35619449 -todo draw quad -todo probe all rgba (1000.0, 707.0, -0.0, -707.0) +draw quad +probe all rgba (1000.0, 707.0, -0.0, -707.0)