Module: wine Branch: master Commit: 9da924039f2905bbc2328b3c3cba0648ddc3416d URL: http://source.winehq.org/git/wine.git/?a=commit;h=9da924039f2905bbc2328b3c3c...
Author: Matteo Bruni mbruni@codeweavers.com Date: Fri Apr 22 21:59:56 2011 +0200
wined3d: Split pow instruction handling in the ARB backend.
---
dlls/wined3d/arb_program_shader.c | 51 ++++++++++++++++++++++-------------- 1 files changed, 31 insertions(+), 20 deletions(-)
diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c index 7d1a3f7..fd97c96 100644 --- a/dlls/wined3d/arb_program_shader.c +++ b/dlls/wined3d/arb_program_shader.c @@ -2733,51 +2733,62 @@ static DWORD abs_modifier(DWORD mod, BOOL *need_abs) return mod; }
-static void shader_hw_log_pow(const struct wined3d_shader_instruction *ins) +static void shader_hw_log(const struct wined3d_shader_instruction *ins) { struct wined3d_shader_buffer *buffer = ins->ctx->buffer; - char src0[50], src1[50], dst[50]; + char src0[50], dst[50]; struct wined3d_shader_src_param src0_copy = ins->src[0]; BOOL need_abs = FALSE; const char *instr; - BOOL arg2 = FALSE;
switch(ins->handler_idx) { case WINED3DSIH_LOG: instr = "LG2"; break; case WINED3DSIH_LOGP: instr = "LOG"; break; - case WINED3DSIH_POW: instr = "POW"; arg2 = TRUE; break; default: ERR("Unexpected instruction %d\n", ins->handler_idx); return; }
- /* LOG, LOGP and POW operate on the absolute value of the input */ + /* LOG and LOGP operate on the absolute value of the input */ src0_copy.modifiers = abs_modifier(src0_copy.modifiers, &need_abs);
shader_arb_get_dst_param(ins, &ins->dst[0], dst); shader_arb_get_src_param(ins, &src0_copy, 0, src0); - if(arg2) shader_arb_get_src_param(ins, &ins->src[1], 1, src1);
if(need_abs) { shader_addline(buffer, "ABS TA, %s;\n", src0); - if(arg2) - { - shader_addline(buffer, "%s%s %s, TA, %s;\n", instr, shader_arb_get_modifier(ins), dst, src1); - } - else - { - shader_addline(buffer, "%s%s %s, TA;\n", instr, shader_arb_get_modifier(ins), dst); - } + shader_addline(buffer, "%s%s %s, TA;\n", instr, shader_arb_get_modifier(ins), dst); } - else if(arg2) + else + { + shader_addline(buffer, "%s%s %s, %s;\n", instr, shader_arb_get_modifier(ins), dst, src0); + } +} + +static void shader_hw_pow(const struct wined3d_shader_instruction *ins) +{ + struct wined3d_shader_buffer *buffer = ins->ctx->buffer; + char src0[50], src1[50], dst[50]; + struct wined3d_shader_src_param src0_copy = ins->src[0]; + BOOL need_abs = FALSE; + + /* POW operates on the absolute value of the input */ + src0_copy.modifiers = abs_modifier(src0_copy.modifiers, &need_abs); + + shader_arb_get_dst_param(ins, &ins->dst[0], dst); + shader_arb_get_src_param(ins, &src0_copy, 0, src0); + shader_arb_get_src_param(ins, &ins->src[1], 1, src1); + + if (need_abs) { - shader_addline(buffer, "%s%s %s, %s, %s;\n", instr, shader_arb_get_modifier(ins), dst, src0, src1); + shader_addline(buffer, "ABS TA.x, %s;\n", src0); + shader_addline(buffer, "POW%s %s, TA.x, %s;\n", shader_arb_get_modifier(ins), dst, src1); } else { - shader_addline(buffer, "%s%s %s, %s;\n", instr, shader_arb_get_modifier(ins), dst, src0); + shader_addline(buffer, "POW%s %s, %s, %s;\n", shader_arb_get_modifier(ins), dst, src0, src1); } }
@@ -5007,8 +5018,8 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_LABEL */ shader_hw_label, /* WINED3DSIH_LD */ NULL, /* WINED3DSIH_LIT */ shader_hw_map2gl, - /* WINED3DSIH_LOG */ shader_hw_log_pow, - /* WINED3DSIH_LOGP */ shader_hw_log_pow, + /* WINED3DSIH_LOG */ shader_hw_log, + /* WINED3DSIH_LOGP */ shader_hw_log, /* WINED3DSIH_LOOP */ shader_hw_loop, /* WINED3DSIH_LRP */ shader_hw_lrp, /* WINED3DSIH_LT */ NULL, @@ -5027,7 +5038,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL /* WINED3DSIH_NOP */ shader_hw_nop, /* WINED3DSIH_NRM */ shader_hw_nrm, /* WINED3DSIH_PHASE */ NULL, - /* WINED3DSIH_POW */ shader_hw_log_pow, + /* WINED3DSIH_POW */ shader_hw_pow, /* WINED3DSIH_RCP */ shader_hw_rcp, /* WINED3DSIH_REP */ shader_hw_rep, /* WINED3DSIH_RET */ shader_hw_ret,