mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/ir: Allow failure in shader_signature_find_element_for_reg().
shader_signature_find_element_for_reg() is also used in the TPF parser, where the program has not been validated yet, so it must not crash on errors. The I/O normaliser can instead assume that the shader is already validated. This fixes a crash with a shader used by The Falconeer. The bug is still present, because the shader will be incorrectly rejected, but at least the vkd3d-shader will fail gracefully.
This commit is contained in:
committed by
Henri Verbeet
parent
32ced3bd8f
commit
637a3cabe7
Notes:
Henri Verbeet
2024-09-20 17:31:34 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Henri Verbeet (@hverbeet) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/1089
@@ -1157,7 +1157,18 @@ static void shader_sm4_read_dcl_input_ps(struct vkd3d_shader_instruction *ins, u
|
||||
struct signature_element *e = vsir_signature_find_element_for_reg(
|
||||
&priv->p.program->input_signature, dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||
|
||||
e->interpolation_mode = ins->flags;
|
||||
if (!e)
|
||||
{
|
||||
WARN("No matching signature element for input register %u with mask %#x.\n",
|
||||
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DCL,
|
||||
"No matching signature element for input register %u with mask %#x.\n",
|
||||
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
e->interpolation_mode = ins->flags;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1172,7 +1183,18 @@ static void shader_sm4_read_dcl_input_ps_siv(struct vkd3d_shader_instruction *in
|
||||
struct signature_element *e = vsir_signature_find_element_for_reg(
|
||||
&priv->p.program->input_signature, dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||
|
||||
e->interpolation_mode = ins->flags;
|
||||
if (!e)
|
||||
{
|
||||
WARN("No matching signature element for input register %u with mask %#x.\n",
|
||||
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DCL,
|
||||
"No matching signature element for input register %u with mask %#x.\n",
|
||||
dst->reg.idx[dst->reg.idx_count - 1].offset, dst->write_mask);
|
||||
}
|
||||
else
|
||||
{
|
||||
e->interpolation_mode = ins->flags;
|
||||
}
|
||||
}
|
||||
ins->declaration.register_semantic.sysval_semantic = *tokens;
|
||||
}
|
||||
|
Reference in New Issue
Block a user