remove dead files
authorKeith Whitwell <keith@tungstengraphics.com>
Mon, 24 Nov 2003 15:42:24 +0000 (15:42 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Mon, 24 Nov 2003 15:42:24 +0000 (15:42 +0000)
src/mesa/tnl/t_eval_api.c [deleted file]
src/mesa/tnl/t_eval_api.h [deleted file]
src/mesa/tnl/t_imm_api.c [deleted file]
src/mesa/tnl/t_imm_api.h [deleted file]
src/mesa/tnl/t_imm_elt.c [deleted file]
src/mesa/tnl/t_imm_eval.c [deleted file]

diff --git a/src/mesa/tnl/t_eval_api.c b/src/mesa/tnl/t_eval_api.c
deleted file mode 100644 (file)
index 5e68d7c..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-
-/*
- * Mesa 3-D graphics library
- * Version:  5.1
- *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Keith Whitwell - original code
- *    Brian Paul - vertex program updates
- */
-
-
-#include "glheader.h"
-#include "colormac.h"
-#include "context.h"
-#include "macros.h"
-#include "imports.h"
-#include "mtypes.h"
-#include "math/m_eval.h"
-
-#include "t_eval_api.h"
-#include "t_imm_api.h"
-#include "t_imm_alloc.h"
-#include "t_imm_exec.h"
-
-
-/* KW: If are compiling, we don't know whether eval will produce a
- *     vertex when it is run in the future.  If this is pure immediate
- *     mode, eval is a noop if neither vertex map is enabled.
- *
- *     Thus we need to have a check in the display list code or
- *     elsewhere for eval(1,2) vertices in the case where
- *     map(1,2)_vertex is disabled, and to purge those vertices from
- *     the vb.
- */
-void GLAPIENTRY
-_tnl_exec_EvalMesh1( GLenum mode, GLint i1, GLint i2 )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLint i;
-   GLfloat u, du;
-   GLenum prim;
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "glEvalMesh1()");
-
-   switch (mode) {
-      case GL_POINT:
-         prim = GL_POINTS;
-         break;
-      case GL_LINE:
-         prim = GL_LINE_STRIP;
-         break;
-      default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh1(mode)" );
-         return;
-   }
-
-   /* No effect if vertex maps disabled.
-    */
-   if (!ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3 &&
-       (!ctx->VertexProgram.Enabled || !ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]))
-      return;
-
-   du = ctx->Eval.MapGrid1du;
-   u = ctx->Eval.MapGrid1u1 + i1 * du;
-
-   /* Need to turn off compilation -- this is already saved, and the
-    * coordinates generated and the test above depend on state that
-    * may change before the list is executed.
-    *
-    * TODO: Anaylse display lists to determine if this state is
-    * constant.
-    *
-    * State to watch:
-    *       - enabled maps
-    *       - map state for each enabled map, including control points
-    *       - grid state
-    *
-    * Could alternatively cache individual maps in arrays, rather than
-    * building immediates.  
-    */
-   {
-      GLboolean compiling = ctx->CompileFlag;
-      TNLcontext *tnl = TNL_CONTEXT(ctx);
-      struct immediate *im = TNL_CURRENT_IM(ctx);
-      GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
-
-      NotifyBegin = tnl->Driver.NotifyBegin;
-      tnl->Driver.NotifyBegin = 0;
-
-      if (compiling) {
-        struct immediate *tmp = _tnl_alloc_immediate( ctx );
-        FLUSH_VERTICES( ctx, 0 );
-        SET_IMMEDIATE( ctx, tmp );
-        TNL_CURRENT_IM(ctx)->ref_count++;       
-        ctx->CompileFlag = GL_FALSE;
-      }
-
-      _tnl_Begin( prim );
-      for (i=i1;i<=i2;i++,u+=du) {
-        _tnl_eval_coord1f( ctx, u );
-      }
-      _tnl_end_ctx(ctx);
-
-      /* Need this for replay *and* compile:
-       */
-      FLUSH_VERTICES( ctx, 0 );
-      tnl->Driver.NotifyBegin = NotifyBegin;
-
-      if (compiling) {
-        TNL_CURRENT_IM(ctx)->ref_count--;
-        ASSERT( TNL_CURRENT_IM(ctx)->ref_count == 0 );
-        _tnl_free_immediate( ctx, TNL_CURRENT_IM(ctx) );
-        SET_IMMEDIATE( ctx, im );
-        ctx->CompileFlag = GL_TRUE;
-      }
-   }
-}
-
-
-
-void GLAPIENTRY
-_tnl_exec_EvalMesh2( GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2 )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLint i, j;
-   GLfloat u, du, v, dv, v1, u1;
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "glEvalMesh2()");
-
-   /* No effect if vertex maps disabled.
-    */
-   if (!ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3 &&
-       (!ctx->VertexProgram.Enabled || !ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]))
-      return;
-
-   du = ctx->Eval.MapGrid2du;
-   dv = ctx->Eval.MapGrid2dv;
-   v1 = ctx->Eval.MapGrid2v1 + j1 * dv;
-   u1 = ctx->Eval.MapGrid2u1 + i1 * du;
-
-   /* Need to turn off compilation -- this is already saved, and the
-    * coordinates generated and the test above depend on state that
-    * may change before the list is executed.
-    */
-   {
-      GLboolean compiling = ctx->CompileFlag;
-      struct immediate *im = TNL_CURRENT_IM(ctx);
-      TNLcontext *tnl = TNL_CONTEXT(ctx);
-      GLboolean (*NotifyBegin)(GLcontext *ctx, GLenum p);
-
-      NotifyBegin = tnl->Driver.NotifyBegin;
-      tnl->Driver.NotifyBegin = 0;
-
-      if (compiling) {
-        struct immediate *tmp = _tnl_alloc_immediate( ctx );
-        FLUSH_VERTICES( ctx, 0 );
-        SET_IMMEDIATE( ctx, tmp );
-        TNL_CURRENT_IM(ctx)->ref_count++;       
-        ctx->CompileFlag = GL_FALSE;
-      }
-
-      switch (mode) {
-      case GL_POINT:
-        _tnl_Begin( GL_POINTS );
-        for (v=v1,j=j1;j<=j2;j++,v+=dv) {
-           for (u=u1,i=i1;i<=i2;i++,u+=du) {
-              _tnl_eval_coord2f( ctx, u, v );
-           }
-        }
-        _tnl_end_ctx(ctx);
-        break;
-      case GL_LINE:
-        for (v=v1,j=j1;j<=j2;j++,v+=dv) {
-           _tnl_Begin( GL_LINE_STRIP );
-           for (u=u1,i=i1;i<=i2;i++,u+=du) {
-              _tnl_eval_coord2f( ctx, u, v );
-           }
-           _tnl_end_ctx(ctx);
-        }
-        for (u=u1,i=i1;i<=i2;i++,u+=du) {
-           _tnl_Begin( GL_LINE_STRIP );
-           for (v=v1,j=j1;j<=j2;j++,v+=dv) {
-              _tnl_eval_coord2f( ctx, u, v );
-           }
-           _tnl_end_ctx(ctx);
-        }
-        break;
-      case GL_FILL:
-        for (v=v1,j=j1;j<j2;j++,v+=dv) {
-           _tnl_Begin( GL_TRIANGLE_STRIP );
-           for (u=u1,i=i1;i<=i2;i++,u+=du) {
-              _tnl_eval_coord2f( ctx, u, v );
-              _tnl_eval_coord2f( ctx, u, v+dv );
-           }
-           _tnl_end_ctx(ctx);
-        }
-        break;
-      default:
-        _mesa_error( ctx, GL_INVALID_ENUM, "glEvalMesh2(mode)" );
-        return;
-      }
-
-      /* Need this for replay *and* compile:
-       */
-      FLUSH_VERTICES( ctx, 0 );
-      tnl->Driver.NotifyBegin = NotifyBegin;
-        
-      if (compiling) {
-        TNL_CURRENT_IM(ctx)->ref_count--;
-        _tnl_free_immediate( ctx, TNL_CURRENT_IM( ctx ) );
-        SET_IMMEDIATE( ctx, im );
-        ctx->CompileFlag = GL_TRUE;
-      }
-   }
-}
-
-
-void _tnl_eval_init( GLcontext *ctx )
-{
-   GLvertexformat *vfmt = &(TNL_CONTEXT(ctx)->vtxfmt);
-   vfmt->EvalMesh1 = _tnl_exec_EvalMesh1;
-   vfmt->EvalMesh2 = _tnl_exec_EvalMesh2;
-}
diff --git a/src/mesa/tnl/t_eval_api.h b/src/mesa/tnl/t_eval_api.h
deleted file mode 100644 (file)
index a24b121..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-
-/*
- * Mesa 3-D graphics library
- * Version:  3.5
- *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#ifndef _T_EVAL_H
-#define _T_EVAL_H
-
-
-#include "mtypes.h"
-#include "t_context.h"
-
-/* Use _mesa_save_EvalMesh{1,2} to save these to display lists.
- */
-extern void GLAPIENTRY _tnl_exec_EvalMesh1( GLenum mode, GLint i1, GLint i2 );
-
-extern void GLAPIENTRY _tnl_exec_EvalMesh2( GLenum mode, GLint i1, GLint i2,
-                                GLint j1, GLint j2 );
-
-void _tnl_eval_init( GLcontext *ctx );
-
-#endif
diff --git a/src/mesa/tnl/t_imm_api.c b/src/mesa/tnl/t_imm_api.c
deleted file mode 100644 (file)
index 52c2028..0000000
+++ /dev/null
@@ -1,1387 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  5.1
- *
- * Copyright (C) 1999-2002  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Keith Whitwell <keith@tungstengraphics.com>
- */
-
-
-
-#include "glheader.h"
-#include "context.h"
-#include "dlist.h"
-#include "enums.h"
-#include "light.h"
-#include "imports.h"
-#include "state.h"
-#include "colormac.h"
-#include "macros.h"
-#include "vtxfmt.h"
-
-#include "t_context.h"
-#include "t_imm_api.h"
-#include "t_imm_elt.h"
-#include "t_imm_exec.h"
-#include "t_imm_dlist.h"
-
-
-/* A cassette is full or flushed on a statechange.
- */
-void _tnl_flush_immediate( GLcontext *ctx, struct immediate *IM )
-{
-   if (!ctx) {
-      /* We were called by glVertex, glEvalCoord, glArrayElement, etc.
-       * The current context is corresponds to the IM structure.
-       */
-      GET_CURRENT_CONTEXT(context);
-      ctx = context;
-   }
-
-   if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
-      _mesa_debug(ctx, "_tnl_flush_immediate IM: %d compiling: %d\n",
-                  IM->id, ctx->CompileFlag);
-
-   if (IM->FlushElt == FLUSH_ELT_EAGER) {
-      _tnl_translate_array_elts( ctx, IM, IM->LastPrimitive, IM->Count );
-   }
-
-   /* Mark the last primitive:
-    */
-   IM->PrimitiveLength[IM->LastPrimitive] = IM->Count - IM->LastPrimitive;
-   IM->Primitive[IM->LastPrimitive] |= PRIM_LAST;
-
-   if (ctx->CompileFlag)
-      _tnl_compile_cassette( ctx, IM );
-   else
-      _tnl_execute_cassette( ctx, IM );
-}
-
-
-/* Hook for ctx->Driver.FlushVertices:
- */
-void _tnl_flush_vertices( GLcontext *ctx, GLuint flags )
-{
-   struct immediate *IM = TNL_CURRENT_IM(ctx);
-
-   if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
-      _mesa_debug(ctx,
-                  "_tnl_flush_vertices flags %x IM(%d) %d..%d Flag[%d]: %x\n", 
-                  flags, IM->id, IM->Start, IM->Count, IM->Start,
-                  IM->Flag[IM->Start]);
-
-   if (IM->Flag[IM->Start]) {
-      if ((flags & FLUSH_UPDATE_CURRENT) || 
-         IM->Count > IM->Start ||
-         (IM->Flag[IM->Start] & (VERT_BIT_BEGIN | VERT_BIT_END))) {
-        _tnl_flush_immediate( ctx, IM );
-      }
-   }
-}
-
-
-void GLAPIENTRY
-_tnl_save_Begin( GLenum mode )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   struct immediate *IM = TNL_CURRENT_IM(ctx);
-   GLuint inflags, state;
-
-/*     _mesa_debug(ctx, "%s: before: %x\n", __FUNCTION__, IM->BeginState); */
-
-   if (mode > GL_POLYGON) {
-      _mesa_compile_error( ctx, GL_INVALID_ENUM, "_tnl_Begin" );
-      return;
-   }
-
-   if (ctx->NewState)
-      _mesa_update_state(ctx);
-
-#if 000
-   /* if only a very few slots left, might as well flush now
-    */
-   if (IM->Count > IMM_MAXDATA-8) {
-      _tnl_flush_immediate( ctx, IM );
-      IM = TNL_CURRENT_IM(ctx);
-   }
-#endif
-
-   if (IM->Count > IMM_MAXDATA-8) {
-      _tnl_flush_immediate( ctx, IM );
-      IM = TNL_CURRENT_IM(ctx);
-   }
-
-   /* Check for and flush buffered vertices from internal operations.
-    */
-   if (IM->SavedBeginState) {
-      _tnl_flush_immediate( ctx, IM );
-      IM = TNL_CURRENT_IM(ctx);
-      IM->BeginState = IM->SavedBeginState;
-      IM->SavedBeginState = 0;
-   }
-
-   state = IM->BeginState;
-   inflags = state & (VERT_BEGIN_0|VERT_BEGIN_1);
-   state |= inflags << 2;      /* set error conditions */
-
-   if (inflags != (VERT_BEGIN_0|VERT_BEGIN_1))
-   {
-      GLuint count = IM->Count;
-      GLuint last = IM->LastPrimitive;
-
-      state |= (VERT_BEGIN_0|VERT_BEGIN_1);
-      IM->Flag[count] |= VERT_BIT_BEGIN;
-      IM->Primitive[count] = mode | PRIM_BEGIN;
-      IM->PrimitiveLength[IM->LastPrimitive] = count - IM->LastPrimitive;
-      IM->LastPrimitive = count;
-
-      /* Not quite right.  Need to use the fallback '_aa_ArrayElement'
-       * when not known to be inside begin/end and arrays are
-       * unlocked.  
-       */
-      if (IM->FlushElt == FLUSH_ELT_EAGER) {
-        _tnl_translate_array_elts( ctx, IM, last, count );
-      }
-   }
-
-   ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
-   IM->BeginState = state;
-
-   /* Update save_primitive now.  Don't touch ExecPrimitive as this is
-    * updated in the replay of this cassette if we are in
-    * COMPILE_AND_EXECUTE mode.
-    */
-   if (ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN)
-      ctx->Driver.CurrentSavePrimitive = PRIM_INSIDE_UNKNOWN_PRIM;
-   else if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END)
-      ctx->Driver.CurrentSavePrimitive = mode;
-}
-
-
-void GLAPIENTRY
-_tnl_Begin( GLenum mode )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   TNLcontext *tnl = TNL_CONTEXT(ctx);
-   ASSERT (!ctx->CompileFlag);
-
-   if (mode > GL_POLYGON) {
-      _mesa_error( ctx, GL_INVALID_ENUM, "_tnl_Begin(0x%x)", mode );
-      return;
-   }
-
-   if (ctx->Driver.CurrentExecPrimitive != PRIM_OUTSIDE_BEGIN_END) {
-      _mesa_error( ctx, GL_INVALID_OPERATION, "_tnl_Begin" );
-      return;
-   }
-
-   if (ctx->NewState)
-      _mesa_update_state(ctx);
-
-   {
-      struct immediate *IM = TNL_CURRENT_IM(ctx);
-      if (IM->Count > IMM_MAXDATA-8) {
-        _tnl_flush_immediate( ctx, IM );
-        IM = TNL_CURRENT_IM(ctx);
-      }
-   }
-
-
-   {
-      struct immediate *IM = TNL_CURRENT_IM(ctx);
-      GLuint count = IM->Count;
-      GLuint last = IM->LastPrimitive;
-
-      if (IM->Start == IM->Count &&
-         tnl->Driver.NotifyBegin &&
-         tnl->Driver.NotifyBegin( ctx, mode )) {
-        return;
-      }
-
-      assert( (IM->SavedBeginState & (VERT_BEGIN_0|VERT_BEGIN_1)) == 0 );
-      assert( (IM->BeginState & (VERT_BEGIN_0|VERT_BEGIN_1)) == 0 );
-
-      /* Not quite right.  Need to use the fallback '_aa_ArrayElement'
-       * when not known to be inside begin/end and arrays are
-       * unlocked.  
-       */
-      if (IM->FlushElt == FLUSH_ELT_EAGER) {
-        _tnl_translate_array_elts( ctx, IM, last, count );
-      }
-
-      IM->Flag[count] |= VERT_BIT_BEGIN;
-      IM->Primitive[count] = mode | PRIM_BEGIN;
-      IM->PrimitiveLength[last] = count - last;
-      IM->LastPrimitive = count;
-      IM->BeginState = (VERT_BEGIN_0|VERT_BEGIN_1);
-
-/*        _mesa_debug(ctx, "%s: %x\n", __FUNCTION__, IM->BeginState);  */
-
-      ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
-      ctx->Driver.CurrentExecPrimitive = mode;
-   }
-}
-
-
-/* Function which allows operations like 'glRectf' to decompose to a
- * begin/end object and vertices without worrying about what happens
- * with display lists.
- */
-GLboolean
-_tnl_hard_begin( GLcontext *ctx, GLenum p )
-{
-/*     _mesa_debug(ctx, "%s\n", __FUNCTION__); */
-
-   if (!ctx->CompileFlag) {
-      /* If not compiling, treat as a normal begin().
-       */
-/*        _mesa_debug(ctx, "%s: treating as glBegin\n", __FUNCTION__); */
-      glBegin( p );
-      return GL_TRUE;
-   }
-   else {
-      /* Otherwise, need to do special processing to preserve the
-       * condition that these vertices will only be replayed outside
-       * future begin/end objects.
-       */
-      struct immediate *IM = TNL_CURRENT_IM(ctx);
-
-      if (ctx->NewState)
-        _mesa_update_state(ctx);
-
-      if (IM->Count > IMM_MAXDATA-8) {
-        _tnl_flush_immediate( ctx, IM );
-        IM = TNL_CURRENT_IM(ctx);
-      }
-
-      /* A lot depends on the degree to which the display list has
-       * constrained the possible begin/end states at this point:
-       */
-      switch (IM->BeginState & (VERT_BEGIN_0|VERT_BEGIN_1)) {
-      case VERT_BEGIN_0|VERT_BEGIN_1:
-        /* This is an immediate known to be inside a begin/end object.
-         */
-        ASSERT(ctx->Driver.CurrentSavePrimitive <= GL_POLYGON);
-        IM->BeginState |= (VERT_ERROR_1|VERT_ERROR_0);
-        return GL_FALSE;
-
-      case VERT_BEGIN_0:
-      case VERT_BEGIN_1:
-        /* This is a display-list immediate in an unknown begin/end
-         * state.  Assert it is empty and convert it to a 'hard' one.
-         */
-        ASSERT(IM->SavedBeginState == 0);
-        ASSERT(ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN);
-
-        /* Push current beginstate, to be restored later.  Don't worry
-         * about raising errors.
-         */
-        IM->SavedBeginState = IM->BeginState;
-
-        /* FALLTHROUGH */
-
-      case 0:
-        /* Unless we have fallen through, this is an immediate known to
-         * be outside begin/end objects.
-         */
-        ASSERT(ctx->Driver.CurrentSavePrimitive == PRIM_UNKNOWN ||
-               ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END);
-        ASSERT (IM->FlushElt != FLUSH_ELT_EAGER);
-
-        IM->BeginState |= VERT_BEGIN_0|VERT_BEGIN_1;
-        IM->Flag[IM->Count] |= VERT_BIT_BEGIN;
-        IM->Primitive[IM->Count] = p | PRIM_BEGIN;
-        IM->PrimitiveLength[IM->LastPrimitive] = IM->Count - IM->LastPrimitive;
-        IM->LastPrimitive = IM->Count;
-
-        /* This is necessary as this immediate will not be flushed in
-         * _tnl_end() -- we leave it active, hoping to pick up more
-         * vertices before the next state change.
-         */
-        ctx->Driver.NeedFlush |= FLUSH_STORED_VERTICES;
-        return GL_TRUE;
-
-      default:
-        assert (0);
-        return GL_TRUE;
-      }
-   }
-}
-
-
-/* Both streams now outside begin/end.
- *
- * Leave SavedBeginState untouched -- attempt to gather several
- * rects/arrays together in a single immediate struct.
- */
-void
-_tnl_end_ctx( GLcontext *ctx )
-{
-   struct immediate *IM = TNL_CURRENT_IM(ctx);
-   GLuint state = IM->BeginState;
-   GLuint inflags = (~state) & (VERT_BEGIN_0|VERT_BEGIN_1);
-
-   /* Not the case if vertices emitted without calling glBegin first:
-    */
-/*   assert( ctx->Driver.NeedFlush & FLUSH_STORED_VERTICES ); */
-
-
-   state |= inflags << 2;      /* errors */
-
-   if (inflags != (VERT_BEGIN_0|VERT_BEGIN_1))
-   {
-      GLuint count = IM->Count;
-      GLuint last = IM->LastPrimitive;
-
-      state &= ~(VERT_BEGIN_0|VERT_BEGIN_1); /* update state */
-      IM->Flag[count] |= VERT_BIT_END;
-      IM->Primitive[last] |= PRIM_END;
-      IM->PrimitiveLength[last] = count - last;
-      IM->Primitive[count] = PRIM_OUTSIDE_BEGIN_END; /* removes PRIM_BEGIN 
-                                                     * flag if length == 0
-                                                     */
-      IM->LastPrimitive = count;
-
-      if (IM->FlushElt == FLUSH_ELT_EAGER) {
-        _tnl_translate_array_elts( ctx, IM, last, count );
-      }
-   }
-
-   IM->BeginState = state;
-
-   if (!ctx->CompileFlag) {
-      if (ctx->Driver.CurrentExecPrimitive == PRIM_OUTSIDE_BEGIN_END) 
-        _mesa_error( ctx, GL_INVALID_OPERATION, "_tnl_End" );
-      else
-        ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
-   }
-
-   /* You can set this flag to get the old 'flush_vb on glEnd()'
-    * behaviour.
-    */
-   if (MESA_DEBUG_FLAGS & DEBUG_ALWAYS_FLUSH)
-      _tnl_flush_immediate( ctx, IM );
-}
-
-void GLAPIENTRY
-_tnl_End(void)
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   _tnl_end_ctx( ctx );
-
-   /* Need to keep save primitive uptodate in COMPILE and
-    * COMPILE_AND_EXEC modes, need to keep exec primitive uptodate
-    * otherwise.
-    */
-   if (ctx->CompileFlag)
-      ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
-}
-
-
-/* If the given vertex attribute array hasn't been allocated yet,
- * allocate it now.
- */
-#define CHECK_ATTRIB_ARRAY(IM, ATTR)                                   \
-   if (!IM->Attrib[ATTR]) {                                            \
-      IM->Attrib[ATTR] =                                               \
-         (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));        \
-      if (!IM->Attrib[ATTR]) {                                         \
-         GET_CURRENT_CONTEXT(ctx);                                     \
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glVertex/Normal/etc");    \
-         return;                                                       \
-      }                                                                        \
-   }
-
-
-#define COLOR( r, g, b, a )                                    \
-{                                                              \
-   GET_IMMEDIATE;                                              \
-   GLuint count = IM->Count;                                   \
-   GLfloat *color;                                             \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_COLOR0);                 \
-   color = IM->Attrib[VERT_ATTRIB_COLOR0][count];              \
-   color[0] = r;                                               \
-   color[1] = g;                                               \
-   color[2] = b;                                               \
-   color[3] = a;                                               \
-   IM->Flag[count] |= VERT_BIT_COLOR0;                         \
-}
-
-static void GLAPIENTRY
-_tnl_Color3f( GLfloat red, GLfloat green, GLfloat blue )
-{
-   COLOR( red, green, blue, 1.0 );
-}
-
-static void GLAPIENTRY
-_tnl_Color3ub( GLubyte red, GLubyte green, GLubyte blue )
-{
-   COLOR(UBYTE_TO_FLOAT(red),
-         UBYTE_TO_FLOAT(green),
-         UBYTE_TO_FLOAT(blue),
-         1.0);
-}
-
-static void GLAPIENTRY
-_tnl_Color4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
-{
-   COLOR( red, green, blue, alpha );
-}
-
-static void GLAPIENTRY
-_tnl_Color4ub( GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha )
-{
-   COLOR(UBYTE_TO_FLOAT(red),
-         UBYTE_TO_FLOAT(green),
-         UBYTE_TO_FLOAT(blue),
-         UBYTE_TO_FLOAT(alpha));
-}
-
-static void GLAPIENTRY
-_tnl_Color3fv( const GLfloat *v )
-{
-   COLOR( v[0], v[1], v[2], 1.0 );
-}
-
-static void GLAPIENTRY
-_tnl_Color3ubv( const GLubyte *v )
-{
-   COLOR(UBYTE_TO_FLOAT(v[0]),
-         UBYTE_TO_FLOAT(v[1]),
-         UBYTE_TO_FLOAT(v[2]),
-         1.0 );
-}
-
-static void GLAPIENTRY
-_tnl_Color4fv( const GLfloat *v )
-{
-   COLOR( v[0], v[1], v[2], v[3] );
-}
-
-static void GLAPIENTRY
-_tnl_Color4ubv( const GLubyte *v)
-{
-   COLOR(UBYTE_TO_FLOAT(v[0]),
-         UBYTE_TO_FLOAT(v[1]),
-         UBYTE_TO_FLOAT(v[2]),
-         UBYTE_TO_FLOAT(v[3]));
-}
-
-
-
-#define SECONDARY_COLOR( r, g, b )                     \
-{                                                      \
-   GET_IMMEDIATE;                                      \
-   GLuint count = IM->Count;                           \
-   GLfloat *color;                                     \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_COLOR1);         \
-   color = IM->Attrib[VERT_ATTRIB_COLOR1][count];      \
-   color[0] = r;                                       \
-   color[1] = g;                                       \
-   color[2] = b;                                       \
-   IM->Flag[count] |= VERT_BIT_COLOR1;                 \
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3fEXT( GLfloat red, GLfloat green, GLfloat blue )
-{
-   SECONDARY_COLOR( red, green, blue );
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3ubEXT( GLubyte red, GLubyte green, GLubyte blue )
-{
-   SECONDARY_COLOR(UBYTE_TO_FLOAT(red),
-                   UBYTE_TO_FLOAT(green),
-                   UBYTE_TO_FLOAT(blue));
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3fvEXT( const GLfloat *v )
-{
-   SECONDARY_COLOR( v[0], v[1], v[2] );
-}
-
-static void GLAPIENTRY
-_tnl_SecondaryColor3ubvEXT( const GLubyte *v )
-{
-   SECONDARY_COLOR(UBYTE_TO_FLOAT(v[0]),
-                   UBYTE_TO_FLOAT(v[1]),
-                   UBYTE_TO_FLOAT(v[2]));
-}
-
-
-static void GLAPIENTRY
-_tnl_EdgeFlag( GLboolean flag )
-{
-   GLuint count;
-   GET_IMMEDIATE;
-   count = IM->Count;
-   IM->EdgeFlag[count] = flag;
-   IM->Flag[count] |= VERT_BIT_EDGEFLAG;
-}
-
-
-static void GLAPIENTRY
-_tnl_EdgeFlagv( const GLboolean *flag )
-{
-   GLuint count;
-   GET_IMMEDIATE;
-   count = IM->Count;
-   IM->EdgeFlag[count] = *flag;
-   IM->Flag[count] |= VERT_BIT_EDGEFLAG;
-}
-
-
-static void GLAPIENTRY
-_tnl_FogCoordfEXT( GLfloat f )
-{
-   GET_IMMEDIATE;
-   GLuint count = IM->Count;
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_FOG);
-   IM->Attrib[VERT_ATTRIB_FOG][count][0] = f;
-   IM->Flag[count] |= VERT_BIT_FOG;
-}
-
-static void GLAPIENTRY
-_tnl_FogCoordfvEXT( const GLfloat *v )
-{
-   GET_IMMEDIATE;
-   GLuint count = IM->Count;
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_FOG);
-   IM->Attrib[VERT_ATTRIB_FOG][count][0] = v[0];
-   IM->Flag[count] |= VERT_BIT_FOG;
-}
-
-
-static void GLAPIENTRY
-_tnl_Indexi( GLint c )
-{
-   GLuint count;
-   GET_IMMEDIATE;
-   count = IM->Count;
-   IM->Index[count] = c;
-   IM->Flag[count] |= VERT_BIT_INDEX;
-}
-
-
-static void GLAPIENTRY
-_tnl_Indexiv( const GLint *c )
-{
-   GLuint count;
-   GET_IMMEDIATE;
-   count = IM->Count;
-   IM->Index[count] = *c;
-   IM->Flag[count] |= VERT_BIT_INDEX;
-}
-
-
-#define NORMAL( x, y, z )                              \
-{                                                      \
-   GET_IMMEDIATE;                                      \
-   GLuint count = IM->Count;                           \
-   GLfloat *normal;                                    \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_NORMAL);         \
-   normal = IM->Attrib[VERT_ATTRIB_NORMAL][count];     \
-   ASSIGN_3V(normal, x,y,z);                           \
-   IM->Flag[count] |= VERT_BIT_NORMAL;                 \
-}
-
-#if defined(USE_IEEE_foo)
-#define NORMALF( x, y, z )                                     \
-{                                                              \
-   GET_IMMEDIATE;                                              \
-   GLuint count = IM->Count;                                   \
-   fi_type *normal;                                            \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_NORMAL);                 \
-   normal = (fi_type *)IM->Attrib[VERT_ATTRIB_NORMAL][count];  \
-   normal[0].i = ((fi_type *)&(x))->i;                         \
-   normal[1].i = ((fi_type *)&(y))->i;                         \
-   normal[2].i = ((fi_type *)&(z))->i;                         \
-   IM->Flag[count] |= VERT_BIT_NORMAL;                         \
-}
-#else
-#define NORMALF NORMAL
-#endif
-
-static void GLAPIENTRY
-_tnl_Normal3f( GLfloat nx, GLfloat ny, GLfloat nz )
-{
-   NORMALF(nx, ny, nz);
-}
-
-
-static void GLAPIENTRY
-_tnl_Normal3fv( const GLfloat *v )
-{
-   NORMALF( v[0], v[1], v[2] );
-}
-
-
-
-#define TEXCOORD1(s)                           \
-{                                              \
-   GET_IMMEDIATE;                              \
-   GLuint count = IM->Count;                   \
-   GLfloat *tc;                                        \
-   IM->Flag[count] |= VERT_BIT_TEX0;           \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0);   \
-   tc = IM->Attrib[VERT_ATTRIB_TEX0][count];   \
-   ASSIGN_4V(tc,s,0,0,1);                      \
-}
-
-#define TEXCOORD2(s, t)                                \
-{                                              \
-   GET_IMMEDIATE;                              \
-   GLuint count = IM->Count;                   \
-   GLfloat *tc;                                        \
-   IM->Flag[count] |= VERT_BIT_TEX0;           \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0);   \
-   tc = IM->Attrib[VERT_ATTRIB_TEX0][count];   \
-   ASSIGN_4V(tc, s, t, 0, 1);                  \
-}
-
-#define TEXCOORD3(s, t, u)                     \
-{                                              \
-   GET_IMMEDIATE;                              \
-   GLuint count = IM->Count;                   \
-   GLfloat *tc;                                        \
-   IM->Flag[count] |= VERT_BIT_TEX0;           \
-   IM->TexSize |= TEX_0_SIZE_3;                        \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0);   \
-   tc = IM->Attrib[VERT_ATTRIB_TEX0][count];   \
-   ASSIGN_4V(tc, s, t, u, 1);                  \
-}
-
-#define TEXCOORD4(s, t, u, v)                  \
-{                                              \
-   GET_IMMEDIATE;                              \
-   GLuint count = IM->Count;                   \
-   GLfloat *tc;                                        \
-   IM->Flag[count] |= VERT_BIT_TEX0;           \
-   IM->TexSize |= TEX_0_SIZE_4;                        \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0);   \
-   tc = IM->Attrib[VERT_ATTRIB_TEX0][count];   \
-   ASSIGN_4V(tc, s, t, u, v);                  \
-}
-
-#if defined(USE_IEEE)
-#define TEXCOORD2F(s, t)                               \
-{                                                      \
-   GET_IMMEDIATE;                                      \
-   GLuint count = IM->Count;                           \
-   fi_type *tc;                                                \
-   IM->Flag[count] |= VERT_BIT_TEX0;                   \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0);           \
-   tc = (fi_type *)IM->Attrib[VERT_ATTRIB_TEX0][count];        \
-   tc[0].i = ((fi_type *)&(s))->i;                     \
-   tc[1].i = ((fi_type *)&(t))->i;                     \
-   tc[2].i = 0;                                                \
-   tc[3].i = IEEE_ONE;                                 \
-}
-#else
-#define TEXCOORD2F TEXCOORD2
-#endif
-
-static void GLAPIENTRY
-_tnl_TexCoord1f( GLfloat s )
-{
-   TEXCOORD1(s);
-}
-
-
-static void GLAPIENTRY
-_tnl_TexCoord2f( GLfloat s, GLfloat t )
-{
-   TEXCOORD2F(s, t);
-}
-
-
-static void GLAPIENTRY
-_tnl_TexCoord3f( GLfloat s, GLfloat t, GLfloat r )
-{
-   TEXCOORD3(s, t, r);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord4f( GLfloat s, GLfloat t, GLfloat r, GLfloat q )
-{
-   TEXCOORD4(s, t, r, q)
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord1fv( const GLfloat *v )
-{
-   TEXCOORD1(v[0]);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord2fv( const GLfloat *v )
-{
-   TEXCOORD2F(v[0], v[1]);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord3fv( const GLfloat *v )
-{
-   TEXCOORD3(v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-_tnl_TexCoord4fv( const GLfloat *v )
-{
-   TEXCOORD4(v[0], v[1], v[2], v[3]);
-}
-
-
-
-/* KW: Run into bad problems in vertex copying if we don't fully pad
- *     the incoming vertices.
- */
-#define VERTEX2(IM, x,y)                               \
-{                                                      \
-   GLuint count = IM->Count++;                         \
-   GLfloat *dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
-   IM->Flag[count] |= VERT_BIT_POS;                    \
-   ASSIGN_4V(dest, x, y, 0, 1);                                \
-   /*ASSERT(IM->Flag[IM->Count]==0);*/                 \
-   if (count == IMM_MAXDATA - 1)                       \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-#define VERTEX3(IM,x,y,z)                              \
-{                                                      \
-   GLuint count = IM->Count++;                         \
-   GLfloat *dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
-   IM->Flag[count] |= VERT_BITS_OBJ_23;                        \
-   ASSIGN_4V(dest, x, y, z, 1);                                \
-   /*ASSERT(IM->Flag[IM->Count]==0);*/                 \
-   if (count == IMM_MAXDATA - 1)                       \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-#define VERTEX4(IM, x,y,z,w)                           \
-{                                                      \
-   GLuint count = IM->Count++;                         \
-   GLfloat *dest = IM->Attrib[VERT_ATTRIB_POS][count]; \
-   IM->Flag[count] |= VERT_BITS_OBJ_234;               \
-   ASSIGN_4V(dest, x, y, z, w);                                \
-   if (count == IMM_MAXDATA - 1)                       \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-#if defined(USE_IEEE)
-#define VERTEX2F(IM, x, y)                                             \
-{                                                                      \
-   GLuint count = IM->Count++;                                         \
-   fi_type *dest = (fi_type *)IM->Attrib[VERT_ATTRIB_POS][count];      \
-   IM->Flag[count] |= VERT_BIT_POS;                                    \
-   dest[0].i = ((fi_type *)&(x))->i;                                   \
-   dest[1].i = ((fi_type *)&(y))->i;                                   \
-   dest[2].i = 0;                                                      \
-   dest[3].i = IEEE_ONE;                                               \
-   /*ASSERT(IM->Flag[IM->Count]==0);*/                                 \
-   if (count == IMM_MAXDATA - 1)                                       \
-      _tnl_flush_immediate( NULL, IM );                                        \
-}
-#else
-#define VERTEX2F VERTEX2
-#endif
-
-#if defined(USE_IEEE)
-#define VERTEX3F(IM, x, y, z)                                          \
-{                                                                      \
-   GLuint count = IM->Count++;                                         \
-   fi_type *dest = (fi_type *)IM->Attrib[VERT_ATTRIB_POS][count];      \
-   IM->Flag[count] |= VERT_BITS_OBJ_23;                                        \
-   dest[0].i = ((fi_type *)&(x))->i;                                   \
-   dest[1].i = ((fi_type *)&(y))->i;                                   \
-   dest[2].i = ((fi_type *)&(z))->i;                                   \
-   dest[3].i = IEEE_ONE;                                               \
-   /*ASSERT(IM->Flag[IM->Count]==0);*/                                 \
-   if (count == IMM_MAXDATA - 1)                                       \
-      _tnl_flush_immediate( NULL, IM );                                        \
-}
-#else
-#define VERTEX3F VERTEX3
-#endif
-
-#if defined(USE_IEEE)
-#define VERTEX4F(IM, x, y, z, w)                                       \
-{                                                                      \
-   GLuint count = IM->Count++;                                         \
-   fi_type *dest = (fi_type *)IM->Attrib[VERT_ATTRIB_POS][count];      \
-   IM->Flag[count] |= VERT_BITS_OBJ_234;                               \
-   dest[0].i = ((fi_type *)&(x))->i;                                   \
-   dest[1].i = ((fi_type *)&(y))->i;                                   \
-   dest[2].i = ((fi_type *)&(z))->i;                                   \
-   dest[3].i = ((fi_type *)&(w))->i;                                   \
-   if (count == IMM_MAXDATA - 1)                                       \
-      _tnl_flush_immediate( NULL, IM );                                        \
-}
-#else
-#define VERTEX4F VERTEX4
-#endif
-
-
-
-static void GLAPIENTRY
-_tnl_Vertex2f( GLfloat x, GLfloat y )
-{
-   GET_IMMEDIATE;
-   VERTEX2F( IM, x, y );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex3f( GLfloat x, GLfloat y, GLfloat z )
-{
-   GET_IMMEDIATE;
-   VERTEX3F( IM, x, y, z );
-}
-static void GLAPIENTRY
-_tnl_Vertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
-{
-   GET_IMMEDIATE;
-   VERTEX4F( IM, x, y, z, w );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex2fv( const GLfloat *v )
-{
-   GET_IMMEDIATE;
-   VERTEX2F( IM, v[0], v[1] );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex3fv( const GLfloat *v )
-{
-   GET_IMMEDIATE;
-   VERTEX3F( IM, v[0], v[1], v[2] );
-}
-
-static void GLAPIENTRY
-_tnl_Vertex4fv( const GLfloat *v )
-{
-   GET_IMMEDIATE;
-   VERTEX4F( IM, v[0], v[1], v[2], v[3] );
-}
-
-
-
-
-/*
- * GL_ARB_multitexture
- *
- * Note: the multitexture spec says that specifying an invalid target
- * has undefined results and does not have to generate an error.  Just
- * don't crash.  We no-op on invalid targets.
- */
-
-#define MAX_TARGET (GL_TEXTURE0_ARB + MAX_TEXTURE_COORD_UNITS)
-
-#define MULTI_TEXCOORD1(target, s)                             \
-{                                                              \
-   GET_IMMEDIATE;                                              \
-   const GLuint texunit = target - GL_TEXTURE0_ARB;            \
-   if (texunit < IM->MaxTextureUnits) {                                \
-      const GLuint count = IM->Count;                          \
-      GLfloat *tc;                                             \
-      CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit);      \
-      tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count];      \
-      ASSIGN_4V(tc, s, 0.0F, 0.0F, 1.0F);                      \
-      IM->Flag[count] |= VERT_BIT_TEX(texunit);                        \
-   }                                                           \
-}
-
-#define MULTI_TEXCOORD2(target, s, t)                          \
-{                                                              \
-   GET_IMMEDIATE;                                              \
-   const GLuint texunit = target - GL_TEXTURE0_ARB;            \
-   if (texunit < IM->MaxTextureUnits) {                                \
-      const GLuint count = IM->Count;                          \
-      GLfloat *tc;                                             \
-      CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit);      \
-      tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count];      \
-      ASSIGN_4V(tc, s, t, 0.0F, 1.0F);                         \
-      IM->Flag[count] |= VERT_BIT_TEX(texunit);                        \
-   }                                                           \
-}
-
-#define MULTI_TEXCOORD3(target, s, t, u)                       \
-{                                                              \
-   GET_IMMEDIATE;                                              \
-   const GLuint texunit = target - GL_TEXTURE0_ARB;            \
-   if (texunit < IM->MaxTextureUnits) {                                \
-      const GLuint count = IM->Count;                          \
-      GLfloat *tc;                                             \
-      CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit);      \
-      tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count];      \
-      ASSIGN_4V(tc, s, t, u, 1.0F);                            \
-      IM->Flag[count] |= VERT_BIT_TEX(texunit);                        \
-      IM->TexSize |= TEX_SIZE_3(texunit);                      \
-   }                                                           \
-}
-
-#define MULTI_TEXCOORD4(target, s, t, u, v)                    \
-{                                                              \
-   GET_IMMEDIATE;                                              \
-   const GLuint texunit = target - GL_TEXTURE0_ARB;            \
-   if (texunit < IM->MaxTextureUnits) {                                \
-      const GLuint count = IM->Count;                          \
-      GLfloat *tc;                                             \
-      CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit);      \
-      tc = IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count];      \
-      ASSIGN_4V(tc, s, t, u, v);                               \
-      IM->Flag[count] |= VERT_BIT_TEX(texunit);                        \
-      IM->TexSize |= TEX_SIZE_4(texunit);                      \
-   }                                                           \
-}
-
-#if defined(USE_IEEE)
-#define MULTI_TEXCOORD2F(target, s, t)                                 \
-{                                                                      \
-   GET_IMMEDIATE;                                                      \
-   const GLuint texunit = target - GL_TEXTURE0_ARB;                    \
-   if (texunit < IM->MaxTextureUnits) {                                        \
-      const GLuint count = IM->Count;                                  \
-      fi_type *tc;                                                     \
-      CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_TEX0 + texunit);              \
-      tc = (fi_type *)IM->Attrib[VERT_ATTRIB_TEX0 + texunit][count];   \
-      IM->Flag[count] |= VERT_BIT_TEX(texunit);                                \
-      tc[0].i = ((fi_type *)&(s))->i;                                  \
-      tc[1].i = ((fi_type *)&(t))->i;                                  \
-      tc[2].i = 0;                                                     \
-      tc[3].i = IEEE_ONE;                                              \
-   }                                                                   \
-}
-#else
-#define MULTI_TEXCOORD2F MULTI_TEXCOORD2
-#endif
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord1fARB(GLenum target, GLfloat s)
-{
-   MULTI_TEXCOORD1( target, s );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord1fvARB(GLenum target, const GLfloat *v)
-{
-   MULTI_TEXCOORD1( target, v[0] );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord2fARB(GLenum target, GLfloat s, GLfloat t)
-{
-   MULTI_TEXCOORD2F( target, s, t );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord2fvARB(GLenum target, const GLfloat *v)
-{
-   MULTI_TEXCOORD2F( target, v[0], v[1] );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord3fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r)
-{
-   MULTI_TEXCOORD3( target, s, t, r );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord3fvARB(GLenum target, const GLfloat *v)
-{
-   MULTI_TEXCOORD3( target, v[0], v[1], v[2] );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord4fARB(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q)
-{
-   MULTI_TEXCOORD4( target, s, t, r, q );
-}
-
-static void GLAPIENTRY
-_tnl_MultiTexCoord4fvARB(GLenum target, const GLfloat *v)
-{
-   MULTI_TEXCOORD4( target, v[0], v[1], v[2], v[3] );
-}
-
-
-
-/* KW: Because the eval values don't become 'current', fixup will flow
- *     through these vertices, and then evaluation will write on top
- *     of the fixup results.
- *
- *     Note: using Obj to hold eval coord data.
- */
-#define EVALCOORD1(IM, x)                              \
-{                                                      \
-   const GLuint count = IM->Count++;                   \
-   GLfloat *dest;                                      \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS);            \
-   dest = IM->Attrib[VERT_ATTRIB_POS][count];          \
-   IM->Flag[count] |= VERT_BIT_EVAL_C1;                        \
-   ASSIGN_4V(dest, x, 0, 0, 1);                                \
-   if (count == IMM_MAXDATA-1)                         \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-#define EVALCOORD2(IM, x, y)                           \
-{                                                      \
-   const GLuint count = IM->Count++;                   \
-   GLfloat *dest;                                      \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS);            \
-   dest = IM->Attrib[VERT_ATTRIB_POS][count];          \
-   IM->Flag[count] |= VERT_BIT_EVAL_C2;                        \
-   ASSIGN_4V(dest, x, y, 0, 1);                                \
-   if (count == IMM_MAXDATA-1)                         \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-#define EVALPOINT1(IM, x)                              \
-{                                                      \
-   const GLuint count = IM->Count++;                   \
-   GLfloat *dest;                                      \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS);            \
-   dest = IM->Attrib[VERT_ATTRIB_POS][count];          \
-   IM->Flag[count] |= VERT_BIT_EVAL_P1;                        \
-   ASSIGN_4V(dest, x, 0, 0, 1);                                \
-   if (count == IMM_MAXDATA-1)                         \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-#define EVALPOINT2(IM, x, y)                           \
-{                                                      \
-   const GLuint count = IM->Count++;                   \
-   GLfloat *dest;                                      \
-   CHECK_ATTRIB_ARRAY(IM, VERT_ATTRIB_POS);            \
-   dest = IM->Attrib[VERT_ATTRIB_POS][count];          \
-   IM->Flag[count] |= VERT_BIT_EVAL_P2;                        \
-   ASSIGN_4V(dest, x, y, 0, 1);                                \
-   if (count == IMM_MAXDATA-1)                         \
-      _tnl_flush_immediate( NULL, IM );                        \
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord1f( GLfloat u )
-{
-   GET_IMMEDIATE;
-   EVALCOORD1( IM, u );
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord1fv( const GLfloat *u )
-{
-   GET_IMMEDIATE;
-   EVALCOORD1( IM, (GLfloat) *u );
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord2f( GLfloat u, GLfloat v )
-{
-   GET_IMMEDIATE;
-   EVALCOORD2( IM, u, v );
-}
-
-static void GLAPIENTRY
-_tnl_EvalCoord2fv( const GLfloat *u )
-{
-   GET_IMMEDIATE;
-   EVALCOORD2( IM, u[0], u[1] );
-}
-
-
-static void GLAPIENTRY
-_tnl_EvalPoint1( GLint i )
-{
-   GET_IMMEDIATE;
-   EVALPOINT1( IM, (GLfloat) i );
-}
-
-
-static void GLAPIENTRY
-_tnl_EvalPoint2( GLint i, GLint j )
-{
-   GET_IMMEDIATE;
-   EVALPOINT2( IM, (GLfloat) i, (GLfloat) j );
-}
-
-
-/* Need to use the default array-elt outside begin/end for strict
- * conformance.
- * XXX If ctx->Const.CheckArrayBounds is true, we need to test i against
- * ctx->Array._MaxElement
- */
-#define ARRAY_ELT( IM, i )                     \
-{                                              \
-   GLuint count = IM->Count;                   \
-   IM->Elt[count] = i;                         \
-   IM->Flag[count] &= IM->ArrayEltFlags;       \
-   IM->Flag[count] |= VERT_BIT_ELT;            \
-   IM->FlushElt = IM->ArrayEltFlush;           \
-   IM->Count += IM->ArrayEltIncr;              \
-   if (IM->Count == IMM_MAXDATA)               \
-      _tnl_flush_immediate( NULL, IM );                \
-}
-
-
-static void GLAPIENTRY
-_tnl_ArrayElement( GLint i )
-{
-   GET_IMMEDIATE;
-   ARRAY_ELT( IM, i );
-}
-
-
-/* Internal functions.  These are safe to use providing either:
- *
- *    - It is determined that a display list is not being compiled, or
- *    if so that these commands won't be compiled into the list (see
- *    t_eval.c for an example).
- *
- *    - _tnl_hard_begin() is used instead of _tnl_[bB]egin, and tested
- *    for a GL_TRUE return value.  See _tnl_Rectf, below.
- */
-void
-_tnl_eval_coord1f( GLcontext *CC, GLfloat u )
-{
-   struct immediate *i = TNL_CURRENT_IM(CC);
-   EVALCOORD1( i, u );
-}
-
-void
-_tnl_eval_coord2f( GLcontext *CC, GLfloat u, GLfloat v )
-{
-   struct immediate *i = TNL_CURRENT_IM(CC);
-   EVALCOORD2( i, u, v );
-}
-
-
-
-
-/*
- * NV_vertex_program
- */
-
-static void GLAPIENTRY
-_tnl_VertexAttrib4fNV( GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w )
-{
-   if (index < VERT_ATTRIB_MAX) {
-      GET_IMMEDIATE;
-      const GLuint count = IM->Count;
-      GLfloat *attrib;
-      CHECK_ATTRIB_ARRAY(IM, index);
-      attrib = IM->Attrib[index][count];
-      ASSIGN_4V(attrib, x, y, z, w);
-      IM->Flag[count] |= (1 << index);
-      if (index == 0) {
-         IM->Count++;
-         if (count == IMM_MAXDATA - 1)
-            _tnl_flush_immediate( NULL, IM );
-      }
-   }
-   else {
-      GET_CURRENT_CONTEXT(ctx);
-      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribNV(index > 15)");
-   }
-}   
-
-static void GLAPIENTRY
-_tnl_VertexAttrib4fvNV( GLuint index, const GLfloat *v )
-{
-   if (index < VERT_ATTRIB_MAX) {
-      GET_IMMEDIATE;
-      const GLuint count = IM->Count;
-      GLfloat *attrib;
-      CHECK_ATTRIB_ARRAY(IM, index);
-      attrib = IM->Attrib[index][count];
-      COPY_4V(attrib, v);
-      IM->Flag[count] |= (1 << index);
-      if (index == 0) {
-         IM->Count++;
-         if (count == IMM_MAXDATA - 1)
-            _tnl_flush_immediate( NULL, IM );
-      }
-   }
-   else {
-      GET_CURRENT_CONTEXT(ctx);
-      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribNV(index > 15)");
-   }
-}   
-
-
-/* Execute a glRectf() function.  _tnl_hard_begin() ensures the check
- * on outside_begin_end is executed even in compiled lists.  These
- * vertices can now participate in the same immediate as regular ones,
- * even in most display lists.  
- */
-static void GLAPIENTRY
-_tnl_Rectf( GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2 )
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (_tnl_hard_begin( ctx, GL_QUADS )) {
-      glVertex2f( x1, y1 );
-      glVertex2f( x2, y1 );
-      glVertex2f( x2, y2 );
-      glVertex2f( x1, y2 );
-      glEnd();
-   }
-}
-
-static void GLAPIENTRY
-_tnl_Materialfv( GLenum face, GLenum pname, const GLfloat *params )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   TNLcontext *tnl = TNL_CONTEXT(ctx);
-   struct immediate *IM = TNL_CURRENT_IM(ctx);
-   GLuint count = IM->Count;
-   struct gl_material *mat;
-   GLuint bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, "Materialfv");
-   int i, nr;
-
-   if (bitmask == 0)
-      return;
-   
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "_tnl_Materialfv\n");
-
-   if (tnl->IsolateMaterials &&
-       !(IM->BeginState & VERT_BEGIN_1)) /* heuristic */
-   {
-      _tnl_flush_immediate( ctx, IM );      
-      IM = TNL_CURRENT_IM(ctx);
-      count = IM->Count;
-   }
-
-   if (!(IM->Flag[count] & VERT_BIT_MATERIAL)) {
-      if (!IM->Material) {
-        IM->Material = (struct gl_material *)
-            MALLOC( sizeof(struct gl_material) * IMM_SIZE );
-        IM->MaterialMask = (GLuint *) MALLOC( sizeof(GLuint) * IMM_SIZE );
-        IM->MaterialMask[IM->LastMaterial] = 0;
-      }
-      else if (IM->MaterialOrMask & ~bitmask) {
-        _mesa_copy_materials( &IM->Material[count],
-                              &IM->Material[IM->LastMaterial],
-                              IM->MaterialOrMask & ~bitmask );
-      }
-
-      IM->Flag[count] |= VERT_BIT_MATERIAL;
-      IM->MaterialMask[count] = 0;
-      IM->MaterialAndMask &= IM->MaterialMask[IM->LastMaterial];
-      IM->LastMaterial = count;
-   }
-
-   IM->MaterialOrMask |= bitmask;
-   IM->MaterialMask[count] |= bitmask;
-   mat = &IM->Material[count];
-
-   switch (face) {
-   case GL_SHININESS: nr = 1; break;
-   case GL_COLOR_INDEXES: nr = 3; break;
-   default: nr = 4 ; break;
-   }
-
-   for (i = 0 ; i < MAT_ATTRIB_MAX ; i++) 
-      if (bitmask & (1<<i))
-        COPY_SZ_4V( mat->Attrib[i], nr, params ); 
-
-   if (tnl->IsolateMaterials && 
-       !(IM->BeginState & VERT_BEGIN_1)) /* heuristic */
-   {
-      _tnl_flush_immediate( ctx, IM );
-   }
-}
-
-void _tnl_imm_vtxfmt_init( GLcontext *ctx )
-{
-   GLvertexformat *vfmt = &(TNL_CONTEXT(ctx)->vtxfmt);
-
-   /* All begin/end operations are handled by this vertex format:
-    */
-   vfmt->ArrayElement = _tnl_ArrayElement;
-   vfmt->Begin = _tnl_Begin;
-   vfmt->Color3f = _tnl_Color3f;
-   vfmt->Color3fv = _tnl_Color3fv;
-   vfmt->Color3ub = _tnl_Color3ub;
-   vfmt->Color3ubv = _tnl_Color3ubv;
-   vfmt->Color4f = _tnl_Color4f;
-   vfmt->Color4fv = _tnl_Color4fv;
-   vfmt->Color4ub = _tnl_Color4ub;
-   vfmt->Color4ubv = _tnl_Color4ubv;
-   vfmt->EdgeFlag = _tnl_EdgeFlag;
-   vfmt->EdgeFlagv = _tnl_EdgeFlagv;
-   vfmt->End = _tnl_End;
-   vfmt->EvalCoord1f = _tnl_EvalCoord1f;
-   vfmt->EvalCoord1fv = _tnl_EvalCoord1fv;
-   vfmt->EvalCoord2f = _tnl_EvalCoord2f;
-   vfmt->EvalCoord2fv = _tnl_EvalCoord2fv;
-   vfmt->EvalPoint1 = _tnl_EvalPoint1;
-   vfmt->EvalPoint2 = _tnl_EvalPoint2;
-   vfmt->FogCoordfEXT = _tnl_FogCoordfEXT;
-   vfmt->FogCoordfvEXT = _tnl_FogCoordfvEXT;
-   vfmt->Indexi = _tnl_Indexi;
-   vfmt->Indexiv = _tnl_Indexiv;
-   vfmt->Materialfv = _tnl_Materialfv;
-   vfmt->MultiTexCoord1fARB = _tnl_MultiTexCoord1fARB;
-   vfmt->MultiTexCoord1fvARB = _tnl_MultiTexCoord1fvARB;
-   vfmt->MultiTexCoord2fARB = _tnl_MultiTexCoord2fARB;
-   vfmt->MultiTexCoord2fvARB = _tnl_MultiTexCoord2fvARB;
-   vfmt->MultiTexCoord3fARB = _tnl_MultiTexCoord3fARB;
-   vfmt->MultiTexCoord3fvARB = _tnl_MultiTexCoord3fvARB;
-   vfmt->MultiTexCoord4fARB = _tnl_MultiTexCoord4fARB;
-   vfmt->MultiTexCoord4fvARB = _tnl_MultiTexCoord4fvARB;
-   vfmt->Normal3f = _tnl_Normal3f;
-   vfmt->Normal3fv = _tnl_Normal3fv;
-   vfmt->SecondaryColor3fEXT = _tnl_SecondaryColor3fEXT;
-   vfmt->SecondaryColor3fvEXT = _tnl_SecondaryColor3fvEXT;
-   vfmt->SecondaryColor3ubEXT = _tnl_SecondaryColor3ubEXT;
-   vfmt->SecondaryColor3ubvEXT = _tnl_SecondaryColor3ubvEXT;
-   vfmt->TexCoord1f = _tnl_TexCoord1f;
-   vfmt->TexCoord1fv = _tnl_TexCoord1fv;
-   vfmt->TexCoord2f = _tnl_TexCoord2f;
-   vfmt->TexCoord2fv = _tnl_TexCoord2fv;
-   vfmt->TexCoord3f = _tnl_TexCoord3f;
-   vfmt->TexCoord3fv = _tnl_TexCoord3fv;
-   vfmt->TexCoord4f = _tnl_TexCoord4f;
-   vfmt->TexCoord4fv = _tnl_TexCoord4fv;
-   vfmt->Vertex2f = _tnl_Vertex2f;
-   vfmt->Vertex2fv = _tnl_Vertex2fv;
-   vfmt->Vertex3f = _tnl_Vertex3f;
-   vfmt->Vertex3fv = _tnl_Vertex3fv;
-   vfmt->Vertex4f = _tnl_Vertex4f;
-   vfmt->Vertex4fv = _tnl_Vertex4fv;
-   vfmt->VertexAttrib4fNV = _tnl_VertexAttrib4fNV;
-   vfmt->VertexAttrib4fvNV = _tnl_VertexAttrib4fvNV;
-
-   /* Outside begin/end functions (from t_varray.c, t_eval.c, ...):
-    */
-   vfmt->Rectf = _tnl_Rectf;
-
-   /* Just use the core function:
-    */
-   vfmt->CallList = _mesa_CallList;
-
-   vfmt->prefer_float_colors = GL_FALSE;
-}
diff --git a/src/mesa/tnl/t_imm_api.h b/src/mesa/tnl/t_imm_api.h
deleted file mode 100644 (file)
index a61b0d0..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-
-/*
- * Mesa 3-D graphics library
- * Version:  4.1
- *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#ifndef _T_VTXFMT_H
-#define _T_VTXFMT_H
-
-#include "mtypes.h"
-#include "t_context.h"
-
-
-extern void GLAPIENTRY _tnl_save_Begin( GLenum mode );
-extern void GLAPIENTRY _tnl_Begin( GLenum mode );
-
-extern void GLAPIENTRY _tnl_Begin( GLenum mode );
-
-extern void GLAPIENTRY _tnl_End(void);
-
-
-/* TNL-private internal functions for building higher-level operations:
- */
-extern GLboolean _tnl_hard_begin( GLcontext *ctx, GLenum p );
-extern void _tnl_end_ctx( GLcontext *ctx );
-extern void _tnl_vertex2f( GLcontext *ctx, GLfloat x, GLfloat y );
-extern void _tnl_eval_coord1f( GLcontext *CC, GLfloat u );
-extern void _tnl_eval_coord2f( GLcontext *CC, GLfloat u, GLfloat v );
-extern void _tnl_array_element( GLcontext *CC, GLint i );
-
-/* Initialize our part of the vtxfmt struct:
- */
-extern void _tnl_imm_vtxfmt_init( GLcontext *ctx );
-
-
-#endif
diff --git a/src/mesa/tnl/t_imm_elt.c b/src/mesa/tnl/t_imm_elt.c
deleted file mode 100644 (file)
index 50f97a3..0000000
+++ /dev/null
@@ -1,744 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  5.1
- *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Keith Whitwell <keith@tungstengraphics.com>
- */
-
-#include "glheader.h"
-#include "colormac.h"
-#include "context.h"
-#include "imports.h"
-#include "mtypes.h"
-
-#include "math/m_translate.h"
-
-#include "t_context.h"
-#include "t_imm_elt.h"
-
-
-
-typedef void (*trans_elt_1ui_func)(GLuint *to,
-                                  CONST void *ptr,
-                                  GLuint stride,
-                                  const GLuint *flags,
-                                  const GLuint *elts,
-                                  GLuint match,
-                                  GLuint start,
-                                  GLuint n );
-
-typedef void (*trans_elt_1ub_func)(GLubyte *to,
-                                  CONST void *ptr,
-                                  GLuint stride,
-                                  const GLuint *flags,
-                                  const GLuint *elts,
-                                  GLuint match,
-                                  GLuint start,
-                                  GLuint n );
-
-typedef void (*trans_elt_4f_func)(GLfloat (*to)[4],
-                                 CONST void *ptr,
-                                 GLuint stride,
-                                 const GLuint *flags,
-                                 const GLuint *elts,
-                                 GLuint match,
-                                 GLuint start,
-                                 GLuint n );
-
-
-
-static trans_elt_1ui_func _tnl_trans_elt_1ui_tab[MAX_TYPES];
-static trans_elt_1ub_func _tnl_trans_elt_1ub_tab[MAX_TYPES];
-static trans_elt_4f_func  _tnl_trans_elt_4f_tab[5][MAX_TYPES];
-static trans_elt_4f_func  _tnl_trans_elt_4fc_tab[5][MAX_TYPES];
-
-
-#define PTR_ELT(ptr, elt) (((SRC *)ptr)[elt])
-
-
-
-/* Code specific to array element implementation.  There is a small
- * subtlety in the bits CHECK() tests, and the way bits are set in
- * glArrayElement which ensures that if, eg, in the case that the
- * vertex array is disabled and normal array is enabled, and we get
- * either sequence:
- *
- * ArrayElement()    OR   Normal()
- * Normal()               ArrayElement()
- * Vertex()               Vertex()
- *
- * That the correct value for normal is used.
- */
-#define TAB(x) _tnl_trans_elt##x##_tab
-#define ARGS   const GLuint *flags, const GLuint *elts, GLuint match, \
-               GLuint start, GLuint n
-#define SRC_START  0
-#define DST_START  start
-#define CHECK  if ((flags[i]&match) == VERT_BIT_ELT)
-#define NEXT_F  (void)1
-#define NEXT_F2 f = first + elts[i] * stride;
-
-
-/* GL_BYTE
- */
-#define SRC GLbyte
-#define SRC_IDX TYPE_IDX(GL_BYTE)
-#define TRX_4F(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_4FC(f,n)   BYTE_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_UB(ub, f,n)  ub = BYTE_TO_UBYTE( PTR_ELT(f,n) )
-#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
-
-
-#define SZ 4
-#define INIT init_trans_4_GLbyte_elt
-#define DEST_4F trans_4_GLbyte_4f_elt
-#define DEST_4FC trans_4_GLbyte_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLbyte_elt
-#define DEST_4F trans_3_GLbyte_4f_elt
-#define DEST_4FC trans_3_GLbyte_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLbyte_elt
-#define DEST_4F trans_2_GLbyte_4f_elt
-#define DEST_4FC trans_2_GLbyte_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLbyte_elt
-#define DEST_4F trans_1_GLbyte_4f_elt
-#define DEST_4FC trans_1_GLbyte_4fc_elt
-#define DEST_1UB trans_1_GLbyte_1ub_elt
-#define DEST_1UI trans_1_GLbyte_1ui_elt
-#include "math/m_trans_tmp.h"
-
-#undef SRC
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-#undef SRC_IDX
-
-/* GL_UNSIGNED_BYTE
- */
-#define SRC GLubyte
-#define SRC_IDX TYPE_IDX(GL_UNSIGNED_BYTE)
-#define TRX_4F(f,n)         UBYTE_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_4FC(f,n)        UBYTE_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_UB(ub, f,n)             ub = PTR_ELT(f,n)
-#define TRX_UI(f,n)          (GLuint)PTR_ELT(f,n)
-
-/* 4ub->4ub handled in special case below.
- */
-#define SZ 4
-#define INIT init_trans_4_GLubyte_elt
-#define DEST_4F trans_4_GLubyte_4f_elt
-#define DEST_4FC trans_4_GLubyte_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLubyte_elt
-#define DEST_4F trans_3_GLubyte_4f_elt
-#define DEST_4FC trans_3_GLubyte_4fc_elt
-#include "math/m_trans_tmp.h"
-
-
-#define SZ 1
-#define INIT init_trans_1_GLubyte_elt
-#define DEST_4F  trans_1_GLubyte_4f_elt
-#define DEST_4FC  trans_1_GLubyte_4fc_elt
-#define DEST_1UB trans_1_GLubyte_1ub_elt
-#define DEST_1UI trans_1_GLubyte_1ui_elt
-#include "math/m_trans_tmp.h"
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-
-/* GL_SHORT
- */
-#define SRC GLshort
-#define SRC_IDX TYPE_IDX(GL_SHORT)
-#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
-#define TRX_4FC(f,n)   SHORT_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_UB(ub, f,n)  ub = SHORT_TO_UBYTE(PTR_ELT(f,n))
-#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
-
-
-#define SZ  4
-#define INIT init_trans_4_GLshort_elt
-#define DEST_4F trans_4_GLshort_4f_elt
-#define DEST_4FC trans_4_GLshort_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLshort_elt
-#define DEST_4F trans_3_GLshort_4f_elt
-#define DEST_4FC trans_3_GLshort_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLshort_elt
-#define DEST_4F trans_2_GLshort_4f_elt
-#define DEST_4FC trans_2_GLshort_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLshort_elt
-#define DEST_4F trans_1_GLshort_4f_elt
-#define DEST_4FC trans_1_GLshort_4fc_elt
-#define DEST_1UB trans_1_GLshort_1ub_elt
-#define DEST_1UI trans_1_GLshort_1ui_elt
-#include "math/m_trans_tmp.h"
-
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-
-/* GL_UNSIGNED_SHORT
- */
-#define SRC GLushort
-#define SRC_IDX TYPE_IDX(GL_UNSIGNED_SHORT)
-#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
-#define TRX_4FC(f,n)   USHORT_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_UB(ub,f,n)  ub = (GLubyte) (PTR_ELT(f,n) >> 8)
-#define TRX_UI(f,n)  (GLuint)   PTR_ELT(f,n)
-
-
-#define SZ 4
-#define INIT init_trans_4_GLushort_elt
-#define DEST_4F trans_4_GLushort_4f_elt
-#define DEST_4FC trans_4_GLushort_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLushort_elt
-#define DEST_4F trans_3_GLushort_4f_elt
-#define DEST_4FC trans_3_GLushort_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLushort_elt
-#define DEST_4F trans_2_GLushort_4f_elt
-#define DEST_4FC trans_2_GLushort_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLushort_elt
-#define DEST_4F trans_1_GLushort_4f_elt
-#define DEST_4FC trans_1_GLushort_4fc_elt
-#define DEST_1UB trans_1_GLushort_1ub_elt
-#define DEST_1UI trans_1_GLushort_1ui_elt
-#include "math/m_trans_tmp.h"
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-
-/* GL_INT
- */
-#define SRC GLint
-#define SRC_IDX TYPE_IDX(GL_INT)
-#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
-#define TRX_4FC(f,n)   INT_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_UB(ub, f,n)  ub = INT_TO_UBYTE(PTR_ELT(f,n))
-#define TRX_UI(f,n)  (PTR_ELT(f,n) < 0 ? 0 : (GLuint)  PTR_ELT(f,n))
-
-
-#define SZ 4
-#define INIT init_trans_4_GLint_elt
-#define DEST_4F trans_4_GLint_4f_elt
-#define DEST_4FC trans_4_GLint_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLint_elt
-#define DEST_4F trans_3_GLint_4f_elt
-#define DEST_4FC trans_3_GLint_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLint_elt
-#define DEST_4F trans_2_GLint_4f_elt
-#define DEST_4FC trans_2_GLint_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLint_elt
-#define DEST_4F trans_1_GLint_4f_elt
-#define DEST_4FC trans_1_GLint_4fc_elt
-#define DEST_1UB trans_1_GLint_1ub_elt
-#define DEST_1UI trans_1_GLint_1ui_elt
-#include "math/m_trans_tmp.h"
-
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-
-/* GL_UNSIGNED_INT
- */
-#define SRC GLuint
-#define SRC_IDX TYPE_IDX(GL_UNSIGNED_INT)
-#define TRX_4F(f,n)   (GLfloat)( PTR_ELT(f,n) )
-#define TRX_4FC(f,n)   UINT_TO_FLOAT( PTR_ELT(f,n) )
-#define TRX_UB(ub, f,n)  ub = (GLubyte) (PTR_ELT(f,n) >> 24)
-#define TRX_UI(f,n)            PTR_ELT(f,n)
-
-
-#define SZ 4
-#define INIT init_trans_4_GLuint_elt
-#define DEST_4F trans_4_GLuint_4f_elt
-#define DEST_4FC trans_4_GLuint_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLuint_elt
-#define DEST_4F trans_3_GLuint_4f_elt
-#define DEST_4FC trans_3_GLuint_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLuint_elt
-#define DEST_4F trans_2_GLuint_4f_elt
-#define DEST_4FC trans_2_GLuint_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLuint_elt
-#define DEST_4F trans_1_GLuint_4f_elt
-#define DEST_4FC trans_1_GLuint_4fc_elt
-#define DEST_1UB trans_1_GLuint_1ub_elt
-#define DEST_1UI trans_1_GLuint_1ui_elt
-#include "math/m_trans_tmp.h"
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-
-/* GL_DOUBLE
- */
-#define SRC GLdouble
-#define SRC_IDX TYPE_IDX(GL_DOUBLE)
-#define TRX_4F(f,n)    (GLfloat) PTR_ELT(f,n)
-#define TRX_4FC(f,n)    (GLfloat) PTR_ELT(f,n)
-#define TRX_UB(ub,f,n) UNCLAMPED_FLOAT_TO_UBYTE(ub, PTR_ELT(f,n))
-#define TRX_UI(f,n)    (GLuint) (GLint) PTR_ELT(f,n)
-#define TRX_1F(f,n)    (GLfloat) PTR_ELT(f,n)
-
-
-#define SZ 4
-#define INIT init_trans_4_GLdouble_elt
-#define DEST_4F trans_4_GLdouble_4f_elt
-#define DEST_4FC trans_4_GLdouble_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLdouble_elt
-#define DEST_4F trans_3_GLdouble_4f_elt
-#define DEST_4FC trans_3_GLdouble_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLdouble_elt
-#define DEST_4F trans_2_GLdouble_4f_elt
-#define DEST_4FC trans_2_GLdouble_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLdouble_elt
-#define DEST_4F trans_1_GLdouble_4f_elt
-#define DEST_4FC trans_1_GLdouble_4fc_elt
-#define DEST_1UB trans_1_GLdouble_1ub_elt
-#define DEST_1UI trans_1_GLdouble_1ui_elt
-#include "math/m_trans_tmp.h"
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-/* GL_FLOAT
- */
-#define SRC GLfloat
-#define SRC_IDX TYPE_IDX(GL_FLOAT)
-#define TRX_4F(f,n)    (GLfloat) PTR_ELT(f,n)
-#define TRX_4FC(f,n)    (GLfloat) PTR_ELT(f,n)
-#define TRX_UB(ub,f,n) UNCLAMPED_FLOAT_TO_UBYTE(ub, PTR_ELT(f,n))
-#define TRX_UI(f,n)    (GLuint) (GLint) PTR_ELT(f,n)
-#define TRX_1F(f,n)    (GLfloat) PTR_ELT(f,n)
-
-
-#define SZ 4
-#define INIT init_trans_4_GLfloat_elt
-#define DEST_4F  trans_4_GLfloat_4f_elt
-#define DEST_4FC  trans_4_GLfloat_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 3
-#define INIT init_trans_3_GLfloat_elt
-#define DEST_4F  trans_3_GLfloat_4f_elt
-#define DEST_4FC  trans_3_GLfloat_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 2
-#define INIT init_trans_2_GLfloat_elt
-#define DEST_4F trans_2_GLfloat_4f_elt
-#define DEST_4FC trans_2_GLfloat_4fc_elt
-#include "math/m_trans_tmp.h"
-
-#define SZ 1
-#define INIT init_trans_1_GLfloat_elt
-#define DEST_4F  trans_1_GLfloat_4f_elt
-#define DEST_4FC  trans_1_GLfloat_4fc_elt
-#define DEST_1UB trans_1_GLfloat_1ub_elt
-#define DEST_1UI trans_1_GLfloat_1ui_elt
-#include "math/m_trans_tmp.h"
-
-#undef SRC
-#undef SRC_IDX
-#undef TRX_4F
-#undef TRX_4FC
-#undef TRX_UB
-#undef TRX_UI
-
-
-
-
-static void init_translate_elt(void)
-{
-   MEMSET( TAB(_1ui), 0, sizeof(TAB(_1ui)) );
-   MEMSET( TAB(_1ub), 0, sizeof(TAB(_1ub)) );
-   MEMSET( TAB(_4f),  0, sizeof(TAB(_4f)) );
-   MEMSET( TAB(_4fc),  0, sizeof(TAB(_4fc)) );
-
-   init_trans_4_GLbyte_elt();
-   init_trans_3_GLbyte_elt();
-   init_trans_2_GLbyte_elt();
-   init_trans_1_GLbyte_elt();
-   init_trans_1_GLubyte_elt();
-   init_trans_3_GLubyte_elt();
-   init_trans_4_GLubyte_elt();
-   init_trans_4_GLshort_elt();
-   init_trans_3_GLshort_elt();
-   init_trans_2_GLshort_elt();
-   init_trans_1_GLshort_elt();
-   init_trans_4_GLushort_elt();
-   init_trans_3_GLushort_elt();
-   init_trans_2_GLushort_elt();
-   init_trans_1_GLushort_elt();
-   init_trans_4_GLint_elt();
-   init_trans_3_GLint_elt();
-   init_trans_2_GLint_elt();
-   init_trans_1_GLint_elt();
-   init_trans_4_GLuint_elt();
-   init_trans_3_GLuint_elt();
-   init_trans_2_GLuint_elt();
-   init_trans_1_GLuint_elt();
-   init_trans_4_GLdouble_elt();
-   init_trans_3_GLdouble_elt();
-   init_trans_2_GLdouble_elt();
-   init_trans_1_GLdouble_elt();
-   init_trans_4_GLfloat_elt();
-   init_trans_3_GLfloat_elt();
-   init_trans_2_GLfloat_elt();
-   init_trans_1_GLfloat_elt();
-}
-
-
-#undef TAB
-#undef CLASS
-#undef ARGS
-#undef CHECK
-#ifdef START
-#undef START
-#endif
-
-
-
-void _tnl_imm_elt_init( void )
-{
-   init_translate_elt();
-}
-
-
-static void _tnl_trans_elt_1ui(GLuint *to,
-                       const struct gl_client_array *from,
-                       const GLuint *flags,
-                       const GLuint *elts,
-                       GLuint match,
-                       GLuint start,
-                       GLuint n )
-{
-   const GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
-   _tnl_trans_elt_1ui_tab[TYPE_IDX(from->Type)]( to,
-                                                 fromData,
-                                                 from->StrideB,
-                                                 flags,
-                                                 elts,
-                                                 match,
-                                                 start,
-                                                 n );
-
-}
-
-
-static void _tnl_trans_elt_1ub(GLubyte *to,
-                       const struct gl_client_array *from,
-                       const GLuint *flags,
-                       const GLuint *elts,
-                       GLuint match,
-                       GLuint start,
-                       GLuint n )
-{
-   const GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
-   _tnl_trans_elt_1ub_tab[TYPE_IDX(from->Type)]( to,
-                                                 fromData,
-                                                 from->StrideB,
-                                                 flags,
-                                                 elts,
-                                                 match,
-                                                 start,
-                                                 n );
-
-}
-
-static void _tnl_trans_elt_4f(GLfloat (*to)[4],
-                              const struct gl_client_array *from,
-                              const GLuint *flags,
-                              const GLuint *elts,
-                              GLuint match,
-                              GLuint start,
-                              GLuint n )
-{
-   const GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
-   _tnl_trans_elt_4f_tab[from->Size][TYPE_IDX(from->Type)]( to,
-                                             fromData,
-                                             from->StrideB,
-                                             flags,
-                                             elts,
-                                             match,
-                                             start,
-                                             n );
-
-}
-
-
-static void _tnl_trans_elt_4fc(GLfloat (*to)[4],
-                              const struct gl_client_array *from,
-                              const GLuint *flags,
-                              const GLuint *elts,
-                              GLuint match,
-                              GLuint start,
-                              GLuint n )
-{
-   const GLubyte *fromData = ADD_POINTERS( from->Ptr, from->BufferObj->Data );
-   _tnl_trans_elt_4fc_tab[from->Size][TYPE_IDX(from->Type)]( to,
-                                             fromData,
-                                             from->StrideB,
-                                             flags,
-                                             elts,
-                                             match,
-                                             start,
-                                             n );
-
-}
-
-
-
-
-/* Batch function to translate away all the array elements in the
- * input buffer prior to transform.  Done only the first time a vertex
- * buffer is executed or compiled.
- *
- * KW: Have to do this after each glEnd if arrays aren't locked.
- */
-void _tnl_translate_array_elts( GLcontext *ctx, struct immediate *IM,
-                               GLuint start, GLuint count )
-{
-   GLuint *flags = IM->Flag;
-   const GLuint *elts = IM->Elt;
-   GLuint translate = ctx->Array._Enabled;
-   GLuint translateConventional;
-   GLuint attr;
-
-   if (MESA_VERBOSE & VERBOSE_IMMEDIATE)
-      _mesa_debug(ctx, "exec_array_elements %d .. %d\n", start, count);
-
-   /* XXX It would be nice to replace this code with a loop over the vertex
-    * attributes but there's a fair number of special cases.
-    */
-
-   /* Allocate destination attribute arrays if needed */
-   ASSERT(IM->Attrib[VERT_ATTRIB_POS]);
-   for (attr = 1; attr < VERT_ATTRIB_MAX; attr++) {
-      if ((translate & (1 << attr)) && !IM->Attrib[attr]) {
-         IM->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
-         if (!IM->Attrib[attr]) {
-            _mesa_error(ctx, GL_OUT_OF_MEMORY, "vertex processing2");
-            return;
-         }
-      }
-   }
-
-   translateConventional = translate;
-
-   /*
-    * When vertex program mode is enabled, the generic vertex attribute arrays
-    * have priority over the conventional arrays.  Process those arrays now.
-    * When we're done here, translateConventional will indicate which
-    * conventional arrays still have to be translated when we're done.
-    */
-   if (ctx->VertexProgram.Enabled) {
-      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
-         const GLuint attrBit = 1 << attr;
-         if ((translate & attrBit) && ctx->Array.VertexAttrib[attr].Enabled) {
-            _tnl_trans_elt_4f( IM->Attrib[attr],
-                               &ctx->Array.VertexAttrib[attr],
-                               flags, elts, (VERT_BIT_ELT | attrBit),
-                               start, count);
-            /* special case stuff */
-            if (attr == VERT_ATTRIB_POS) {
-               if (ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Size == 4)
-                  translate |= VERT_BITS_OBJ_234;
-               else if (ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Size == 3)
-                  translate |= VERT_BITS_OBJ_23;
-            }
-            else if (attr >= VERT_ATTRIB_TEX0 && attr <= VERT_ATTRIB_TEX7) {
-               if (ctx->Array.VertexAttrib[attr].Size == 4)
-                  IM->TexSize |= TEX_SIZE_4(attr - VERT_ATTRIB_TEX0);
-               else if (ctx->Array.VertexAttrib[attr].Size == 3)
-                  IM->TexSize |= TEX_SIZE_3(attr - VERT_ATTRIB_TEX0);
-            }
-            /* override the conventional array */
-            translateConventional &= ~attrBit;
-         }
-      }
-   }
-
-   /*
-    * Check which conventional arrays are needed.
-    */
-   if (translateConventional & VERT_BIT_POS) {
-      _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_POS],
-                         &ctx->Array.Vertex,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_POS),
-                         start, count);
-
-      if (ctx->Array.Vertex.Size == 4)
-         translate |= VERT_BITS_OBJ_234;
-      else if (ctx->Array.Vertex.Size == 3)
-         translate |= VERT_BITS_OBJ_23;
-   }
-
-   if (translateConventional & VERT_BIT_NORMAL) {
-      _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_NORMAL],
-                         &ctx->Array.Normal,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_NORMAL),
-                         start, count);
-   }
-
-   if (translateConventional & VERT_BIT_COLOR0) {
-      _tnl_trans_elt_4fc( IM->Attrib[VERT_ATTRIB_COLOR0],
-                         &ctx->Array.Color,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_COLOR0),
-                         start, count);
-   }
-
-   if (translateConventional & VERT_BIT_COLOR1) {
-      _tnl_trans_elt_4fc( IM->Attrib[VERT_ATTRIB_COLOR1],
-                         &ctx->Array.SecondaryColor,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_COLOR1),
-                         start, count);
-   }
-
-   if (translateConventional & VERT_BIT_FOG) {
-      _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_FOG],
-                         &ctx->Array.FogCoord,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_FOG),
-                         start, count);
-   }
-
-   if (translateConventional & VERT_BITS_TEX_ANY) {
-      GLuint i;
-      for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
-        if (translateConventional & VERT_BIT_TEX(i)) {
-            _tnl_trans_elt_4f( IM->Attrib[VERT_ATTRIB_TEX0 + i],
-                               &ctx->Array.TexCoord[i],
-                               flags, elts, (VERT_BIT_ELT|VERT_BIT_TEX(i)),
-                               start, count);
-
-            if (ctx->Array.TexCoord[i].Size == 4)
-               IM->TexSize |= TEX_SIZE_4(i);
-            else if (ctx->Array.TexCoord[i].Size == 3)
-               IM->TexSize |= TEX_SIZE_3(i);
-        }
-   }
-
-   if (translate & VERT_BIT_INDEX)
-      _tnl_trans_elt_1ui( IM->Index,
-                         &ctx->Array.Index,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_INDEX),
-                         start, count);
-
-   if (translate & VERT_BIT_EDGEFLAG)
-      _tnl_trans_elt_1ub( IM->EdgeFlag,
-                         &ctx->Array.EdgeFlag,
-                         flags, elts, (VERT_BIT_ELT|VERT_BIT_EDGEFLAG),
-                         start, count);
-
-   {
-      GLuint i;
-      for (i = start ; i < count ; i++)
-         if (flags[i] & VERT_BIT_ELT)
-            flags[i] |= translate;
-   }
-
-   IM->FlushElt = 0;
-}
diff --git a/src/mesa/tnl/t_imm_eval.c b/src/mesa/tnl/t_imm_eval.c
deleted file mode 100644 (file)
index f72ada7..0000000
+++ /dev/null
@@ -1,868 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version:  5.1
- *
- * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Keith Whitwell <keith@tungstengraphics.com>
- *    Brian Paul - vertex program updates
- */
-
-
-#include "glheader.h"
-#include "colormac.h"
-#include "context.h"
-#include "macros.h"
-#include "imports.h"
-#include "mtypes.h"
-#include "math/m_eval.h"
-
-#include "t_context.h"
-#include "t_imm_debug.h"
-#include "t_imm_eval.h"
-#include "t_imm_exec.h"
-#include "t_imm_fixup.h"
-#include "t_imm_alloc.h"
-
-
-static void eval_points1( GLfloat outcoord[][4],
-                         GLfloat coord[][4],
-                         const GLuint *flags,
-                         GLfloat du, GLfloat u1 )
-{
-   GLuint i;
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & VERT_BITS_EVAL_ANY) {
-        outcoord[i][0] = coord[i][0];
-        outcoord[i][1] = coord[i][1];
-        if (flags[i] & VERT_BIT_EVAL_P1)
-           outcoord[i][0] = coord[i][0] * du + u1;
-      }
-}
-
-static void eval_points2( GLfloat outcoord[][4],
-                         GLfloat coord[][4],
-                         const GLuint *flags,
-                         GLfloat du, GLfloat u1,
-                         GLfloat dv, GLfloat v1 )
-{
-   GLuint i;
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++) {
-      if (flags[i] & VERT_BITS_EVAL_ANY) {
-        outcoord[i][0] = coord[i][0];
-        outcoord[i][1] = coord[i][1];
-        if (flags[i] & VERT_BIT_EVAL_P2) {
-           outcoord[i][0] = coord[i][0] * du + u1;
-           outcoord[i][1] = coord[i][1] * dv + v1;
-        }
-      }
-   }
-}
-
-static const GLubyte dirty_flags[5] = {
-   0,                          /* not possible */
-   VEC_DIRTY_0,
-   VEC_DIRTY_1,
-   VEC_DIRTY_2,
-   VEC_DIRTY_3
-};
-
-
-static void eval1_4f( GLvector4f *dest,
-                     GLfloat coord[][4],
-                     const GLuint *flags,
-                     GLuint dimension,
-                     const struct gl_1d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   GLfloat (*to)[4] = dest->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        ASSIGN_4V(to[i], 0,0,0,1);
-        _math_horner_bezier_curve(map->Points, to[i], u,
-                                  dimension, map->Order);
-      }
-
-   dest->size = MAX2(dest->size, dimension);
-   dest->flags |= dirty_flags[dimension];
-}
-
-
-/* as above, but dest is a gl_client_array */
-static void eval1_4f_ca( struct gl_client_array *dest,
-                        GLfloat coord[][4],
-                        const GLuint *flags,
-                        GLuint dimension,
-                        const struct gl_1d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   const GLubyte *destData = ADD_POINTERS(dest->Ptr, dest->BufferObj->Data);
-   GLfloat (*to)[4] = (GLfloat (*)[4]) destData;
-   GLuint i;
-
-   ASSERT(dest->Type == GL_FLOAT);
-   ASSERT(dest->StrideB == 4 * sizeof(GLfloat));
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        ASSIGN_4V(to[i], 0,0,0,1);
-        _math_horner_bezier_curve(map->Points, to[i], u,
-                                  dimension, map->Order);
-      }
-
-   dest->Size = MAX2(dest->Size, (GLint) dimension);
-}
-
-
-static void eval1_1ui( GLvector1ui *dest,
-                      GLfloat coord[][4],
-                      const GLuint *flags,
-                      const struct gl_1d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   GLuint *to = dest->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        GLfloat tmp;
-        _math_horner_bezier_curve(map->Points, &tmp, u, 1, map->Order);
-        to[i] = (GLuint) (GLint) tmp;
-      }
-
-}
-
-static void eval1_norm( GLvector4f *dest,
-                       GLfloat coord[][4],
-                       const GLuint *flags,
-                       const struct gl_1d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   GLfloat (*to)[4] = dest->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        _math_horner_bezier_curve(map->Points, to[i], u, 3, map->Order);
-      }
-}
-
-
-static void eval2_obj_norm( GLvector4f *obj_ptr,
-                           GLvector4f *norm_ptr,
-                           GLfloat coord[][4],
-                           GLuint *flags,
-                           GLuint dimension,
-                           const struct gl_2d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   const GLfloat v1 = map->v1;
-   const GLfloat dv = map->dv;
-   GLfloat (*obj)[4] = obj_ptr->data;
-   GLfloat (*normal)[4] = norm_ptr->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        GLfloat v = (coord[i][1] - v1) * dv;
-        GLfloat du[4], dv[4];
-
-        ASSIGN_4V(obj[i], 0,0,0,1);
-        _math_de_casteljau_surf(map->Points, obj[i], du, dv, u, v, dimension,
-                                map->Uorder, map->Vorder);
-
-        if (dimension == 4) {
-           du[0] = du[0]*obj[i][3] - du[3]*obj[i][0];
-           du[1] = du[1]*obj[i][3] - du[3]*obj[i][1];
-           du[2] = du[2]*obj[i][3] - du[3]*obj[i][2];
-        
-           dv[0] = dv[0]*obj[i][3] - dv[3]*obj[i][0];
-           dv[1] = dv[1]*obj[i][3] - dv[3]*obj[i][1];
-           dv[2] = dv[2]*obj[i][3] - dv[3]*obj[i][2];
-        }
-
-        CROSS3(normal[i], du, dv);
-        NORMALIZE_3FV(normal[i]);
-      }
-
-   obj_ptr->size = MAX2(obj_ptr->size, dimension);
-   obj_ptr->flags |= dirty_flags[dimension];
-}
-
-
-static void eval2_4f( GLvector4f *dest,
-                     GLfloat coord[][4],
-                     const GLuint *flags,
-                     GLuint dimension,
-                     const struct gl_2d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   const GLfloat v1 = map->v1;
-   const GLfloat dv = map->dv;
-   GLfloat (*to)[4] = dest->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        GLfloat v = (coord[i][1] - v1) * dv;
-
-        _math_horner_bezier_surf(map->Points, to[i], u, v, dimension,
-                                 map->Uorder, map->Vorder);
-      }
-
-   dest->size = MAX2(dest->size, dimension);
-   dest->flags |= dirty_flags[dimension];
-}
-
-
-/* as above, but dest is a gl_client_array */
-static void eval2_4f_ca( struct gl_client_array *dest,
-                        GLfloat coord[][4],
-                        const GLuint *flags,
-                        GLuint dimension,
-                        const struct gl_2d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   const GLfloat v1 = map->v1;
-   const GLfloat dv = map->dv;
-   const GLubyte *destData = ADD_POINTERS(dest->Ptr, dest->BufferObj->Data);
-   GLfloat (*to)[4] = (GLfloat (*)[4]) destData;
-   GLuint i;
-
-   ASSERT(dest->Type == GL_FLOAT);
-   ASSERT(dest->StrideB == 4 * sizeof(GLfloat));
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        GLfloat v = (coord[i][1] - v1) * dv;
-        _math_horner_bezier_surf(map->Points, to[i], u, v, dimension,
-                                 map->Uorder, map->Vorder);
-      }
-
-   dest->Size = MAX2(dest->Size, (GLint) dimension);
-}
-
-
-static void eval2_norm( GLvector4f *dest,
-                       GLfloat coord[][4],
-                       GLuint *flags,
-                       const struct gl_2d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   const GLfloat v1 = map->v1;
-   const GLfloat dv = map->dv;
-   GLfloat (*to)[4] = dest->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++) {
-      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        GLfloat v = (coord[i][1] - v1) * dv;
-        _math_horner_bezier_surf(map->Points, to[i], u, v, 3,
-                                 map->Uorder, map->Vorder);
-      }
-   }
-}
-
-
-static void eval2_1ui( GLvector1ui *dest,
-                      GLfloat coord[][4],
-                      const GLuint *flags,
-                      const struct gl_2d_map *map )
-{
-   const GLfloat u1 = map->u1;
-   const GLfloat du = map->du;
-   const GLfloat v1 = map->v1;
-   const GLfloat dv = map->dv;
-   GLuint *to = dest->data;
-   GLuint i;
-
-   for (i = 0 ; !(flags[i] & VERT_BIT_END_VB) ; i++)
-      if (flags[i] & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2)) {
-        GLfloat u = (coord[i][0] - u1) * du;
-        GLfloat v = (coord[i][1] - v1) * dv;
-        GLfloat tmp;
-        _math_horner_bezier_surf(map->Points, &tmp, u, v, 1,
-                                 map->Uorder, map->Vorder);
-
-        to[i] = (GLuint) (GLint) tmp;
-      }
-}
-
-
-static void copy_4f( GLfloat to[][4], GLfloat from[][4], GLuint count )
-{
-   MEMCPY( to, from, count * sizeof(to[0]));
-}
-
-static void copy_4f_stride( GLfloat to[][4], const GLfloat *from, 
-                           GLuint stride, GLuint count )
-{
-   if (stride == 4 * sizeof(GLfloat))
-      MEMCPY( to, from, count * sizeof(to[0]));
-   else {
-      GLuint i;
-      for (i = 0 ; i < count ; i++, STRIDE_F(from, stride))
-        COPY_4FV( to[i], from );
-   }
-}
-
-static void copy_3f( GLfloat to[][4], GLfloat from[][4], GLuint count )
-{
-   GLuint i;
-   for (i = 0 ; i < count ; i++) {
-      COPY_3FV(to[i], from[i]);
-   }
-}
-
-
-static void copy_1ui( GLuint to[], const GLuint from[], GLuint count )
-{
-   MEMCPY( to, from, (count) * sizeof(to[0]));
-}
-
-
-
-/* Translate eval enabled flags to VERT_* flags.
- */
-static void update_eval( GLcontext *ctx )
-{
-   TNLcontext *tnl = TNL_CONTEXT(ctx);
-   GLuint eval1 = 0, eval2 = 0;
-   GLuint i;
-
-   if (ctx->Eval.Map1Index)
-      eval1 |= VERT_BIT_INDEX;
-
-   if (ctx->Eval.Map2Index)
-      eval2 |= VERT_BIT_INDEX;
-
-   if (ctx->Eval.Map1Color4)
-      eval1 |= VERT_BIT_COLOR0;
-
-   if (ctx->Eval.Map2Color4)
-      eval2 |= VERT_BIT_COLOR0;
-
-   if (ctx->Eval.Map1Normal)
-      eval1 |= VERT_BIT_NORMAL;
-
-   if (ctx->Eval.Map2Normal)
-      eval2 |= VERT_BIT_NORMAL;
-
-   if (ctx->Eval.Map1TextureCoord4 ||
-       ctx->Eval.Map1TextureCoord3 ||
-       ctx->Eval.Map1TextureCoord2 ||
-       ctx->Eval.Map1TextureCoord1)
-      eval1 |= VERT_BIT_TEX0;
-
-   if (ctx->Eval.Map2TextureCoord4 ||
-       ctx->Eval.Map2TextureCoord3 ||
-       ctx->Eval.Map2TextureCoord2 ||
-       ctx->Eval.Map2TextureCoord1)
-      eval2 |= VERT_BIT_TEX0;
-
-   if (ctx->Eval.Map1Vertex4)
-      eval1 |= VERT_BITS_OBJ_234;
-
-   if (ctx->Eval.Map1Vertex3)
-      eval1 |= VERT_BITS_OBJ_23;
-
-   if (ctx->Eval.Map2Vertex4) {
-      if (ctx->Eval.AutoNormal)
-        eval2 |= VERT_BITS_OBJ_234 | VERT_BIT_NORMAL;
-      else
-        eval2 |= VERT_BITS_OBJ_234;
-   }
-   else if (ctx->Eval.Map2Vertex3) {
-      if (ctx->Eval.AutoNormal)
-        eval2 |= VERT_BITS_OBJ_23 | VERT_BIT_NORMAL;
-      else
-        eval2 |= VERT_BITS_OBJ_23;
-   }
-
-   tnl->eval.EvalMap1Flags = eval1;
-   tnl->eval.EvalMap2Flags = eval2;
-
-   /* GL_NV_vertex_program evaluators */
-   eval1 = eval2 = 0;
-   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
-      if (ctx->Eval.Map1Attrib[i])
-         eval1 |= (1 << i);
-      if (ctx->Eval.Map2Attrib[i])
-         eval2 |= (1 << i);
-   }
-   tnl->eval.EvalMap1AttribFlags = eval1;
-   tnl->eval.EvalMap2AttribFlags = eval2;
-
-   tnl->eval.EvalNewState = 0;
-}
-
-
-/* This looks a lot like a pipeline stage, but for various reasons is
- * better handled outside the pipeline, and considered the final stage
- * of fixing up an immediate struct for execution.
- *
- * Really want to cache the results of this function in display lists,
- * at least for EvalMesh commands.
- */
-void _tnl_eval_immediate( GLcontext *ctx, struct immediate *IM )
-{
-   TNLcontext *tnl = TNL_CONTEXT(ctx);
-   struct vertex_arrays *tmp = &tnl->imm_inputs;
-   struct immediate *store = tnl->eval.im;
-   GLuint *flags = IM->Flag + IM->CopyStart;
-   GLuint copycount;
-   GLuint orflag = IM->OrFlag;
-   GLuint any_eval1 = orflag & (VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1);
-   GLuint any_eval2 = orflag & (VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2);
-   GLuint req = 0;
-   GLuint purge_flags = 0;
-   GLfloat (*coord)[4] = IM->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
-   GLuint attr;
-
-   if (IM->AndFlag & VERT_BITS_EVAL_ANY)
-      copycount = IM->Start - IM->CopyStart; /* just copy copied vertices */
-   else
-      copycount = IM->Count - IM->CopyStart; /* copy all vertices */
-
-   if (!store)
-      store = tnl->eval.im = _tnl_alloc_immediate( ctx );
-
-   if (tnl->eval.EvalNewState & _NEW_EVAL)
-      update_eval( ctx );
-
-   if (any_eval1) {
-      req |= tnl->pipeline.inputs
-         & (tnl->eval.EvalMap1Flags | tnl->eval.EvalMap1AttribFlags);
-
-      if (!ctx->Eval.Map1Vertex4 && !ctx->Eval.Map1Vertex3 &&
-          !ctx->Eval.Map1Attrib[0])
-        purge_flags = (VERT_BIT_EVAL_P1|VERT_BIT_EVAL_C1);
-
-      if (orflag & VERT_BIT_EVAL_P1) {
-        eval_points1( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart, 
-                      coord, flags,
-                      ctx->Eval.MapGrid1du,
-                      ctx->Eval.MapGrid1u1);
-        
-        coord = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
-      }
-   }
-
-   if (any_eval2) {
-      req |= tnl->pipeline.inputs
-         & (tnl->eval.EvalMap2Flags | tnl->eval.EvalMap2AttribFlags);
-
-      if (!ctx->Eval.Map2Vertex4 && !ctx->Eval.Map2Vertex3 &&
-          !ctx->Eval.Map2Attrib[0])
-        purge_flags |= (VERT_BIT_EVAL_P2|VERT_BIT_EVAL_C2);
-
-      if (orflag & VERT_BIT_EVAL_P2) {
-        eval_points2( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart, 
-                      coord, flags,
-                      ctx->Eval.MapGrid2du,
-                      ctx->Eval.MapGrid2u1,
-                      ctx->Eval.MapGrid2dv,
-                      ctx->Eval.MapGrid2v1 );
-
-        coord = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
-      }
-   }
-
-   /* Allocate vertex attribute storage now */
-   for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
-      if ((req & (1 << attr)) && !store->Attrib[attr]) {
-         store->Attrib[attr] = (GLfloat (*)[4]) _mesa_malloc(IMM_SIZE * 4 * sizeof(GLfloat));
-         if (!store->Attrib[attr]) {
-            _mesa_error(ctx, GL_OUT_OF_MEMORY, "evaluator processing");
-            return;
-         }
-      }
-   }
-
-
-   /* Perform the evaluations on active data elements.
-    */
-   if (req & VERT_BIT_INDEX) {
-      GLuint generated = 0;
-
-      if (copycount)
-        copy_1ui( store->Index + IM->CopyStart, tmp->Index.data, copycount );
-
-      tmp->Index.data = store->Index + IM->CopyStart;
-      tmp->Index.start = store->Index + IM->CopyStart;
-
-      if (ctx->Eval.Map1Index && any_eval1) {
-        eval1_1ui( &tmp->Index, coord, flags, &ctx->EvalMap.Map1Index );
-        generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-      }
-
-      if (ctx->Eval.Map2Index && any_eval2) {
-        eval2_1ui( &tmp->Index, coord, flags, &ctx->EvalMap.Map2Index );
-        generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-      }
-   }
-
-   if (req & VERT_BIT_COLOR0) {
-      GLuint generated = 0;
-
-      if (copycount) {
-         const GLubyte *destData = ADD_POINTERS(tmp->Color.Ptr, tmp->Color.BufferObj->Data);
-         copy_4f_stride( store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart, 
-                         (GLfloat *) destData,
-                         tmp->Color.StrideB,
-                         copycount );
-      }
-
-      tmp->Color.Ptr = (GLubyte *) (store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart);
-      tmp->Color.StrideB = 4 * sizeof(GLfloat);
-      tmp->Color.Flags = 0;
-      tnl->vb.importable_data &= ~VERT_BIT_COLOR0;
-
-      if (ctx->VertexProgram.Enabled) {
-         tmp->Attribs[VERT_ATTRIB_COLOR0].data =
-            store->Attrib[VERT_ATTRIB_COLOR0] + IM->CopyStart;
-         tmp->Attribs[VERT_ATTRIB_COLOR0].start =
-            (GLfloat *) tmp->Attribs[VERT_ATTRIB_COLOR0].data;
-         tmp->Attribs[VERT_ATTRIB_COLOR0].size = 0;
-      }
-
-      /* Vertex program maps have priority over conventional attribs */
-      if (any_eval1) {
-         if (ctx->VertexProgram.Enabled
-             && ctx->Eval.Map1Attrib[VERT_ATTRIB_COLOR0]) {
-            eval1_4f_ca( &tmp->Color, coord, flags, 4,
-                         &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_COLOR0] );
-            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-         }
-         else if (ctx->Eval.Map1Color4) {
-            eval1_4f_ca( &tmp->Color, coord, flags, 4,
-                         &ctx->EvalMap.Map1Color4 );
-            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-         }
-      }
-
-      if (any_eval2) {
-         if (ctx->VertexProgram.Enabled
-             && ctx->Eval.Map2Attrib[VERT_ATTRIB_COLOR0]) {
-            eval2_4f_ca( &tmp->Color, coord, flags, 4,
-                         &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_COLOR0] );
-            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-         }
-         else if (ctx->Eval.Map2Color4) {
-            eval2_4f_ca( &tmp->Color, coord, flags, 4,
-                         &ctx->EvalMap.Map2Color4 );
-            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-         }
-      }
-   }
-
-   if (req & VERT_BIT_TEX0) {
-      GLuint generated = 0;
-
-      if (copycount)
-        copy_4f( store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart, 
-                 tmp->TexCoord[0].data, copycount );
-      else
-        tmp->TexCoord[0].size = 0;
-
-      tmp->TexCoord[0].data = store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart;
-      tmp->TexCoord[0].start = (GLfloat *)tmp->TexCoord[0].data;
-
-      if (ctx->VertexProgram.Enabled) {
-         tmp->Attribs[VERT_ATTRIB_TEX0].data =
-            store->Attrib[VERT_ATTRIB_TEX0] + IM->CopyStart;
-         tmp->Attribs[VERT_ATTRIB_TEX0].start =
-            (GLfloat *) tmp->Attribs[VERT_ATTRIB_TEX0].data;
-         tmp->Attribs[VERT_ATTRIB_TEX0].size = 0;
-      }
-
-      /* Vertex program maps have priority over conventional attribs */
-      if (any_eval1) {
-         if (ctx->VertexProgram.Enabled
-             && ctx->Eval.Map1Attrib[VERT_ATTRIB_TEX0]) {
-           eval1_4f( &tmp->TexCoord[0], coord, flags, 4,
-                     &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_TEX0] );
-           generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-         }
-        else if (ctx->Eval.Map1TextureCoord4) {
-           eval1_4f( &tmp->TexCoord[0], coord, flags, 4,
-                     &ctx->EvalMap.Map1Texture4 );
-           generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-        }
-        else if (ctx->Eval.Map1TextureCoord3) {
-           eval1_4f( &tmp->TexCoord[0], coord, flags, 3,
-                     &ctx->EvalMap.Map1Texture3 );
-           generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-        }
-        else if (ctx->Eval.Map1TextureCoord2) {
-           eval1_4f( &tmp->TexCoord[0], coord, flags, 2,
-                     &ctx->EvalMap.Map1Texture2 );
-           generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-        }
-        else if (ctx->Eval.Map1TextureCoord1) {
-           eval1_4f( &tmp->TexCoord[0], coord, flags, 1,
-                     &ctx->EvalMap.Map1Texture1 );
-           generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-        }
-      }
-
-      if (any_eval2) {
-         if (ctx->VertexProgram.Enabled
-             && ctx->Eval.Map2Attrib[VERT_ATTRIB_TEX0]) {
-           eval2_4f( &tmp->TexCoord[0], coord, flags, 4,
-                     &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_TEX0] );
-           generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-         }
-        else if (ctx->Eval.Map2TextureCoord4) {
-           eval2_4f( &tmp->TexCoord[0], coord, flags, 4,
-                     &ctx->EvalMap.Map2Texture4 );
-           generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-        }
-        else if (ctx->Eval.Map2TextureCoord3) {
-           eval2_4f( &tmp->TexCoord[0], coord, flags, 3,
-                     &ctx->EvalMap.Map2Texture3 );
-           generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-        }
-        else if (ctx->Eval.Map2TextureCoord2) {
-           eval2_4f( &tmp->TexCoord[0], coord, flags, 2,
-                     &ctx->EvalMap.Map2Texture2 );
-           generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-        }
-        else if (ctx->Eval.Map2TextureCoord1) {
-           eval2_4f( &tmp->TexCoord[0], coord, flags, 1,
-                     &ctx->EvalMap.Map2Texture1 );
-           generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-        }
-      }
-   }
-
-   if (req & VERT_BIT_NORMAL) {
-      GLuint generated = 0;
-
-      if (copycount) {
-        copy_3f( store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart,
-                  tmp->Normal.data, copycount );
-      }
-
-      tmp->Normal.data = store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart;
-      tmp->Normal.start = (GLfloat *)tmp->Normal.data;
-
-      if (ctx->VertexProgram.Enabled) {
-         tmp->Attribs[VERT_ATTRIB_NORMAL].data =
-            store->Attrib[VERT_ATTRIB_NORMAL] + IM->CopyStart;
-         tmp->Attribs[VERT_ATTRIB_NORMAL].start =
-            (GLfloat *) tmp->Attribs[VERT_ATTRIB_NORMAL].data;
-         tmp->Attribs[VERT_ATTRIB_NORMAL].size = 0;
-      }
-
-      if (any_eval1) {
-         if (ctx->VertexProgram.Enabled &&
-             ctx->Eval.Map1Attrib[VERT_ATTRIB_NORMAL]) {
-            eval1_norm( &tmp->Normal, coord, flags,
-                        &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_NORMAL] );
-            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-         }
-         else if (ctx->Eval.Map1Normal) {
-            eval1_norm( &tmp->Normal, coord, flags, &ctx->EvalMap.Map1Normal );
-            generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-         }
-      }
-
-      if (any_eval2) {
-         if (ctx->VertexProgram.Enabled &&
-             ctx->Eval.Map2Attrib[VERT_ATTRIB_NORMAL]) {
-            eval2_norm( &tmp->Normal, coord, flags,
-                        &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_NORMAL] );
-            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-         }
-         else if (ctx->Eval.Map2Normal) {
-            eval2_norm( &tmp->Normal, coord, flags, &ctx->EvalMap.Map2Normal );
-            generated |= VERT_BIT_EVAL_C2|VERT_BIT_EVAL_P2;
-         }
-      }
-   }
-
-   /* In the AutoNormal case, the copy and assignment of tmp->NormalPtr
-    * are done above.
-    */
-   if (req & VERT_BIT_POS) {
-      if (copycount) {
-        /* This copy may already have occurred when eliminating
-         * glEvalPoint calls:
-         */
-        if (coord != store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart) {
-           copy_4f( store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart,
-                     tmp->Obj.data, copycount );
-         }
-      }
-      else {
-        tmp->Obj.size = 0;
-      }
-
-      tmp->Obj.data = store->Attrib[VERT_ATTRIB_POS] + IM->CopyStart;
-      tmp->Obj.start = (GLfloat *) tmp->Obj.data;
-
-#if 1
-      /*tmp->Attribs[0].count = count;*/
-      tmp->Attribs[0].data = store->Attrib[0] + IM->CopyStart;
-      tmp->Attribs[0].start = (GLfloat *) tmp->Attribs[0].data;
-      tmp->Attribs[0].size = 0;
-#endif
-
-      /* Note: Normal data is already prepared above.
-       */
-
-      if (any_eval1) {
-         if (ctx->VertexProgram.Enabled &&
-             ctx->Eval.Map1Attrib[VERT_ATTRIB_POS]) {
-           eval1_4f( &tmp->Obj, coord, flags, 4,
-                     &ctx->EvalMap.Map1Attrib[VERT_ATTRIB_POS] );
-         }
-        else if (ctx->Eval.Map1Vertex4) {
-           eval1_4f( &tmp->Obj, coord, flags, 4,
-                     &ctx->EvalMap.Map1Vertex4 );
-        }
-        else if (ctx->Eval.Map1Vertex3) {
-           eval1_4f( &tmp->Obj, coord, flags, 3,
-                     &ctx->EvalMap.Map1Vertex3 );
-        }
-      }
-
-      if (any_eval2) {
-         if (ctx->VertexProgram.Enabled &&
-             ctx->Eval.Map2Attrib[VERT_ATTRIB_POS]) {
-           if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
-              eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 4,
-                              &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_POS] );
-           else
-              eval2_4f( &tmp->Obj, coord, flags, 4,
-                        &ctx->EvalMap.Map2Attrib[VERT_ATTRIB_POS] );
-         }
-        else if (ctx->Eval.Map2Vertex4) {
-           if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
-              eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 4,
-                              &ctx->EvalMap.Map2Vertex4 );
-           else
-              eval2_4f( &tmp->Obj, coord, flags, 4,
-                        &ctx->EvalMap.Map2Vertex4 );
-        }
-        else if (ctx->Eval.Map2Vertex3) {
-           if (ctx->Eval.AutoNormal && (req & VERT_BIT_NORMAL))
-              eval2_obj_norm( &tmp->Obj, &tmp->Normal, coord, flags, 3,
-                              &ctx->EvalMap.Map2Vertex3 );
-           else
-              eval2_4f( &tmp->Obj, coord, flags, 3,
-                        &ctx->EvalMap.Map2Vertex3 );
-        }
-      }
-   }
-
-
-   if (ctx->VertexProgram.Enabled) {
-      /* We already evaluated position, normal, color and texture 0 above.
-       * now evaluate any other generic attributes.
-       */
-      const GLuint skipBits = (VERT_BIT_POS |
-                               VERT_BIT_NORMAL |
-                               VERT_BIT_COLOR0 |
-                               VERT_BIT_TEX0);
-      GLuint generated = 0;
-      GLuint attr;
-      for (attr = 0; attr < VERT_ATTRIB_MAX; attr++) {
-         if ((1 << attr) & req & ~skipBits) {
-            if (any_eval1 && ctx->Eval.Map1Attrib[attr]) {
-               /* evaluate 1-D vertex attrib map [i] */
-               eval1_4f( &tmp->Attribs[attr], coord, flags, 4,
-                         &ctx->EvalMap.Map1Attrib[attr] );
-               generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-            }
-            if (any_eval2 && ctx->Eval.Map2Attrib[attr]) {
-               /* evaluate 2-D vertex attrib map [i] */
-               eval2_4f( &tmp->Attribs[attr], coord, flags, 4,
-                         &ctx->EvalMap.Map2Attrib[attr] );
-               generated |= VERT_BIT_EVAL_C1|VERT_BIT_EVAL_P1;
-            }
-         }
-      }
-   }
-
-   /* Calculate new IM->Elts, IM->Primitive, IM->PrimitiveLength for
-    * the case where vertex maps are not enabled for some received
-    * eval coordinates.  In this case those slots in the immediate
-    * must be ignored.
-    */
-   if (purge_flags) {
-      const GLuint vertex = VERT_BIT_POS|(VERT_BITS_EVAL_ANY & ~purge_flags);
-      GLuint last_new_prim = 0;
-      GLuint new_prim_length = 0;
-      GLuint next_old_prim = 0;
-      struct vertex_buffer *VB = &tnl->vb;
-      const GLuint count = VB->Count;
-      GLuint i, j;
-
-      for (i = 0, j = 0 ; i < count ; i++) {
-        if (flags[i] & vertex) {
-           store->Elt[j++] = i;
-           new_prim_length++;
-        }
-        if (i == next_old_prim) {
-           next_old_prim += VB->PrimitiveLength[i];
-           VB->PrimitiveLength[last_new_prim] = new_prim_length;
-           VB->Primitive[j] = VB->Primitive[i];
-           last_new_prim = j;
-        }
-      }
-      
-      VB->Elts = store->Elt;
-      _tnl_get_purged_copy_verts( ctx, store );
-   }
-
-   /* Produce new flags array:
-    */
-   {
-      const GLuint count = tnl->vb.Count + 1;
-      GLuint i;
-
-      copy_1ui( store->Flag, flags, count );
-      tnl->vb.Flag = store->Flag;
-      for (i = 0 ; i < count ; i++)
-        store->Flag[i] |= req;
-      IM->Evaluated = req;     /* hack for copying. */
-   }
-}