Matteo Bruni : wined3d: Split pow instruction handling in the ARB backend.

Alexandre Julliard julliard at winehq.org
Thu Apr 28 12:18:55 CDT 2011


Module: wine
Branch: master
Commit: 9da924039f2905bbc2328b3c3cba0648ddc3416d
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=9da924039f2905bbc2328b3c3cba0648ddc3416d

Author: Matteo Bruni <mbruni at 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,




More information about the wine-cvs mailing list