From 5894e790646bf996b9a5e8074e115e69ab3fba62 Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Fri, 15 Nov 2024 15:14:22 +0100 Subject: [PATCH] vkd3d-shader/ir: Check that all tessellation system values appear in the patch constant signature. --- libs/vkd3d-shader/ir.c | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 782b4bc6..808fab50 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -7742,6 +7742,54 @@ static void vsir_validate_signature(struct validation_context *ctx, for (i = 0; i < signature->element_count; ++i) vsir_validate_signature_element(ctx, signature, signature_type, i); + + if (signature_type == SIGNATURE_TYPE_PATCH_CONSTANT) + { + unsigned int expected_outer_count = 0; + unsigned int expected_inner_count = 0; + + switch (ctx->program->tess_domain) + { + case VKD3D_TESSELLATOR_DOMAIN_QUAD: + expected_outer_count = 4; + expected_inner_count = 2; + break; + + case VKD3D_TESSELLATOR_DOMAIN_TRIANGLE: + expected_outer_count = 3; + expected_inner_count = 1; + break; + + case VKD3D_TESSELLATOR_DOMAIN_LINE: + expected_outer_count = 2; + expected_inner_count = 0; + break; + + default: + break; + } + + /* After I/O normalisation tessellation factors are merged in a single array. */ + if (ctx->program->normalisation_level >= VSIR_FULLY_NORMALISED_IO) + { + expected_outer_count = min(1, expected_outer_count); + expected_inner_count = min(1, expected_inner_count); + } + + for (i = 0; i < expected_outer_count; ++i) + { + if (ctx->outer_tess_idxs[i] == ~0u) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE, + "Missing outer system value semantic %u.", i); + } + + for (i = 0; i < expected_inner_count; ++i) + { + if (ctx->inner_tess_idxs[i] == ~0u) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE, + "Missing inner system value semantic %u.", i); + } + } } static const char *name_from_cf_type(enum vsir_control_flow_type type)