vkd3d-shader/dxil: Move relative index validation outside sm6_parser_get_value_index().

This allows sm6_parser_get_value_index() to be called with relative indices
requiring different validation.
This commit is contained in:
Conor McCarthy
2024-10-01 01:07:48 +10:00
committed by Henri Verbeet
parent 7d3a520060
commit 28e58e0c85
Notes: Henri Verbeet 2025-11-20 18:36:32 +01:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1133

View File

@@ -2863,27 +2863,24 @@ static size_t sm6_parser_compute_max_value_count(struct sm6_parser *sm6,
return value_count;
}
static size_t sm6_parser_get_value_index(struct sm6_parser *sm6, uint64_t idx)
static size_t sm6_parser_get_value_index(struct sm6_parser *dxil, uint32_t idx)
{
size_t i;
/* The value relative index is 32 bits. */
if (idx > UINT32_MAX)
WARN("Ignoring upper 32 bits of relative index.\n");
i = (uint32_t)sm6->value_count - (uint32_t)idx;
i = (uint32_t)dxil->value_count - idx;
/* This may underflow to produce a forward reference, but it must not exceed the final value count. */
if (i >= sm6->cur_max_value)
/* This may underflow to produce a forward reference, but it must not
* exceed the final value count. */
if (i >= dxil->cur_max_value)
{
WARN("Invalid value index %"PRIx64" at %zu.\n", idx, sm6->value_count);
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Invalid value relative index %u.", (unsigned int)idx);
vkd3d_shader_parser_error(&dxil->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
"Invalid value relative index %u.", idx);
return SIZE_MAX;
}
if (i == sm6->value_count)
if (i == dxil->value_count)
{
WARN("Invalid value self-reference at %zu.\n", sm6->value_count);
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, "Invalid value self-reference.");
vkd3d_shader_parser_error(&dxil->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, "Invalid value self-reference.");
return SIZE_MAX;
}
@@ -3094,6 +3091,11 @@ static size_t sm6_parser_get_value_idx_by_ref(struct sm6_parser *sm6, const stru
return SIZE_MAX;
val_ref = record->operands[idx++];
/* Normally only the lower 32 bits are set in the value relative index. */
if (val_ref > UINT32_MAX)
vkd3d_shader_parser_warning(&sm6->p, VKD3D_SHADER_WARNING_DXIL_IGNORING_OPERANDS,
"Ignoring upper 32 bits of DXIL SSA value relative index %"PRIx64".", val_ref);
operand = sm6_parser_get_value_index(sm6, val_ref);
if (operand == SIZE_MAX)
return SIZE_MAX;