[PATCH 2/5] wined3d: Recognize SM4 resinfo opcode.

Józef Kucia jkucia at codeweavers.com
Tue Jan 12 16:51:16 CST 2016


Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
The _uint and _rcpFloat modifiers seems to be specific to the resinfo
instruction. AFAIK, there is one other instruction, SM 4.1 sampleinfo,
which also has _uint modifier.
---
 dlls/wined3d/arb_program_shader.c |  1 +
 dlls/wined3d/glsl_shader.c        |  3 +++
 dlls/wined3d/shader.c             | 11 +++++++++--
 dlls/wined3d/shader_sm4.c         | 30 ++++++++++++++++++++++++++++++
 dlls/wined3d/wined3d_private.h    |  3 +++
 5 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 074b74f..84b85c4 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -5295,6 +5295,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_POW                   */ shader_hw_pow,
     /* WINED3DSIH_RCP                   */ shader_hw_scalar_op,
     /* WINED3DSIH_REP                   */ shader_hw_rep,
+    /* WINED3DSIH_RESINFO               */ NULL,
     /* WINED3DSIH_RET                   */ shader_hw_ret,
     /* WINED3DSIH_ROUND_NI              */ NULL,
     /* WINED3DSIH_RSQ                   */ shader_hw_scalar_op,
diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index b7d30ca..0e5372c 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -2592,6 +2592,8 @@ static void shader_glsl_add_instruction_modifiers(const struct wined3d_shader_in
     {
         /* MSDN says this modifier can be safely ignored, so that's what we'll do. */
     }
+
+    /* WINED3DSPDM_UINT and WINED3DSPDM_RCP_FLOAT should be implemented in instruction handlers */
 }
 
 static const char *shader_glsl_get_rel_op(enum wined3d_shader_rel_op op)
@@ -7948,6 +7950,7 @@ static const SHADER_HANDLER shader_glsl_instruction_handler_table[WINED3DSIH_TAB
     /* WINED3DSIH_POW                   */ shader_glsl_pow,
     /* WINED3DSIH_RCP                   */ shader_glsl_scalar_op,
     /* WINED3DSIH_REP                   */ shader_glsl_rep,
+    /* WINED3DSIH_RESINFO               */ NULL,
     /* WINED3DSIH_RET                   */ shader_glsl_ret,
     /* WINED3DSIH_ROUND_NI              */ shader_glsl_map2gl,
     /* WINED3DSIH_RSQ                   */ shader_glsl_scalar_op,
diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c
index d747816..b86c4fc 100644
--- a/dlls/wined3d/shader.c
+++ b/dlls/wined3d/shader.c
@@ -123,6 +123,7 @@ static const char * const shader_opcode_names[] =
     /* WINED3DSIH_POW                   */ "pow",
     /* WINED3DSIH_RCP                   */ "rcp",
     /* WINED3DSIH_REP                   */ "rep",
+    /* WINED3DSIH_RESINFO               */ "resinfo",
     /* WINED3DSIH_RET                   */ "ret",
     /* WINED3DSIH_ROUND_NI              */ "round_ni",
     /* WINED3DSIH_RSQ                   */ "rsq",
@@ -1703,8 +1704,14 @@ static void shader_dump_ins_modifiers(const struct wined3d_shader_dst_param *dst
     if (mmask & WINED3DSPDM_SATURATE)         TRACE("_sat");
     if (mmask & WINED3DSPDM_PARTIALPRECISION) TRACE("_pp");
     if (mmask & WINED3DSPDM_MSAMPCENTROID)    TRACE("_centroid");
-
-    mmask &= ~(WINED3DSPDM_SATURATE | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_MSAMPCENTROID);
+    if (mmask & WINED3DSPDM_UINT)             TRACE("_uint");
+    if (mmask & WINED3DSPDM_RCP_FLOAT)        TRACE("_rcpFloat");
+
+    mmask &= ~(WINED3DSPDM_SATURATE
+            | WINED3DSPDM_PARTIALPRECISION
+            | WINED3DSPDM_MSAMPCENTROID
+            | WINED3DSPDM_UINT
+            | WINED3DSPDM_RCP_FLOAT);
     if (mmask) FIXME("_unrecognized_modifier(%#x)", mmask);
 }
 
diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c
index 6e02352..a180a5b 100644
--- a/dlls/wined3d/shader_sm4.c
+++ b/dlls/wined3d/shader_sm4.c
@@ -72,6 +72,9 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode);
 #define WINED3D_SM4_ADDRESSING_RELATIVE         0x2
 #define WINED3D_SM4_ADDRESSING_OFFSET           0x1
 
+#define WINED3D_SM4_RESINFO_MODIFIER_SHIFT      11
+#define WINED3D_SM4_RESINFO_MODIFIER_MASK       (0x3u << WINED3D_SM4_RESINFO_MODIFIER_SHIFT)
+
 enum wined3d_sm4_opcode
 {
     WINED3D_SM4_OP_ADD                  = 0x00,
@@ -120,6 +123,7 @@ enum wined3d_sm4_opcode
     WINED3D_SM4_OP_MUL                  = 0x38,
     WINED3D_SM4_OP_NE                   = 0x39,
     WINED3D_SM4_OP_OR                   = 0x3c,
+    WINED3D_SM4_OP_RESINFO              = 0x3d,
     WINED3D_SM4_OP_RET                  = 0x3e,
     WINED3D_SM4_OP_ROUND_NI             = 0x41,
     WINED3D_SM4_OP_RSQ                  = 0x44,
@@ -203,6 +207,13 @@ enum wined3d_sm4_data_type
     WINED3D_SM4_DATA_FLOAT  = 0x5,
 };
 
+enum wined3d_sm4_resinfo_modifier
+{
+    WINED3D_SM4_RESINFO_FLOAT     = 0x0,
+    WINED3D_SM4_RESINFO_RCP_FLOAT = 0x1,
+    WINED3D_SM4_RESINFO_UINT      = 0x2,
+};
+
 struct wined3d_shader_src_param_entry
 {
     struct list entry;
@@ -296,6 +307,7 @@ static const struct wined3d_sm4_opcode_info opcode_table[] =
     {WINED3D_SM4_OP_MUL,                    WINED3DSIH_MUL,                 "F",    "FF"},
     {WINED3D_SM4_OP_NE,                     WINED3DSIH_NE,                  "U",    "FF"},
     {WINED3D_SM4_OP_OR,                     WINED3DSIH_OR,                  "U",    "UU"},
+    {WINED3D_SM4_OP_RESINFO,                WINED3DSIH_RESINFO,             "F",    "IR"},
     {WINED3D_SM4_OP_RET,                    WINED3DSIH_RET,                 "",     ""},
     {WINED3D_SM4_OP_ROUND_NI,               WINED3DSIH_ROUND_NI,            "F",    "F"},
     {WINED3D_SM4_OP_RSQ,                    WINED3DSIH_RSQ,                 "F",    "F"},
@@ -393,6 +405,13 @@ static const enum wined3d_data_type data_type_table[] =
     /* WINED3D_SM4_DATA_FLOAT */    WINED3D_DATA_FLOAT,
 };
 
+static const enum wined3d_shader_dst_modifier resinfo_modifier_table[] =
+{
+    /* WINED3D_SM4_RESINFO_FLOAT */        0,
+    /* WINED3D_SM4_RESINFO_RCP_FLOAT */    WINED3DSPDM_RCP_FLOAT,
+    /* WINED3D_SM4_RESINFO_UINT */         WINED3DSPDM_UINT,
+};
+
 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);
 
@@ -906,6 +925,17 @@ static void shader_sm4_read_instruction(void *data, const DWORD **ptr, struct wi
             }
         }
     }
+
+    if (opcode == WINED3D_SM4_OP_RESINFO)
+    {
+        enum wined3d_sm4_resinfo_modifier modifier;
+
+        modifier = (opcode_token & WINED3D_SM4_RESINFO_MODIFIER_MASK) >> WINED3D_SM4_RESINFO_MODIFIER_SHIFT;
+        if (modifier >= ARRAY_SIZE(resinfo_modifier_table))
+            FIXME("Unhandled resinfo modifier %#x.\n", modifier);
+        else
+            priv->dst_param[0].modifiers |= resinfo_modifier_table[modifier];
+    }
 }
 
 static BOOL shader_sm4_is_end(void *data, const DWORD **ptr)
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 07007c0..0700cc9 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -401,6 +401,8 @@ enum wined3d_shader_dst_modifier
     WINED3DSPDM_SATURATE = 1,
     WINED3DSPDM_PARTIALPRECISION = 2,
     WINED3DSPDM_MSAMPCENTROID = 4,
+    WINED3DSPDM_UINT = 16,
+    WINED3DSPDM_RCP_FLOAT = 32,
 };
 
 /* Undocumented opcode control to identify projective texture lookups in ps 2.0 and later */
@@ -538,6 +540,7 @@ enum WINED3D_SHADER_INSTRUCTION_HANDLER
     WINED3DSIH_POW,
     WINED3DSIH_RCP,
     WINED3DSIH_REP,
+    WINED3DSIH_RESINFO,
     WINED3DSIH_RET,
     WINED3DSIH_ROUND_NI,
     WINED3DSIH_RSQ,
-- 
2.4.10




More information about the wine-patches mailing list