From: Giovanni Mascellani gmascellani@codeweavers.com
--- libs/vkd3d-shader/ir.c | 51 +++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 10 deletions(-)
diff --git a/libs/vkd3d-shader/ir.c b/libs/vkd3d-shader/ir.c index 0cea6e590..d9774e10a 100644 --- a/libs/vkd3d-shader/ir.c +++ b/libs/vkd3d-shader/ir.c @@ -2544,9 +2544,19 @@ static void vsir_validate_dst_param(struct validation_context *ctx, { vsir_validate_register(ctx, &dst->reg);
- if (dst->write_mask & ~VKD3DSP_WRITEMASK_ALL) - validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_WRITE_MASK, "Destination has invalid write mask %#x.", - dst->write_mask); + + if (!data_type_is_64_bit(dst->reg.data_type)) + { + if (dst->write_mask & ~VKD3DSP_WRITEMASK_ALL) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_WRITE_MASK, + "Destination has invalid write mask %#x.", dst->write_mask); + } + else + { + if (dst->write_mask & ~(VKD3DSP_WRITEMASK_0 | VKD3DSP_WRITEMASK_1)) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_WRITE_MASK, + "64 bit destination has invalid write mask %#x.", dst->write_mask); + }
switch (dst->reg.dimension) { @@ -2597,7 +2607,10 @@ static void vsir_validate_dst_param(struct validation_context *ctx,
if (data->write_mask == 0) { - data->write_mask = dst->write_mask; + if (data_type_is_64_bit(dst->reg.data_type)) + data->write_mask = vsir_write_mask_32_from_64(dst->write_mask); + else + data->write_mask = dst->write_mask; data->first_assigned = ctx->instruction_idx; } else @@ -2629,13 +2642,31 @@ static void vsir_validate_src_param(struct validation_context *ctx, { vsir_validate_register(ctx, &src->reg);
- if (src->swizzle & ~0x03030303u) - validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SWIZZLE, "Source has invalid swizzle %#x.", - src->swizzle); + if (!data_type_is_64_bit(src->reg.data_type)) + { + if (src->swizzle & ~0x03030303u) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SWIZZLE, + "Source has invalid swizzle %#x.", src->swizzle); + + if (src->reg.dimension != VSIR_DIMENSION_VEC4 && src->swizzle != VKD3D_SHADER_SWIZZLE(X, X, X, X)) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SWIZZLE, + "Source of dimension %u has invalid swizzle %#x.", + src->reg.dimension, src->swizzle); + } + else + { + if (src->swizzle != VKD3D_SHADER_SWIZZLE(X, Y, X, Y) + && src->swizzle != VKD3D_SHADER_SWIZZLE(X, Y, Z, W) + && src->swizzle != VKD3D_SHADER_SWIZZLE(Z, W, X, Y) + && src->swizzle != VKD3D_SHADER_SWIZZLE(Z, W, Z, W)) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SWIZZLE, + "64 bit source has invalid swizzle %#x.", src->swizzle);
- if (src->reg.dimension != VSIR_DIMENSION_VEC4 && src->swizzle != 0) - validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SWIZZLE, "Source of dimension %u has invalid swizzle %#x.", - src->reg.dimension, src->swizzle); + if (src->reg.dimension != VSIR_DIMENSION_VEC4 && src->swizzle != VKD3D_SHADER_SWIZZLE(X, Y, X, Y)) + validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SWIZZLE, + "64 bit source of dimension %u has invalid swizzle %#x.", + src->reg.dimension, src->swizzle); + }
if (src->modifiers >= VKD3DSPSM_COUNT) validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_MODIFIERS, "Source has invalid modifiers %#x.",