From 7f834f57e5af1558673b7898766aaccf3b4a0dd7 Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Mon, 14 Oct 2024 18:15:43 +0200 Subject: [PATCH] vkd3d-shader/ir: Validate that signatures are sensible for shader type. --- libs/vkd3d-shader/ir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index d0db2a71..b99582a3 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -6942,11 +6942,23 @@ static void vsir_validate_signature_element(struct validation_context *ctx, idx, signature_type_name, element->interpolation_mode); } +static const unsigned int allowed_signature_phases[] = +{ + [SIGNATURE_TYPE_INPUT] = PS_BIT | VS_BIT | GS_BIT | HS_BIT | DS_BIT, + [SIGNATURE_TYPE_OUTPUT] = PS_BIT | VS_BIT | GS_BIT | HS_BIT | DS_BIT, + [SIGNATURE_TYPE_PATCH_CONSTANT] = HS_BIT | DS_BIT, +}; + static void vsir_validate_signature(struct validation_context *ctx, const struct shader_signature *signature, enum vsir_signature_type signature_type) { unsigned int i; + if (signature->element_count != 0 && !(allowed_signature_phases[signature_type] + & (1u << ctx->program->shader_version.type))) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE, + "Unexpected %s signature.", signature_type_names[signature_type]); + for (i = 0; i < signature->element_count; ++i) vsir_validate_signature_element(ctx, signature, signature_type, i); }