Skip memcpy() calls, etc. if the matrix is already the identity. Return true/false to indicate if we're really changing the matrix or not. --- src/mesa/math/m_matrix.c | 23 +++++++++++++++-------- src/mesa/math/m_matrix.h | 2 +- 2 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/src/mesa/math/m_matrix.c b/src/mesa/math/m_matrix.c index ecf564c..37c7612 100644 --- a/src/mesa/math/m_matrix.c +++ b/src/mesa/math/m_matrix.c @@ -1132,17 +1132,24 @@ _math_matrix_viewport(GLmatrix *m, const double scale[3], * * Copies ::Identity into \p GLmatrix::m, and into GLmatrix::inv if not NULL. * Sets the matrix type to identity, and clear the dirty flags. + * \return true if prev matrix wasn't identity, false otherwise */ -void -_math_matrix_set_identity( GLmatrix *mat ) +bool +_math_matrix_set_identity(GLmatrix *mat) { - memcpy( mat->m, Identity, 16*sizeof(GLfloat) ); - memcpy( mat->inv, Identity, 16*sizeof(GLfloat) ); + if (mat->type != MATRIX_IDENTITY || mat->flags) { + memcpy(mat->m, Identity, 16 * sizeof(GLfloat)); + memcpy(mat->inv, Identity, 16 * sizeof(GLfloat)); + + mat->type = MATRIX_IDENTITY; + mat->flags = 0; - mat->type = MATRIX_IDENTITY; - mat->flags &= ~(MAT_DIRTY_FLAGS| - MAT_DIRTY_TYPE| - MAT_DIRTY_INVERSE); + return true; + } + else { + /* no change */ + return false; + } } /*@}*/ diff --git a/src/mesa/math/m_matrix.h b/src/mesa/math/m_matrix.h index 778d716..0bb63c8 100644 --- a/src/mesa/math/m_matrix.h +++ b/src/mesa/math/m_matrix.h @@ -125,7 +125,7 @@ extern void _math_matrix_viewport( GLmatrix *m, const double scale[3], const double translate[3], double depthMax ); -extern void +extern bool _math_matrix_set_identity( GLmatrix *dest ); extern void -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev