Henri Verbeet : wined3d: Give mov & mova their own handler.

Alexandre Julliard julliard at winehq.org
Wed Nov 19 08:35:08 CST 2008


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

Author: Henri Verbeet <hverbeet at codeweavers.com>
Date:   Wed Nov 19 11:49:13 2008 +0100

wined3d: Give mov & mova their own handler.

---

 dlls/wined3d/arb_program_shader.c |   81 +++++++++++++++++++++++--------------
 1 files changed, 50 insertions(+), 31 deletions(-)

diff --git a/dlls/wined3d/arb_program_shader.c b/dlls/wined3d/arb_program_shader.c
index e5bd6bb..ec64c3e 100644
--- a/dlls/wined3d/arb_program_shader.c
+++ b/dlls/wined3d/arb_program_shader.c
@@ -1154,35 +1154,7 @@ static void shader_hw_map2gl(SHADER_OPCODE_ARG* arg)
         /* A shift requires another line. */
         if (shift) pshader_gen_output_modifier_line(buffer, saturate, output_wmask, shift, output_rname);
     } else {
-        if ((curOpcode->opcode == WINED3DSIO_MOV && shader_get_regtype(dst) == WINED3DSPR_ADDR)
-                || curOpcode->opcode == WINED3DSIO_MOVA) {
-            memset(tmpLine, 0, sizeof(tmpLine));
-            if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
-            {
-                vshader_program_add_param(arg, src[0], TRUE, tmpLine);
-                shader_addline(buffer, "ADD TMP.x, %s, helper_const.z;\n", tmpLine);
-                shader_addline(buffer, "ARL A0.x, TMP.x;\n");
-            } else {
-                /* Apple's ARB_vertex_program implementation does not accept an ARL source argument
-                 * with more than one component. Thus replicate the first source argument over all
-                 * 4 components. For example, .xyzw -> .x (or better: .xxxx), .zwxy -> .z, etc)
-                 */
-                DWORD parm = src[0] & ~(WINED3DVS_SWIZZLE_MASK);
-                if((src[0] & WINED3DVS_X_W) == WINED3DVS_X_W) {
-                    parm |= WINED3DVS_X_W | WINED3DVS_Y_W | WINED3DVS_Z_W | WINED3DVS_W_W;
-                } else if((src[0] & WINED3DVS_X_Z) == WINED3DVS_X_Z) {
-                    parm |= WINED3DVS_X_Z | WINED3DVS_Y_Z | WINED3DVS_Z_Z | WINED3DVS_W_Z;
-                } else if((src[0] & WINED3DVS_X_Y) == WINED3DVS_X_Y) {
-                    parm |= WINED3DVS_X_Y | WINED3DVS_Y_Y | WINED3DVS_Z_Y | WINED3DVS_W_Y;
-                } else if((src[0] & WINED3DVS_X_X) == WINED3DVS_X_X) {
-                    parm |= WINED3DVS_X_X | WINED3DVS_Y_X | WINED3DVS_Z_X | WINED3DVS_W_X;
-                }
-                vshader_program_add_param(arg, parm, TRUE, tmpLine);
-                shader_addline(buffer, "ARL A0.x, %s;\n", tmpLine);
-            }
-            return;
-        } else
-            strcpy(tmpLine, curOpcode->glname);
+        strcpy(tmpLine, curOpcode->glname);
 
         if (curOpcode->num_params > 0)
         {
@@ -1197,6 +1169,53 @@ static void shader_hw_map2gl(SHADER_OPCODE_ARG* arg)
     }
 }
 
+static void shader_hw_mov(SHADER_OPCODE_ARG *arg)
+{
+    IWineD3DBaseShaderImpl *shader = (IWineD3DBaseShaderImpl*)arg->shader;
+
+    if ((WINED3DSHADER_VERSION_MAJOR(shader->baseShader.hex_version) == 1
+            && !shader_is_pshader_version(shader->baseShader.hex_version)
+            && shader_get_regtype(arg->dst) == WINED3DSPR_ADDR)
+            || arg->opcode->opcode == WINED3DSIO_MOVA)
+    {
+        SHADER_BUFFER *buffer = arg->buffer;
+        char src0_param[256];
+
+        if (arg->opcode->opcode == WINED3DSIO_MOVA)
+            FIXME("mova should round\n");
+
+        src0_param[0] = '\0';
+        if (((IWineD3DVertexShaderImpl *)shader)->rel_offset)
+        {
+            vshader_program_add_param(arg, arg->src[0], TRUE, src0_param);
+            shader_addline(buffer, "ADD TMP.x, %s, helper_const.z;\n", src0_param);
+            shader_addline(buffer, "ARL A0.x, TMP.x;\n");
+        }
+        else
+        {
+            /* Apple's ARB_vertex_program implementation does not accept an ARL source argument
+             * with more than one component. Thus replicate the first source argument over all
+             * 4 components. For example, .xyzw -> .x (or better: .xxxx), .zwxy -> .z, etc)
+             */
+            DWORD parm = arg->src[0] & ~(WINED3DVS_SWIZZLE_MASK);
+            if((arg->src[0] & WINED3DVS_X_W) == WINED3DVS_X_W)
+                parm |= WINED3DVS_X_W | WINED3DVS_Y_W | WINED3DVS_Z_W | WINED3DVS_W_W;
+            else if((arg->src[0] & WINED3DVS_X_Z) == WINED3DVS_X_Z)
+                parm |= WINED3DVS_X_Z | WINED3DVS_Y_Z | WINED3DVS_Z_Z | WINED3DVS_W_Z;
+            else if((arg->src[0] & WINED3DVS_X_Y) == WINED3DVS_X_Y)
+                parm |= WINED3DVS_X_Y | WINED3DVS_Y_Y | WINED3DVS_Z_Y | WINED3DVS_W_Y;
+            else if((arg->src[0] & WINED3DVS_X_X) == WINED3DVS_X_X)
+                parm |= WINED3DVS_X_X | WINED3DVS_Y_X | WINED3DVS_Z_X | WINED3DVS_W_X;
+            vshader_program_add_param(arg, parm, TRUE, src0_param);
+            shader_addline(buffer, "ARL A0.x, %s;\n", src0_param);
+        }
+    }
+    else
+    {
+        shader_hw_map2gl(arg);
+    }
+}
+
 static void pshader_hw_texkill(SHADER_OPCODE_ARG* arg) {
     IWineD3DPixelShaderImpl* This = (IWineD3DPixelShaderImpl*) arg->shader;
     DWORD hex_version = This->baseShader.hex_version;
@@ -2288,8 +2307,8 @@ static const SHADER_HANDLER shader_arb_instruction_handler_table[WINED3DSIH_TABL
     /* WINED3DSIH_MAD           */ shader_hw_map2gl,
     /* WINED3DSIH_MAX           */ shader_hw_map2gl,
     /* WINED3DSIH_MIN           */ shader_hw_map2gl,
-    /* WINED3DSIH_MOV           */ shader_hw_map2gl,
-    /* WINED3DSIH_MOVA          */ shader_hw_map2gl,
+    /* WINED3DSIH_MOV           */ shader_hw_mov,
+    /* WINED3DSIH_MOVA          */ shader_hw_mov,
     /* WINED3DSIH_MUL           */ shader_hw_map2gl,
     /* WINED3DSIH_NOP           */ shader_hw_map2gl,
     /* WINED3DSIH_NRM           */ shader_hw_nrm,




More information about the wine-cvs mailing list