On Mon, 16 Aug 2021 at 06:16, Conor McCarthy cmccarthy@codeweavers.com wrote:
@@ -1123,8 +1123,9 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr } param->data_type = data_type;
- if (token & VKD3D_SM4_REGISTER_MODIFIER)
- if (token & VKD3D_SM4_EXTENDED_OPERAND) {
unsigned int type; DWORD m;
"enum vkd3d_sm4_extended_operand_type type;", technically.
@@ -1133,27 +1134,52 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr return false; } m = *(*ptr)++;
type = m & VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK;
switch (m)
if (type == VKD3D_SM4_EXTENDED_OPERAND_MODIFIER) {
case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
*modifier = VKD3DSPSM_NEG;
break;
unsigned int min_precis = (m & VKD3D_SM4_REGISTER_MIN_PRECIS_MASK) >> VKD3D_SM4_REGISTER_MIN_PRECIS_SHIFT;
unsigned int op_mod = (m & VKD3D_SM4_REGISTER_MODIFIER_MASK) >> VKD3D_SM4_REGISTER_MODIFIER_SHIFT;
unsigned int non_uniform =
(m & VKD3D_SM4_REGISTER_NON_UNIFORM_MASK) >> VKD3D_SM4_REGISTER_NON_UNIFORM_SHIFT;
Extracting the "non-uniform" and "minimum precision" modifiers are separate changes, and should be in their own patches.
switch (op_mod & (VKD3D_SM4_REGISTER_MODIFIER_ABS | VKD3D_SM4_REGISTER_MODIFIER_NEGATE))
{
Is there still a reason to handle these as flags? It seems somewhat of an arbitrary change now.
if (min_precis)
WARN("Ignoring minimum precision %#x.\n", min_precis);
if (non_uniform)
FIXME("Ignoring extended modifier NON_UNIFORM.\n");
}
else if (type)
{
FIXME("Unhandled extended operand type %#x.\n", type);
}
We leave "*modifier" uninitialised here. We should probably also check for any unhandled but set bits, and generate a message.