Module: wine Branch: master Commit: 31713e39b528d98bb02d15624c4f827c44acdf9b URL: http://source.winehq.org/git/wine.git/?a=commit;h=31713e39b528d98bb02d15624c...
Author: Józef Kucia jkucia@codeweavers.com Date: Tue Mar 8 17:46:50 2016 +0100
wined3d: Recognize aoffimmi shader instruction modifier.
The aoffimmi stands for address offset by immediate integer.
Signed-off-by: Józef Kucia jkucia@codeweavers.com Signed-off-by: Henri Verbeet hverbeet@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
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 2c2dc84..61cc3a3 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;