Replace old matrix stacks with new code based on struct matrix_stack.
authorBrian Paul <brian.paul@tungstengraphics.com>
Tue, 18 Dec 2001 04:06:44 +0000 (04:06 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Tue, 18 Dec 2001 04:06:44 +0000 (04:06 +0000)
Moved vertex program hash table into shared context state.
Implemented reference counting for vertex programs.
Replaced tnl "ProjectedClip" with "Ndc" (normalized device coordinates).

24 files changed:
src/mesa/main/clip.c
src/mesa/main/config.h
src/mesa/main/context.c
src/mesa/main/dlist.c
src/mesa/main/enable.c
src/mesa/main/get.c
src/mesa/main/light.c
src/mesa/main/matrix.c
src/mesa/main/mtypes.h
src/mesa/main/pixel.c
src/mesa/main/rastpos.c
src/mesa/main/state.c
src/mesa/main/texstate.c
src/mesa/math/m_matrix.c
src/mesa/swrast/s_fog.c
src/mesa/swrast_setup/ss_vbtmp.h
src/mesa/tnl/t_context.c
src/mesa/tnl/t_context.h
src/mesa/tnl/t_vb_fog.c
src/mesa/tnl/t_vb_normals.c
src/mesa/tnl/t_vb_program.c
src/mesa/tnl/t_vb_texmat.c
src/mesa/tnl/t_vb_vertex.c
src/mesa/x86/gen_matypes.c

index f18b0b42391100a2c7e1bafc69a6a71a64fb5574..700d271f7bda9b3cbd391cdf1574390c9a5d56e1 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: clip.c,v 1.23 2001/09/15 18:02:49 brianp Exp $ */
+/* $Id: clip.c,v 1.24 2001/12/18 04:06:44 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -74,10 +74,11 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq )
     * clipping now takes place.  The clip-space equations are recalculated
     * whenever the projection matrix changes.
     */
-   if (ctx->ModelView.flags & MAT_DIRTY)
-      _math_matrix_analyse( &ctx->ModelView );
+   if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY)
+      _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
 
-   _mesa_transform_vector( equation, equation, ctx->ModelView.inv );
+   _mesa_transform_vector( equation, equation,
+                           ctx->ModelviewMatrixStack.Top->inv );
 
    if (TEST_EQ_4V(ctx->Transform.EyeUserPlane[p], equation))
       return;
@@ -90,12 +91,12 @@ _mesa_ClipPlane( GLenum plane, const GLdouble *eq )
     * code in _mesa_update_state().
     */
    if (ctx->Transform.ClipEnabled[p]) {
-      if (ctx->ProjectionMatrix.flags & MAT_DIRTY)
-        _math_matrix_analyse( &ctx->ProjectionMatrix );
+      if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY)
+        _math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
 
       _mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
                           ctx->Transform.EyeUserPlane[p],
-                          ctx->ProjectionMatrix.inv );
+                          ctx->ProjectionMatrixStack.Top->inv );
    }
 
    if (ctx->Driver.ClipPlane)
index 66ad1fe31e17a891de62bd6e078214d2649da999..37c572226db2970ddb6692f21aaa062d48a0c8fb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: config.h,v 1.36 2001/11/28 17:18:36 brianp Exp $ */
+/* $Id: config.h,v 1.37 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
 /* Maximum color matrix stack depth: */
 #define MAX_COLOR_STACK_DEPTH 4
 
+/* Vertex program matrix stacks: */
+#define MAX_PROGRAM_MATRICES 8
+#define MAX_PROGRAM_STACK_DEPTH 4
+
 /* Maximum attribute stack depth: */
 #define MAX_ATTRIB_STACK_DEPTH 16
 
index 686d5535137db71ebe6afac47543183b5773a3ca..cb5674c0a7ff06af0d96a1dfd96f162efe5b9346 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.151 2001/12/17 22:41:45 brianp Exp $ */
+/* $Id: context.c,v 1.152 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -52,6 +52,7 @@
 #include "texobj.h"
 #include "mtypes.h"
 #include "varray.h"
+#include "vpstate.h"
 #include "vtxfmt.h"
 #include "math/m_translate.h"
 #include "math/m_vertices.h"
@@ -487,15 +488,13 @@ init_matrix_stack( struct matrix_stack *stack,
    stack->Depth = 0;
    stack->MaxDepth = maxDepth;
    stack->DirtyFlag = dirtyFlag;
-   /* Top matrix */
-   _math_matrix_ctr( &stack->Top );
-   _math_matrix_alloc_inv( &stack->Top );
    /* The stack */
-   stack->Stack = MALLOC(maxDepth * sizeof(GLmatrix));
+   stack->Stack = CALLOC(maxDepth * sizeof(GLmatrix));
    for (i = 0; i < maxDepth; i++) {
       _math_matrix_ctr(&stack->Stack[i]);
       _math_matrix_alloc_inv(&stack->Stack[i]);
    }
+   stack->Top = stack->Stack;
 }
 
 
@@ -503,10 +502,10 @@ static void
 free_matrix_stack( struct matrix_stack *stack )
 {
    GLuint i;
-   _math_matrix_dtr( &stack->Top );
    for (i = 0; i < stack->MaxDepth; i++) {
       _math_matrix_dtr(&stack->Stack[i]);
    }
+   stack->Stack = stack->Top = NULL;
 }
 
 
@@ -527,6 +526,7 @@ alloc_shared_state( void )
 
    ss->DisplayList = _mesa_NewHashTable();
    ss->TexObjects = _mesa_NewHashTable();
+   ss->VertexPrograms = _mesa_NewHashTable();
 
    /* Default Texture objects */
    outOfMemory = GL_FALSE;
@@ -551,12 +551,15 @@ alloc_shared_state( void )
       outOfMemory = GL_TRUE;
    }
 
-   if (!ss->DisplayList || !ss->TexObjects || outOfMemory) {
+   if (!ss->DisplayList || !ss->TexObjects || !ss->VertexPrograms
+       || outOfMemory) {
       /* Ran out of memory at some point.  Free everything and return NULL */
       if (ss->DisplayList)
          _mesa_DeleteHashTable(ss->DisplayList);
       if (ss->TexObjects)
          _mesa_DeleteHashTable(ss->TexObjects);
+      if (ss->VertexPrograms)
+         _mesa_DeleteHashTable(ss->VertexPrograms);
       if (ss->Default1D)
          _mesa_free_texture_object(ss, ss->Default1D);
       if (ss->Default2D)
@@ -601,6 +604,18 @@ free_shared_state( GLcontext *ctx, struct gl_shared_state *ss )
    }
    _mesa_DeleteHashTable(ss->TexObjects);
 
+   /* Free vertex programs */
+   while (1) {
+      GLuint prog = _mesa_HashFirstEntry(ss->VertexPrograms);
+      if (prog) {
+         _mesa_delete_program(ctx, prog);
+      }
+      else {
+         break;
+      }
+   }
+   _mesa_DeleteHashTable(ss->VertexPrograms);
+
    FREE(ss);
 }
 
@@ -757,7 +772,7 @@ init_2d_map( struct gl_2d_map *map, int n, const float *initial )
 static void
 init_attrib_groups( GLcontext *ctx )
 {
-   GLuint i, j;
+   GLuint i;
 
    assert(ctx);
 
@@ -791,49 +806,24 @@ init_attrib_groups( GLcontext *ctx )
    ctx->Const.MaxClipPlanes = MAX_CLIP_PLANES;
    ctx->Const.MaxLights = MAX_LIGHTS;
 
-   /* Modelview matrix */
-   _math_matrix_ctr( &ctx->ModelView );
-   _math_matrix_alloc_inv( &ctx->ModelView );
-
-   ctx->ModelViewStackDepth = 0;
-   for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
-      _math_matrix_ctr( &ctx->ModelViewStack[i] );
-      _math_matrix_alloc_inv( &ctx->ModelViewStack[i] );
-   }
-#if 0
-   init_matrix_stack(&ctx->ModelviewStack, 32, _NEW_MODELVIEW);
-#endif
-
-   /* Projection matrix - need inv for user clipping in clip space*/
-   _math_matrix_ctr( &ctx->ProjectionMatrix );
-   _math_matrix_alloc_inv( &ctx->ProjectionMatrix );
-
-   ctx->ProjectionStackDepth = 0;
-   for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
-      _math_matrix_ctr( &ctx->ProjectionStack[i] );
-      _math_matrix_alloc_inv( &ctx->ProjectionStack[i] );
-   }
-
-   /* Derived ModelProject matrix */
+   /* Initialize matrix stacks */
+   init_matrix_stack(&ctx->ModelviewMatrixStack, MAX_MODELVIEW_STACK_DEPTH,
+                     _NEW_MODELVIEW);
+   init_matrix_stack(&ctx->ProjectionMatrixStack, MAX_PROJECTION_STACK_DEPTH,
+                     _NEW_PROJECTION);
+   init_matrix_stack(&ctx->ColorMatrixStack, MAX_COLOR_STACK_DEPTH,
+                     _NEW_COLOR_MATRIX);
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++)
+      init_matrix_stack(&ctx->TextureMatrixStack[i], MAX_TEXTURE_STACK_DEPTH,
+                        _NEW_TEXTURE_MATRIX);
+   for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
+      init_matrix_stack(&ctx->ProgramMatrixStack[i], MAX_PROGRAM_STACK_DEPTH,
+                        _NEW_TRACK_MATRIX);
+   ctx->CurrentStack = &ctx->ModelviewMatrixStack;
+
+   /* Init combined Modelview*Projection matrix */
    _math_matrix_ctr( &ctx->_ModelProjectMatrix );
 
-   /* Texture matrix */
-   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
-      _math_matrix_ctr( &ctx->TextureMatrix[i] );
-      ctx->TextureStackDepth[i] = 0;
-      for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
-         _math_matrix_ctr( &ctx->TextureStack[i][j] );
-         ctx->TextureStack[i][j].inv = 0;
-      }
-   }
-
-   /* Color matrix */
-   _math_matrix_ctr(&ctx->ColorMatrix);
-   ctx->ColorStackDepth = 0;
-   for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
-      _math_matrix_ctr(&ctx->ColorStack[j]);
-   }
-
    /* Accumulate buffer group */
    ASSIGN_4V( ctx->Accum.ClearColor, 0.0, 0.0, 0.0, 0.0 );
 
@@ -1319,8 +1309,8 @@ init_attrib_groups( GLcontext *ctx )
    _mesa_init_colortable(&ctx->ProxyPostColorMatrixColorTable);
 
    /* GL_NV_vertex_program */
-   ctx->VertexProgram.Binding = 0;
-   ctx->VertexProgram.HashTable = _mesa_NewHashTable();
+   ctx->VertexProgram.Current = NULL;
+   ctx->VertexProgram.CurrentID = 0;
    ctx->VertexProgram.Enabled = GL_FALSE;
    ctx->VertexProgram.PointSizeEnabled = GL_FALSE;
    ctx->VertexProgram.TwoSideEnabled = GL_FALSE;
@@ -1643,39 +1633,34 @@ void
 _mesa_free_context_data( GLcontext *ctx )
 {
    struct gl_shine_tab *s, *tmps;
-   GLuint i, j;
+   GLuint i;
 
    /* if we're destroying the current context, unbind it first */
    if (ctx == _mesa_get_current_context()) {
       _mesa_make_current(NULL, NULL);
    }
 
-#if 0
-   free_matrix_stack(&ctx->ModelviewStack);
-#endif
-
-   _math_matrix_dtr( &ctx->ModelView );
-   for (i = 0; i < MAX_MODELVIEW_STACK_DEPTH - 1; i++) {
-      _math_matrix_dtr( &ctx->ModelViewStack[i] );
-   }
-   _math_matrix_dtr( &ctx->ProjectionMatrix );
-   for (i = 0; i < MAX_PROJECTION_STACK_DEPTH - 1; i++) {
-      _math_matrix_dtr( &ctx->ProjectionStack[i] );
-   }
-   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
-      _math_matrix_dtr( &ctx->TextureMatrix[i] );
-      for (j = 0; j < MAX_TEXTURE_STACK_DEPTH - 1; j++) {
-         _math_matrix_dtr( &ctx->TextureStack[i][j] );
-      }
-   }
-
+   /*
+    * Free transformation matrix stacks
+    */
+   free_matrix_stack(&ctx->ModelviewMatrixStack);
+   free_matrix_stack(&ctx->ProjectionMatrixStack);
+   free_matrix_stack(&ctx->ColorMatrixStack);
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++)
+      free_matrix_stack(&ctx->TextureMatrixStack[i]);
+   for (i = 0; i < MAX_PROGRAM_MATRICES; i++)
+      free_matrix_stack(&ctx->ProgramMatrixStack[i]);
+   /* combined Modelview*Projection matrix */
    _math_matrix_dtr( &ctx->_ModelProjectMatrix );
 
-   _math_matrix_dtr(&ctx->ColorMatrix);
-   for (j = 0; j < MAX_COLOR_STACK_DEPTH - 1; j++) {
-      _math_matrix_dtr(&ctx->ColorStack[j]);
+
+   if (ctx->VertexProgram.Current) {
+      ctx->VertexProgram.Current->RefCount--;
+      if (ctx->VertexProgram.Current->RefCount <= 0)
+         _mesa_delete_program(ctx, ctx->VertexProgram.CurrentID);
    }
 
+   /* Shared context state (display lists, textures, etc) */
    _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
    ctx->Shared->RefCount--;
    assert(ctx->Shared->RefCount >= 0);
@@ -1685,6 +1670,7 @@ _mesa_free_context_data( GLcontext *ctx )
       free_shared_state( ctx, ctx->Shared );
    }
 
+   /* Free lighting shininess exponentiation table */
    foreach_s( s, tmps, ctx->_ShineTabList ) {
       FREE( s );
    }
@@ -1744,9 +1730,6 @@ _mesa_free_context_data( GLcontext *ctx )
 
    _mesa_extensions_dtr(ctx);
 
-   /* GL_NV_vertex_program */
-   _mesa_DeleteHashTable(ctx->VertexProgram.HashTable);
-
    FREE(ctx->Exec);
    FREE(ctx->Save);
 }
index 43323b13bdd6b48351c3718444e1820724c32091..24617f4953a9a1ed7dcb0602114f88b7030e7059 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: dlist.c,v 1.82 2001/12/14 03:13:04 brianp Exp $ */
+/* $Id: dlist.c,v 1.83 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -5999,6 +5999,10 @@ _mesa_init_dlist_table( struct _glapi_table *table, GLuint tableSize )
 
    /* 233. GL_NV_vertex_program */
    /* XXX Need to implement vertex program in display lists !!! */
+   /* The following commands DO NOT go into display lists:
+    * AreProgramsResidentNV, IsProgramNV, GenProgramsNV, DeleteProgramsNV,
+    * VertexAttribPointerNV
+    */
    table->BindProgramNV = _mesa_BindProgramNV;
    table->DeleteProgramsNV = _mesa_DeleteProgramsNV;
    table->ExecuteProgramNV = _mesa_ExecuteProgramNV;
index 758426d0e4befb1702fed4c57d9b0fbfad37970b..6f0b1bde00e26e48f495bc8a96f479e62cdbd8aa 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: enable.c,v 1.51 2001/12/14 02:50:01 brianp Exp $ */
+/* $Id: enable.c,v 1.52 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -207,7 +207,7 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
       case GL_CLIP_PLANE4:
       case GL_CLIP_PLANE5:
          {
-            GLuint p = cap-GL_CLIP_PLANE0;
+            GLuint p = cap - GL_CLIP_PLANE0;
 
             if (ctx->Transform.ClipEnabled[p] == state)
                return;
@@ -218,8 +218,8 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
             if (state) {
                ctx->Transform._AnyClip++;
 
-               if (ctx->ProjectionMatrix.flags & MAT_DIRTY) {
-                  _math_matrix_analyse( &ctx->ProjectionMatrix );
+               if (ctx->ProjectionMatrixStack.Top->flags & MAT_DIRTY) {
+                  _math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
                }
 
                /* This derived state also calculated in clip.c and
@@ -228,7 +228,7 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
                 */
                _mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
                                     ctx->Transform.EyeUserPlane[p],
-                                    ctx->ProjectionMatrix.inv );
+                                    ctx->ProjectionMatrixStack.Top->inv );
             }
          }
          break;
index a6a4d12d4c85951046e2c38b0e124b2361e26c94..efbed8ccb1f96ea0b15932c2bc5172b66fc4616d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: get.c,v 1.74 2001/12/14 02:55:08 brianp Exp $ */
+/* $Id: get.c,v 1.75 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -616,11 +616,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
         break;
       case GL_MODELVIEW_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = FLOAT_TO_BOOL(ctx->ModelView.m[i]);
+           params[i] = FLOAT_TO_BOOL(ctx->ModelviewMatrixStack.Top->m[i]);
         }
         break;
       case GL_MODELVIEW_STACK_DEPTH:
-        *params = INT_TO_BOOL(ctx->ModelViewStackDepth + 1);
+         *params = INT_TO_BOOL(ctx->ModelviewMatrixStack.Depth + 1);
         break;
       case GL_NAME_STACK_DEPTH:
         *params = INT_TO_BOOL(ctx->Select.NameStackDepth);
@@ -743,11 +743,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
         break;
       case GL_PROJECTION_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = FLOAT_TO_BOOL(ctx->ProjectionMatrix.m[i]);
+           params[i] = FLOAT_TO_BOOL(ctx->ProjectionMatrixStack.Top->m[i]);
         }
         break;
       case GL_PROJECTION_STACK_DEPTH:
-        *params = INT_TO_BOOL(ctx->ProjectionStackDepth + 1);
+        *params = INT_TO_BOOL(ctx->ProjectionMatrixStack.Depth + 1);
         break;
       case GL_READ_BUFFER:
         *params = ENUM_TO_BOOL(ctx->Pixel.ReadBuffer);
@@ -868,11 +868,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
       case GL_TEXTURE_MATRIX:
         for (i=0;i<16;i++) {
            params[i] =
-              FLOAT_TO_BOOL(ctx->TextureMatrix[texUnit].m[i]);
+              FLOAT_TO_BOOL(ctx->TextureMatrixStack[texUnit].Top->m[i]);
         }
         break;
       case GL_TEXTURE_STACK_DEPTH:
-        *params = INT_TO_BOOL(ctx->TextureStackDepth[texUnit] + 1);
+        *params = INT_TO_BOOL(ctx->TextureMatrixStack[texUnit].Depth + 1);
         break;
       case GL_UNPACK_ALIGNMENT:
         *params = INT_TO_BOOL(ctx->Unpack.Alignment);
@@ -1042,7 +1042,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ColorMatrix.m);
+            _math_transposef(tm, ctx->ColorMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = FLOAT_TO_BOOL(tm[i]);
             }
@@ -1052,7 +1052,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ModelView.m);
+            _math_transposef(tm, ctx->ModelviewMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = FLOAT_TO_BOOL(tm[i]);
             }
@@ -1062,7 +1062,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ProjectionMatrix.m);
+            _math_transposef(tm, ctx->ProjectionMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = FLOAT_TO_BOOL(tm[i]);
             }
@@ -1072,7 +1072,7 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->TextureMatrix[texUnit].m);
+            _math_transposef(tm, ctx->TextureMatrixStack[texUnit].Top->m);
             for (i=0;i<16;i++) {
                params[i] = FLOAT_TO_BOOL(tm[i]);
             }
@@ -1111,11 +1111,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
       /* GL_SGI_color_matrix (also in 1.2 imaging) */
       case GL_COLOR_MATRIX_SGI:
          for (i=0;i<16;i++) {
-           params[i] = FLOAT_TO_BOOL(ctx->ColorMatrix.m[i]);
+           params[i] = FLOAT_TO_BOOL(ctx->ColorMatrixStack.Top->m[i]);
         }
         break;
       case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
-         *params = INT_TO_BOOL(ctx->ColorStackDepth + 1);
+         *params = INT_TO_BOOL(ctx->ColorMatrixStack.Depth + 1);
          break;
       case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
          *params = FLOAT_TO_BOOL(MAX_COLOR_STACK_DEPTH);
@@ -1334,11 +1334,11 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
       /* GL_NV_vertex_program */
       case GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV:
          CHECK_EXTENSION_B(NV_vertex_program);
-         *params = VP_MAX_MATRIX_DEPTH;
+         *params = MAX_PROGRAM_STACK_DEPTH;
          break;
       case GL_MAX_TRACK_MATRICES_NV:
          CHECK_EXTENSION_B(NV_vertex_program);
-         *params = VP_MAX_MATRICES;
+         *params = MAX_PROGRAM_MATRICES;
          break;
       case GL_VERTEX_PROGRAM_NV:
          CHECK_EXTENSION_B(NV_vertex_program);
@@ -1942,11 +1942,11 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          break;
       case GL_MODELVIEW_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = (GLdouble) ctx->ModelView.m[i];
+           params[i] = (GLdouble) ctx->ModelviewMatrixStack.Top->m[i];
         }
         break;
       case GL_MODELVIEW_STACK_DEPTH:
-        *params = (GLdouble) (ctx->ModelViewStackDepth + 1);
+        *params = (GLdouble) (ctx->ModelviewMatrixStack.Depth + 1);
         break;
       case GL_NAME_STACK_DEPTH:
         *params = (GLdouble) ctx->Select.NameStackDepth;
@@ -2069,11 +2069,11 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
         break;
       case GL_PROJECTION_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = (GLdouble) ctx->ProjectionMatrix.m[i];
+           params[i] = (GLdouble) ctx->ProjectionMatrixStack.Top->m[i];
         }
         break;
       case GL_PROJECTION_STACK_DEPTH:
-        *params = (GLdouble) (ctx->ProjectionStackDepth + 1);
+        *params = (GLdouble) (ctx->ProjectionMatrixStack.Depth + 1);
         break;
       case GL_READ_BUFFER:
         *params = ENUM_TO_DOUBLE(ctx->Pixel.ReadBuffer);
@@ -2191,11 +2191,11 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
         break;
       case GL_TEXTURE_MATRIX:
          for (i=0;i<16;i++) {
-           params[i] = (GLdouble) ctx->TextureMatrix[texUnit].m[i];
+           params[i] = (GLdouble) ctx->TextureMatrixStack[texUnit].Top->m[i];
         }
         break;
       case GL_TEXTURE_STACK_DEPTH:
-        *params = (GLdouble) (ctx->TextureStackDepth[texUnit] + 1);
+        *params = (GLdouble) (ctx->TextureMatrixStack[texUnit].Depth + 1);
         break;
       case GL_UNPACK_ALIGNMENT:
         *params = (GLdouble) ctx->Unpack.Alignment;
@@ -2368,7 +2368,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ColorMatrix.m);
+            _math_transposef(tm, ctx->ColorMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLdouble) tm[i];
             }
@@ -2378,7 +2378,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ModelView.m);
+            _math_transposef(tm, ctx->ModelviewMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLdouble) tm[i];
             }
@@ -2388,7 +2388,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ProjectionMatrix.m);
+            _math_transposef(tm, ctx->ProjectionMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLdouble) tm[i];
             }
@@ -2398,7 +2398,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->TextureMatrix[texUnit].m);
+            _math_transposef(tm, ctx->TextureMatrixStack[texUnit].Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLdouble) tm[i];
             }
@@ -2437,11 +2437,11 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
       /* GL_SGI_color_matrix (also in 1.2 imaging) */
       case GL_COLOR_MATRIX_SGI:
          for (i=0;i<16;i++) {
-           params[i] = (GLdouble) ctx->ColorMatrix.m[i];
+           params[i] = (GLdouble) ctx->ColorMatrixStack.Top->m[i];
         }
         break;
       case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
-         *params = (GLdouble) (ctx->ColorStackDepth + 1);
+         *params = (GLdouble) (ctx->ColorMatrixStack.Depth + 1);
          break;
       case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
          *params = (GLdouble) MAX_COLOR_STACK_DEPTH;
@@ -2658,7 +2658,7 @@ _mesa_GetDoublev( GLenum pname, GLdouble *params )
          break;
 
       /* GL_NV_vertex_program */
-         /* to do */
+         /* XXX to do */
 
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetDoublev" );
@@ -3178,11 +3178,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_MODELVIEW_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = ctx->ModelView.m[i];
+           params[i] = ctx->ModelviewMatrixStack.Top->m[i];
         }
         break;
       case GL_MODELVIEW_STACK_DEPTH:
-        *params = (GLfloat) (ctx->ModelViewStackDepth + 1);
+        *params = (GLfloat) (ctx->ModelviewMatrixStack.Depth + 1);
         break;
       case GL_NAME_STACK_DEPTH:
         *params = (GLfloat) ctx->Select.NameStackDepth;
@@ -3307,11 +3307,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
         break;
       case GL_PROJECTION_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = ctx->ProjectionMatrix.m[i];
+           params[i] = ctx->ProjectionMatrixStack.Top->m[i];
         }
         break;
       case GL_PROJECTION_STACK_DEPTH:
-        *params = (GLfloat) (ctx->ProjectionStackDepth + 1);
+        *params = (GLfloat) (ctx->ProjectionMatrixStack.Depth + 1);
         break;
       case GL_READ_BUFFER:
         *params = ENUM_TO_FLOAT(ctx->Pixel.ReadBuffer);
@@ -3429,11 +3429,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
         break;
       case GL_TEXTURE_MATRIX:
          for (i=0;i<16;i++) {
-           params[i] = ctx->TextureMatrix[texUnit].m[i];
+           params[i] = ctx->TextureMatrixStack[texUnit].Top->m[i];
         }
         break;
       case GL_TEXTURE_STACK_DEPTH:
-        *params = (GLfloat) (ctx->TextureStackDepth[texUnit] + 1);
+        *params = (GLfloat) (ctx->TextureMatrixStack[texUnit].Depth + 1);
         break;
       case GL_UNPACK_ALIGNMENT:
         *params = (GLfloat) ctx->Unpack.Alignment;
@@ -3605,16 +3605,16 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
 
       /* GL_ARB_transpose_matrix */
       case GL_TRANSPOSE_COLOR_MATRIX_ARB:
-         _math_transposef(params, ctx->ColorMatrix.m);
+         _math_transposef(params, ctx->ColorMatrixStack.Top->m);
          break;
       case GL_TRANSPOSE_MODELVIEW_MATRIX_ARB:
-         _math_transposef(params, ctx->ModelView.m);
+         _math_transposef(params, ctx->ModelviewMatrixStack.Top->m);
          break;
       case GL_TRANSPOSE_PROJECTION_MATRIX_ARB:
-         _math_transposef(params, ctx->ProjectionMatrix.m);
+         _math_transposef(params, ctx->ProjectionMatrixStack.Top->m);
          break;
       case GL_TRANSPOSE_TEXTURE_MATRIX_ARB:
-         _math_transposef(params, ctx->TextureMatrix[texUnit].m);
+         _math_transposef(params, ctx->TextureMatrixStack[texUnit].Top->m);
          break;
 
       /* GL_HP_occlusion_test */
@@ -3649,11 +3649,11 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
       /* GL_SGI_color_matrix (also in 1.2 imaging) */
       case GL_COLOR_MATRIX_SGI:
          for (i=0;i<16;i++) {
-           params[i] = ctx->ColorMatrix.m[i];
+           params[i] = ctx->ColorMatrixStack.Top->m[i];
         }
         break;
       case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
-         *params = (GLfloat) (ctx->ColorStackDepth + 1);
+         *params = (GLfloat) (ctx->ColorMatrixStack.Depth + 1);
          break;
       case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
          *params = (GLfloat) MAX_COLOR_STACK_DEPTH;
@@ -3870,7 +3870,7 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
 
       /* GL_NV_vertex_program */
-         /* to do */
+         /* XXX to do */
 
       default:
          GET_FLOAT_ERROR;
@@ -4385,11 +4385,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_MODELVIEW_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = (GLint) ctx->ModelView.m[i];
+           params[i] = (GLint) ctx->ModelviewMatrixStack.Top->m[i];
         }
         break;
       case GL_MODELVIEW_STACK_DEPTH:
-        *params = (GLint) (ctx->ModelViewStackDepth + 1);
+        *params = (GLint) (ctx->ModelviewMatrixStack.Depth + 1);
         break;
       case GL_NAME_STACK_DEPTH:
         *params = (GLint) ctx->Select.NameStackDepth;
@@ -4512,11 +4512,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
         break;
       case GL_PROJECTION_MATRIX:
         for (i=0;i<16;i++) {
-           params[i] = (GLint) ctx->ProjectionMatrix.m[i];
+           params[i] = (GLint) ctx->ProjectionMatrixStack.Top->m[i];
         }
         break;
       case GL_PROJECTION_STACK_DEPTH:
-        *params = (GLint) (ctx->ProjectionStackDepth + 1);
+        *params = (GLint) (ctx->ProjectionMatrixStack.Depth + 1);
         break;
       case GL_READ_BUFFER:
         *params = (GLint) ctx->Pixel.ReadBuffer;
@@ -4634,11 +4634,11 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
         break;
       case GL_TEXTURE_MATRIX:
          for (i=0;i<16;i++) {
-           params[i] = (GLint) ctx->TextureMatrix[texUnit].m[i];
+           params[i] = (GLint) ctx->TextureMatrixStack[texUnit].Top->m[i];
         }
         break;
       case GL_TEXTURE_STACK_DEPTH:
-        *params = (GLint) (ctx->TextureStackDepth[texUnit] + 1);
+        *params = (GLint) (ctx->TextureMatrixStack[texUnit].Depth + 1);
         break;
       case GL_UNPACK_ALIGNMENT:
         *params = ctx->Unpack.Alignment;
@@ -4813,7 +4813,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ColorMatrix.m);
+            _math_transposef(tm, ctx->ColorMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLint) tm[i];
             }
@@ -4823,7 +4823,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ModelView.m);
+            _math_transposef(tm, ctx->ModelviewMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLint) tm[i];
             }
@@ -4833,7 +4833,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->ProjectionMatrix.m);
+            _math_transposef(tm, ctx->ProjectionMatrixStack.Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLint) tm[i];
             }
@@ -4843,7 +4843,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          {
             GLfloat tm[16];
             GLuint i;
-            _math_transposef(tm, ctx->TextureMatrix[texUnit].m);
+            _math_transposef(tm, ctx->TextureMatrixStack[texUnit].Top->m);
             for (i=0;i<16;i++) {
                params[i] = (GLint) tm[i];
             }
@@ -4886,12 +4886,12 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
       case GL_COLOR_MATRIX_SGI:
          CHECK_EXTENSION_I(SGI_color_matrix);
          for (i=0;i<16;i++) {
-           params[i] = (GLint) ctx->ColorMatrix.m[i];
+           params[i] = (GLint) ctx->ColorMatrixStack.Top->m[i];
         }
         break;
       case GL_COLOR_MATRIX_STACK_DEPTH_SGI:
          CHECK_EXTENSION_I(SGI_color_matrix);
-         *params = ctx->ColorStackDepth + 1;
+         *params = ctx->ColorMatrixStack.Depth + 1;
          break;
       case GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI:
          CHECK_EXTENSION_I(SGI_color_matrix);
@@ -5121,7 +5121,7 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
 
       /* GL_NV_vertex_program */
-         /* to do */
+         /* XXX to do */
 
       default:
          _mesa_error( ctx, GL_INVALID_ENUM, "glGetIntegerv" );
index c5f741567da85c58f082b13c940ae7ff46ba5796..9286642d3ad327d19b0cbd6f10c8e25dd5d57fc9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: light.c,v 1.47 2001/12/14 02:50:02 brianp Exp $ */
+/* $Id: light.c,v 1.48 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -117,7 +117,7 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params )
    case GL_POSITION: {
       GLfloat tmp[4];
       /* transform position by ModelView matrix */
-      TRANSFORM_POINT( tmp, ctx->ModelView.m, params );
+      TRANSFORM_POINT( tmp, ctx->ModelviewMatrixStack.Top->m, params );
       if (TEST_EQ_4V(l->EyePosition, tmp))
         return;
       FLUSH_VERTICES(ctx, _NEW_LIGHT);
@@ -131,10 +131,10 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params )
    case GL_SPOT_DIRECTION: {
       GLfloat tmp[4];
       /* transform direction by inverse modelview */
-      if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) {
-        _math_matrix_analyse( &ctx->ModelView );
+      if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
+        _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
       }
-      TRANSFORM_NORMAL( tmp, params, ctx->ModelView.inv );
+      TRANSFORM_NORMAL( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
       if (TEST_EQ_3V(l->EyeDirection, tmp))
         return;
       FLUSH_VERTICES(ctx, _NEW_LIGHT);
@@ -1254,7 +1254,7 @@ _mesa_compute_light_positions( GLcontext *ctx )
       COPY_3V( ctx->_EyeZDir, eye_z );
    }
    else {
-      TRANSFORM_NORMAL( ctx->_EyeZDir, eye_z, ctx->ModelView.m );
+      TRANSFORM_NORMAL( ctx->_EyeZDir, eye_z, ctx->ModelviewMatrixStack.Top->m );
    }
 
    foreach (light, &ctx->Light.EnabledList) {
@@ -1263,7 +1263,7 @@ _mesa_compute_light_positions( GLcontext *ctx )
         COPY_4FV( light->_Position, light->EyePosition );
       }
       else {
-        TRANSFORM_POINT( light->_Position, ctx->ModelView.inv,
+        TRANSFORM_POINT( light->_Position, ctx->ModelviewMatrixStack.Top->inv,
                          light->EyePosition );
       }
 
@@ -1287,7 +1287,7 @@ _mesa_compute_light_positions( GLcontext *ctx )
          else {
            TRANSFORM_NORMAL( light->_NormDirection,
                              light->EyeDirection,
-                             ctx->ModelView.m);
+                             ctx->ModelviewMatrixStack.Top->m);
         }
 
         NORMALIZE_3FV( light->_NormDirection );
index 763669e0c66603fe528f126d88160bae9655594a..6dbb4144fd9b3adaf95ed796a173c505b671809a 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: matrix.c,v 1.37 2001/12/14 02:50:02 brianp Exp $ */
+/* $Id: matrix.c,v 1.38 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.1
  *
  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
  *
 #endif
 
 
-/**********************************************************************/
-/*                        API functions                               */
-/**********************************************************************/
-
-
-#define GET_ACTIVE_MATRIX(mat, where)                                  \
-do {                                                                   \
-   GLint n;                                                            \
-   if (MESA_VERBOSE&VERBOSE_API) fprintf(stderr, "%s\n", where);       \
-   switch (ctx->Transform.MatrixMode) {                                        \
-      case GL_MODELVIEW:                                               \
-        mat = &ctx->ModelView;                                         \
-        ctx->NewState |= _NEW_MODELVIEW;                               \
-        break;                                                         \
-      case GL_PROJECTION:                                              \
-        mat = &ctx->ProjectionMatrix;                                  \
-        ctx->NewState |= _NEW_PROJECTION;                              \
-        break;                                                         \
-      case GL_TEXTURE:                                                 \
-        mat = &ctx->TextureMatrix[ctx->Texture.CurrentUnit];           \
-        ctx->NewState |= _NEW_TEXTURE_MATRIX;                          \
-        break;                                                         \
-      case GL_COLOR:                                                   \
-        mat = &ctx->ColorMatrix;                                       \
-        ctx->NewState |= _NEW_COLOR_MATRIX;                            \
-        break;                                                         \
-      case GL_MATRIX0_NV:                                              \
-      case GL_MATRIX1_NV:                                              \
-      case GL_MATRIX2_NV:                                              \
-      case GL_MATRIX3_NV:                                              \
-      case GL_MATRIX4_NV:                                              \
-      case GL_MATRIX5_NV:                                              \
-      case GL_MATRIX6_NV:                                              \
-      case GL_MATRIX7_NV:                                              \
-        n = ctx->Transform.MatrixMode - GL_MATRIX0_NV;                 \
-        mat = &ctx->VertexProgram.Matrix[n];                           \
-        ctx->NewState |= _NEW_TRACK_MATRIX;                            \
-        break;                                                         \
-      default:                                                         \
-         _mesa_problem(ctx, where);                                    \
-   }                                                                   \
-} while (0)
-
-
 void
 _mesa_Frustum( GLdouble left, GLdouble right,
                GLdouble bottom, GLdouble top,
                GLdouble nearval, GLdouble farval )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
-   GET_ACTIVE_MATRIX(mat, "glFrustrum");
-
    if (nearval <= 0.0 ||
        farval <= 0.0 ||
        nearval == farval ||
@@ -117,9 +70,11 @@ _mesa_Frustum( GLdouble left, GLdouble right,
       return;
    }
 
-   _math_matrix_frustum( mat, (GLfloat) left, (GLfloat) right, 
+   _math_matrix_frustum( ctx->CurrentStack->Top,
+                         (GLfloat) left, (GLfloat) right, 
                         (GLfloat) bottom, (GLfloat) top, 
                         (GLfloat) nearval, (GLfloat) farval );
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
@@ -129,11 +84,8 @@ _mesa_Ortho( GLdouble left, GLdouble right,
              GLdouble nearval, GLdouble farval )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
-   GET_ACTIVE_MATRIX(mat, "glOrtho");
-
    if (left == right ||
        bottom == top ||
        nearval == farval)
@@ -142,9 +94,11 @@ _mesa_Ortho( GLdouble left, GLdouble right,
       return;
    }
 
-   _math_matrix_ortho( mat, (GLfloat) left, (GLfloat) right, 
+   _math_matrix_ortho( ctx->CurrentStack->Top,
+                       (GLfloat) left, (GLfloat) right, 
                       (GLfloat) bottom, (GLfloat) top, 
                       (GLfloat) nearval, (GLfloat) farval );
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
@@ -154,32 +108,43 @@ _mesa_MatrixMode( GLenum mode )
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
+   if (ctx->Transform.MatrixMode == mode)
+      return;
+   FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
+
    switch (mode) {
-      case GL_MATRIX0_NV:
-      case GL_MATRIX1_NV:
-      case GL_MATRIX2_NV:
-      case GL_MATRIX3_NV:
-      case GL_MATRIX4_NV:
-      case GL_MATRIX5_NV:
-      case GL_MATRIX6_NV:
-      case GL_MATRIX7_NV:
-         if (!ctx->Extensions.NV_vertex_program) {
-            _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode" );
-            return;
-         }
-         /* FALL-THROUGH */
-      case GL_MODELVIEW:
-      case GL_PROJECTION:
-      case GL_TEXTURE:
-      case GL_COLOR:
-        if (ctx->Transform.MatrixMode == mode)
-           return;
-         ctx->Transform.MatrixMode = mode;
-        FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
-         break;
-      default:
+   case GL_MODELVIEW:
+      ctx->CurrentStack = &ctx->ModelviewMatrixStack;
+      break;
+   case GL_PROJECTION:
+      ctx->CurrentStack = &ctx->ProjectionMatrixStack;
+      break;
+   case GL_TEXTURE:
+      ctx->CurrentStack = &ctx->TextureMatrixStack[ctx->Texture.CurrentUnit];
+      break;
+   case GL_COLOR:
+      ctx->CurrentStack = &ctx->ColorMatrixStack;
+      break;
+   case GL_MATRIX0_NV:
+   case GL_MATRIX1_NV:
+   case GL_MATRIX2_NV:
+   case GL_MATRIX3_NV:
+   case GL_MATRIX4_NV:
+   case GL_MATRIX5_NV:
+   case GL_MATRIX6_NV:
+   case GL_MATRIX7_NV:
+      if (!ctx->Extensions.NV_vertex_program) {
          _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode" );
+         return;
+      }
+      ctx->CurrentStack = &ctx->ProgramMatrixStack[mode - GL_MATRIX0_NV];
+      break;
+   default:
+      _mesa_error( ctx,  GL_INVALID_ENUM, "glMatrixMode" );
+      return;
    }
+
+   ctx->Transform.MatrixMode = mode;
 }
 
 
@@ -188,51 +153,22 @@ void
 _mesa_PushMatrix( void )
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct matrix_stack *stack = ctx->CurrentStack;
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
       fprintf(stderr, "glPushMatrix %s\n",
              _mesa_lookup_enum_by_nr(ctx->Transform.MatrixMode));
 
-   switch (ctx->Transform.MatrixMode) {
-      case GL_MODELVIEW:
-         if (ctx->ModelViewStackDepth >= MAX_MODELVIEW_STACK_DEPTH - 1) {
-            _mesa_error( ctx,  GL_STACK_OVERFLOW, "glPushMatrix");
-            return;
-         }
-         _math_matrix_copy( &ctx->ModelViewStack[ctx->ModelViewStackDepth++],
-                      &ctx->ModelView );
-         break;
-      case GL_PROJECTION:
-         if (ctx->ProjectionStackDepth >= MAX_PROJECTION_STACK_DEPTH - 1) {
-            _mesa_error( ctx,  GL_STACK_OVERFLOW, "glPushMatrix");
-            return;
-         }
-         _math_matrix_copy( &ctx->ProjectionStack[ctx->ProjectionStackDepth++],
-                      &ctx->ProjectionMatrix );
-         break;
-      case GL_TEXTURE:
-         {
-            GLuint t = ctx->Texture.CurrentUnit;
-            if (ctx->TextureStackDepth[t] >= MAX_TEXTURE_STACK_DEPTH - 1) {
-               _mesa_error( ctx,  GL_STACK_OVERFLOW, "glPushMatrix");
-               return;
-            }
-           _math_matrix_copy( &ctx->TextureStack[t][ctx->TextureStackDepth[t]++],
-                         &ctx->TextureMatrix[t] );
-         }
-         break;
-      case GL_COLOR:
-         if (ctx->ColorStackDepth >= MAX_COLOR_STACK_DEPTH - 1) {
-            _mesa_error( ctx,  GL_STACK_OVERFLOW, "glPushMatrix");
-            return;
-         }
-         _math_matrix_copy( &ctx->ColorStack[ctx->ColorStackDepth++],
-                      &ctx->ColorMatrix );
-         break;
-      default:
-         _mesa_problem(ctx, "Bad matrix mode in _mesa_PushMatrix");
+   if (stack->Depth + 1 >= stack->MaxDepth) {
+      _mesa_error( ctx,  GL_STACK_OVERFLOW, "glPushMatrix" );
+      return;
    }
+   _math_matrix_copy( &stack->Stack[stack->Depth + 1],
+                      &stack->Stack[stack->Depth] );
+   stack->Depth++;
+   stack->Top = &(stack->Stack[stack->Depth]);
+   ctx->NewState |= stack->DirtyFlag;
 }
 
 
@@ -241,56 +177,20 @@ void
 _mesa_PopMatrix( void )
 {
    GET_CURRENT_CONTEXT(ctx);
+   struct matrix_stack *stack = ctx->CurrentStack;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
    if (MESA_VERBOSE&VERBOSE_API)
       fprintf(stderr, "glPopMatrix %s\n",
              _mesa_lookup_enum_by_nr(ctx->Transform.MatrixMode));
 
-   switch (ctx->Transform.MatrixMode) {
-      case GL_MODELVIEW:
-         if (ctx->ModelViewStackDepth==0) {
-            _mesa_error( ctx,  GL_STACK_UNDERFLOW, "glPopMatrix");
-            return;
-         }
-         _math_matrix_copy( &ctx->ModelView,
-                           &ctx->ModelViewStack[--ctx->ModelViewStackDepth] );
-        ctx->NewState |= _NEW_MODELVIEW;
-         break;
-      case GL_PROJECTION:
-         if (ctx->ProjectionStackDepth==0) {
-            _mesa_error( ctx,  GL_STACK_UNDERFLOW, "glPopMatrix");
-            return;
-         }
-
-         _math_matrix_copy( &ctx->ProjectionMatrix,
-                           &ctx->ProjectionStack[--ctx->ProjectionStackDepth] );
-        ctx->NewState |= _NEW_PROJECTION;
-         break;
-      case GL_TEXTURE:
-         {
-            GLuint t = ctx->Texture.CurrentUnit;
-            if (ctx->TextureStackDepth[t]==0) {
-               _mesa_error( ctx,  GL_STACK_UNDERFLOW, "glPopMatrix");
-               return;
-            }
-           _math_matrix_copy(&ctx->TextureMatrix[t],
-                             &ctx->TextureStack[t][--ctx->TextureStackDepth[t]]);
-           ctx->NewState |= _NEW_TEXTURE_MATRIX;
-         }
-         break;
-      case GL_COLOR:
-         if (ctx->ColorStackDepth==0) {
-            _mesa_error( ctx,  GL_STACK_UNDERFLOW, "glPopMatrix");
-            return;
-         }
-         _math_matrix_copy(&ctx->ColorMatrix,
-                          &ctx->ColorStack[--ctx->ColorStackDepth]);
-        ctx->NewState |= _NEW_COLOR_MATRIX;
-         break;
-      default:
-         _mesa_problem(ctx, "Bad matrix mode in _mesa_PopMatrix");
+   if (stack->Depth == 0) {
+      _mesa_error( ctx,  GL_STACK_UNDERFLOW, "glPopMatrix" );
+      return;
    }
+   stack->Depth--;
+   stack->Top = &(stack->Stack[stack->Depth]);
+   ctx->NewState |= stack->DirtyFlag;
 }
 
 
@@ -299,10 +199,9 @@ void
 _mesa_LoadIdentity( void )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-   GET_ACTIVE_MATRIX(mat, "glLoadIdentity");
-   _math_matrix_set_identity( mat );
+   _math_matrix_set_identity( ctx->CurrentStack->Top );
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
@@ -310,10 +209,9 @@ void
 _mesa_LoadMatrixf( const GLfloat *m )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-   GET_ACTIVE_MATRIX(mat, "glLoadMatrix");
-   _math_matrix_loadf( mat, m );
+   _math_matrix_loadf( ctx->CurrentStack->Top, m );
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
@@ -336,10 +234,9 @@ void
 _mesa_MultMatrixf( const GLfloat *m )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-   GET_ACTIVE_MATRIX(mat, "glMultMatrix");
-   _math_matrix_mul_floats( mat, m );
+   _math_matrix_mul_floats( ctx->CurrentStack->Top, m );
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
@@ -368,9 +265,8 @@ _mesa_Rotatef( GLfloat angle, GLfloat x, GLfloat y, GLfloat z )
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
    if (angle != 0.0F) {
-      GLmatrix *mat = 0;
-      GET_ACTIVE_MATRIX(mat, "glRotate");
-      _math_matrix_rotate( mat, angle, x, y, z );
+      _math_matrix_rotate( ctx->CurrentStack->Top, angle, x, y, z);
+      ctx->NewState |= ctx->CurrentStack->DirtyFlag;
    }
 }
 
@@ -388,10 +284,9 @@ void
 _mesa_Scalef( GLfloat x, GLfloat y, GLfloat z )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-   GET_ACTIVE_MATRIX(mat, "glScale");
-   _math_matrix_scale( mat, x, y, z );
+   _math_matrix_scale( ctx->CurrentStack->Top, x, y, z);
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
@@ -409,10 +304,9 @@ void
 _mesa_Translatef( GLfloat x, GLfloat y, GLfloat z )
 {
    GET_CURRENT_CONTEXT(ctx);
-   GLmatrix *mat = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-   GET_ACTIVE_MATRIX(mat, "glTranslate");
-   _math_matrix_translate( mat, x, y, z );
+   _math_matrix_translate( ctx->CurrentStack->Top, x, y, z);
+   ctx->NewState |= ctx->CurrentStack->DirtyFlag;
 }
 
 
index 32820178d4184911d1528888c24f56ce540f6714..f597c1d02fefa7cb4cf3c595ff11ea001c76412b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: mtypes.h,v 1.55 2001/12/14 02:50:02 brianp Exp $ */
+/* $Id: mtypes.h,v 1.56 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1131,8 +1131,6 @@ struct gl_evaluators {
  */
 
 #define VP_MAX_INSTRUCTIONS 128
-#define VP_MAX_MATRICES 8
-#define VP_MAX_MATRIX_DEPTH 4
 
 #define VP_NUM_INPUT_REGS 16
 #define VP_NUM_OUTPUT_REGS 15
@@ -1251,7 +1249,8 @@ struct vp_program
    GLubyte *String;                      /* Original user code */
    struct vp_instruction *Instructions;  /* Compiled instructions */
    GLenum Target;      /* GL_VERTEX_PROGRAM_NV or GL_VERTEX_STATE_PROGRAM_NV */
-   GLint ErrorPos;
+   GLint ErrorPos;            /* Position in string where error was detected */
+   GLint RefCount;            /* Since programs can be shared among contexts */
    GLboolean Resident;
 };
 
@@ -1259,21 +1258,17 @@ struct vp_program
 /*
  * State vars for GL_NV_vertex_program
  */
-struct gl_vertex_program
+struct vertex_program_state
 {
    GLboolean Enabled;                    /* GL_VERTEX_PROGRAM_NV */
    GLboolean PointSizeEnabled;           /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
-   GLboolean TwoSideEnabled;            /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
-   GLuint Binding;                       /* currently bound program */
-   struct _mesa_HashTable *HashTable;    /* all programs */
+   GLboolean TwoSideEnabled;             /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
+   GLuint CurrentID;                     /* currently bound program's ID */
+   struct vp_program *Current;           /* ptr to currently bound program */
    struct vp_machine Machine;            /* machine state */
-   GLmatrix Matrix[VP_MAX_MATRICES];          /* Tracking matrices */
-   GLmatrix MatrixStack[VP_MAX_MATRICES][VP_MAX_MATRIX_DEPTH-1];  /* stacks */
-   GLuint MatrixStackDepth[VP_MAX_MATRICES];
 
    GLenum TrackMatrix[VP_NUM_PROG_REGS / 4];
    GLenum TrackMatrixTransform[VP_NUM_PROG_REGS / 4];
-
 };
 
 
@@ -1294,6 +1289,9 @@ struct gl_shared_state {
    struct gl_texture_object *Default3D;
    struct gl_texture_object *DefaultCubeMap;
 
+   /* GL_NV_vertex_program */
+   struct _mesa_HashTable *VertexPrograms;
+
    void *DriverData;  /* Device driver shared state */
 };
 
@@ -1439,10 +1437,10 @@ struct gl_extensions {
 /* XXX just an idea */
 struct matrix_stack
 {
-   GLmatrix Top;
-   GLmatrix *Stack;
-   GLuint Depth;
-   GLuint MaxDepth;
+   GLmatrix *Top;      /* points into Stack */
+   GLmatrix *Stack;    /* array [MaxDepth] of GLmatrix */
+   GLuint Depth;       /* 0 <= Depth < MaxDepth */
+   GLuint MaxDepth;    /* size of Stack[] array */
    GLuint DirtyFlag;   /* _NEW_MODELVIEW or _NEW_PROJECTION, for example */
 };
 
@@ -1654,32 +1652,17 @@ struct __GLcontextRec {
    /* Core/Driver constants */
    struct gl_constants Const;
 
-   /* Modelview matrix and stack */
-   GLmatrix ModelView;           /* current matrix, not stored on stack */
-   GLuint ModelViewStackDepth;
-   GLmatrix ModelViewStack[MAX_MODELVIEW_STACK_DEPTH - 1];
-#if 1
-   struct matrix_stack ModelviewStack;
-#endif
-
-   /* Projection matrix and stack */
-   GLmatrix ProjectionMatrix;    /* current matrix, not stored on stack */
-   GLuint ProjectionStackDepth;
-   GLmatrix ProjectionStack[MAX_PROJECTION_STACK_DEPTH - 1];
+   /* The various 4x4 matrix stacks */
+   struct matrix_stack ModelviewMatrixStack;
+   struct matrix_stack ProjectionMatrixStack;
+   struct matrix_stack ColorMatrixStack;
+   struct matrix_stack TextureMatrixStack[MAX_TEXTURE_UNITS];
+   struct matrix_stack ProgramMatrixStack[MAX_PROGRAM_MATRICES];
+   struct matrix_stack *CurrentStack; /* Points to one of the above stacks */
 
    /* Combined modelview and projection matrix */
    GLmatrix _ModelProjectMatrix;
 
-   /* Texture matrix and stack */
-   GLmatrix TextureMatrix[MAX_TEXTURE_UNITS];
-   GLuint TextureStackDepth[MAX_TEXTURE_UNITS];
-   GLmatrix TextureStack[MAX_TEXTURE_UNITS][MAX_TEXTURE_STACK_DEPTH - 1];
-
-   /* Color matrix and stack */
-   GLmatrix ColorMatrix;
-   GLuint ColorStackDepth;
-   GLmatrix ColorStack[MAX_COLOR_STACK_DEPTH - 1];
-
    /* Display lists */
    GLuint CallDepth;           /* Current recursion calling depth */
    GLboolean ExecuteFlag;      /* Execute GL commands? */
@@ -1745,7 +1728,7 @@ struct __GLcontextRec {
    struct gl_color_table PostColorMatrixColorTable;
    struct gl_color_table ProxyPostColorMatrixColorTable;
 
-   struct gl_vertex_program VertexProgram;  /* GL_NV_vertex_program */
+   struct vertex_program_state VertexProgram;  /* GL_NV_vertex_program */
 
    GLenum ErrorValue;        /* Last error code */
    GLenum RenderMode;        /* either GL_RENDER, GL_SELECT, GL_FEEDBACK */
@@ -1759,13 +1742,13 @@ struct __GLcontextRec {
    GLuint _NeedEyeCoords;
    GLuint _NeedNormals;    /* Are vertex normal vectors needed? */
 
-   struct gl_shine_tab *_ShineTable[2];  /* Active shine tables */
-   struct gl_shine_tab *_ShineTabList;   /* Mru list of inactive shine tables */
+   struct gl_shine_tab *_ShineTable[2]; /* Active shine tables */
+   struct gl_shine_tab *_ShineTabList;  /* Mru list of inactive shine tables */
 
    struct gl_list_extensions listext; /* driver dlist extensions */
 
 
-   GLboolean OcclusionResult;  /* GL_HP_occlusion_test */
+   GLboolean OcclusionResult;       /* GL_HP_occlusion_test */
    GLboolean OcclusionResultSaved;  /* GL_HP_occlusion_test */
 
    /* Z buffer stuff */
index b6fe7b2123a5ad8eb6367868a156890d9e49e077..c7667a28a1d5609d9f305bec6fb58959be2593c9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: pixel.c,v 1.32 2001/12/04 23:45:31 brianp Exp $ */
+/* $Id: pixel.c,v 1.33 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -852,7 +852,7 @@ _mesa_transform_rgba(const GLcontext *ctx, GLuint n, GLfloat rgba[][4])
    const GLfloat bb = ctx->Pixel.PostColorMatrixBias[2];
    const GLfloat as = ctx->Pixel.PostColorMatrixScale[3];
    const GLfloat ab = ctx->Pixel.PostColorMatrixBias[3];
-   const GLfloat *m = ctx->ColorMatrix.m;
+   const GLfloat *m = ctx->ColorMatrixStack.Top->m;
    GLuint i;
    for (i = 0; i < n; i++) {
       const GLfloat r = rgba[i][RCOMP];
index 276c54c6ec78815fa535a896b9a2f72539d3e86f..d702458898cca8ee9aa146d125eb1302f49d6f3a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: rastpos.c,v 1.33 2001/12/14 02:50:02 brianp Exp $ */
+/* $Id: rastpos.c,v 1.34 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -286,7 +286,7 @@ raster_pos4f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
       _mesa_update_state( ctx );
 
    ASSIGN_4V( v, x, y, z, w );
-   TRANSFORM_POINT( eye, ctx->ModelView.m, v );
+   TRANSFORM_POINT( eye, ctx->ModelviewMatrixStack.Top->m, v );
 
    /* raster color */
    if (ctx->Light.Enabled) {
@@ -294,7 +294,7 @@ raster_pos4f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
       GLfloat *objnorm = ctx->Current.Attrib[VERT_ATTRIB_NORMAL];
 
       if (ctx->_NeedEyeCoords) {
-        GLfloat *inv = ctx->ModelView.inv;
+        GLfloat *inv = ctx->ModelviewMatrixStack.Top->inv;
         TRANSFORM_NORMAL( eyenorm, objnorm, inv );
         norm = eyenorm;
       }
@@ -326,7 +326,7 @@ raster_pos4f(GLcontext *ctx, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
                       GL_SQRT( eye[0]*eye[0] + eye[1]*eye[1] + eye[2]*eye[2] );
 
    /* apply projection matrix:  clip = Proj * eye */
-   TRANSFORM_POINT( clip, ctx->ProjectionMatrix.m, eye );
+   TRANSFORM_POINT( clip, ctx->ProjectionMatrixStack.Top->m, eye );
 
    /* clip to view volume */
    if (ctx->Transform.RasterPositionUnclipped) {
index dd53c817dda8ebe016a0df73087c71be7c653dbc..82b2ea1f3b4ab3d383c7c992f905476b68101a25 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: state.c,v 1.74 2001/12/14 03:13:04 brianp Exp $ */
+/* $Id: state.c,v 1.75 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -557,8 +557,8 @@ calculate_model_project_matrix( GLcontext *ctx )
 {
    if (!ctx->_NeedEyeCoords) {
       _math_matrix_mul_matrix( &ctx->_ModelProjectMatrix,
-                              &ctx->ProjectionMatrix,
-                              &ctx->ModelView );
+                              ctx->ProjectionMatrixStack.Top,
+                              ctx->ModelviewMatrixStack.Top );
 
       _math_matrix_analyse( &ctx->_ModelProjectMatrix );
    }
@@ -568,11 +568,11 @@ static void
 update_modelview_scale( GLcontext *ctx )
 {
    ctx->_ModelViewInvScale = 1.0F;
-   if (ctx->ModelView.flags & (MAT_FLAG_UNIFORM_SCALE |
+   if (ctx->ModelviewMatrixStack.Top->flags & (MAT_FLAG_UNIFORM_SCALE |
                               MAT_FLAG_GENERAL_SCALE |
                               MAT_FLAG_GENERAL_3D |
                               MAT_FLAG_GENERAL) ) {
-      const GLfloat *m = ctx->ModelView.inv;
+      const GLfloat *m = ctx->ModelviewMatrixStack.Top->inv;
       GLfloat f = m[2] * m[2] + m[6] * m[6] + m[10] * m[10];
       if (f < 1e-12) f = 1.0;
       if (ctx->_NeedEyeCoords)
@@ -651,7 +651,7 @@ update_drawbuffer( GLcontext *ctx )
 static void
 update_projection( GLcontext *ctx )
 {
-   _math_matrix_analyse( &ctx->ProjectionMatrix );
+   _math_matrix_analyse( ctx->ProjectionMatrixStack.Top );
 
    /* Recompute clip plane positions in clipspace.  This is also done
     * in _mesa_ClipPlane().
@@ -662,7 +662,7 @@ update_projection( GLcontext *ctx )
         if (ctx->Transform.ClipEnabled[p]) {
            _mesa_transform_vector( ctx->Transform._ClipUserPlane[p],
                                 ctx->Transform.EyeUserPlane[p],
-                                ctx->ProjectionMatrix.inv );
+                                ctx->ProjectionMatrixStack.Top->inv );
         }
       }
    }
@@ -712,7 +712,7 @@ update_image_transfer_state(GLcontext *ctx)
    if (ctx->Pixel.PostConvolutionColorTableEnabled)
       mask |= IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT;
 
-   if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
+   if (ctx->ColorMatrixStack.Top->type != MATRIX_IDENTITY ||
        ctx->Pixel.PostColorMatrixScale[0] != 1.0F ||
        ctx->Pixel.PostColorMatrixBias[0]  != 0.0F ||
        ctx->Pixel.PostColorMatrixScale[1] != 1.0F ||
@@ -754,14 +754,14 @@ update_texture_matrices( GLcontext *ctx )
    ctx->Texture._TexMatEnabled = 0;
 
    for (i=0; i < ctx->Const.MaxTextureUnits; i++) {
-      if (ctx->TextureMatrix[i].flags & MAT_DIRTY) {
-        _math_matrix_analyse( &ctx->TextureMatrix[i] );
+      if (ctx->TextureMatrixStack[i].Top->flags & MAT_DIRTY) {
+        _math_matrix_analyse( ctx->TextureMatrixStack[i].Top );
 
         if (ctx->Driver.TextureMatrix)
-           ctx->Driver.TextureMatrix( ctx, i, &ctx->TextureMatrix[i] );
+           ctx->Driver.TextureMatrix( ctx, i, ctx->TextureMatrixStack[i].Top);
 
         if (ctx->Texture.Unit[i]._ReallyEnabled &&
-            ctx->TextureMatrix[i].type != MATRIX_IDENTITY)
+            ctx->TextureMatrixStack[i].Top->type != MATRIX_IDENTITY)
            ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(i);
       }
    }
@@ -874,7 +874,7 @@ update_texture_state( GLcontext *ctx )
         ctx->Texture._GenFlags |= texUnit->_GenFlags;
       }
 
-      if (ctx->TextureMatrix[i].type != MATRIX_IDENTITY)
+      if (ctx->TextureMatrixStack[i].Top->type != MATRIX_IDENTITY)
         ctx->Texture._TexMatEnabled |= ENABLE_TEXMAT(i);
    }
 
@@ -915,7 +915,7 @@ void _mesa_update_state( GLcontext *ctx )
       _mesa_print_state("", new_state);
 
    if (new_state & _NEW_MODELVIEW)
-      _math_matrix_analyse( &ctx->ModelView );
+      _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
 
    if (new_state & _NEW_PROJECTION)
       update_projection( ctx );
@@ -924,7 +924,7 @@ void _mesa_update_state( GLcontext *ctx )
       update_texture_matrices( ctx );
 
    if (new_state & _NEW_COLOR_MATRIX)
-      _math_matrix_analyse( &ctx->ColorMatrix );
+      _math_matrix_analyse( ctx->ColorMatrixStack.Top );
 
    /* References ColorMatrix.type (derived above).
     */
@@ -953,7 +953,7 @@ void _mesa_update_state( GLcontext *ctx )
    if (new_state & (_NEW_MODELVIEW|_NEW_LIGHT)) {
       ctx->_NeedEyeCoords &= ~NEED_EYE_LIGHT_MODELVIEW;
       if (ctx->Light.Enabled &&
-         !TEST_MAT_FLAGS( &ctx->ModelView, MAT_FLAGS_LENGTH_PRESERVING))
+         !TEST_MAT_FLAGS( ctx->ModelviewMatrixStack.Top, MAT_FLAGS_LENGTH_PRESERVING))
            ctx->_NeedEyeCoords |= NEED_EYE_LIGHT_MODELVIEW;
    }
 
index f711ab31ce64b4a8d6ba3f7e95fc44ffbf0504de..827a6bd8943f9278f84458ff3bb84591e1f54bf6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: texstate.c,v 1.61 2001/12/13 16:02:11 brianp Exp $ */
+/* $Id: texstate.c,v 1.62 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1706,10 +1706,10 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
            GLfloat tmp[4];
 
             /* Transform plane equation by the inverse modelview matrix */
-            if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) {
-               _math_matrix_analyse( &ctx->ModelView );
+            if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
+               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
             }
-            _mesa_transform_vector( tmp, params, ctx->ModelView.inv );
+            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
            if (TEST_EQ_4V(texUnit->EyePlaneS, tmp))
               return;
            FLUSH_VERTICES(ctx, _NEW_TEXTURE);
@@ -1762,10 +1762,10 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
         else if (pname==GL_EYE_PLANE) {
            GLfloat tmp[4];
             /* Transform plane equation by the inverse modelview matrix */
-           if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) {
-               _math_matrix_analyse( &ctx->ModelView );
+           if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
+               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
             }
-            _mesa_transform_vector( tmp, params, ctx->ModelView.inv );
+            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
            if (TEST_EQ_4V(texUnit->EyePlaneT, tmp))
                return;
            FLUSH_VERTICES(ctx, _NEW_TEXTURE);
@@ -1815,10 +1815,10 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
         else if (pname==GL_EYE_PLANE) {
            GLfloat tmp[4];
             /* Transform plane equation by the inverse modelview matrix */
-            if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) {
-               _math_matrix_analyse( &ctx->ModelView );
+            if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
+               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
             }
-            _mesa_transform_vector( tmp, params, ctx->ModelView.inv );
+            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
            if (TEST_EQ_4V(texUnit->EyePlaneR, tmp))
               return;
            FLUSH_VERTICES(ctx, _NEW_TEXTURE);
@@ -1862,10 +1862,10 @@ _mesa_TexGenfv( GLenum coord, GLenum pname, const GLfloat *params )
         else if (pname==GL_EYE_PLANE) {
            GLfloat tmp[4];
             /* Transform plane equation by the inverse modelview matrix */
-            if (ctx->ModelView.flags & MAT_DIRTY_INVERSE) {
-               _math_matrix_analyse( &ctx->ModelView );
+            if (ctx->ModelviewMatrixStack.Top->flags & MAT_DIRTY_INVERSE) {
+               _math_matrix_analyse( ctx->ModelviewMatrixStack.Top );
             }
-            _mesa_transform_vector( tmp, params, ctx->ModelView.inv );
+            _mesa_transform_vector( tmp, params, ctx->ModelviewMatrixStack.Top->inv );
            if (TEST_EQ_4V(texUnit->EyePlaneQ, tmp))
               return;
            FLUSH_VERTICES(ctx, _NEW_TEXTURE);
index 91f26f164fde8b65226cef0120aaa3cd1ad66dc3..e06b5684c4b19313f7c429b33064c0362e881ab8 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: m_matrix.c,v 1.9 2001/09/18 23:06:14 kschultz Exp $ */
+/* $Id: m_matrix.c,v 1.10 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  4.1
  *
  * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
  *
@@ -975,11 +975,10 @@ _math_matrix_loadf( GLmatrix *mat, const GLfloat *m )
 void
 _math_matrix_ctr( GLmatrix *m )
 {
-   if ( m->m == 0 ) {
-      m->m = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 );
-   }
-   MEMCPY( m->m, Identity, sizeof(Identity) );
-   m->inv = 0;
+   m->m = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 );
+   if (m->m)
+      MEMCPY( m->m, Identity, sizeof(Identity) );
+   m->inv = NULL;
    m->type = MATRIX_IDENTITY;
    m->flags = 0;
 }
@@ -987,13 +986,13 @@ _math_matrix_ctr( GLmatrix *m )
 void
 _math_matrix_dtr( GLmatrix *m )
 {
-   if ( m->m != 0 ) {
+   if (m->m) {
       ALIGN_FREE( m->m );
-      m->m = 0;
+      m->m = NULL;
    }
-   if ( m->inv != 0 ) {
+   if (m->inv) {
       ALIGN_FREE( m->inv );
-      m->inv = 0;
+      m->inv = NULL;
    }
 }
 
@@ -1001,9 +1000,10 @@ _math_matrix_dtr( GLmatrix *m )
 void
 _math_matrix_alloc_inv( GLmatrix *m )
 {
-   if ( m->inv == 0 ) {
+   if (!m->inv) {
       m->inv = (GLfloat *) ALIGN_MALLOC( 16 * sizeof(GLfloat), 16 );
-      MEMCPY( m->inv, Identity, 16 * sizeof(GLfloat) );
+      if (m->inv)
+         MEMCPY( m->inv, Identity, 16 * sizeof(GLfloat) );
    }
 }
 
index dc2c6778b713ca2856ac5e06499376ba23d30450..4441141bdd576da9494b4edcff1b8d1542e7d439 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_fog.c,v 1.15 2001/12/17 04:54:35 brianp Exp $ */
+/* $Id: s_fog.c,v 1.16 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -195,9 +195,10 @@ compute_fog_factors_from_z( const GLcontext *ctx,
                             const GLdepth z[],
                             GLfloat fogFact[] )
 {
-   const GLboolean ortho = (ctx->ProjectionMatrix.m[15] != 0.0F);
-   const GLfloat p10 = ctx->ProjectionMatrix.m[10];
-   const GLfloat p14 = ctx->ProjectionMatrix.m[14];
+   const GLfloat *proj = ctx->ProjectionMatrixStack.Top->m;
+   const GLboolean ortho = (proj[15] != 0.0F);
+   const GLfloat p10 = proj[10];
+   const GLfloat p14 = proj[14];
    const GLfloat tz = ctx->Viewport._WindowMap.m[MAT_TZ];
    GLfloat szInv;
    GLuint i;
index 682ca90866acf313e64b86852421185801902d72..759c4d594b7c1eb217aa72372050bbcc393c73f8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: ss_vbtmp.h,v 1.17 2001/07/17 19:39:32 keithw Exp $ */
+/* $Id: ss_vbtmp.h,v 1.18 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -73,8 +73,8 @@ static void TAG(emit)(GLcontext *ctx, GLuint start, GLuint end,
       }
    }
 
-   proj = VB->ProjectedClipPtr->data[0];
-   proj_stride = VB->ProjectedClipPtr->stride;
+   proj = VB->NdcPtr->data[0];
+   proj_stride = VB->NdcPtr->stride;
 
    if (IND & FOG) {
       fog = VB->FogCoordPtr->data;
index 130a3febe50f5bd23b9273271a5121fc98d8c58b..ae1d7f536110f62106c1e7f779d88a3c07c31bca 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_context.c,v 1.22 2001/07/19 15:54:35 brianp Exp $ */
+/* $Id: t_context.c,v 1.23 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -102,7 +102,7 @@ _tnl_CreateContext( GLcontext *ctx )
    _tnl_install_pipeline( ctx, _tnl_default_pipeline );
 
 
-   tnl->NeedProjCoords = GL_TRUE;
+   tnl->NeedNdcCoords = GL_TRUE;
    tnl->LoopbackDListCassettes = GL_FALSE;
    tnl->CalcDListNormalLengths = GL_TRUE;
 
@@ -210,8 +210,8 @@ void
 _tnl_need_projected_coords( GLcontext *ctx, GLboolean mode )
 {
    TNLcontext *tnl = TNL_CONTEXT(ctx);
-   if (tnl->NeedProjCoords != mode) {
-      tnl->NeedProjCoords = mode;
+   if (tnl->NeedNdcCoords != mode) {
+      tnl->NeedNdcCoords = mode;
       _tnl_InvalidateState( ctx, _NEW_PROJECTION );
    }
 }
index dd0bfad5b618f255960284bb9b99b6446b679954..7b1954a205798e03a030b5cd8526c9984c3573d5 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_context.h,v 1.33 2001/12/14 02:51:44 brianp Exp $ */
+/* $Id: t_context.h,v 1.34 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -260,7 +260,7 @@ typedef struct vertex_buffer
    GLvector4f  *ObjPtr;                                /* VERT_OBJ_BIT */
    GLvector4f  *EyePtr;                                /* VERT_EYE */
    GLvector4f  *ClipPtr;                       /* VERT_CLIP */
-   GLvector4f  *ProjectedClipPtr;               /* VERT_CLIP (2) */
+   GLvector4f  *NdcPtr;                         /* VERT_CLIP (2) */
    GLubyte     ClipOrMask;                     /* VERT_CLIP (3) */
    GLubyte     *ClipMask;                      /* VERT_CLIP (4) */
    GLvector3f  *NormalPtr;                     /* VERT_NORMAL_BIT */
@@ -535,7 +535,7 @@ typedef struct {
 
    /* Probably need a better configuration mechanism:
     */
-   GLboolean NeedProjCoords;
+   GLboolean NeedNdcCoords;
    GLboolean LoopbackDListCassettes;
    GLboolean CalcDListNormalLengths;
 
index 9e3d440b6a05f86a8649dd5ef2265b34c71eaa0d..eebeba265b391fa2fbdeabcb8f411a9d95078c4c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_vb_fog.c,v 1.13 2001/12/14 02:51:45 brianp Exp $ */
+/* $Id: t_vb_fog.c,v 1.14 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -145,7 +145,7 @@ static GLboolean run_fog_stage( GLcontext *ctx,
       VB->FogCoordPtr = &store->fogcoord;
 
       if (!ctx->_NeedEyeCoords) {
-        GLfloat *m = ctx->ModelView.m;
+        const GLfloat *m = ctx->ModelviewMatrixStack.Top->m;
         GLfloat plane[4];
 
         /* Use this to store calculated eye z values:
index aff84b084857d3c00fa41a29e7ffad3b399db6e5..457acd2b5222a3f7f79d35d0863158ca7db317b2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_vb_normals.c,v 1.10 2001/12/14 02:51:45 brianp Exp $ */
+/* $Id: t_vb_normals.c,v 1.11 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -62,7 +62,7 @@ static GLboolean run_normal_stage( GLcontext *ctx,
    ASSERT(store->NormalTransform);
 
    if (stage->changed_inputs)
-      store->NormalTransform( &ctx->ModelView,
+      store->NormalTransform( ctx->ModelviewMatrixStack.Top,
                              ctx->_ModelViewInvScale,
                              VB->NormalPtr,
                              VB->NormalLengthPtr,
@@ -84,7 +84,7 @@ static GLboolean run_validate_normal_stage( GLcontext *ctx,
    if (ctx->_NeedEyeCoords) {
       GLuint transform = NORM_TRANSFORM_NO_ROT;
 
-      if (ctx->ModelView.flags & (MAT_FLAG_GENERAL |
+      if (ctx->ModelviewMatrixStack.Top->flags & (MAT_FLAG_GENERAL |
                                  MAT_FLAG_ROTATION |
                                  MAT_FLAG_GENERAL_3D |
                                  MAT_FLAG_PERSPECTIVE))
index b713031decbb6efc09b7ac6ebf4c602585635e79..aea3c868acaf7289760c0c350efffa297a8b7296 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_vb_program.c,v 1.4 2001/12/15 22:31:23 brianp Exp $ */
+/* $Id: t_vb_program.c,v 1.5 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -718,7 +718,6 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
    struct vp_stage_data *store = VP_STAGE_DATA(stage);
    struct vertex_buffer *VB = &tnl->vb;
    struct vp_machine *machine = &(ctx->VertexProgram.Machine);
-   struct vp_program *program;
    GLint i;
 
    /* convenience pointers */
@@ -734,9 +733,6 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
    GLfloat (*texture2)[4] = (GLfloat (*)[4]) store->texCoord[2].data;
    GLfloat (*texture3)[4] = (GLfloat (*)[4]) store->texCoord[3].data;
 
-   program = (struct vp_program *) _mesa_HashLookup(ctx->VertexProgram.HashTable, ctx->VertexProgram.Binding);
-   assert(program);
-
    _mesa_init_tracked_matrices(ctx);
    _mesa_init_vp_registers(ctx);  /* sets temp regs to (0,0,0,1) */
 
@@ -770,7 +766,8 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
       }
 
       /* execute the program */
-      _mesa_exec_program(ctx, program);
+      ASSERT(ctx->VertexProgram.Current);
+      _mesa_exec_program(ctx, ctx->VertexProgram.Current);
 
 #if 0
       printf("Output %d: %f, %f, %f, %f\n", i,
@@ -819,8 +816,8 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
    store->ormask = 0;
    store->andmask = CLIP_ALL_BITS;
 
-   if (tnl->NeedProjCoords) {
-      VB->ProjectedClipPtr =
+   if (tnl->NeedNdcCoords) {
+      VB->NdcPtr =
          _mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr,
                                             &store->ndcCoords,
                                             store->clipmask,
@@ -829,7 +826,7 @@ static GLboolean run_vp( GLcontext *ctx, struct gl_pipeline_stage *stage )
 
    }
    else {
-      VB->ProjectedClipPtr = 0;
+      VB->NdcPtr = 0;
       _mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr,
                                             0,
                                             store->clipmask,
index a0ed3e58990d38ad5342775feccfdda1a2825052..8cff96a74aa0701419e2e571be8f19f2d6a3536a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_vb_texmat.c,v 1.6 2001/12/14 02:51:45 brianp Exp $ */
+/* $Id: t_vb_texmat.c,v 1.7 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -86,7 +86,8 @@ static GLboolean run_texmat_stage( GLcontext *ctx,
    for (i = 0 ; i < ctx->Const.MaxTextureUnits ; i++)
       if (ctx->Texture._TexMatEnabled & ENABLE_TEXMAT(i)) {
         if (stage->changed_inputs & VERT_TEX(i))
-           (void) TransformRaw( &store->texcoord[i], &ctx->TextureMatrix[i],
+           (void) TransformRaw( &store->texcoord[i],
+                                 ctx->TextureMatrixStack[i].Top,
                                 VB->TexCoordPtr[i]);
 
         VB->TexCoordPtr[i] = &store->texcoord[i];
index f54d73bd62809538b40f25e6e4639a92ba5d1d89..8ceb9dbdafd3c32da7fb5a39422f510e09a359bb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: t_vb_vertex.c,v 1.10 2001/12/14 02:51:45 brianp Exp $ */
+/* $Id: t_vb_vertex.c,v 1.11 2001/12/18 04:06:46 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -57,7 +57,7 @@ struct vertex_stage_data {
     */
    GLvector4f *save_eyeptr;
    GLvector4f *save_clipptr;
-   GLvector4f *save_projptr;
+   GLvector4f *save_ndcptr;
 };
 
 #define VERTEX_STAGE_DATA(stage) ((struct vertex_stage_data *)stage->privatePtr)
@@ -142,16 +142,18 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
       if (ctx->_NeedEyeCoords) {
         /* Separate modelview and project transformations:
          */
-        if (ctx->ModelView.type == MATRIX_IDENTITY)
+        if (ctx->ModelviewMatrixStack.Top->type == MATRIX_IDENTITY)
            VB->EyePtr = VB->ObjPtr;
         else
-           VB->EyePtr = TransformRaw( &store->eye, &ctx->ModelView,
+           VB->EyePtr = TransformRaw( &store->eye,
+                                       ctx->ModelviewMatrixStack.Top,
                                       VB->ObjPtr);
 
-        if (ctx->ProjectionMatrix.type == MATRIX_IDENTITY)
+        if (ctx->ProjectionMatrixStack.Top->type == MATRIX_IDENTITY)
            VB->ClipPtr = VB->EyePtr;
         else
-           VB->ClipPtr = TransformRaw( &store->clip, &ctx->ProjectionMatrix,
+           VB->ClipPtr = TransformRaw( &store->clip,
+                                        ctx->ProjectionMatrixStack.Top,
                                        VB->EyePtr );
       }
       else {
@@ -184,16 +186,17 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
       store->ormask = 0;
       store->andmask = CLIP_ALL_BITS;
 
-      if (tnl->NeedProjCoords) {
-        VB->ProjectedClipPtr =
+      if (tnl->NeedNdcCoords) {
+        VB->NdcPtr =
            _mesa_clip_tab[VB->ClipPtr->size]( VB->ClipPtr,
                                                &store->proj,
                                                store->clipmask,
                                                &store->ormask,
                                                &store->andmask );
 
-      } else {
-        VB->ProjectedClipPtr = 0;
+      }
+      else {
+        VB->NdcPtr = 0;
         _mesa_clip_np_tab[VB->ClipPtr->size]( VB->ClipPtr,
                                                0,
                                                store->clipmask,
@@ -227,14 +230,14 @@ static GLboolean run_vertex_stage( GLcontext *ctx,
 
       store->save_eyeptr = VB->EyePtr;
       store->save_clipptr = VB->ClipPtr;
-      store->save_projptr = VB->ProjectedClipPtr;
+      store->save_ndcptr = VB->NdcPtr;
    }
    else {
       /* Replay the sideeffects.
        */
       VB->EyePtr = store->save_eyeptr;
       VB->ClipPtr = store->save_clipptr;
-      VB->ProjectedClipPtr = store->save_projptr;
+      VB->NdcPtr = store->save_ndcptr;
       VB->ClipMask = store->clipmask;
       VB->ClipOrMask = store->ormask;
       if (VB->ClipPtr == VB->ObjPtr && (VB->importable_data & VERT_OBJ_BIT))
index 006a0544a5732520bea64e2818b9be29d185d3f2..12021d70c4cda6f0e316d4f269aef70aa962c6e6 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: gen_matypes.c,v 1.4 2001/12/16 11:28:20 brianp Exp $ */
+/* $Id: gen_matypes.c,v 1.5 2001/12/18 04:06:45 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -122,7 +122,7 @@ int main( int argc, char **argv )
    OFFSET( "VB_OBJ_PTR             ", struct vertex_buffer, ObjPtr );
    OFFSET( "VB_EYE_PTR             ", struct vertex_buffer, EyePtr );
    OFFSET( "VB_CLIP_PTR            ", struct vertex_buffer, ClipPtr );
-   OFFSET( "VB_PROJ_CLIP_PTR       ", struct vertex_buffer, ProjectedClipPtr );
+   OFFSET( "VB_PROJ_CLIP_PTR       ", struct vertex_buffer, NdcPtr );
    OFFSET( "VB_CLIP_OR_MASK        ", struct vertex_buffer, ClipOrMask );
    OFFSET( "VB_CLIP_MASK           ", struct vertex_buffer, ClipMask );
    OFFSET( "VB_NORMAL_PTR          ", struct vertex_buffer, NormalPtr );