Henri Verbeet : wined3d: Add an initial shader_sm4_read_src_param() implementation.

Alexandre Julliard julliard at winehq.org
Wed May 6 10:33:15 CDT 2009


Module: wine
Branch: master
Commit: 9381a416811a38e73fb8cd50f5b84e2a4bd7f969
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9381a416811a38e73fb8cd50f5b84e2a4bd7f969

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed May  6 10:05:46 2009 +0200

wined3d: Add an initial shader_sm4_read_src_param() implementation.

---

 dlls/wined3d/shader_sm4.c      |   70 +++++++++++++++++++++++++++++++++++++---
 dlls/wined3d/wined3d_private.h |    9 +++++
 2 files changed, 74 insertions(+), 5 deletions(-)

diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index cdfaa08..5ec8688 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -31,14 +31,27 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d_shader);
 #define WINED3D_SM4_REGISTER_TYPE_SHIFT         12
 #define WINED3D_SM4_REGISTER_TYPE_MASK          (0xf << WINED3D_SM4_REGISTER_TYPE_SHIFT)
 
+#define WINED3D_SM4_IMMCONST_TYPE_SHIFT         0
+#define WINED3D_SM4_IMMCONST_TYPE_MASK          (0x3 << WINED3D_SM4_IMMCONST_TYPE_SHIFT)
+
 #define WINED3D_SM4_WRITEMASK_SHIFT             4
 #define WINED3D_SM4_WRITEMASK_MASK              (0xf << WINED3D_SM4_WRITEMASK_SHIFT)
 
+#define WINED3D_SM4_SWIZZLE_SHIFT               4
+#define WINED3D_SM4_SWIZZLE_MASK                (0xff << WINED3D_SM4_SWIZZLE_SHIFT)
+
 enum wined3d_sm4_register_type
 {
     WINED3D_SM4_RT_TEMP     = 0x0,
     WINED3D_SM4_RT_INPUT    = 0x1,
     WINED3D_SM4_RT_OUTPUT   = 0x2,
+    WINED3D_SM4_RT_IMMCONST = 0x4,
+};
+
+enum wined3d_sm4_immconst_type
+{
+    WINED3D_SM4_IMMCONST_FLOAT  = 0x1,
+    WINED3D_SM4_IMMCONST_FLOAT4 = 0x2,
 };
 
 struct wined3d_sm4_data
@@ -48,9 +61,11 @@ struct wined3d_sm4_data
 
 static const WINED3DSHADER_PARAM_REGISTER_TYPE register_type_table[] =
 {
-    /* WINED3D_SM4_RT_TEMP */   WINED3DSPR_TEMP,
-    /* WINED3D_SM4_RT_INPUT */  WINED3DSPR_INPUT,
-    /* WINED3D_SM4_RT_OUTPUT */ WINED3DSPR_OUTPUT,
+    /* WINED3D_SM4_RT_TEMP */       WINED3DSPR_TEMP,
+    /* WINED3D_SM4_RT_INPUT */      WINED3DSPR_INPUT,
+    /* WINED3D_SM4_RT_OUTPUT */     WINED3DSPR_OUTPUT,
+    /* UNKNOWN */                   0,
+    /* WINED3D_SM4_RT_IMMCONST */   WINED3DSPR_IMMCONST,
 };
 
 static void *shader_sm4_init(const DWORD *byte_code)
@@ -101,8 +116,53 @@ static void shader_sm4_read_opcode(void *data, const DWORD **ptr, struct wined3d
 static void shader_sm4_read_src_param(const DWORD **ptr, struct wined3d_shader_src_param *src_param,
         struct wined3d_shader_src_param *src_rel_addr, DWORD shader_version)
 {
-    FIXME("ptr %p, src_param %p, src_rel_addr %p, shader_version %#x stub!\n",
-            ptr, src_param, src_rel_addr, shader_version);
+    DWORD token = *(*ptr)++;
+    enum wined3d_sm4_register_type register_type;
+
+    register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
+    if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
+    {
+        FIXME("Unhandled register type %#x\n", register_type);
+        src_param->register_type = WINED3DSPR_TEMP;
+    }
+    else
+    {
+        src_param->register_type = register_type_table[register_type];
+    }
+
+    if (register_type == WINED3D_SM4_RT_IMMCONST)
+    {
+        enum wined3d_sm4_immconst_type immconst_type =
+                (token & WINED3D_SM4_IMMCONST_TYPE_MASK) >> WINED3D_SM4_IMMCONST_TYPE_SHIFT;
+        src_param->swizzle = WINED3DSP_NOSWIZZLE;
+
+        switch(immconst_type)
+        {
+            case WINED3D_SM4_IMMCONST_FLOAT:
+                src_param->immconst_type = WINED3D_IMMCONST_FLOAT;
+                memcpy(src_param->immconst_data, *ptr, 1 * sizeof(DWORD));
+                *ptr += 1;
+                break;
+
+            case WINED3D_SM4_IMMCONST_FLOAT4:
+                src_param->immconst_type = WINED3D_IMMCONST_FLOAT4;
+                memcpy(src_param->immconst_data, *ptr, 4 * sizeof(DWORD));
+                *ptr += 4;
+                break;
+
+            default:
+                FIXME("Unhandled immediate constant type %#x\n", immconst_type);
+                break;
+        }
+    }
+    else
+    {
+        src_param->register_idx = *(*ptr)++;
+        src_param->swizzle = (token & WINED3D_SM4_SWIZZLE_MASK) >> WINED3D_SM4_SWIZZLE_SHIFT;
+    }
+
+    src_param->modifiers = 0;
+    src_param->rel_addr = NULL;
 }
 
 static void shader_sm4_read_dst_param(const DWORD **ptr, struct wined3d_shader_dst_param *dst_param,
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 85811e7..38c8e1e 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -322,8 +322,15 @@ typedef enum _WINED3DSHADER_PARAM_REGISTER_TYPE
     WINED3DSPR_MISCTYPE = 17,
     WINED3DSPR_LABEL = 18,
     WINED3DSPR_PREDICATE = 19,
+    WINED3DSPR_IMMCONST,
 } WINED3DSHADER_PARAM_REGISTER_TYPE;
 
+enum wined3d_immconst_type
+{
+    WINED3D_IMMCONST_FLOAT,
+    WINED3D_IMMCONST_FLOAT4,
+};
+
 typedef enum _WINED3DVS_RASTOUT_OFFSETS
 {
     WINED3DSRO_POSITION = 0,
@@ -645,6 +652,8 @@ struct wined3d_shader_src_param
     DWORD swizzle;
     DWORD modifiers;
     const struct wined3d_shader_src_param *rel_addr;
+    enum wined3d_immconst_type immconst_type;
+    DWORD immconst_data[4];
 };
 
 struct wined3d_shader_instruction




More information about the wine-cvs mailing list