Mesa (master): mesa: factor out enum -> matrix stack lookup

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 3 19:29:32 UTC 2019


Module: Mesa
Branch: master
Commit: 28ce704bb012e0510bfb90659020764800e62e82
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=28ce704bb012e0510bfb90659020764800e62e82

Author: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer at amd.com>
Date:   Tue May  7 11:20:20 2019 +0200

mesa: factor out enum -> matrix stack lookup

Split this out from glMatrixMode since we're about to need it
independently for EXT_DSA.

Adapted from Chris Forbes commit.

Reviewed-by: Marek Olšák <marek.olsak at amd.com>

---

 src/mesa/main/matrix.c | 110 +++++++++++++++++++++++++------------------------
 1 file changed, 56 insertions(+), 54 deletions(-)

diff --git a/src/mesa/main/matrix.c b/src/mesa/main/matrix.c
index 8065a83705c..3b5159e1c7e 100644
--- a/src/mesa/main/matrix.c
+++ b/src/mesa/main/matrix.c
@@ -46,6 +46,54 @@
 #include "util/bitscan.h"
 
 
+static struct gl_matrix_stack *
+get_named_matrix_stack(struct gl_context *ctx, GLenum mode)
+{
+   switch (mode) {
+   case GL_MODELVIEW:
+      return &ctx->ModelviewMatrixStack;
+   case GL_PROJECTION:
+      return &ctx->ProjectionMatrixStack;
+   case GL_TEXTURE:
+      /* This error check is disabled because if we're called from
+       * glPopAttrib() when the active texture unit is >= MaxTextureCoordUnits
+       * we'll generate an unexpected error.
+       * From the GL_ARB_vertex_shader spec it sounds like we should instead
+       * do error checking in other places when we actually try to access
+       * texture matrices beyond MaxTextureCoordUnits.
+       */
+#if 0
+      if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glMatrixMode(invalid tex unit %d)",
+                     ctx->Texture.CurrentUnit);
+         return;
+      }
+#endif
+      assert(ctx->Texture.CurrentUnit < ARRAY_SIZE(ctx->TextureMatrixStack));
+      return &ctx->TextureMatrixStack[ctx->Texture.CurrentUnit];
+   case GL_MATRIX0_ARB:
+   case GL_MATRIX1_ARB:
+   case GL_MATRIX2_ARB:
+   case GL_MATRIX3_ARB:
+   case GL_MATRIX4_ARB:
+   case GL_MATRIX5_ARB:
+   case GL_MATRIX6_ARB:
+   case GL_MATRIX7_ARB:
+      if (ctx->API == API_OPENGL_COMPAT
+          && (ctx->Extensions.ARB_vertex_program ||
+              ctx->Extensions.ARB_fragment_program)) {
+         const GLuint m = mode - GL_MATRIX0_ARB;
+         if (m <= ctx->Const.MaxProgramMatrices)
+            return &ctx->ProgramMatrixStack[m];
+      }
+      /* fallthrough */
+   default:
+      return NULL;
+   }
+}
+
+
 /**
  * Apply a perspective projection matrix.
  *
@@ -148,67 +196,21 @@ _mesa_Ortho( GLdouble left, GLdouble right,
 void GLAPIENTRY
 _mesa_MatrixMode( GLenum mode )
 {
+   struct gl_matrix_stack * stack;
    GET_CURRENT_CONTEXT(ctx);
 
    if (ctx->Transform.MatrixMode == mode && mode != GL_TEXTURE)
       return;
 
-   switch (mode) {
-   case GL_MODELVIEW:
-      ctx->CurrentStack = &ctx->ModelviewMatrixStack;
-      break;
-   case GL_PROJECTION:
-      ctx->CurrentStack = &ctx->ProjectionMatrixStack;
-      break;
-   case GL_TEXTURE:
-      /* This error check is disabled because if we're called from
-       * glPopAttrib() when the active texture unit is >= MaxTextureCoordUnits
-       * we'll generate an unexpected error.
-       * From the GL_ARB_vertex_shader spec it sounds like we should instead
-       * do error checking in other places when we actually try to access
-       * texture matrices beyond MaxTextureCoordUnits.
-       */
-#if 0
-      if (ctx->Texture.CurrentUnit >= ctx->Const.MaxTextureCoordUnits) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glMatrixMode(invalid tex unit %d)",
-                     ctx->Texture.CurrentUnit);
-         return;
-      }
-#endif
-      assert(ctx->Texture.CurrentUnit < ARRAY_SIZE(ctx->TextureMatrixStack));
-      ctx->CurrentStack = &ctx->TextureMatrixStack[ctx->Texture.CurrentUnit];
-      break;
-   case GL_MATRIX0_ARB:
-   case GL_MATRIX1_ARB:
-   case GL_MATRIX2_ARB:
-   case GL_MATRIX3_ARB:
-   case GL_MATRIX4_ARB:
-   case GL_MATRIX5_ARB:
-   case GL_MATRIX6_ARB:
-   case GL_MATRIX7_ARB:
-      if (ctx->API == API_OPENGL_COMPAT
-          && (ctx->Extensions.ARB_vertex_program ||
-              ctx->Extensions.ARB_fragment_program)) {
-         const GLuint m = mode - GL_MATRIX0_ARB;
-         if (m > ctx->Const.MaxProgramMatrices) {
-            _mesa_error(ctx, GL_INVALID_ENUM,
-                        "glMatrixMode(GL_MATRIX%d_ARB)", m);
-            return;
-         }
-         ctx->CurrentStack = &ctx->ProgramMatrixStack[m];
-      }
-      else {
-         _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
-         return;
-      }
-      break;
-   default:
+   stack = get_named_matrix_stack(ctx, mode);
+
+   if (stack) {
+      ctx->CurrentStack = stack;
+      ctx->Transform.MatrixMode = mode;
+   }
+   else {
       _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode(mode)" );
-      return;
    }
-
-   ctx->Transform.MatrixMode = mode;
 }
 
 




More information about the mesa-commit mailing list