mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-04-13 05:43:18 -07: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);
|
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_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)
|
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[] =
|
static const char *const op_names[] =
|
||||||
{
|
{
|
||||||
|
[HLSL_OP0_ERROR] = "error",
|
||||||
[HLSL_OP0_VOID] = "void",
|
[HLSL_OP0_VOID] = "void",
|
||||||
[HLSL_OP0_RASTERIZER_SAMPLE_COUNT] = "GetRenderTargetSampleCount",
|
[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->domain = VKD3D_TESSELLATOR_DOMAIN_INVALID;
|
||||||
ctx->output_control_point_count = UINT_MAX;
|
ctx->output_control_point_count = UINT_MAX;
|
||||||
ctx->output_primitive = 0;
|
ctx->output_primitive = 0;
|
||||||
|
@ -661,6 +661,7 @@ struct hlsl_ir_switch
|
|||||||
|
|
||||||
enum hlsl_ir_expr_op
|
enum hlsl_ir_expr_op
|
||||||
{
|
{
|
||||||
|
HLSL_OP0_ERROR,
|
||||||
HLSL_OP0_VOID,
|
HLSL_OP0_VOID,
|
||||||
HLSL_OP0_RASTERIZER_SAMPLE_COUNT,
|
HLSL_OP0_RASTERIZER_SAMPLE_COUNT,
|
||||||
|
|
||||||
@ -1050,6 +1051,9 @@ struct hlsl_ctx
|
|||||||
struct hlsl_type *error;
|
struct hlsl_type *error;
|
||||||
} builtin_types;
|
} builtin_types;
|
||||||
|
|
||||||
|
/* Pre-allocated "error" expression. */
|
||||||
|
struct hlsl_ir_node *error_instr;
|
||||||
|
|
||||||
/* List of the instruction nodes for initializing static variables. */
|
/* List of the instruction nodes for initializing static variables. */
|
||||||
struct hlsl_block static_initializers;
|
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_ir_node *args[HLSL_MAX_OPERANDS] = {0};
|
||||||
struct hlsl_type *common_type;
|
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)))
|
if (!(args[0] = add_implicit_conversion(ctx, block, arg1, common_type, loc)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user