Conor McCarthy : vkd3d-shader/sm4: Parse register modifiers separately from the extended operand type.

Alexandre Julliard julliard at winehq.org
Tue Sep 28 16:01:44 CDT 2021


Module: vkd3d
Branch: master
Commit: cddd978be640baabfe1be4f7ad7e38f16e26b516
URL:    https://source.winehq.org/git/vkd3d.git/?a=commit;h=cddd978be640baabfe1be4f7ad7e38f16e26b516

Author: Conor McCarthy <cmccarthy at codeweavers.com>
Date:   Tue Sep 28 16:07:21 2021 +0200

vkd3d-shader/sm4: Parse register modifiers separately from the extended operand type.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 libs/vkd3d-shader/dxbc.c     | 59 +++++++++++++++++++++++++-------------------
 libs/vkd3d-shader/hlsl_sm4.c |  5 ++--
 libs/vkd3d-shader/sm4.h      | 21 ++++++++++++----
 3 files changed, 53 insertions(+), 32 deletions(-)

diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 86cd0ec..0d77f02 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -1166,7 +1166,9 @@ static bool shader_sm4_read_param(struct vkd3d_sm4_data *priv, const DWORD **ptr
         enum vkd3d_shader_src_modifier *modifier)
 {
     enum vkd3d_sm4_register_type register_type;
-    DWORD token, order;
+    enum vkd3d_sm4_extended_operand_type type;
+    enum vkd3d_sm4_register_modifier m;
+    uint32_t token, order, extended;
 
     if (*ptr >= end)
     {
@@ -1188,42 +1190,49 @@ 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)
+    *modifier = VKD3DSPSM_NONE;
+    if (token & VKD3D_SM4_EXTENDED_OPERAND)
     {
-        DWORD m;
-
         if (*ptr >= end)
         {
             WARN("Invalid ptr %p >= end %p.\n", *ptr, end);
             return false;
         }
-        m = *(*ptr)++;
+        extended = *(*ptr)++;
 
-        switch (m)
+        type = extended & VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK;
+        if (type == VKD3D_SM4_EXTENDED_OPERAND_MODIFIER)
         {
-            case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
-                *modifier = VKD3DSPSM_NEG;
-                break;
+            m = (extended & VKD3D_SM4_REGISTER_MODIFIER_MASK) >> VKD3D_SM4_REGISTER_MODIFIER_SHIFT;
+            switch (m)
+            {
+                case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
+                    *modifier = VKD3DSPSM_NEG;
+                    break;
 
-            case VKD3D_SM4_REGISTER_MODIFIER_ABS:
-                *modifier = VKD3DSPSM_ABS;
-                break;
+                case VKD3D_SM4_REGISTER_MODIFIER_ABS:
+                    *modifier = VKD3DSPSM_ABS;
+                    break;
 
-            case VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE:
-                *modifier = VKD3DSPSM_ABSNEG;
-                break;
+                case VKD3D_SM4_REGISTER_MODIFIER_ABS_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;
+                default:
+                    FIXME("Unhandled register modifier %#x.\n", m);
+                    /* fall-through */
+                case VKD3D_SM4_REGISTER_MODIFIER_NONE:
+                    break;
+            }
+
+            extended &= ~(VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK | VKD3D_SM4_REGISTER_MODIFIER_MASK);
+            if (extended)
+                FIXME("Skipping unhandled extended operand bits 0x%08x.\n", extended);
+        }
+        else if (type)
+        {
+            FIXME("Skipping unhandled extended operand token 0x%08x (type %#x).\n", extended, type);
         }
-    }
-    else
-    {
-        *modifier = VKD3DSPSM_NONE;
     }
 
     order = (token & VKD3D_SM4_REGISTER_ORDER_MASK) >> VKD3D_SM4_REGISTER_ORDER_SHIFT;
diff --git a/libs/vkd3d-shader/hlsl_sm4.c b/libs/vkd3d-shader/hlsl_sm4.c
index 500c9f4..49579dd 100644
--- a/libs/vkd3d-shader/hlsl_sm4.c
+++ b/libs/vkd3d-shader/hlsl_sm4.c
@@ -750,11 +750,12 @@ static void write_sm4_instruction(struct vkd3d_bytecode_buffer *buffer, const st
         token |= sm4_swizzle_type(instr->srcs[i].reg.type) << VKD3D_SM4_SWIZZLE_TYPE_SHIFT;
         token |= instr->srcs[i].swizzle << VKD3D_SM4_SWIZZLE_SHIFT;
         if (instr->srcs[i].reg.mod)
-            token |= VKD3D_SM4_REGISTER_MODIFIER;
+            token |= VKD3D_SM4_EXTENDED_OPERAND;
         put_u32(buffer, token);
 
         if (instr->srcs[i].reg.mod)
-            put_u32(buffer, instr->srcs[i].reg.mod);
+            put_u32(buffer, (instr->srcs[i].reg.mod << VKD3D_SM4_REGISTER_MODIFIER_SHIFT)
+                    | VKD3D_SM4_EXTENDED_OPERAND_MODIFIER);
 
         for (j = 0; j < instr->srcs[i].reg.idx_count; ++j)
             put_u32(buffer, instr->srcs[i].reg.idx[j]);
diff --git a/libs/vkd3d-shader/sm4.h b/libs/vkd3d-shader/sm4.h
index b4dd163..d64a9ef 100644
--- a/libs/vkd3d-shader/sm4.h
+++ b/libs/vkd3d-shader/sm4.h
@@ -94,7 +94,12 @@
 
 #define VKD3D_SM4_OPCODE_MASK                 0xff
 
-#define VKD3D_SM4_REGISTER_MODIFIER           (0x1u << 31)
+#define VKD3D_SM4_EXTENDED_OPERAND            (0x1u << 31)
+
+#define VKD3D_SM4_EXTENDED_OPERAND_TYPE_MASK  0x3fu
+
+#define VKD3D_SM4_REGISTER_MODIFIER_SHIFT     6
+#define VKD3D_SM4_REGISTER_MODIFIER_MASK      (0xffu << VKD3D_SM4_REGISTER_MODIFIER_SHIFT)
 
 #define VKD3D_SM4_ADDRESSING_SHIFT2           28
 #define VKD3D_SM4_ADDRESSING_MASK2            (0x3u << VKD3D_SM4_ADDRESSING_SHIFT2)
@@ -388,12 +393,18 @@ enum vkd3d_sm4_register_type
     VKD3D_SM5_RT_DEPTHOUT_LESS_EQUAL     = 0x27,
 };
 
+enum vkd3d_sm4_extended_operand_type
+{
+    VKD3D_SM4_EXTENDED_OPERAND_NONE      = 0x0,
+    VKD3D_SM4_EXTENDED_OPERAND_MODIFIER  = 0x1,
+};
+
 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_NONE       = 0x00,
+    VKD3D_SM4_REGISTER_MODIFIER_NEGATE     = 0x01,
+    VKD3D_SM4_REGISTER_MODIFIER_ABS        = 0x02,
+    VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE = 0x03,
 };
 
 enum vkd3d_sm4_output_primitive_type




More information about the wine-cvs mailing list