[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