[PATCH 1/6] wined3d: Recognize aoffimmi shader instruction modifier.

Józef Kucia jkucia at codeweavers.com
Tue Mar 8 10:46:50 CST 2016


The aoffimmi stands for address offset by immediate integer.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
 dlls/wined3d/shader.c          |  3 +++
 dlls/wined3d/shader_sm1.c      |  1 +
 dlls/wined3d/shader_sm4.c      | 36 +++++++++++++++++++++++++++++++++++-
 dlls/wined3d/wined3d_private.h | 11 +++++++++++
 4 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index 88c064c..17611dd 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -2091,6 +2091,9 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe
                 }
             }
 
+            if (wined3d_shader_instruction_has_texel_offset(&ins))
+                shader_addline(&buffer, "(%d,%d,%d)", ins.texel_offset.u, ins.texel_offset.v, ins.texel_offset.w);
+
             for (i = 0; i < ins.dst_count; ++i)
             {
                 shader_dump_ins_modifiers(&buffer, &ins.dst[i]);
diff --git a/dlls/wined3d/shader_sm1.c b/dlls/wined3d/shader_sm1.c
index 8c48d19..718effa 100644
--- a/dlls/wined3d/shader_sm1.c
+++ b/dlls/wined3d/shader_sm1.c
@@ -735,6 +735,7 @@ static void shader_sm1_read_instruction(void *data, const DWORD **ptr, struct wi
     ins->dst = &priv->dst_param;
     ins->src_count = opcode_info->param_count - opcode_info->dst_count;
     ins->src = priv->src_param;
+    memset(&ins->texel_offset, 0, sizeof(ins->texel_offset));
 
     p = *ptr;
     *ptr += shader_skip_opcode(priv, opcode_info, opcode_token);
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index a741f66..9cf74a5 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -26,6 +26,14 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode);
 
 #define WINED3D_SM4_INSTRUCTION_MODIFIER        (0x1u << 31)
 
+#define WINED3D_SM4_MODIFIER_AOFFIMMI           0x1
+#define WINED3D_SM4_AOFFIMMI_U_SHIFT            9
+#define WINED3D_SM4_AOFFIMMI_U_MASK             (0xfu << WINED3D_SM4_AOFFIMMI_U_SHIFT)
+#define WINED3D_SM4_AOFFIMMI_V_SHIFT            13
+#define WINED3D_SM4_AOFFIMMI_V_MASK             (0xfu << WINED3D_SM4_AOFFIMMI_V_SHIFT)
+#define WINED3D_SM4_AOFFIMMI_W_SHIFT            17
+#define WINED3D_SM4_AOFFIMMI_W_MASK             (0xfu << WINED3D_SM4_AOFFIMMI_W_SHIFT)
+
 #define WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT    24
 #define WINED3D_SM4_INSTRUCTION_LENGTH_MASK     (0x1fu << WINED3D_SM4_INSTRUCTION_LENGTH_SHIFT)
 
@@ -853,14 +861,40 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
     ins->dst = priv->dst_param;
     ins->src_count = strlen(opcode_info->src_info);
     ins->src = priv->src_param;
+    memset(&ins->texel_offset, 0, sizeof(ins->texel_offset));
 
     p = *ptr;
     *ptr += len;
 
     if (opcode_token & WINED3D_SM4_INSTRUCTION_MODIFIER)
     {
+        static const DWORD recognized_bits = WINED3D_SM4_MODIFIER_AOFFIMMI
+                | WINED3D_SM4_AOFFIMMI_U_MASK
+                | WINED3D_SM4_AOFFIMMI_V_MASK
+                | WINED3D_SM4_AOFFIMMI_W_MASK;
         DWORD modifier = *p++;
-        FIXME("Skipping modifier 0x%08x.\n", modifier);
+        /* Bit fields are used for sign extension */
+        struct
+        {
+            int u : 4;
+            int v : 4;
+            int w : 4;
+        }
+        aoffimmi;
+
+        if (modifier & ~recognized_bits)
+        {
+            FIXME("Skipping modifier 0x%08x.\n", modifier);
+        }
+        else
+        {
+            aoffimmi.u = (modifier & WINED3D_SM4_AOFFIMMI_U_MASK) >> WINED3D_SM4_AOFFIMMI_U_SHIFT;
+            aoffimmi.v = (modifier & WINED3D_SM4_AOFFIMMI_V_MASK) >> WINED3D_SM4_AOFFIMMI_V_SHIFT;
+            aoffimmi.w = (modifier & WINED3D_SM4_AOFFIMMI_W_MASK) >> WINED3D_SM4_AOFFIMMI_W_SHIFT;
+            ins->texel_offset.u = aoffimmi.u;
+            ins->texel_offset.v = aoffimmi.v;
+            ins->texel_offset.w = aoffimmi.w;
+        }
     }
 
     if (opcode == WINED3D_SM4_OP_SHADER_DATA)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 87c5f9b..4fd84b2 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -801,6 +801,11 @@ struct wined3d_shader_register_semantic
     enum wined3d_sysval_semantic sysval_semantic;
 };
 
+struct wined3d_shader_texel_offset
+{
+    signed char u, v, w;
+};
+
 struct wined3d_shader_instruction
 {
     const struct wined3d_shader_context *ctx;
@@ -812,6 +817,7 @@ struct wined3d_shader_instruction
     const struct wined3d_shader_dst_param *dst;
     UINT src_count;
     const struct wined3d_shader_src_param *src;
+    struct wined3d_shader_texel_offset texel_offset;
     union
     {
         struct wined3d_shader_semantic semantic;
@@ -824,6 +830,11 @@ struct wined3d_shader_instruction
     } declaration;
 };
 
+static inline BOOL wined3d_shader_instruction_has_texel_offset(const struct wined3d_shader_instruction *ins)
+{
+    return ins->texel_offset.u || ins->texel_offset.v || ins->texel_offset.w;
+}
+
 struct wined3d_shader_attribute
 {
     enum wined3d_decl_usage usage;
-- 
2.4.10




More information about the wine-patches mailing list