[PATCH vkd3d v3 5/9] vkd3d-shader: Handle extended instruction operand fields.

Conor McCarthy cmccarthy at codeweavers.com
Mon Aug 23 10:23:24 CDT 2021


Prevents a non-zero value at or above bit 14 from causing
abs/negate values to be skipped, and emits proper warning and
fixme messages.

Signed-off-by: Conor McCarthy <cmccarthy at codeweavers.com>
---
 libs/vkd3d-shader/dxbc.c | 53 ++++++++++++++++++++++++----------------
 libs/vkd3d-shader/sm4.h  | 22 +++++++++++++----
 2 files changed, 49 insertions(+), 26 deletions(-)

diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 83f91960..8bb07a2b 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -1188,8 +1188,10 @@ 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)
     {
+        enum vkd3d_sm4_extended_operand_type type;
         DWORD m;
 
         if (*ptr >= end)
@@ -1198,32 +1200,41 @@ 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 op_modifier = (m & VKD3D_SM4_REGISTER_MODIFIER_MASK) >> VKD3D_SM4_REGISTER_MODIFIER_SHIFT;
 
-            case VKD3D_SM4_REGISTER_MODIFIER_ABS:
-                *modifier = VKD3DSPSM_ABS;
-                break;
+            switch (op_modifier & VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE)
+            {
+                case VKD3D_SM4_REGISTER_MODIFIER_NEGATE:
+                    *modifier = VKD3DSPSM_NEG;
+                    break;
 
-            case VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE:
-                *modifier = VKD3DSPSM_ABSNEG;
-                break;
+                case VKD3D_SM4_REGISTER_MODIFIER_ABS:
+                    *modifier = VKD3DSPSM_ABS;
+                    break;
 
-            default:
-                FIXME("Skipping modifier 0x%08x.\n", m);
-                /* fall-through */
-            case VKD3D_SM4_REGISTER_MODIFIER_NONE:
-                *modifier = VKD3DSPSM_NONE;
-                break;
+                case VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE:
+                    *modifier = VKD3DSPSM_ABSNEG;
+                    break;
+
+                default:
+                    break;
+            }
+            op_modifier &= ~VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE;
+            if (op_modifier)
+                FIXME("Skipping modifier flags %#x.\n", op_modifier);
         }
-    }
-    else
-    {
-        *modifier = VKD3DSPSM_NONE;
+        else if (type)
+        {
+            FIXME("Unhandled extended operand type %#x.\n", type);
+        }
+
+        m &= ~0u << VKD3D_SM4_REGISTER_MIN_PRECIS_SHIFT;
+        if (m)
+            FIXME("Skipping modifier 0x%08x.\n", m);
     }
 
     order = (token & VKD3D_SM4_REGISTER_ORDER_MASK) >> VKD3D_SM4_REGISTER_ORDER_SHIFT;
diff --git a/libs/vkd3d-shader/sm4.h b/libs/vkd3d-shader/sm4.h
index b4dd1632..8dd00590 100644
--- a/libs/vkd3d-shader/sm4.h
+++ b/libs/vkd3d-shader/sm4.h
@@ -94,7 +94,14 @@
 
 #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  0x1fu
+
+#define VKD3D_SM4_REGISTER_MODIFIER_SHIFT     6
+#define VKD3D_SM4_REGISTER_MODIFIER_MASK      (0xffu << VKD3D_SM4_REGISTER_MODIFIER_SHIFT)
+
+#define VKD3D_SM4_REGISTER_MIN_PRECIS_SHIFT   14
 
 #define VKD3D_SM4_ADDRESSING_SHIFT2           28
 #define VKD3D_SM4_ADDRESSING_MASK2            (0x3u << VKD3D_SM4_ADDRESSING_SHIFT2)
@@ -388,12 +395,17 @@ 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_NEGATE     = 0x1,
+    VKD3D_SM4_REGISTER_MODIFIER_ABS        = 0x2,
+    VKD3D_SM4_REGISTER_MODIFIER_ABS_NEGATE = 0x3,
 };
 
 enum vkd3d_sm4_output_primitive_type
-- 
2.32.0




More information about the wine-devel mailing list