From 65e896fd60c381339c401ccca051781b0560c235 Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Sat, 14 Sep 2024 17:43:37 +0200 Subject: [PATCH] vkd3d-shader/ir: Validate ABS instructions. --- libs/vkd3d-shader/ir.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 7546a1f55..c61cf95a6 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -9284,6 +9284,31 @@ static void vsir_validate_hull_shader_phase(struct validation_context *ctx, ctx->dcl_temps_found = false; } +static void vsir_validate_float_elementwise_operation(struct validation_context *ctx, + const struct vkd3d_shader_instruction *instruction) +{ + unsigned int i; + + if (instruction->dst_count < 1) + return; + + if (instruction->dst[0].reg.data_type != VKD3D_DATA_FLOAT) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_DATA_TYPE, + "Invalid data type %#x for elementwise operation \"%s\" (%#x).", + instruction->dst[0].reg.data_type, + vsir_opcode_get_name(instruction->opcode, ""), instruction->opcode); + + for (i = 0; i < instruction->src_count; ++i) + { + if (instruction->src[i].reg.data_type != instruction->dst[0].reg.data_type) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_DATA_TYPE, + "Data type %#x for operand %u doesn't match the destination data type %#x " + "for elementwise operation \"%s\" (%#x).", + instruction->src[i].reg.data_type, i, instruction->dst[0].reg.data_type, + vsir_opcode_get_name(instruction->opcode, ""), instruction->opcode); + } +} + static void vsir_validate_branch(struct validation_context *ctx, const struct vkd3d_shader_instruction *instruction) { size_t i; @@ -9969,6 +9994,7 @@ struct vsir_validator_instruction_desc static const struct vsir_validator_instruction_desc vsir_validator_instructions[] = { + [VKD3DSIH_ABS] = {1, 1, vsir_validate_float_elementwise_operation}, [VKD3DSIH_BRANCH] = {0, ~0u, vsir_validate_branch}, [VKD3DSIH_HS_CONTROL_POINT_PHASE] = {0, 0, vsir_validate_hull_shader_phase}, [VKD3DSIH_HS_DECLS] = {0, 0, vsir_validate_hull_shader_phase},