Signed-off-by: Giovanni Mascellani gmascellani@codeweavers.com --- For the record, add_unary_arithmetic_expr is not completely correct here, because, for example, it produces an int4 output type when input is int4, while native would convert to float4.
However, integer floor is not implemented anyway, and other intrinsics are broken in the same way, so there's not reason to delay this patch.
Eventually I think it would make sense to have another helper called something like "add_unary_float_arithmetic_expr" that always converts its input to half4 or float4.
On 11/12/21 20:44, Nikolay Sivov wrote:
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
Makefile.am | 1 + libs/vkd3d-shader/hlsl.h | 1 + libs/vkd3d-shader/hlsl.y | 7 +++++++ libs/vkd3d-shader/hlsl_sm4.c | 4 ++++ tests/floor.shader_test | 26 ++++++++++++++++++++++++++ 5 files changed, 39 insertions(+) create mode 100644 tests/floor.shader_test
diff --git a/Makefile.am b/Makefile.am index be3d8ec..a4d188b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -60,6 +60,7 @@ vkd3d_shader_tests = \ tests/cast-to-int.shader_test \ tests/cast-to-uint.shader_test \ tests/conditional.shader_test \
- tests/floor.shader_test \ tests/hlsl-array-dimension.shader_test \ tests/hlsl-bool-cast.shader_test \ tests/hlsl-clamp.shader_test \
diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h index e7bdb45..636d27c 100644 --- a/libs/vkd3d-shader/hlsl.h +++ b/libs/vkd3d-shader/hlsl.h @@ -293,6 +293,7 @@ enum hlsl_ir_expr_op HLSL_OP1_DSX, HLSL_OP1_DSY, HLSL_OP1_EXP2,
- HLSL_OP1_FLOOR, HLSL_OP1_FRACT, HLSL_OP1_LOG2, HLSL_OP1_LOGIC_NOT,
diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y index ff35c09..4ef8d79 100644 --- a/libs/vkd3d-shader/hlsl.y +++ b/libs/vkd3d-shader/hlsl.y @@ -1646,6 +1646,12 @@ static bool intrinsic_max(struct hlsl_ctx *ctx, return !!add_binary_arithmetic_expr(ctx, params->instrs, HLSL_OP2_MAX, params->args[0], params->args[1], &loc); }
+static bool intrinsic_floor(struct hlsl_ctx *ctx,
const struct parse_initializer *params, struct vkd3d_shader_location loc)
+{
- return !!add_unary_arithmetic_expr(ctx, params->instrs, HLSL_OP1_FLOOR, params->args[0], &loc);
+}
- static bool intrinsic_pow(struct hlsl_ctx *ctx, const struct parse_initializer *params, struct vkd3d_shader_location loc) {
@@ -1690,6 +1696,7 @@ intrinsic_functions[] = {"abs", 1, true, intrinsic_abs}, {"clamp", 3, true, intrinsic_clamp}, {"cross", 2, true, intrinsic_cross},
- {"floor", 1, true, intrinsic_floor}, {"max", 2, true, intrinsic_max}, {"pow", 2, true, intrinsic_pow}, {"round", 1, true, intrinsic_round},
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c index c0c26f8..6f07f97 100644 --- a/libs/vkd3d-shader/hlsl_sm4.c +++ b/libs/vkd3d-shader/hlsl_sm4.c @@ -1297,6 +1297,10 @@ static void write_sm4_expr(struct hlsl_ctx *ctx, write_sm4_unary_op(buffer, VKD3D_SM4_OP_EXP, &expr->node, arg1, 0); break;
case HLSL_OP1_FLOOR:
write_sm4_unary_op(buffer, VKD3D_SM4_OP_ROUND_NI, &expr->node, arg1, 0);
break;
case HLSL_OP1_LOG2: write_sm4_unary_op(buffer, VKD3D_SM4_OP_LOG, &expr->node, arg1, 0); break;
diff --git a/tests/floor.shader_test b/tests/floor.shader_test new file mode 100644 index 0000000..0593eaf --- /dev/null +++ b/tests/floor.shader_test @@ -0,0 +1,26 @@ +[pixel shader] +float4 main(uniform float4 u) : sv_target +{
- return floor(u);
+}
+[test] +uniform 0 float4 -0.5 6.5 7.5 3.4 +draw quad +probe all rgba (-1.0, 6.0, 7.0, 3.0) 4
+[pixel shader] +float4 main(uniform float4 u) : sv_target +{
- float a = floor(u.r);
- int2 b = floor(u.gb);
- float4 res = float4(b, a, u.a);
- return floor(res);
+}
+[test] +uniform 0 float4 -0.5 6.5 7.5 3.4 +draw quad +probe all rgba (6.0, 7.0, -1.0, 3.0) 4