vkd3d-shader/ir: Validate SSA write masks.

This commit is contained in:
Elizabeth Figura
2024-11-02 15:39:37 -05:00
committed by Henri Verbeet
parent d91d552a5e
commit 0c18736370
Notes: Henri Verbeet 2025-04-14 17:16:33 +02:00
Approved-by: Francisco Casas (@fcasas)
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1450

View File

@@ -8255,6 +8255,14 @@ static void vsir_validate_dst_param(struct validation_context *ctx,
switch (dst->reg.type) switch (dst->reg.type)
{ {
case VKD3DSPR_SSA: case VKD3DSPR_SSA:
if (dst->reg.dimension == VSIR_DIMENSION_VEC4
&& dst->write_mask != VKD3DSP_WRITEMASK_0
&& dst->write_mask != (VKD3DSP_WRITEMASK_0 | VKD3DSP_WRITEMASK_1)
&& dst->write_mask != (VKD3DSP_WRITEMASK_0 | VKD3DSP_WRITEMASK_1 | VKD3DSP_WRITEMASK_2)
&& dst->write_mask != VKD3DSP_WRITEMASK_ALL)
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_WRITE_MASK,
"SSA register has invalid write mask %#x.", dst->write_mask);
if (dst->reg.idx[0].offset < ctx->program->ssa_count) if (dst->reg.idx[0].offset < ctx->program->ssa_count)
{ {
struct validation_context_ssa_data *data = &ctx->ssas[dst->reg.idx[0].offset]; struct validation_context_ssa_data *data = &ctx->ssas[dst->reg.idx[0].offset];