From 32bf71ba96b78793ec3994d2e0fc6775f3a6cbf5 Mon Sep 17 00:00:00 2001 From: Giovanni Mascellani Date: Fri, 28 Mar 2025 15:19:31 +0100 Subject: [PATCH] vkd3d-shader/ir: Validate descriptor flags in vsir programs. --- libs/vkd3d-shader/ir.c | 30 ++++++++++++++++++++++++ libs/vkd3d-shader/vkd3d_shader_private.h | 1 + 2 files changed, 31 insertions(+) diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index fe7e8c54d..2cba46e12 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -10479,6 +10479,7 @@ static void vsir_validate_descriptors(struct validation_context *ctx) for (i = 0; i < descriptors->descriptor_count; ++i) { const struct vkd3d_shader_descriptor_info1 *descriptor = &descriptors->descriptors[i]; + uint32_t flags_mask = 0; if (descriptor->type >= VKD3D_SHADER_DESCRIPTOR_TYPE_COUNT) validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_DESCRIPTOR_TYPE, @@ -10507,6 +10508,35 @@ static void vsir_validate_descriptors(struct validation_context *ctx) validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_DESCRIPTOR_COUNT, "Descriptor %u has invalid descriptor count %u starting at index %u.", i, descriptor->count, descriptor->register_index); + + switch (descriptor->type) + { + case VKD3D_SHADER_DESCRIPTOR_TYPE_SRV: + flags_mask = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_RAW_BUFFER; + break; + + case VKD3D_SHADER_DESCRIPTOR_TYPE_UAV: + flags_mask = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_COUNTER + | VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_READ + | VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_UAV_ATOMICS + | VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_RAW_BUFFER; + break; + + case VKD3D_SHADER_DESCRIPTOR_TYPE_CBV: + break; + + case VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER: + flags_mask = VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE; + break; + + case VKD3D_SHADER_DESCRIPTOR_TYPE_FORCE_32BIT: + break; + } + + if (descriptor->flags & ~flags_mask) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_FLAGS, + "Descriptor %u of type %#x has invalid flags %#x.", + i, descriptor->type, descriptor->flags); } } diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h index 9daa87e17..4fd16df89 100644 --- a/libs/vkd3d-shader/vkd3d_shader_private.h +++ b/libs/vkd3d-shader/vkd3d_shader_private.h @@ -265,6 +265,7 @@ enum vkd3d_shader_error VKD3D_SHADER_ERROR_VSIR_INVALID_DESCRIPTOR_TYPE = 9024, VKD3D_SHADER_ERROR_VSIR_INVALID_RESOURCE_TYPE = 9025, VKD3D_SHADER_ERROR_VSIR_INVALID_DESCRIPTOR_COUNT = 9026, + VKD3D_SHADER_ERROR_VSIR_INVALID_FLAGS = 9027, VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY = 9300,