Stefan Dösinger : wined3d: Simplify shader_hw_map2gl.

Alexandre Julliard julliard at winehq.org
Mon May 11 09:10:47 CDT 2009


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Thu May  7 18:20:59 2009 +0200

wined3d: Simplify shader_hw_map2gl.

Most of the extra work done in the pixel shader code was not needed or
redundant. This patch unifies the two paths.

---

 dlls/wined3d/arb_program_shader.c |  101 ++++++++----------------------------
 1 files changed, 23 insertions(+), 78 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index 67987ba..ec4bea7 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -915,8 +915,10 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
 {
     SHADER_BUFFER *buffer = ins->ctx->buffer;
     const char *instruction;
-    char arguments[256];
+    char arguments[256], dst_str[50];
     unsigned int i;
+    const struct wined3d_shader_dst_param *dst = &ins->dst[0];
+    const char *modifier;
 
     switch (ins->handler_idx)
     {
@@ -938,7 +940,6 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
         case WINED3DSIH_MIN: instruction = "MIN"; break;
         case WINED3DSIH_MOV: instruction = "MOV"; break;
         case WINED3DSIH_MUL: instruction = "MUL"; break;
-        case WINED3DSIH_NOP: instruction = "NOP"; break;
         case WINED3DSIH_POW: instruction = "POW"; break;
         case WINED3DSIH_SGE: instruction = "SGE"; break;
         case WINED3DSIH_SLT: instruction = "SLT"; break;
@@ -948,83 +949,27 @@ static void shader_hw_map2gl(const struct wined3d_shader_instruction *ins)
             break;
     }
 
-    if (shader_is_pshader_version(ins->ctx->reg_maps->shader_version.type))
-    {
-        /* Output token related */
-        const struct wined3d_shader_dst_param *dst;
-        char output_rname[256];
-        char output_wmask[20];
-        char operands[4][100];
-        BOOL saturate = FALSE;
-        BOOL centroid = FALSE;
-        BOOL partialprecision = FALSE;
-        const char *modifier;
-        BOOL is_color;
-        DWORD shift;
-
-        if (!(ins->dst_count + ins->src_count))
-        {
-            ERR("Opcode \"%#x\" has no parameters\n", ins->handler_idx);
-            return;
-        }
-        dst = &ins->dst[0];
-
-        /* Process modifiers */
-        if (dst->modifiers)
-        {
-            DWORD mask = dst->modifiers;
-
-            saturate = mask & WINED3DSPDM_SATURATE;
-            centroid = mask & WINED3DSPDM_MSAMPCENTROID;
-            partialprecision = mask & WINED3DSPDM_PARTIALPRECISION;
-            mask &= ~(WINED3DSPDM_MSAMPCENTROID | WINED3DSPDM_PARTIALPRECISION | WINED3DSPDM_SATURATE);
-            if (mask)
-                FIXME("Unrecognized modifier(%#x)\n", mask);
-
-            if (centroid)
-                FIXME("Unhandled modifier(%#x)\n", mask);
-        }
-        shift = dst->shift;
-        modifier = (saturate && !shift) ? "_SAT" : "";
-
-        /* Generate input register names (with modifiers) */
-        for (i = 0; i < ins->src_count; ++i)
-        {
-            shader_arb_get_src_param(ins, &ins->src[i], i, operands[i + 1]);
-        }
+    /* All instructions handled by this function have a destination parameter */
+    if(dst->modifiers & WINED3DSPDM_SATURATE) modifier = "_SAT";
+    else modifier = "";
 
-        /* Handle output register */
-        shader_arb_get_register_name(ins->ctx->shader, dst->reg.type,
-                dst->reg.idx, !!dst->reg.rel_addr, output_rname, &is_color);
-        strcpy(operands[0], output_rname);
-        shader_arb_get_write_mask(ins, dst, output_wmask);
-        strcat(operands[0], output_wmask);
-
-        arguments[0] = '\0';
-        strcat(arguments, operands[0]);
-        for (i = 0; i < ins->src_count; ++i)
-        {
-            strcat(arguments, ", ");
-            strcat(arguments, operands[i + 1]);
-        }
-        shader_addline(buffer, "%s%s %s;\n", instruction, modifier, arguments);
-    } else {
-        arguments[0] = '\0';
-        if (ins->dst_count)
-        {
-            char operand[100];
-            shader_arb_get_dst_param(ins, &ins->dst[0], operand);
-            strcat(arguments, " ");
-            strcat(arguments, operand);
-            for (i = 0; i < ins->src_count; ++i)
-            {
-                strcat(arguments, ", ");
-                shader_arb_get_src_param(ins, &ins->src[i], i, operand);
-                strcat(arguments, operand);
-            }
-        }
-        shader_addline(buffer, "%s%s;\n", instruction, arguments);
+    /* Note that shader_arb_add_dst_param() adds spaces. */
+    arguments[0] = '\0';
+    shader_arb_get_dst_param(ins, dst, dst_str);
+    for (i = 0; i < ins->src_count; ++i)
+    {
+        char operand[100];
+        strcat(arguments, ", ");
+        shader_arb_get_src_param(ins, &ins->src[i], i, operand);
+        strcat(arguments, operand);
     }
+    shader_addline(buffer, "%s%s %s%s;\n", instruction, modifier, dst_str, arguments);
+}
+
+static void shader_hw_nop(const struct wined3d_shader_instruction *ins)
+{
+    SHADER_BUFFER *buffer = ins->ctx->buffer;
+    shader_addline(buffer, "NOP;\n");
 }
 
 static void shader_hw_mov(const struct wined3d_shader_instruction *ins)
@@ -2275,7 +2220,7 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_MOV           */ shader_hw_mov,
     /* WINED3DSIH_MOVA          */ shader_hw_mov,
     /* WINED3DSIH_MUL           */ shader_hw_map2gl,
-    /* WINED3DSIH_NOP           */ shader_hw_map2gl,
+    /* WINED3DSIH_NOP           */ shader_hw_nop,
     /* WINED3DSIH_NRM           */ shader_hw_nrm,
     /* WINED3DSIH_PHASE         */ NULL,
     /* WINED3DSIH_POW           */ shader_hw_map2gl,




More information about the wine-cvs mailing list