mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2024-11-21 16:46:41 -08:00
vkd3d-shader/hlsl: Return an "error" expression when constructing an arithmetic expression from incompatible types.
This commit is contained in:
parent
c43e5c8eb5
commit
7e3231c749
Notes:
Henri Verbeet
2024-09-23 15:55:59 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1071
@ -1635,6 +1635,16 @@ struct hlsl_ir_node *hlsl_new_ternary_expr(struct hlsl_ctx *ctx, enum hlsl_ir_ex
|
||||
return hlsl_new_expr(ctx, op, operands, arg1->data_type, &arg1->loc);
|
||||
}
|
||||
|
||||
static struct hlsl_ir_node *hlsl_new_error_expr(struct hlsl_ctx *ctx)
|
||||
{
|
||||
static const struct vkd3d_shader_location loc = {.source_name = "<error>"};
|
||||
struct hlsl_ir_node *operands[HLSL_MAX_OPERANDS] = {0};
|
||||
|
||||
/* Use a dummy location; we should never report any messages related to
|
||||
* this expression. */
|
||||
return hlsl_new_expr(ctx, HLSL_OP0_ERROR, operands, ctx->builtin_types.error, &loc);
|
||||
}
|
||||
|
||||
struct hlsl_ir_node *hlsl_new_if(struct hlsl_ctx *ctx, struct hlsl_ir_node *condition,
|
||||
struct hlsl_block *then_block, struct hlsl_block *else_block, const struct vkd3d_shader_location *loc)
|
||||
{
|
||||
@ -3059,6 +3069,7 @@ const char *debug_hlsl_expr_op(enum hlsl_ir_expr_op op)
|
||||
{
|
||||
static const char *const op_names[] =
|
||||
{
|
||||
[HLSL_OP0_ERROR] = "error",
|
||||
[HLSL_OP0_VOID] = "void",
|
||||
[HLSL_OP0_RASTERIZER_SAMPLE_COUNT] = "GetRenderTargetSampleCount",
|
||||
|
||||
@ -4279,6 +4290,10 @@ static bool hlsl_ctx_init(struct hlsl_ctx *ctx, const struct vkd3d_shader_compil
|
||||
}
|
||||
}
|
||||
|
||||
if (!(ctx->error_instr = hlsl_new_error_expr(ctx)))
|
||||
return false;
|
||||
hlsl_block_add_instr(&ctx->static_initializers, ctx->error_instr);
|
||||
|
||||
ctx->domain = VKD3D_TESSELLATOR_DOMAIN_INVALID;
|
||||
ctx->output_control_point_count = UINT_MAX;
|
||||
ctx->output_primitive = 0;
|
||||
|
@ -661,6 +661,7 @@ struct hlsl_ir_switch
|
||||
|
||||
enum hlsl_ir_expr_op
|
||||
{
|
||||
HLSL_OP0_ERROR,
|
||||
HLSL_OP0_VOID,
|
||||
HLSL_OP0_RASTERIZER_SAMPLE_COUNT,
|
||||
|
||||
@ -1050,6 +1051,9 @@ struct hlsl_ctx
|
||||
struct hlsl_type *error;
|
||||
} builtin_types;
|
||||
|
||||
/* Pre-allocated "error" expression. */
|
||||
struct hlsl_ir_node *error_instr;
|
||||
|
||||
/* List of the instruction nodes for initializing static variables. */
|
||||
struct hlsl_block static_initializers;
|
||||
|
||||
|
@ -1756,7 +1756,11 @@ static struct hlsl_ir_node *add_binary_arithmetic_expr(struct hlsl_ctx *ctx, str
|
||||
struct hlsl_ir_node *args[HLSL_MAX_OPERANDS] = {0};
|
||||
struct hlsl_type *common_type;
|
||||
|
||||
common_type = get_common_numeric_type(ctx, arg1, arg2, loc);
|
||||
if (!(common_type = get_common_numeric_type(ctx, arg1, arg2, loc)))
|
||||
{
|
||||
block->value = ctx->error_instr;
|
||||
return block->value;
|
||||
}
|
||||
|
||||
if (!(args[0] = add_implicit_conversion(ctx, block, arg1, common_type, loc)))
|
||||
return NULL;
|
||||
|
Loading…
x
Reference in New Issue
Block a user