st/nine: Fix ff computation for inverse
authorAxel Davy <axel.davy@ens.fr>
Sun, 25 Sep 2016 10:43:29 +0000 (12:43 +0200)
committerAxel Davy <axel.davy@ens.fr>
Mon, 10 Oct 2016 21:43:50 +0000 (23:43 +0200)
Thanks to wine tests.
Apparently 4x4 inverse is to be used, and
if the inverse can't be calculated, the
input matrix is to be used.

Signed-off-by: Axel Davy <axel.davy@ens.fr>
src/gallium/state_trackers/nine/nine_ff.c
src/gallium/state_trackers/nine/nine_ff.h

index 2c237f4ed847a8f01e2c4d1c8c01f9de6cfa9553..b2d6a9d759bd3fc03e6ed3e786762c53f7a872c7 100644 (file)
@@ -1825,7 +1825,7 @@ nine_ff_load_vs_transforms(struct NineDevice9 *device)
         nine_d3d_matrix_matrix_mul(&M[0], &M[1], GET_D3DTS(PROJECTION));
 
         /* normal matrix == transpose(inverse(WV)) */
-        nine_d3d_matrix_inverse_3x3(&T, &M[1]);
+        nine_d3d_matrix_inverse(&T, &M[1]);
         nine_d3d_matrix_transpose(&M[4], &T);
 
         /* P matrix */
@@ -2445,6 +2445,11 @@ nine_d3d_matrix_inverse(D3DMATRIX *D, const D3DMATRIX *M)
         M->m[2][0] * D->m[0][2] +
         M->m[3][0] * D->m[0][3];
 
+    if (det < 1e-30) {/* non inversible */
+        *D = *M; /* wine tests */
+        return;
+    }
+
     det = 1.0 / det;
 
     for (i = 0; i < 4; i++)
@@ -2464,22 +2469,3 @@ nine_d3d_matrix_inverse(D3DMATRIX *D, const D3DMATRIX *M)
     }
 #endif
 }
-
-/* TODO: don't use 4x4 inverse, unless this gets all nicely inlined ? */
-void
-nine_d3d_matrix_inverse_3x3(D3DMATRIX *D, const D3DMATRIX *M)
-{
-    D3DMATRIX T;
-    unsigned i, j;
-
-    for (i = 0; i < 3; ++i)
-    for (j = 0; j < 3; ++j)
-        T.m[i][j] = M->m[i][j];
-    for (i = 0; i < 3; ++i) {
-        T.m[i][3] = 0.0f;
-        T.m[3][i] = 0.0f;
-    }
-    T.m[3][3] = 1.0f;
-
-    nine_d3d_matrix_inverse(D, &T);
-}
index 9c33c76370df15da75db8d6c6af15b7472b0598a..6c32dba5902f996271b572db820c5cb7be8d22fc 100644 (file)
@@ -24,9 +24,6 @@ nine_d3d_matrix_det(const D3DMATRIX *);
 void
 nine_d3d_matrix_inverse(D3DMATRIX *, const D3DMATRIX *);
 
-void
-nine_d3d_matrix_inverse_3x3(D3DMATRIX *, const D3DMATRIX *);
-
 void
 nine_d3d_matrix_transpose(D3DMATRIX *, const D3DMATRIX *);