[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