[PATCH vkd3d 6/6] vkd3d-shader/hlsl: Lower casts to bool to comparisons.

Matteo Bruni matteo.mystral at gmail.com
Tue Apr 5 05:48:25 CDT 2022


On Thu, Mar 24, 2022 at 10:32 PM Francisco Casas <fcasas at codeweavers.com> wrote:
>
> Hello,
>
> March 23, 2022 11:28 AM, "Giovanni Mascellani" <gmascellani at codeweavers.com> wrote:
>
> > Signed-off-by: Giovanni Mascellani <gmascellani at codeweavers.com>
> > ---
> > libs/vkd3d-shader/hlsl_codegen.c | 32 +++++++++++++++++++++++++++
> > libs/vkd3d-shader/hlsl_constant_ops.c | 10 ++-------
> > libs/vkd3d-shader/hlsl_sm4.c | 4 ++--
> > 3 files changed, 36 insertions(+), 10 deletions(-)
> >
> > diff --git a/libs/vkd3d-shader/hlsl_codegen.c b/libs/vkd3d-shader/hlsl_codegen.c
> > index 3d0f9e41..7222ff8a 100644
> > --- a/libs/vkd3d-shader/hlsl_codegen.c
> > +++ b/libs/vkd3d-shader/hlsl_codegen.c
> > @@ -745,6 +745,37 @@ static bool lower_division(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr,
> > voi
> > return true;
> > }
> >
> > +static bool lower_cast_to_bool(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
> > +{
> > + struct hlsl_type *type = instr->data_type, *arg_type;
> > + struct hlsl_ir_constant *zero;
> > + struct hlsl_ir_expr *expr;
> > +
> > + if (instr->type != HLSL_IR_EXPR)
> > + return false;
> > + expr = hlsl_ir_expr(instr);
> > + if (expr->op != HLSL_OP1_CAST)
> > + return false;
> > + arg_type = expr->operands[0].node->data_type;
> > + if (type->type > HLSL_CLASS_VECTOR || arg_type->type > HLSL_CLASS_VECTOR)
> > + return false;
> > + if (type->base_type != HLSL_TYPE_BOOL)
> > + return false;
> > +
> > + /* Narrowing casts should already have been lowered. */
> > + assert(type->dimx == arg_type->dimx);
> > +
>
> But isn't lower_cast_to_bool being done before lower_narrowing_casts in
> hlsl_emit_bytecode() ?
>
> > + zero = hlsl_new_constant(ctx, arg_type, &instr->loc);
> > + if (!zero)
> > + return false;
> > + list_add_before(&instr->entry, &zero->node.entry);
> > +
> > + expr->op = HLSL_OP2_NEQUAL;
> > + hlsl_src_from_node(&expr->operands[1], &zero->node);
> > +
> > + return true;
> > +}
> > +
> > static bool dce(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, void *context)
> > {
> > switch (instr->type)
> > @@ -1642,6 +1673,7 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl
> > *entry
> > }
> >
> > transform_ir(ctx, lower_broadcasts, body, NULL);
> > + transform_ir(ctx, lower_cast_to_bool, body, NULL);
>
> here.

Yes, e.g. the following shader asserts:

uniform float4 val;

bool2 main() : sv_target
{
    return (bool2)val;
}

It's still an issue in v2.



More information about the wine-devel mailing list