mirror of
https://gitlab.winehq.org/wine/vkd3d.git
synced 2025-09-12 18:50:22 -07:00
vkd3d-shader/tpf: Handle the dimension bitfield in dst param tokens.
A zero mask is still emitted for some scalar registers. This has no effect on current tests, but keeping the correction is probably a good idea.
This commit is contained in:
committed by
Alexandre Julliard
parent
92021b7a3c
commit
eddae47062
Notes:
Alexandre Julliard
2023-08-28 22:16:25 +02:00
Approved-by: Giovanni Mascellani (@giomasce) Approved-by: Francisco Casas (@fcasas) Approved-by: Henri Verbeet (@hverbeet) Approved-by: Alexandre Julliard (@julliard) Merge-Request: https://gitlab.winehq.org/wine/vkd3d/-/merge_requests/225
@@ -2112,6 +2112,7 @@ static bool shader_sm4_read_dst_param(struct vkd3d_shader_sm4_parser *priv, cons
|
|||||||
const uint32_t *end, enum vkd3d_data_type data_type, struct vkd3d_shader_dst_param *dst_param)
|
const uint32_t *end, enum vkd3d_data_type data_type, struct vkd3d_shader_dst_param *dst_param)
|
||||||
{
|
{
|
||||||
enum vkd3d_shader_src_modifier modifier;
|
enum vkd3d_shader_src_modifier modifier;
|
||||||
|
unsigned int dimension;
|
||||||
DWORD token;
|
DWORD token;
|
||||||
|
|
||||||
if (*ptr >= end)
|
if (*ptr >= end)
|
||||||
@@ -2133,10 +2134,30 @@ static bool shader_sm4_read_dst_param(struct vkd3d_shader_sm4_parser *priv, cons
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch ((dimension = (token & VKD3D_SM4_DIMENSION_MASK) >> VKD3D_SM4_DIMENSION_SHIFT))
|
||||||
|
{
|
||||||
|
case VKD3D_SM4_DIMENSION_NONE:
|
||||||
|
dst_param->write_mask = 0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VKD3D_SM4_DIMENSION_SCALAR:
|
||||||
|
dst_param->write_mask = VKD3DSP_WRITEMASK_0;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case VKD3D_SM4_DIMENSION_VEC4:
|
||||||
dst_param->write_mask = (token & VKD3D_SM4_WRITEMASK_MASK) >> VKD3D_SM4_WRITEMASK_SHIFT;
|
dst_param->write_mask = (token & VKD3D_SM4_WRITEMASK_MASK) >> VKD3D_SM4_WRITEMASK_SHIFT;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FIXME("Unhandled dimension %#x.\n", dimension);
|
||||||
|
vkd3d_shader_parser_error(&priv->p, VKD3D_SHADER_ERROR_TPF_INVALID_REGISTER_DIMENSION,
|
||||||
|
"Destination register dimension %#x is invalid.", dimension);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (data_type == VKD3D_DATA_DOUBLE)
|
if (data_type == VKD3D_DATA_DOUBLE)
|
||||||
dst_param->write_mask = vkd3d_write_mask_64_from_32(dst_param->write_mask);
|
dst_param->write_mask = vkd3d_write_mask_64_from_32(dst_param->write_mask);
|
||||||
/* Scalar registers are declared with no write mask in shader bytecode. */
|
/* Some scalar registers are declared with no write mask in shader bytecode. */
|
||||||
if (!dst_param->write_mask && shader_sm4_is_scalar_register(&dst_param->reg))
|
if (!dst_param->write_mask && shader_sm4_is_scalar_register(&dst_param->reg))
|
||||||
dst_param->write_mask = VKD3DSP_WRITEMASK_0;
|
dst_param->write_mask = VKD3DSP_WRITEMASK_0;
|
||||||
dst_param->modifiers = 0;
|
dst_param->modifiers = 0;
|
||||||
|
Reference in New Issue
Block a user