From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/tpf.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)
diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 3dd6de37..e716a452 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -3836,9 +3836,29 @@ static void sm4_src_from_node(const struct tpf_writer *tpf, struct vkd3d_shader_ } }
+static unsigned int sm4_get_index_addressing_from_reg(const struct vkd3d_shader_register *reg, + unsigned int i) +{ + if (i >= reg->idx_count) + return 0; + + if (reg->idx[i].rel_addr) + { + if (reg->idx[i].offset == 0) + return VKD3D_SM4_ADDRESSING_RELATIVE; + else + return VKD3D_SM4_ADDRESSING_RELATIVE | VKD3D_SM4_ADDRESSING_OFFSET; + } + + return 0; +} + static uint32_t sm4_encode_register(const struct tpf_writer *tpf, const struct vkd3d_shader_register *reg, enum vkd3d_sm4_swizzle_type sm4_swizzle_type, uint32_t sm4_swizzle) { + unsigned int idx0_addressing = sm4_get_index_addressing_from_reg(reg, 0); + unsigned int idx1_addressing = sm4_get_index_addressing_from_reg(reg, 1); + unsigned int idx2_addressing = sm4_get_index_addressing_from_reg(reg, 2); const struct vkd3d_sm4_register_type_info *register_type_info; uint32_t sm4_reg_type, sm4_reg_dim; uint32_t token = 0; @@ -3862,6 +3882,9 @@ static uint32_t sm4_encode_register(const struct tpf_writer *tpf, const struct v token |= sm4_reg_type << VKD3D_SM4_REGISTER_TYPE_SHIFT; token |= reg->idx_count << VKD3D_SM4_REGISTER_ORDER_SHIFT; token |= sm4_reg_dim << VKD3D_SM4_DIMENSION_SHIFT; + token |= idx0_addressing << VKD3D_SM4_ADDRESSING_SHIFT0; + token |= idx1_addressing << VKD3D_SM4_ADDRESSING_SHIFT1; + token |= idx2_addressing << VKD3D_SM4_ADDRESSING_SHIFT2;
if (sm4_reg_dim == VKD3D_SM4_DIMENSION_VEC4) {