mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-12-15 08:03:30 -08:00
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:
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
@@ -2863,27 +2863,24 @@ static size_t sm6_parser_compute_max_value_count(struct sm6_parser *sm6,
|
|||||||
return value_count;
|
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;
|
size_t i;
|
||||||
|
|
||||||
/* The value relative index is 32 bits. */
|
i = (uint32_t)dxil->value_count - idx;
|
||||||
if (idx > UINT32_MAX)
|
|
||||||
WARN("Ignoring upper 32 bits of relative index.\n");
|
|
||||||
i = (uint32_t)sm6->value_count - (uint32_t)idx;
|
|
||||||
|
|
||||||
/* This may underflow to produce a forward reference, but it must not exceed the final value count. */
|
/* This may underflow to produce a forward reference, but it must not
|
||||||
if (i >= sm6->cur_max_value)
|
* 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(&dxil->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
||||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND,
|
"Invalid value relative index %u.", idx);
|
||||||
"Invalid value relative index %u.", (unsigned int)idx);
|
|
||||||
return SIZE_MAX;
|
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(&dxil->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, "Invalid value self-reference.");
|
||||||
vkd3d_shader_parser_error(&sm6->p, VKD3D_SHADER_ERROR_DXIL_INVALID_OPERAND, "Invalid value self-reference.");
|
|
||||||
return SIZE_MAX;
|
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;
|
return SIZE_MAX;
|
||||||
val_ref = record->operands[idx++];
|
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);
|
operand = sm6_parser_get_value_index(sm6, val_ref);
|
||||||
if (operand == SIZE_MAX)
|
if (operand == SIZE_MAX)
|
||||||
return SIZE_MAX;
|
return SIZE_MAX;
|
||||||
|
|||||||
Reference in New Issue
Block a user