[PATCH vkd3d v2 2/7] vkd3d-shader/hlsl: Make pre/post decrement generate a signed one.
Giovanni Mascellani
gmascellani at codeweavers.com
Mon Nov 22 09:14:18 CST 2021
Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
On 22/11/21 15:28, Giovanni Mascellani wrote:
> If a float expression is pre/post decremented and an unsigned one is
> used to execute it, the unsigned one is first negated (becoming 2^32-1)
> and then casted to float (becoming 2^32), which leads to an incorrect
> result.
> ---
> Makefile.am | 1 -
> libs/vkd3d-shader/hlsl.c | 12 ++++++++++++
> libs/vkd3d-shader/hlsl.h | 2 ++
> libs/vkd3d-shader/hlsl.y | 2 +-
> 4 files changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index 3e083b0a..bbfd6d9c 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -303,7 +303,6 @@ XFAIL_TESTS = \
> tests/hlsl-storage-qualifiers.shader_test \
> tests/hlsl-vector-indexing.shader_test \
> tests/hlsl-vector-indexing-uniform.shader_test \
> - tests/math.shader_test \
> tests/max.shader_test \
> tests/sampler.shader_test \
> tests/texture-load.shader_test \
> diff --git a/libs/vkd3d-shader/hlsl.c b/libs/vkd3d-shader/hlsl.c
> index 1eee4278..f6264fdd 100644
> --- a/libs/vkd3d-shader/hlsl.c
> +++ b/libs/vkd3d-shader/hlsl.c
> @@ -553,6 +553,18 @@ struct hlsl_ir_store *hlsl_new_simple_store(struct hlsl_ctx *ctx, struct hlsl_ir
> return hlsl_new_store(ctx, lhs, NULL, rhs, 0, rhs->loc);
> }
>
> +struct hlsl_ir_constant *hlsl_new_int_constant(struct hlsl_ctx *ctx, int n,
> + const struct vkd3d_shader_location loc)
> +{
> + struct hlsl_ir_constant *c;
> +
> + if (!(c = hlsl_alloc(ctx, sizeof(*c))))
> + return NULL;
> + init_node(&c->node, HLSL_IR_CONSTANT, ctx->builtin_types.scalar[HLSL_TYPE_INT], loc);
> + c->value[0].i = n;
> + return c;
> +}
> +
> struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned int n,
> const struct vkd3d_shader_location loc)
> {
> diff --git a/libs/vkd3d-shader/hlsl.h b/libs/vkd3d-shader/hlsl.h
> index 365ef980..3e7c906d 100644
> --- a/libs/vkd3d-shader/hlsl.h
> +++ b/libs/vkd3d-shader/hlsl.h
> @@ -718,6 +718,8 @@ struct hlsl_ir_var *hlsl_new_synthetic_var(struct hlsl_ctx *ctx, const char *nam
> struct hlsl_type *hlsl_new_texture_type(struct hlsl_ctx *ctx, enum hlsl_sampler_dim dim, struct hlsl_type *format);
> struct hlsl_ir_constant *hlsl_new_uint_constant(struct hlsl_ctx *ctx, unsigned int n,
> const struct vkd3d_shader_location loc);
> +struct hlsl_ir_constant *hlsl_new_int_constant(struct hlsl_ctx *ctx, int n,
> + const struct vkd3d_shader_location loc);
> struct hlsl_ir_node *hlsl_new_unary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_expr_op op, struct hlsl_ir_node *arg,
> struct vkd3d_shader_location loc);
> struct hlsl_ir_var *hlsl_new_var(struct hlsl_ctx *ctx, const char *name, struct hlsl_type *type,
> diff --git a/libs/vkd3d-shader/hlsl.y b/libs/vkd3d-shader/hlsl.y
> index b7e0409d..d2bddb2e 100644
> --- a/libs/vkd3d-shader/hlsl.y
> +++ b/libs/vkd3d-shader/hlsl.y
> @@ -1254,7 +1254,7 @@ static bool add_increment(struct hlsl_ctx *ctx, struct list *instrs, bool decrem
> hlsl_error(ctx, loc, VKD3D_SHADER_ERROR_HLSL_MODIFIES_CONST,
> "Argument to %s%screment operator is const.", post ? "post" : "pre", decrement ? "de" : "in");
>
> - if (!(one = hlsl_new_uint_constant(ctx, 1, loc)))
> + if (!(one = hlsl_new_int_constant(ctx, 1, loc)))
> return false;
> list_add_tail(instrs, &one->node.entry);
>
>
More information about the wine-devel
mailing list