mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-01-28 13:05:02 -08:00
vkd3d-shader/tpf: Validate the src register of case conditions.
Case values are constants in TPF.
This commit is contained in:
parent
5c09752194
commit
5c706152fa
Notes:
Alexandre Julliard
2023-08-28 22:16:25 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Francisco Casas (@fcasas) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/225
@ -707,6 +707,19 @@ static void shader_sm4_read_conditional_op(struct vkd3d_shader_instruction *ins,
|
||||
VKD3D_SHADER_CONDITIONAL_OP_NZ : VKD3D_SHADER_CONDITIONAL_OP_Z;
|
||||
}
|
||||
|
||||
static void shader_sm4_read_case_condition(struct vkd3d_shader_instruction *ins, uint32_t opcode,
|
||||
uint32_t opcode_token, const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *priv)
|
||||
{
|
||||
shader_sm4_read_src_param(priv, &tokens, &tokens[token_count], VKD3D_DATA_UINT,
|
||||
(struct vkd3d_shader_src_param *)&ins->src[0]);
|
||||
if (ins->src[0].reg.type != VKD3DSPR_IMMCONST)
|
||||
{
|
||||
FIXME("Switch case value is not a 32-bit constant.\n");
|
||||
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_CASE_VALUE,
|
||||
"Switch case value is not a 32-bit immediate constant register.");
|
||||
}
|
||||
}
|
||||
|
||||
static void shader_sm4_read_shader_data(struct vkd3d_shader_instruction *ins, uint32_t opcode, uint32_t opcode_token,
|
||||
const uint32_t *tokens, unsigned int token_count, struct vkd3d_shader_sm4_parser *priv)
|
||||
{
|
||||
@ -1215,7 +1228,8 @@ static const struct vkd3d_sm4_opcode_info opcode_table[] =
|
||||
{VKD3D_SM4_OP_BREAK, VKD3DSIH_BREAK, "", ""},
|
||||
{VKD3D_SM4_OP_BREAKC, VKD3DSIH_BREAKP, "", "u",
|
||||
shader_sm4_read_conditional_op},
|
||||
{VKD3D_SM4_OP_CASE, VKD3DSIH_CASE, "", "u"},
|
||||
{VKD3D_SM4_OP_CASE, VKD3DSIH_CASE, "", "u",
|
||||
shader_sm4_read_case_condition},
|
||||
{VKD3D_SM4_OP_CONTINUE, VKD3DSIH_CONTINUE, "", ""},
|
||||
{VKD3D_SM4_OP_CONTINUEC, VKD3DSIH_CONTINUEP, "", "u",
|
||||
shader_sm4_read_conditional_op},
|
||||
|
@ -78,6 +78,7 @@ enum vkd3d_shader_error
|
||||
VKD3D_SHADER_ERROR_TPF_TOO_MANY_REGISTERS = 1004,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_IO_REGISTER = 1005,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_INDEX_RANGE_DCL = 1006,
|
||||
VKD3D_SHADER_ERROR_TPF_INVALID_CASE_VALUE = 1007,
|
||||
|
||||
VKD3D_SHADER_WARNING_TPF_MASK_NOT_CONTIGUOUS = 1300,
|
||||
VKD3D_SHADER_WARNING_TPF_UNHANDLED_INDEX_RANGE_MASK = 1301,
|
||||
|
Loading…
x
Reference in New Issue
Block a user