mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
vkd3d-shader/ir: Validate I/O destination write masks on normalised vsir.
This commit is contained in:
committed by
Henri Verbeet
parent
32b622d7a5
commit
f616e6c118
Notes:
Henri Verbeet
2025-10-29 13:43:34 +01:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1801
@@ -11011,10 +11011,34 @@ static void vsir_validate_io_dst_param(struct validation_context *ctx,
|
||||
const struct vkd3d_shader_dst_param *dst)
|
||||
{
|
||||
struct vsir_io_register_data io_reg_data;
|
||||
const struct signature_element *e;
|
||||
unsigned int idx;
|
||||
|
||||
if (!vsir_get_io_register_data(ctx, dst->reg.type, &io_reg_data) || !(io_reg_data.flags & OUTPUT_BIT))
|
||||
{
|
||||
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_REGISTER_TYPE,
|
||||
"Invalid register type %#x used as destination parameter.", dst->reg.type);
|
||||
return;
|
||||
}
|
||||
|
||||
if (ctx->program->normalisation_level >= VSIR_NORMALISED_SM6)
|
||||
{
|
||||
if (!dst->reg.idx_count)
|
||||
{
|
||||
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_REGISTER_TYPE,
|
||||
"Invalid index count %u for a register of type %#x.",
|
||||
dst->reg.idx_count, dst->reg.type);
|
||||
return;
|
||||
}
|
||||
|
||||
idx = dst->reg.idx[dst->reg.idx_count - 1].offset;
|
||||
e = &io_reg_data.signature->elements[idx];
|
||||
|
||||
if (dst->write_mask & ~e->mask)
|
||||
validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_REGISTER_TYPE,
|
||||
"Invalid destination write mask %#x for signature element with mask %#x.",
|
||||
dst->write_mask, e->mask);
|
||||
}
|
||||
}
|
||||
|
||||
static void vsir_validate_dst_param(struct validation_context *ctx,
|
||||
|
||||
Reference in New Issue
Block a user