From 0da80c1f25ae81a052ff26fb48f6bb722a9090fe Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Fri, 28 Mar 2025 10:39:43 +0100 Subject: [PATCH] vkd3d-shader/ir: Validate descriptor types in vsir programs. --- libs/vkd3d-shader/ir.c | 17 +++++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 2 ++ 2 files changed, 19 insertions(+) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index d25485ab0..696984367 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -8857,6 +8857,21 @@ static void vsir_validate_signature(struct validation_context *ctx, const struct } } +static void vsir_validate_descriptors(struct validation_context *ctx) +{ + const struct vkd3d_shader_scan_descriptor_info1 *descriptors = &ctx->program->descriptors; + unsigned int i; + + for (i = 0; i < descriptors->descriptor_count; ++i) + { + const struct vkd3d_shader_descriptor_info1 *descriptor = &descriptors->descriptors[i]; + + if (descriptor->type >= VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_DESCRIPTOR_TYPE, + "Descriptor %u has invalid type %#x.", i, descriptor->type); + } +} + static const char *name_from_cf_type(enum vsir_control_flow_type type) { switch (type) @@ -9823,6 +9838,8 @@ enum vkd3d_result vsir_program_validate(struct vsir_program *program, uint64_t c } } + vsir_validate_descriptors(&ctx); + if (!(ctx.temps = vkd3d_calloc(ctx.program->temp_count, sizeof(*ctx.temps)))) goto fail; diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 2734638e7..61fb6b9f4 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -61,6 +61,7 @@ #define VKD3D_SHADER_COMPONENT_TYPE_COUNT (VKD3D_SHADER_COMPONENT_INT16 + 1) #define VKD3D_SHADER_MINIMUM_PRECISION_COUNT (VKD3D_SHADER_MINIMUM_PRECISION_UINT_16 + 1) +#define VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT (VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER + 1) #define VKD3D_MAX_STREAM_COUNT 4 @@ -257,6 +258,7 @@ enum vkd3d_shader_error VKD3D_SHADER_ERROR_VSIR_MISSING_SEMANTIC = 9021, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE = 9022, VKD3D_SHADER_ERROR_VSIR_INVALID_RANGE = 9023, + VKD3D_SHADER_ERROR_VSIR_INVALID_DESCRIPTOR_TYPE = 9024, VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY = 9300,