[Mesa-dev] [PATCH 6/6] mesa: check for identity matrix in _mesa_LoadMatrixf()

Brian Paul brianp at vmware.com
Fri Jul 17 17:48:43 PDT 2015


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



More information about the mesa-dev mailing list