[PATCH vkd3d v2 6/7] vkd3d-shader: Handle extended instruction operand fields.
Henri Verbeet
hverbeet at gmail.com
Thu Aug 19 10:01:41 CDT 2021
On Mon, 16 Aug 2021 at 06:16, Conor McCarthy <cmccarthy at 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.
More information about the wine-devel
mailing list