[PATCH vkd3d 6/7] vkd3d-shader: Use flag values for register modifiers.

Zebediah Figura (she/her) zfigura at codeweavers.com
Fri Aug 13 10:38:25 CDT 2021


On 8/13/21 9:55 AM, Conor McCarthy wrote:
> Prevents an unhandled flag from causing all flags to be skipped.
> Based in part on a vkd3d-proton patch by Philip Rebohle.
> 
> Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
> ---
>   libs/vkd3d-shader/dxbc.c | 13 ++++++++-----
>   libs/vkd3d-shader/sm4.h  |  8 ++++----
>   2 files changed, 12 insertions(+), 9 deletions(-)
> 
> diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
> index fab19046..412b9267 100644
> --- a/libs/vkd3d-shader/dxbc.c
> +++ b/libs/vkd3d-shader/dxbc.c
> @@ -1133,8 +1133,9 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
>               return false;
>           }
>           m = *(*ptr)++;
> +        m = (m & VKD3D_SM4_REGISTER_MODIFIER_MASK) >> VKD3D_SM4_REGISTER_MODIFIER_SHIFT;
>   
> -        switch (m)
> +        switch (m & (VKD3D_SM4_REGISTER_MODIFIER_ABS | VKD3D_SM4_REGISTER_MODIFIER_NEGATE))
>           {
>               case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
>                   *modifier = VKD3DSPSM_NEG;
> @@ -1144,17 +1145,19 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
>                   *modifier = VKD3DSPSM_ABS;
>                   break;
>   
> -            case VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE:
> +            case VKD3D_SM4_REGISTER_MODIFIER_ABS | VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
>                   *modifier = VKD3DSPSM_ABSNEG;
>                   break;
>   
>               default:
> -                FIXME("Skipping modifier 0x%08x.\n", m);
> -                /* fall-through */
> -            case VKD3D_SM4_REGISTER_MODIFIER_NONE:
>                   *modifier = VKD3DSPSM_NONE;
>                   break;
>           }
> +        m &= ~(VKD3D_SM4_REGISTER_MODIFIER_ABS | VKD3D_SM4_REGISTER_MODIFIER_NEGATE);
> +
> +        if (m)
> +            FIXME("Skipping modifier flags 0x%08x.\n", m);
> +
>       }
>       else
>       {
> diff --git a/libs/vkd3d-shader/sm4.h b/libs/vkd3d-shader/sm4.h
> index 335f0161..e8dbeb4b 100644
> --- a/libs/vkd3d-shader/sm4.h
> +++ b/libs/vkd3d-shader/sm4.h
> @@ -94,6 +94,8 @@
>   #define VKD3D_SM4_OPCODE_MASK                 0xff
>   
>   #define VKD3D_SM4_REGISTER_MODIFIER           (0x1u << 31)
> +#define VKD3D_SM4_REGISTER_MODIFIER_SHIFT     1
> +#define VKD3D_SM4_REGISTER_MODIFIER_MASK      (0x7FFFFFFF << VKD3D_SM4_REGISTER_MODIFIER_SHIFT)
>   
>   #define VKD3D_SM4_ADDRESSING_SHIFT2           28
>   #define VKD3D_SM4_ADDRESSING_MASK2            (0x3u << VKD3D_SM4_ADDRESSING_SHIFT2)
> @@ -383,10 +385,8 @@ enum vkd3d_sm4_register_type
>   
>   enum vkd3d_sm4_register_modifier
>   {
> -    VKD3D_SM4_REGISTER_MODIFIER_NONE       = 0x01,
> -    VKD3D_SM4_REGISTER_MODIFIER_NEGATE     = 0x41,
> -    VKD3D_SM4_REGISTER_MODIFIER_ABS        = 0x81,
> -    VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE = 0xc1,
> +    VKD3D_SM4_REGISTER_MODIFIER_NEGATE     = 0x20,
> +    VKD3D_SM4_REGISTER_MODIFIER_ABS        = 0x40,
>   };
>   
>   enum vkd3d_sm4_output_primitive_type
> 

For what it's worth, according to Microsoft ([1] s.v. 
D3D10_SB_OPERAND_MODIFIER) the shift and mask here is different. Not 
that we necessarily have to follow that, though.

[1] 
https://github.com/microsoft/DirectXShaderCompiler/blob/cb485263b75495015e2a77cc438e72dc813ea287/include/dxc/Support/d3d12TokenizedProgramFormat.hpp



More information about the wine-devel mailing list