Module: vkd3d Branch: master Commit: 3e6fccdbf96802f62b001cd2461af2c6a58b85a4 URL: https://gitlab.winehq.org/wine/vkd3d/-/commit/3e6fccdbf96802f62b001cd2461af2...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Tue Jan 24 10:57:18 2023 +0300
vkd3d-shader/hlsl: Support frac() intrinsic.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=34242 Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
Makefile.am | 1 + libs/vkd3d-shader/hlsl.y | 12 ++++++++++++ libs/vkd3d-shader/hlsl_sm1.c | 4 ++++ tests/frac.shader_test | 12 ++++++++++++ 4 files changed, 29 insertions(+)
diff --git a/Makefile.am b/Makefile.am index 0536c53b..be84e829 100644 --- a/Makefile.am +++ b/Makefile.am @@ -60,6 +60,7 @@ vkd3d_shader_tests = \ tests/compute.shader_test \ tests/conditional.shader_test \ tests/floor.shader_test \ + tests/frac.shader_test \ tests/hlsl-array-dimension.shader_test \ tests/hlsl-attributes.shader_test \ tests/hlsl-bool-cast.shader_test \ diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index b3e38d1f..93d4ca7d 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -2502,6 +2502,17 @@ static bool intrinsic_floor(struct hlsl_ctx *ctx, return !!add_unary_arithmetic_expr(ctx, params->instrs, HLSL_OP1_FLOOR, arg, loc); }
+static bool intrinsic_frac(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_FRACT, arg, loc); +} + static bool intrinsic_ldexp(struct hlsl_ctx *ctx, const struct parse_initializer *params, const struct vkd3d_shader_location *loc) { @@ -2922,6 +2933,7 @@ intrinsic_functions[] = {"cross", 2, true, intrinsic_cross}, {"dot", 2, true, intrinsic_dot}, {"floor", 1, true, intrinsic_floor}, + {"frac", 1, true, intrinsic_frac}, {"ldexp", 2, true, intrinsic_ldexp}, {"length", 1, true, intrinsic_length}, {"lerp", 3, true, intrinsic_lerp}, diff --git a/libs/vkd3d-shader/hlsl_sm1.c b/libs/vkd3d-shader/hlsl_sm1.c index ba22925e..fb505473 100644 --- a/libs/vkd3d-shader/hlsl_sm1.c +++ b/libs/vkd3d-shader/hlsl_sm1.c @@ -658,6 +658,10 @@ static void write_sm1_expr(struct hlsl_ctx *ctx, struct vkd3d_bytecode_buffer *b write_sm1_binary_op(ctx, buffer, D3DSIO_MUL, &instr->reg, &arg1->reg, &arg2->reg); break;
+ case HLSL_OP1_FRACT: + write_sm1_unary_op(ctx, buffer, D3DSIO_FRC, &instr->reg, &arg1->reg, D3DSPSM_NONE); + break; + default: hlsl_fixme(ctx, &instr->loc, "SM1 "%s" expression.", debug_hlsl_expr_op(expr->op)); break; diff --git a/tests/frac.shader_test b/tests/frac.shader_test new file mode 100644 index 00000000..f54f3fe8 --- /dev/null +++ b/tests/frac.shader_test @@ -0,0 +1,12 @@ +[pixel shader] +uniform float4 f; + +float4 main() : sv_target +{ + return frac(f); +} + +[test] +uniform 0 float4 -1.1 1.6 1.3 0.5 +draw quad +probe all rgba (0.9, 0.6, 0.3, 0.5) 2