[PATCH vkd3d 2/2] vkd3d-shader/hlsl: Implement floor().

Giovanni Mascellani gmascellani at codeweavers.com
Mon Dec 13 03:03:14 CST 2021


Signed-off-by: Giovanni Mascellani <gmascellani at 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 at 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
> 



More information about the wine-devel mailing list