vkd3d-shader/tpf: Parse register dimension for all register types.

This commit is contained in:
Francisco Casas 2023-08-15 17:39:37 -04:00 committed by Alexandre Julliard
parent e904660497
commit 33f47c5ae9
Notes: Alexandre Julliard 2023-09-26 22:47:43 +02:00
Approved-by: Giovanni Mascellani (@giomasce)
Approved-by: Henri Verbeet (@hverbeet)
Approved-by: Alexandre Julliard (@julliard)
Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/319

View File

@ -519,6 +519,22 @@ enum vkd3d_sm4_dimension
VKD3D_SM4_DIMENSION_VEC4 = 0x2, VKD3D_SM4_DIMENSION_VEC4 = 0x2,
}; };
static enum vsir_dimension vsir_dimension_from_sm4_dimension(enum vkd3d_sm4_dimension dim)
{
switch (dim)
{
case VKD3D_SM4_DIMENSION_NONE:
return VSIR_DIMENSION_NONE;
case VKD3D_SM4_DIMENSION_SCALAR:
return VSIR_DIMENSION_SCALAR;
case VKD3D_SM4_DIMENSION_VEC4:
return VSIR_DIMENSION_VEC4;
default:
FIXME("Unknown SM4 dimension %#x.\n", dim);
return VSIR_DIMENSION_NONE;
}
}
enum vkd3d_sm4_resource_type enum vkd3d_sm4_resource_type
{ {
VKD3D_SM4_RESOURCE_BUFFER = 0x1, VKD3D_SM4_RESOURCE_BUFFER = 0x1,
@ -1718,6 +1734,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_register_type register_type;
enum vkd3d_sm4_extended_operand_type type; enum vkd3d_sm4_extended_operand_type type;
enum vkd3d_sm4_register_modifier m; enum vkd3d_sm4_register_modifier m;
enum vkd3d_sm4_dimension sm4_dimension;
uint32_t token, order, extended; uint32_t token, order, extended;
if (*ptr >= end) if (*ptr >= end)
@ -1849,15 +1866,16 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui
return false; return false;
} }
sm4_dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT;
param->dimension = vsir_dimension_from_sm4_dimension(sm4_dimension);
if (register_type == VKD3D_SM4_RT_IMMCONST || register_type == VKD3D_SM4_RT_IMMCONST64) 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; unsigned int dword_count;
switch (dimension) switch (param->dimension)
{ {
case VKD3D_SM4_DIMENSION_SCALAR: case VSIR_DIMENSION_SCALAR:
param->dimension = VSIR_DIMENSION_SCALAR;
dword_count = 1 + (register_type == VKD3D_SM4_RT_IMMCONST64); dword_count = 1 + (register_type == VKD3D_SM4_RT_IMMCONST64);
if (end - *ptr < dword_count) if (end - *ptr < dword_count)
{ {
@ -1868,8 +1886,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui
*ptr += dword_count; *ptr += dword_count;
break; break;
case VKD3D_SM4_DIMENSION_VEC4: case VSIR_DIMENSION_VEC4:
param->dimension = VSIR_DIMENSION_VEC4;
if (end - *ptr < VKD3D_VEC4_SIZE) if (end - *ptr < VKD3D_VEC4_SIZE)
{ {
WARN("Invalid ptr %p, end %p.\n", *ptr, end); WARN("Invalid ptr %p, end %p.\n", *ptr, end);
@ -1880,7 +1897,7 @@ static bool shader_sm4_read_param(struct vkd3d_shader_sm4_parser *priv, const ui
break; break;
default: default:
FIXME("Unhandled dimension %#x.\n", dimension); FIXME("Unhandled dimension %#x.\n", param->dimension);
break; break;
} }
} }