From: Francisco Casas fcasas@codeweavers.com
--- libs/vkd3d-shader/tpf.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-)
diff --git a/libs/vkd3d-shader/tpf.c b/libs/vkd3d-shader/tpf.c index 24900e01..18b69beb 100644 --- a/libs/vkd3d-shader/tpf.c +++ b/libs/vkd3d-shader/tpf.c @@ -1717,6 +1717,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui enum vkd3d_sm4_register_type register_type; enum vkd3d_sm4_extended_operand_type type; enum vkd3d_sm4_register_modifier m; + enum vkd3d_sm4_dimension dimension; uint32_t token, order, extended;
if (*ptr >= end) @@ -1864,9 +1865,9 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui
param->idx_count = order;
+ dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT; if (register_type == VKD3D_SM4_RT_IMMCONST || register_type == VKD3D_SM4_RT_IMMCONST64) { - enum vkd3d_sm4_dimension dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT; unsigned int dword_count;
switch (dimension) @@ -1899,7 +1900,29 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui break; } } - else if (!shader_is_sm_5_1(priv) && sm4_register_is_descriptor(register_type)) + else + { + switch (dimension) + { + case VKD3D_SM4_DIMENSION_NONE: + param->dimension = VKD3D_SHADER_DIMENSION_NONE; + break; + + case VKD3D_SM4_DIMENSION_SCALAR: + param->dimension = VKD3D_SHADER_DIMENSION_SCALAR; + break; + + case VKD3D_SM4_DIMENSION_VEC4: + param->dimension = VKD3D_SHADER_DIMENSION_VEC4; + break; + + default: + FIXME("Unknown dimension %#x.\n", dimension); + break; + } + } + + if (!shader_is_sm_5_1(priv) && sm4_register_is_descriptor(register_type)) { /* SM5.1 places a symbol identifier in idx[0] and moves * other values up one slot. Normalize to SM5.1. */