Henri Verbeet : wined3d: Use a common function for parsing SM4 source and destination parameters.

Alexandre Julliard julliard at winehq.org
Mon Oct 15 14:29:05 CDT 2012


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Sun Oct 14 18:40:35 2012 +0200

wined3d: Use a common function for parsing SM4 source and destination parameters.

---

 dlls/wined3d/shader_sm4.c |  113 +++++++++++++++++++++++---------------------
 1 files changed, 59 insertions(+), 54 deletions(-)

diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 9b52bd7..dceb120 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -511,58 +511,59 @@ static BOOL shader_sm4_read_reg_idx(struct wined3d_sm4_data *priv, const DWORD *
     return TRUE;
 }
 
-static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
-        enum wined3d_data_type data_type, struct wined3d_shader_src_param *src_param)
+static BOOL shader_sm4_read_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
+        enum wined3d_data_type data_type, struct wined3d_shader_register *param,
+        enum wined3d_shader_src_modifier *modifier)
 {
-    DWORD token = *(*ptr)++;
     enum wined3d_sm4_register_type register_type;
     struct wined3d_sm4_reg_idx reg_idx;
+    DWORD token = *(*ptr)++;
     DWORD order;
 
     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->reg.type = WINED3DSPR_TEMP;
+        FIXME("Unhandled register type %#x.\n", register_type);
+        param->type = WINED3DSPR_TEMP;
     }
     else
     {
-        src_param->reg.type = register_type_table[register_type];
+        param->type = register_type_table[register_type];
     }
-    src_param->reg.data_type = data_type;
+    param->data_type = data_type;
 
     if (token & WINED3D_SM4_REGISTER_MODIFIER)
     {
-        DWORD modifier = *(*ptr)++;
+        DWORD m = *(*ptr)++;
 
         /* FIXME: This will probably break down at some point. The SM4
          * modifiers look like flags, while wined3d currently has an enum
          * with possible combinations, e.g. WINED3DSPSM_ABSNEG. */
-        switch (modifier)
+        switch (m)
         {
             case 0x41:
-                src_param->modifiers = WINED3DSPSM_NEG;
+                *modifier = WINED3DSPSM_NEG;
                 break;
 
             case 0x81:
-                src_param->modifiers = WINED3DSPSM_ABS;
+                *modifier = WINED3DSPSM_ABS;
                 break;
 
             default:
-                FIXME("Skipping modifier 0x%08x.\n", modifier);
-                src_param->modifiers = WINED3DSPSM_NONE;
+                FIXME("Skipping modifier 0x%08x.\n", m);
+                *modifier = WINED3DSPSM_NONE;
                 break;
         }
     }
     else
     {
-        src_param->modifiers = WINED3DSPSM_NONE;
+        *modifier = WINED3DSPSM_NONE;
     }
 
     order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
 
     if (order < 1)
-        src_param->reg.idx = ~0U;
+        param->idx = ~0U;
     else
     {
         DWORD addressing = (token & WINED3D_SM4_ADDRESSING_MASK0) >> WINED3D_SM4_ADDRESSING_SHIFT0;
@@ -571,12 +572,12 @@ static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD
             ERR("Failed to read register index.\n");
             return FALSE;
         }
-        src_param->reg.rel_addr = reg_idx.rel_addr;
-        src_param->reg.idx = reg_idx.offset;
+        param->rel_addr = reg_idx.rel_addr;
+        param->idx = reg_idx.offset;
     }
 
     if (order < 2)
-        src_param->reg.array_idx = ~0U;
+        param->array_idx = ~0U;
     else
     {
         DWORD addressing = (token & WINED3D_SM4_ADDRESSING_MASK1) >> WINED3D_SM4_ADDRESSING_SHIFT1;
@@ -585,37 +586,58 @@ static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD
             ERR("Failed to read register index.\n");
             return FALSE;
         }
-        src_param->reg.array_rel_addr = reg_idx.rel_addr;
-        src_param->reg.array_idx = reg_idx.offset;
+        param->array_rel_addr = reg_idx.rel_addr;
+        param->array_idx = reg_idx.offset;
     }
 
-    if (order > 2) FIXME("Unhandled order %u.\n", order);
+    if (order > 2)
+        FIXME("Unhandled order %u.\n", order);
 
     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)
+        switch (immconst_type)
         {
             case WINED3D_SM4_IMMCONST_SCALAR:
-                src_param->reg.immconst_type = WINED3D_IMMCONST_SCALAR;
-                memcpy(src_param->reg.immconst_data, *ptr, 1 * sizeof(DWORD));
+                param->immconst_type = WINED3D_IMMCONST_SCALAR;
+                memcpy(param->immconst_data, *ptr, 1 * sizeof(DWORD));
                 *ptr += 1;
                 break;
 
             case WINED3D_SM4_IMMCONST_VEC4:
-                src_param->reg.immconst_type = WINED3D_IMMCONST_VEC4;
-                memcpy(src_param->reg.immconst_data, *ptr, 4 * sizeof(DWORD));
+                param->immconst_type = WINED3D_IMMCONST_VEC4;
+                memcpy(param->immconst_data, *ptr, 4 * sizeof(DWORD));
                 *ptr += 4;
                 break;
 
             default:
-                FIXME("Unhandled immediate constant type %#x\n", immconst_type);
+                FIXME("Unhandled immediate constant type %#x.\n", immconst_type);
                 break;
         }
     }
+
+    map_register(priv, param);
+
+    return TRUE;
+}
+
+static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
+        enum wined3d_data_type data_type, struct wined3d_shader_src_param *src_param)
+{
+    DWORD token = **ptr;
+
+    if (!shader_sm4_read_param(priv, ptr, data_type, &src_param->reg, &src_param->modifiers))
+    {
+        ERR("Failed to read parameter.\n");
+        return FALSE;
+    }
+
+    if (src_param->reg.type == WINED3DSPR_IMMCONST)
+    {
+        src_param->swizzle = WINED3DSP_NOSWIZZLE;
+    }
     else
     {
         enum wined3d_sm4_swizzle_type swizzle_type =
@@ -638,47 +660,30 @@ static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD
         }
     }
 
-    map_register(priv, &src_param->reg);
-
     return TRUE;
 }
 
 static BOOL shader_sm4_read_dst_param(struct wined3d_sm4_data *priv, const DWORD **ptr,
         enum wined3d_data_type data_type, struct wined3d_shader_dst_param *dst_param)
 {
-    DWORD token = *(*ptr)++;
-    enum wined3d_sm4_register_type register_type;
-    DWORD order;
+    enum wined3d_shader_src_modifier modifier;
+    DWORD token = **ptr;
 
-    register_type = (token & WINED3D_SM4_REGISTER_TYPE_MASK) >> WINED3D_SM4_REGISTER_TYPE_SHIFT;
-    if (register_type >= sizeof(register_type_table) / sizeof(*register_type_table))
+    if (!shader_sm4_read_param(priv, ptr, data_type, &dst_param->reg, &modifier))
     {
-        FIXME("Unhandled register type %#x\n", register_type);
-        dst_param->reg.type = WINED3DSPR_TEMP;
+        ERR("Failed to read parameter.\n");
+        return FALSE;
     }
-    else
+
+    if (modifier != WINED3DSPSM_NONE)
     {
-        dst_param->reg.type = register_type_table[register_type];
+        ERR("Invalid source modifier %#x on destination register.\n", modifier);
+        return FALSE;
     }
-    dst_param->reg.data_type = data_type;
-
-    order = (token & WINED3D_SM4_REGISTER_ORDER_MASK) >> WINED3D_SM4_REGISTER_ORDER_SHIFT;
-
-    if (order < 1) dst_param->reg.idx = ~0U;
-    else dst_param->reg.idx = *(*ptr)++;
-
-    if (order < 2) dst_param->reg.array_idx = ~0U;
-    else dst_param->reg.array_idx = *(*ptr)++;
-
-    if (order > 2) FIXME("Unhandled order %u.\n", order);
 
     dst_param->write_mask = (token & WINED3D_SM4_WRITEMASK_MASK) >> WINED3D_SM4_WRITEMASK_SHIFT;
     dst_param->modifiers = 0;
     dst_param->shift = 0;
-    dst_param->reg.rel_addr = NULL;
-    dst_param->reg.array_rel_addr = NULL;
-
-    map_register(priv, &dst_param->reg);
 
     return TRUE;
 }




More information about the wine-cvs mailing list