[Mesa-dev] [PATCH 39/75] st/nine: Fix ff computation for inverse
Axel Davy
axel.davy at ens.fr
Wed Oct 5 20:09:12 UTC 2016
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 at ens.fr>
---
src/gallium/state_trackers/nine/nine_ff.c | 26 ++++++--------------------
src/gallium/state_trackers/nine/nine_ff.h | 3 ---
2 files changed, 6 insertions(+), 23 deletions(-)
diff --git a/src/gallium/state_trackers/nine/nine_ff.c b/src/gallium/state_trackers/nine/nine_ff.c
index 2c237f4..b2d6a9d 100644
--- a/src/gallium/state_trackers/nine/nine_ff.c
+++ b/src/gallium/state_trackers/nine/nine_ff.c
@@ -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);
-}
diff --git a/src/gallium/state_trackers/nine/nine_ff.h b/src/gallium/state_trackers/nine/nine_ff.h
index 9c33c76..6c32dba 100644
--- a/src/gallium/state_trackers/nine/nine_ff.h
+++ b/src/gallium/state_trackers/nine/nine_ff.h
@@ -25,9 +25,6 @@ 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 *);
#define NINED3DTSS_TCI_DISABLE 0
--
2.10.0
More information about the mesa-dev
mailing list