[PATCH 2/5] wined3d: Recognise SM4 scalar swizzles.

Henri Verbeet hverbeet at codeweavers.com
Sun Oct 14 11:40:34 CDT 2012


---
 dlls/wined3d/shader_sm4.c |   28 +++++++++++++++++++++++++++-
 1 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 3def9d8..9b52bd7 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -51,6 +51,9 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode);
 #define WINED3D_SM4_REGISTER_TYPE_SHIFT         12
 #define WINED3D_SM4_REGISTER_TYPE_MASK          (0xf << WINED3D_SM4_REGISTER_TYPE_SHIFT)
 
+#define WINED3D_SM4_SWIZZLE_TYPE_SHIFT          2
+#define WINED3D_SM4_SWIZZLE_TYPE_MASK           (0x3 << WINED3D_SM4_SWIZZLE_TYPE_SHIFT)
+
 #define WINED3D_SM4_IMMCONST_TYPE_SHIFT         0
 #define WINED3D_SM4_IMMCONST_TYPE_MASK          (0x3 << WINED3D_SM4_IMMCONST_TYPE_SHIFT)
 
@@ -147,6 +150,12 @@ enum wined3d_sm4_input_primitive_type
     WINED3D_SM4_INPUT_PT_TRIANGLEADJ    = 0x7,
 };
 
+enum wined3d_sm4_swizzle_type
+{
+    WINED3D_SM4_SWIZZLE_VEC4            = 0x1,
+    WINED3D_SM4_SWIZZLE_SCALAR          = 0x2,
+};
+
 enum wined3d_sm4_immconst_type
 {
     WINED3D_SM4_IMMCONST_SCALAR = 0x1,
@@ -609,7 +618,24 @@ static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD
     }
     else
     {
-        src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT;
+        enum wined3d_sm4_swizzle_type swizzle_type =
+                (token & WINED3D_SM4_SWIZZLE_TYPE_MASK) >> WINED3D_SM4_SWIZZLE_TYPE_SHIFT;
+
+        switch (swizzle_type)
+        {
+            case WINED3D_SM4_SWIZZLE_SCALAR:
+                src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT;
+                src_param->swizzle = (src_param->swizzle & 0x3) * 0x55;
+                break;
+
+            case WINED3D_SM4_SWIZZLE_VEC4:
+                src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT;
+                break;
+
+            default:
+                FIXME("Unhandled swizzle type %#x.\n", swizzle_type);
+                break;
+        }
     }
 
     map_register(priv, &src_param->reg);
-- 
1.7.8.6




More information about the wine-patches mailing list