From: Józef Kucia Subject: [PATCH 3/8] wined3d: Handle SM4 if instruction modifiers. Message-Id: <1464166285-21332-3-git-send-email-jkucia@codeweavers.com> Date: Wed, 25 May 2016 10:51:20 +0200 In-Reply-To: <1464166285-21332-1-git-send-email-jkucia@codeweavers.com> References: <1464166285-21332-1-git-send-email-jkucia@codeweavers.com> Signed-off-by: Józef Kucia --- dlls/wined3d/glsl_shader.c | 3 ++- dlls/wined3d/shader.c | 11 ++++++++++- dlls/wined3d/shader_sm4.c | 14 +++++++++++++- dlls/wined3d/wined3d_private.h | 6 ++++++ 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c index 8a6215f..98d179e 100644 --- a/dlls/wined3d/glsl_shader.c +++ b/dlls/wined3d/glsl_shader.c @@ -4156,10 +4156,11 @@ static void shader_glsl_rep(const struct wined3d_shader_instruction *ins) static void shader_glsl_if(const struct wined3d_shader_instruction *ins) { + const char *condition = (ins->flags == WINED3D_SHADER_CONDITIONAL_OP_NZ) ? "bool" : "!bool"; struct glsl_src_param src0_param; shader_glsl_add_src_param(ins, &ins->src[0], WINED3DSP_WRITEMASK_0, &src0_param); - shader_addline(ins->ctx->buffer, "if (bool(%s)) {\n", src0_param.param_str); + shader_addline(ins->ctx->buffer, "if (%s(%s)) {\n", condition, src0_param.param_str); } static void shader_glsl_ifc(const struct wined3d_shader_instruction *ins) diff --git a/dlls/wined3d/shader.c b/dlls/wined3d/shader.c index c843bc1..b410277 100644 --- a/dlls/wined3d/shader.c +++ b/dlls/wined3d/shader.c @@ -2259,7 +2259,16 @@ static void shader_trace_init(const struct wined3d_shader_frontend *fe, void *fe shader_addline(&buffer, "%s", shader_opcode_names[ins.handler_idx]); - if (ins.handler_idx == WINED3DSIH_IFC + if (ins.handler_idx == WINED3DSIH_IF) + { + switch (ins.flags) + { + case WINED3D_SHADER_CONDITIONAL_OP_NZ: shader_addline(&buffer, "_nz"); break; + case WINED3D_SHADER_CONDITIONAL_OP_Z: shader_addline(&buffer, "_z"); break; + default: shader_addline(&buffer, "_unrecognized(%#x)", ins.flags); break; + } + } + else if (ins.handler_idx == WINED3DSIH_IFC || ins.handler_idx == WINED3DSIH_BREAKC) { switch (ins.flags) diff --git a/dlls/wined3d/shader_sm4.c b/dlls/wined3d/shader_sm4.c index b922012..96ea274 100644 --- a/dlls/wined3d/shader_sm4.c +++ b/dlls/wined3d/shader_sm4.c @@ -103,6 +103,8 @@ WINE_DECLARE_DEBUG_CHANNEL(d3d_bytecode); #define WINED3D_SM4_INSTRUCTION_FLAG_SATURATE 0x4 +#define WINED3D_SM4_CONDITIONAL_NZ (0x1u << 18) + enum wined3d_sm4_opcode { WINED3D_SM4_OP_ADD = 0x00, @@ -379,6 +381,15 @@ static BOOL shader_sm4_read_src_param(struct wined3d_sm4_data *priv, const DWORD 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); +static void shader_sm4_read_if(struct wined3d_shader_instruction *ins, + DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, + struct wined3d_sm4_data *priv) +{ + shader_sm4_read_src_param(priv, &tokens, WINED3D_DATA_UINT, &priv->src_param[0]); + ins->flags = (opcode_token & WINED3D_SM4_CONDITIONAL_NZ) ? + WINED3D_SHADER_CONDITIONAL_OP_NZ : WINED3D_SHADER_CONDITIONAL_OP_Z; +} + static void shader_sm4_read_shader_data(struct wined3d_shader_instruction *ins, DWORD opcode, DWORD opcode_token, const DWORD *tokens, unsigned int token_count, struct wined3d_sm4_data *priv) @@ -627,7 +638,8 @@ static const struct wined3d_sm4_opcode_info opcode_table[] = {WINED3D_SM4_OP_FTOU, WINED3DSIH_FTOU, "u", "f"}, {WINED3D_SM4_OP_GE, WINED3DSIH_GE, "u", "ff"}, {WINED3D_SM4_OP_IADD, WINED3DSIH_IADD, "i", "ii"}, - {WINED3D_SM4_OP_IF, WINED3DSIH_IF, "", "u"}, + {WINED3D_SM4_OP_IF, WINED3DSIH_IF, "", "u", + shader_sm4_read_if}, {WINED3D_SM4_OP_IEQ, WINED3DSIH_IEQ, "u", "ii"}, {WINED3D_SM4_OP_IGE, WINED3DSIH_IGE, "u", "ii"}, {WINED3D_SM4_OP_ILT, WINED3DSIH_ILT, "u", "ii"}, diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index b5a2732..6a8bbcb 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -497,6 +497,12 @@ enum wined3d_shader_rel_op WINED3D_SHADER_REL_OP_LE = 6, }; +enum wined3d_shader_conditional_op +{ + WINED3D_SHADER_CONDITIONAL_OP_NZ = 0, + WINED3D_SHADER_CONDITIONAL_OP_Z = 1 +}; + #define WINED3D_SM1_VS 0xfffeu #define WINED3D_SM1_PS 0xffffu #define WINED3D_SM4_PS 0x0000u -- 2.7.3