vkd3d-shader/ir: Validate data types for NEG source modifiers.

This commit is contained in:
Giovanni Mascellani
2025-06-09 21:14:28 +02:00
committed by Henri Verbeet
parent 46fac7f264
commit eb3383b04e
Notes: Henri Verbeet 2025-06-19 20:51:40 +02:00
Approved-by: Elizabeth Figura (@zfigura)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1551

View File

@@ -8659,9 +8659,27 @@ static void vsir_validate_io_src_param(struct validation_context *ctx,
"Invalid register type %#x used as source parameter.", src->reg.type);
}
#define F64_BIT (1u << VKD3D_DATA_DOUBLE)
#define F32_BIT (1u << VKD3D_DATA_FLOAT)
#define F16_BIT (1u << VKD3D_DATA_HALF)
#define I32_BIT (1u << VKD3D_DATA_INT)
#define U64_BIT (1u << VKD3D_DATA_UINT64)
#define U32_BIT (1u << VKD3D_DATA_UINT)
#define U16_BIT (1u << VKD3D_DATA_UINT16)
static void vsir_validate_src_param(struct validation_context *ctx,
const struct vkd3d_shader_src_param *src)
{
static const struct
{
uint32_t data_type_mask;
}
src_modifier_data[] =
{
[VKD3DSPSM_NEG] = {F64_BIT | F32_BIT | F16_BIT | I32_BIT | U64_BIT | U32_BIT | U16_BIT},
};
vsir_validate_register(ctx, &src->reg);
if (src->swizzle & ~0x03030303u)
@@ -8676,6 +8694,13 @@ static void vsir_validate_src_param(struct validation_context *ctx,
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_MODIFIERS, "Source has invalid modifiers %#x.",
src->modifiers);
if (src->modifiers < ARRAY_SIZE(src_modifier_data) && src_modifier_data[src->modifiers].data_type_mask)
{
if (!(src_modifier_data[src->modifiers].data_type_mask & (1u << src->reg.data_type)))
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_MODIFIERS,
"Source has invalid modifier %#x for data type %u.", src->modifiers, src->reg.data_type);
}
switch (src->reg.type)
{
case VKD3DSPR_SSA: