Nozomi Kodama : d3dx9_36: Fix the case out = in for D3DXSHRotate.

Alexandre Julliard julliard at winehq.org
Tue Nov 13 13:46:06 CST 2012


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

Author: Nozomi Kodama <nozomi.kodama at yahoo.com>
Date:   Sun Nov 11 15:23:57 2012 -1000

d3dx9_36: Fix the case out = in for D3DXSHRotate.

---

 dlls/d3dx9_36/math.c       |   12 ++++----
 dlls/d3dx9_36/tests/math.c |   65 ++++++++++++++++++++++++++++++-------------
 2 files changed, 51 insertions(+), 26 deletions(-)

diff --git a/dlls/d3dx9_36/math.c b/dlls/d3dx9_36/math.c
index 05125f7..12073e3 100644
--- a/dlls/d3dx9_36/math.c
+++ b/dlls/d3dx9_36/math.c
@@ -2774,7 +2774,7 @@ static void rotate_X(FLOAT *out, UINT order, FLOAT a, FLOAT *in)
 
 FLOAT* WINAPI D3DXSHRotate(FLOAT *out, UINT order, CONST D3DXMATRIX *matrix, CONST FLOAT *in)
 {
-    FLOAT alpha, beta, gamma, sinb, temp[36];
+    FLOAT alpha, beta, gamma, sinb, temp[36], temp1[36];
 
     TRACE("out %p, order %u, matrix %p, in %p\n", out, order, matrix, in);
 
@@ -2848,11 +2848,11 @@ FLOAT* WINAPI D3DXSHRotate(FLOAT *out, UINT order, CONST D3DXMATRIX *matrix, CON
         gamma = 0.0f;
     }
 
-    D3DXSHRotateZ(out, order, gamma, in);
-    rotate_X(temp, order, 1.0f, out);
-    D3DXSHRotateZ(out, order, beta, temp);
-    rotate_X(temp, order, -1.0f, out);
-    D3DXSHRotateZ(out, order, alpha, temp);
+    D3DXSHRotateZ(temp, order, gamma, in);
+    rotate_X(temp1, order, 1.0f, temp);
+    D3DXSHRotateZ(temp, order, beta, temp1);
+    rotate_X(temp1, order, -1.0f, temp);
+    D3DXSHRotateZ(out, order, alpha, temp1);
 
     return out;
 }
diff --git a/dlls/d3dx9_36/tests/math.c b/dlls/d3dx9_36/tests/math.c
index 53262b7..c727c5f 100644
--- a/dlls/d3dx9_36/tests/math.c
+++ b/dlls/d3dx9_36/tests/math.c
@@ -2751,7 +2751,7 @@ static void test_D3DXSHMultiply4(void)
 static void test_D3DXSHRotate(void)
 {
     D3DXMATRIX m[4];
-    FLOAT expected, in[49], out[49], *received_ptr;
+    FLOAT expected, in[49], out[49], *out_temp, *received_ptr;
     static const FLOAT table[]=
     { /* Rotation around X-axis Pi/2 */
         1.01f, -3.01f, 2.01f, 4.01f, -8.01f, -6.01f,
@@ -2760,6 +2760,8 @@ static void test_D3DXSHRotate(void)
         30.241013f, 26.919991f, 39.236877f, -22.632446f, 6.707388f, -11.768282f,
         3.443672f, -6.07445f, 11.61839f, 1.527561f, 37.89633f, -56.9012f,
         47.42289f, 50.39153f, 10.61819f, 25.50101f, 0.049241f, 16.98330f,
+
+        1.01f, -3.01f, -3.01f, 4.01f, -8.01f, -6.01f, -11.307889f, -8.01f, 14.297919f,
       /* Rotation around X-axis -Pi/2 */
         1.01f, 3.01f, -2.01f, 4.01f, 8.01f, -6.01f,
         -11.307890f, -5.01f, -1.565839f, -1.093598f, -11.01f, -19.833414f,
@@ -2767,6 +2769,8 @@ static void test_D3DXSHRotate(void)
         -30.241013f, 26.919991f, 39.236877f, 22.632446f, 6.707388f, 11.768282f,
         3.443672f, 6.07445f, 11.61839f, -1.527561f, 37.89633f, 56.9012f,
         -47.42289f, 50.39153f, -10.61819f, 25.50101f, -0.049248f, 16.98330f,
+
+        1.01f, 3.01f, -3.01f, 4.01f, 8.01f, -6.01f, -11.307890f, -8.01f, 14.297919f,
       /* Yaw Pi/3, Pitch Pi/4, Roll Pi/5 */
         1.01f, 4.944899f, 1.442301f, 1.627281f, 0.219220f, 10.540824f,
         -9.136903f, 2.763750f, -7.30904f,  -5.875721f, 5.303124f,  -8.682154f,
@@ -2774,41 +2778,62 @@ static void test_D3DXSHRotate(void)
         14.629795f, -54.467102f, -12.231035f, -4.089857f, -9.444222f, 3.056035f,
         0.179257f, -10.041875f, 23.090092f, -23.188709f, 11.727098f, -65.183090f,
         48.671577f, -15.073209f, 38.793171f, -26.039536f, 6.192769f, -17.672247f,
+
+        1.01f, 4.944899f, -0.891142f, 4.607695f, 0.219218f, 10.773325f,
+        -8.204769f, 13.563829f, -12.007767f,
       /* Rotation around Z-axis Pi/6 */
         1.01f, 3.745711f, 3.01f, 2.467762f, 10.307889f, 9.209813f,
         7.01f, 3.931864f, 0.166212f, 16.01f, 18.504042f, 17.405966f,
         13.01f, 6.128016f, -2.029941f, -10.01f, 13.154292f, 24.01f,
         29.432245f, 28.334167f, 21.01f, 9.056221f, -4.958143f, -18.01f,
         -27.236094f, -4.520332f, 16.814543f, 34.01f, 43.092495f, 41.994423f,
-        31.01f, 12.716471f, -8.618400f, -28.01f, -40.896347f, -44.190571,};
-    unsigned int i, j, order;
+        31.01f, 12.716471f, -8.618400f, -28.01f, -40.896347f, -44.190571,
+
+        1.01f, 3.745711f, 3.01f, 1.599906f, 10.307889f, 9.209813f,
+        7.01f, 2.331957f, -4.421894f, };
+    unsigned int i, j, l, order;
 
     D3DXMatrixRotationX(&m[0], -D3DX_PI / 2.0f);
     D3DXMatrixRotationX(&m[1], D3DX_PI / 2.0f);
     D3DXMatrixRotationYawPitchRoll(&m[2], D3DX_PI / 3.0f, D3DX_PI / 4.0f, D3DX_PI / 5.0f);
     D3DXMatrixRotationZ(&m[3], D3DX_PI / 6.0f);
 
-    for (i = 0; i < 49; i++)
-        in[i] = i + 1.01f;
-
-    for (j = 0; j < 4; j++)
+    for (l = 0; l < 2; l++)
     {
-        for (order = 0; order <= D3DXSH_MAXORDER; order++)
-        {
-            for (i = 0; i < 49; i++)
-                out[i] = ( i + 1.0f ) * ( i + 1.0f );
-
-            received_ptr = D3DXSHRotate(out, order, &m[j], in);
-            ok(received_ptr == out, "Order %u, expected %p, received %p\n", order, out, received_ptr);
+        if (l == 0)
+            out_temp = out;
+        else
+            out_temp = in;
 
-            for (i = 0; i < 49; i++)
+        for (j = 0; j < 4; j++)
+        {
+            for (order = 0; order <= D3DXSH_MAXORDER; order++)
             {
-                if ( ( i > 0 ) && ( ( i >= order * order ) || ( order > D3DXSH_MAXORDER ) ) )
-                    expected = ( i + 1.0f ) * ( i + 1.0f );
-                else
-                    expected = table[36 * j + i];
+                for (i = 0; i < 49; i++)
+                {
+                    out[i] = ( i + 1.0f ) * ( i + 1.0f );
+                    in[i] = i + 1.01f;
+                }
+
+                received_ptr = D3DXSHRotate(out_temp, order, &m[j], in);
+                ok(received_ptr == out_temp, "Order %u, expected %p, received %p\n", order, out, received_ptr);
 
-                ok(relative_error(out[i], expected) < admitted_error, "Order %u index %u, expected %f, received %f\n", order, i, expected, out[i]);
+                for (i = 0; i < 49; i++)
+                {
+                    if ((i > 0) && ((i >= order * order) || (order > D3DXSH_MAXORDER)))
+                    {
+                        if (l == 0)
+                            expected = ( i + 1.0f ) * ( i + 1.0f );
+                        else
+                            expected = i + 1.01f;
+                    }
+                    else if ((l == 0) || (order > 3))
+                        expected = table[45 * j + i];
+                    else
+                        expected = table[45 * j + 36 +i];
+                    ok(relative_error(out_temp[i], expected) < admitted_error,
+                        "Order %u index %u, expected %f, received %f\n", order, i, expected, out_temp[i]);
+                }
             }
         }
     }




More information about the wine-cvs mailing list