H. Verbeet : wined3d: Give WINED3DSIO_CRS its own function, properly take the write mask into account.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jan 16 10:07:32 CST 2007


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

Author: H. Verbeet <hverbeet at gmail.com>
Date:   Mon Jan 15 19:31:56 2007 +0100

wined3d: Give WINED3DSIO_CRS its own function, properly take the write mask into account.

---

 dlls/wined3d/glsl_shader.c     |   16 +++++++++++++++-
 dlls/wined3d/pixelshader.c     |    2 +-
 dlls/wined3d/vertexshader.c    |    2 +-
 dlls/wined3d/wined3d_private.h |    1 +
 4 files changed, 18 insertions(+), 3 deletions(-)

diff --git a/dlls/wined3d/glsl_shader.c b/dlls/wined3d/glsl_shader.c
index 6523d35..ca5ae44 100644
--- a/dlls/wined3d/glsl_shader.c
+++ b/dlls/wined3d/glsl_shader.c
@@ -1003,6 +1003,21 @@ void shader_glsl_dot(SHADER_OPCODE_ARG*
                    tmpDest, cast, src0_str, cast, src1_str, dst_mask);
 }
 
+/* Note that this instruction has some restrictions. The destination write mask
+ * can't contain the w component, and the source swizzles have to be .xyzw */
+void shader_glsl_cross(SHADER_OPCODE_ARG *arg) {
+    char src0_reg[50], src0_mask[6], src0_str[100];
+    char src1_reg[50], src1_mask[6], src1_str[100];
+    DWORD src_mask = WINED3DSP_WRITEMASK_0 | WINED3DSP_WRITEMASK_1 | WINED3DSP_WRITEMASK_2;
+    char dst_mask[6];
+
+    shader_glsl_get_write_mask(arg->dst, dst_mask);
+    shader_glsl_append_dst(arg->buffer, arg);
+    shader_glsl_add_src_param(arg, arg->src[0], arg->src_addr[0], src_mask, src0_reg, src0_mask, src0_str);
+    shader_glsl_add_src_param(arg, arg->src[1], arg->src_addr[1], src_mask, src1_reg, src1_mask, src1_str);
+    shader_addline(arg->buffer, "cross(%s, %s).%s);\n", src0_str, src1_str, dst_mask);
+}
+
 /* Map the opcode 1-to-1 to the GL code (arg->dst = instruction(src0, src1, ...) */
 void shader_glsl_map2gl(SHADER_OPCODE_ARG* arg) {
 
@@ -1027,7 +1042,6 @@ void shader_glsl_map2gl(SHADER_OPCODE_AR
             case WINED3DSIO_ABS:    strcat(tmpLine, "abs"); break;
             case WINED3DSIO_FRC:    strcat(tmpLine, "fract"); break;
             case WINED3DSIO_POW:    strcat(tmpLine, "pow"); break;
-            case WINED3DSIO_CRS:    strcat(tmpLine, "cross"); break;
             case WINED3DSIO_NRM:    strcat(tmpLine, "normalize"); break;
             case WINED3DSIO_LOGP:
             case WINED3DSIO_LOG:    strcat(tmpLine, "log2"); break;
diff --git a/dlls/wined3d/pixelshader.c b/dlls/wined3d/pixelshader.c
index ce69e0b..8573b9b 100644
--- a/dlls/wined3d/pixelshader.c
+++ b/dlls/wined3d/pixelshader.c
@@ -646,7 +646,7 @@ CONST SHADER_OPCODE IWineD3DPixelShaderI
     {WINED3DSIO_CND,  "cnd",  NULL, 1, 4, pshader_cnd, pshader_hw_cnd, shader_glsl_cnd, WINED3DPS_VERSION(1,1), WINED3DPS_VERSION(1,4)},
     {WINED3DSIO_CMP,  "cmp",  NULL, 1, 4, pshader_cmp, pshader_hw_cmp, shader_glsl_cmp, WINED3DPS_VERSION(1,2), WINED3DPS_VERSION(3,0)},
     {WINED3DSIO_POW,  "pow",  "POW", 1, 3, pshader_pow,  NULL, shader_glsl_map2gl, 0, 0},
-    {WINED3DSIO_CRS,  "crs",  "XPS", 1, 3, pshader_crs,  NULL, shader_glsl_map2gl, 0, 0},
+    {WINED3DSIO_CRS,  "crs",  "XPS", 1, 3, pshader_crs,  NULL, shader_glsl_cross, 0, 0},
     /* TODO: xyz normalise can be performed as VS_ARB using one temporary register,
         DP3 tmp , vec, vec;
         RSQ tmp, tmp.x;
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index cd2d472..c6e034d 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -501,7 +501,7 @@ CONST SHADER_OPCODE IWineD3DVertexShader
     {WINED3DSIO_LRP,  "lrp",  "LRP", 1, 4, vshader_lrp,  NULL,              shader_glsl_lrp, 0, 0},
     {WINED3DSIO_FRC,  "frc",  "FRC", 1, 2, vshader_frc,  vshader_hw_map2gl, shader_glsl_map2gl, 0, 0},
     {WINED3DSIO_POW,  "pow",  "POW", 1, 3, vshader_pow,  NULL, shader_glsl_map2gl, 0, 0},
-    {WINED3DSIO_CRS,  "crs",  "XPS", 1, 3, vshader_crs,  NULL, shader_glsl_map2gl, 0, 0},
+    {WINED3DSIO_CRS,  "crs",  "XPS", 1, 3, vshader_crs,  NULL, shader_glsl_cross, 0, 0},
     /* TODO: sng can possibly be performed a  s
         RCP tmp, vec
         MUL out, tmp, vec*/
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index 3ff6b26..6b4c42a 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -1616,6 +1616,7 @@ extern void shader_glsl_load_constants(
     char useVertexShader);
 
 /** The following translate DirectX pixel/vertex shader opcodes to GLSL lines */
+extern void shader_glsl_cross(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_map2gl(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_arith(SHADER_OPCODE_ARG* arg);
 extern void shader_glsl_mov(SHADER_OPCODE_ARG* arg);




More information about the wine-cvs mailing list