From: Conor McCarthy cmccarthy@codeweavers.com
In the fork/join phases these registers have two-dimensional addressing. --- libs/vkd3d-shader/tpf.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index e90fb64d..077956ae 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -565,6 +565,7 @@ struct vkd3d_shader_sm4_parser unsigned int output_map[MAX_REG_OUTPUT];
enum vkd3d_shader_opcode phase; + bool has_control_point_phase; unsigned int input_register_masks[MAX_REG_OUTPUT]; unsigned int output_register_masks[MAX_REG_OUTPUT]; unsigned int patch_constant_register_masks[MAX_REG_OUTPUT]; @@ -892,6 +893,17 @@ static void shader_sm4_read_dcl_index_range(struct vkd3d_shader_instruction *ins return; }
+ if (priv->p.shader_version.type == VKD3D_SHADER_TYPE_HULL && !priv->has_control_point_phase + && (range_masks == priv->input_index_range_masks || range_masks == priv->output_index_range_masks)) + { + WARN("Index range base %u, count %u, mask %#x applies to a default phase.\n", + register_idx, register_count, write_mask); + vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_INDEX_RANGE_DCL, + "Register index range base %u, count %u, mask %#x applies to a default control point phase.", + register_idx, register_count, write_mask); + return; + } + for (i = 0; i < register_count; ++i) { if (range_masks[register_idx + i] & write_mask) @@ -2156,6 +2168,7 @@ static void shader_sm4_read_instruction(struct vkd3d_shader_sm4_parser *sm4, str if (ins->handler_idx == VKD3DSIH_HS_CONTROL_POINT_PHASE || ins->handler_idx == VKD3DSIH_HS_FORK_PHASE || ins->handler_idx == VKD3DSIH_HS_JOIN_PHASE) sm4->phase = ins->handler_idx; + sm4->has_control_point_phase |= ins->handler_idx == VKD3DSIH_HS_CONTROL_POINT_PHASE; ins->flags = 0; ins->coissue = false; ins->raw = false;