mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/hlsl: Lower casts to bool to comparisons.
Signed-off-by: Giovanni Mascellani <gmascellani@codeweavers.com> Signed-off-by: Matteo Bruni <mbruni@codeweavers.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
8fa196cf51
commit
8c086b5c91
@ -750,6 +750,37 @@ static bool lower_division(struct hlsl_ctx *ctx, struct hlsl_ir_node *instr, voi
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool lower_casts_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 have already been lowered. */
|
||||
assert(type->dimx == arg_type->dimx);
|
||||
|
||||
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)
|
||||
@ -1655,6 +1686,7 @@ int hlsl_emit_bytecode(struct hlsl_ctx *ctx, struct hlsl_ir_function_decl *entry
|
||||
}
|
||||
while (progress);
|
||||
transform_ir(ctx, lower_narrowing_casts, body, NULL);
|
||||
transform_ir(ctx, lower_casts_to_bool, body, NULL);
|
||||
do
|
||||
{
|
||||
progress = transform_ir(ctx, hlsl_fold_constants, body, NULL);
|
||||
|
@ -27,7 +27,6 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
int32_t i;
|
||||
double d;
|
||||
float f;
|
||||
bool b;
|
||||
|
||||
if (dst->node.data_type->dimx != src->node.data_type->dimx
|
||||
|| dst->node.data_type->dimy != src->node.data_type->dimy)
|
||||
@ -47,7 +46,6 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
i = src->value[k].f;
|
||||
f = src->value[k].f;
|
||||
d = src->value[k].f;
|
||||
b = !!src->value[k].f;
|
||||
break;
|
||||
|
||||
case HLSL_TYPE_DOUBLE:
|
||||
@ -55,7 +53,6 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
i = src->value[k].d;
|
||||
f = src->value[k].d;
|
||||
d = src->value[k].d;
|
||||
b = !!src->value[k].d;
|
||||
break;
|
||||
|
||||
case HLSL_TYPE_INT:
|
||||
@ -63,7 +60,6 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
i = src->value[k].i;
|
||||
f = src->value[k].i;
|
||||
d = src->value[k].i;
|
||||
b = !!src->value[k].i;
|
||||
break;
|
||||
|
||||
case HLSL_TYPE_UINT:
|
||||
@ -71,7 +67,6 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
i = src->value[k].u;
|
||||
f = src->value[k].u;
|
||||
d = src->value[k].u;
|
||||
b = !!src->value[k].u;
|
||||
break;
|
||||
|
||||
case HLSL_TYPE_BOOL:
|
||||
@ -79,7 +74,6 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
i = !!src->value[k].u;
|
||||
f = !!src->value[k].u;
|
||||
d = !!src->value[k].u;
|
||||
b = !!src->value[k].u;
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -107,7 +101,8 @@ static bool fold_cast(struct hlsl_ctx *ctx, struct hlsl_ir_constant *dst, struct
|
||||
break;
|
||||
|
||||
case HLSL_TYPE_BOOL:
|
||||
dst->value[k].u = b ? ~0u : 0;
|
||||
/* Casts to bool should have already been lowered. */
|
||||
assert(0);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -1542,7 +1542,8 @@ static void write_sm4_cast(struct hlsl_ctx *ctx,
|
||||
break;
|
||||
|
||||
case HLSL_TYPE_BOOL:
|
||||
hlsl_fixme(ctx, &expr->node.loc, "SM4 cast to bool.");
|
||||
/* Casts to bool should have already been lowered. */
|
||||
assert(0);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
Loading…
x
Reference in New Issue
Block a user