Stefan Dösinger : wined3d: Replace the position fixup mul-add-add with a MAD.

Alexandre Julliard julliard at winehq.org
Thu Nov 8 07:07:35 CST 2007


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

Author: Stefan Dösinger <stefan at codeweavers.com>
Date:   Fri Nov  2 01:11:15 2007 +0100

wined3d: Replace the position fixup mul-add-add with a MAD.

---

 dlls/wined3d/directx.c      |    1 +
 dlls/wined3d/vertexshader.c |   30 ++++++++++++------------------
 2 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/dlls/wined3d/directx.c b/dlls/wined3d/directx.c
index ada76e2..9ccc47b 100644
--- a/dlls/wined3d/directx.c
+++ b/dlls/wined3d/directx.c
@@ -2642,6 +2642,7 @@ static HRESULT  WINAPI IWineD3DImpl_CreateDevice(IWineD3D *iface, UINT Adapter,
     } else {
         object->surface_alignment = 4;
     }
+    object->posFixup[0] = 1.0; /* This is needed to get the x coord unmodified through a MAD */
 
     /* Set the state up as invalid until the device is fully created */
     object->state   = WINED3DERR_DRIVERINTERNALERROR;
diff --git a/dlls/wined3d/vertexshader.c b/dlls/wined3d/vertexshader.c
index e49e34a..4e2a7c5 100644
--- a/dlls/wined3d/vertexshader.c
+++ b/dlls/wined3d/vertexshader.c
@@ -333,20 +333,16 @@ static VOID IWineD3DVertexShaderImpl_GenerateShader(
         /* If this shader doesn't use fog copy the z coord to the fog coord so that we can use table fog */
         if (!reg_maps->fog)
             shader_addline(&buffer, "gl_FogFragCoord = gl_Position.z;\n");
-        
+
         /* Write the final position.
          *
          * OpenGL coordinates specify the center of the pixel while d3d coords specify
-         * the corner. The offsets are stored in z and w in the 2nd row of the projection
-         * matrix to avoid wasting a free shader constant. Add them to the w and z coord
-         * of the 2nd row
-         */
-        shader_addline(&buffer, "gl_Position.x = gl_Position.x + posFixup[2];\n");
-        shader_addline(&buffer, "gl_Position.y = gl_Position.y + posFixup[3];\n");
-        /* Account for any inverted textures (render to texture case) by reversing the y coordinate
-         *  (this is handled in drawPrim() when it sets the MODELVIEW and PROJECTION matrices)
+         * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
+         * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
+         * contains 1.0 to allow a mad.
          */
-        shader_addline(&buffer, "gl_Position.y = gl_Position.y * posFixup[1];\n");
+        shader_addline(&buffer, "gl_Position.xy = gl_Position.xy * posFixup.xy + posFixup.zw;\n");
+
         /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
          *
          * Basically we want(in homogenous coordinates) z = z * 2 - 1. However, shaders are run
@@ -399,15 +395,13 @@ static VOID IWineD3DVertexShaderImpl_GenerateShader(
         /* Write the final position.
          *
          * OpenGL coordinates specify the center of the pixel while d3d coords specify
-         * the corner. The offsets are stored in the 2nd row of the projection matrix,
-         * the x offset in z and the y offset in w. Add them to the resulting position
-         */
-        shader_addline(&buffer, "ADD TMP_OUT.x, TMP_OUT.x, posFixup.z;\n");
-        shader_addline(&buffer, "ADD TMP_OUT.y, TMP_OUT.y, posFixup.w;\n");
-        /* Account for any inverted textures (render to texture case) by reversing the y coordinate
-         *  (this is handled in drawPrim() when it sets the MODELVIEW and PROJECTION matrices)
+         * the corner. The offsets are stored in z and w in posFixup. posFixup.y contains
+         * 1.0 or -1.0 to turn the rendering upside down for offscreen rendering. PosFixup.x
+         * contains 1.0 to allow a mad, but arb vs swizzles are too restricted for that.
          */
-        shader_addline(&buffer, "MUL TMP_OUT.y, TMP_OUT.y, posFixup.y;\n");
+        shader_addline(&buffer, "ADD TMP_OUT.x, TMP_OUT.x, posFixup.z;");
+        shader_addline(&buffer, "MAD TMP_OUT.y, TMP_OUT.y, posFixup.y, posFixup.w;");
+
         /* Z coord [0;1]->[-1;1] mapping, see comment in transform_projection in state.c
          * and the glsl equivalent
          */




More information about the wine-cvs mailing list