Google Earth often calls glLoadMatrixf() with an identity matrix instead of glLoadIdentity() to set the modelview and texture matrices. In many cases, the matrix is already the identity so the calls are redundant.
By being a bit smarter in _mesa_LoadMatrixf() we can avoid quite a few matrix-related state validations. --- src/mesa/main/matrix.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c index 5ac97f8..e6bdff8 100644 --- a/src/mesa/main/matrix.c +++ b/src/mesa/main/matrix.c @@ -330,8 +330,16 @@ _mesa_LoadIdentity( void ) void GLAPIENTRY _mesa_LoadMatrixf( const GLfloat *m ) { + static const GLfloat identity[16] = { + 1.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 1.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 1.0f, 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f }; GET_CURRENT_CONTEXT(ctx); - if (!m) return; + + if (!m) + return; + if (MESA_VERBOSE & VERBOSE_API) _mesa_debug(ctx, "glLoadMatrix(%f %f %f %f, %f %f %f %f, %f %f %f %f, %f %f %f %f\n", @@ -341,8 +349,17 @@ _mesa_LoadMatrixf( const GLfloat *m ) m[3], m[7], m[11], m[15]); FLUSH_VERTICES(ctx, 0); - _math_matrix_loadf( ctx->CurrentStack->Top, m ); - ctx->NewState |= ctx->CurrentStack->DirtyFlag; + + if (memcmp(m, identity, sizeof(identity)) == 0) { + /* Setting the identity matrix */ + if (_math_matrix_set_identity(ctx->CurrentStack->Top)) { + ctx->NewState |= ctx->CurrentStack->DirtyFlag; + } + } + else { + _math_matrix_loadf(ctx->CurrentStack->Top, m); + ctx->NewState |= ctx->CurrentStack->DirtyFlag; + } } -- 1.9.1 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev