From: Petrichor Park ppark@codeweavers.com
--- libs/vkd3d-shader/hlsl.y | 32 +++++++++++++++++++++++++++++ tests/hlsl/trigonometry.shader_test | 6 +++--- 2 files changed, 35 insertions(+), 3 deletions(-)
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index e4a5bf1f3..a5ea27ad3 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -3939,6 +3939,37 @@ static bool intrinsic_tan(struct hlsl_ctx *ctx, return !!add_binary_arithmetic_expr(ctx, params->instrs, HLSL_OP2_DIV, sin, cos, loc); }
+static bool intrinsic_tanh(struct hlsl_ctx *ctx, + const struct parse_initializer *params, const struct vkd3d_shader_location *loc) +{ + struct hlsl_ir_function_decl *func; + struct hlsl_type *type; + char *body; + + static const char template[] = + "%s tanh(%s x)\n" + "{\n" + " %s expPos, expNeg;\n" + " expPos = exp(x);\n" + " expNeg = exp(-x);\n" + " return (expPos - expNeg) / (expPos + expNeg);\n" + "}\n"; + + type = params->args[0]->data_type; + type = hlsl_get_numeric_type(ctx, type->class, HLSL_TYPE_FLOAT, type->dimx, type->dimy); + + if (!(body = hlsl_sprintf_alloc(ctx, template, + type->name, type->name, type->name))) + return false; + + func = hlsl_compile_internal_function(ctx, "tanh", body); + vkd3d_free(body); + if (!func) + return false; + + return add_user_call(ctx, func, params, 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) { @@ -4313,6 +4344,7 @@ intrinsic_functions[] = {"sqrt", 1, true, intrinsic_sqrt}, {"step", 2, true, intrinsic_step}, {"tan", 1, true, intrinsic_tan}, + {"tanh", 1, true, intrinsic_tanh}, {"tex1D", -1, false, intrinsic_tex1D}, {"tex2D", -1, false, intrinsic_tex2D}, {"tex2Dlod", 2, false, intrinsic_tex2Dlod}, diff --git a/tests/hlsl/trigonometry.shader_test b/tests/hlsl/trigonometry.shader_test index 392728098..cf6165876 100644 --- a/tests/hlsl/trigonometry.shader_test +++ b/tests/hlsl/trigonometry.shader_test @@ -111,7 +111,7 @@ todo(glsl) draw quad probe all rgba (1.0, 1.0, 1.0e39, 1.0e39) 1
-[pixel shader todo] +[pixel shader] uniform float4 a;
float4 main() : sv_target @@ -121,8 +121,8 @@ float4 main() : sv_target
[test] uniform 0 float4 -1.57079633 -0.54930614 0.54930614 1.57079633 -todo draw quad +todo(glsl) draw quad probe all rgba (-0.91715234, -0.5, 0.5, 0.91715234) 2 uniform 0 float4 -10.0 -0.0 0.0 10.0 -todo draw quad +todo(glsl) draw quad probe all rgba (-1.0, 0.0, 0.0, 1.0) 1