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

This commit is contained in:
Giovanni Mascellani
2025-06-09 21:21:01 +02:00
committed by Henri Verbeet
parent 65c23999e8
commit 318d7466a8
Notes: Henri Verbeet 2025-06-24 16:32:28 +02:00
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1590

View File

@@ -9743,7 +9743,7 @@ static void vsir_validate_src_param(struct validation_context *ctx,
{
uint32_t data_type_mask;
}
src_modifier_data[] =
src_modifier_data[VKD3DSPSM_COUNT] =
{
[VKD3DSPSM_NEG] = {F64_BIT | F32_BIT | F16_BIT | I32_BIT | U64_BIT | U32_BIT | U16_BIT},
[VKD3DSPSM_BIAS] = {F32_BIT},
@@ -9757,6 +9757,11 @@ static void vsir_validate_src_param(struct validation_context *ctx,
[VKD3DSPSM_DW] = {F32_BIT},
[VKD3DSPSM_ABS] = {F64_BIT | F32_BIT | F16_BIT},
[VKD3DSPSM_ABSNEG] = {F64_BIT | F32_BIT | F16_BIT},
/* This doesn't make a lot of sense. NOT is used only by D3DBC, and
* apparently only for IF instructions reading from a CONSTBOOL register.
* However, currently the D3DBC parser generates those registers of
* type float, so for the moment let's allow that. */
[VKD3DSPSM_NOT] = {F32_BIT},
};
vsir_validate_register(ctx, &src->reg);
@@ -9773,7 +9778,7 @@ 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->modifiers != VKD3DSPSM_NONE && src->modifiers < ARRAY_SIZE(src_modifier_data))
{
if (!(src_modifier_data[src->modifiers].data_type_mask & (1u << src->reg.data_type)))
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_MODIFIERS,