mesa: use vbo_attrib_tmp.h to generate display list vertex attrib functions
authorMarek Olšák <marek.olsak@amd.com>
Sun, 8 Mar 2020 22:47:56 +0000 (18:47 -0400)
committerMarge Bot <eric+marge@anholt.net>
Thu, 19 Mar 2020 23:24:08 +0000 (23:24 +0000)
This removes about 1150 lines of code.

The diff is messy, but the new code really starts with save_Attr32bit and
below. Ignore false Eval/Material/Begin changes etc. Git can't figure out
what was really changed. I didn't change them.

Acked-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4123>

src/mesa/main/dlist.c
src/mesa/main/macros.h
src/mesa/main/mtypes.h
src/mesa/main/vtxfmt.c

index f1aee16d5876ed723fc2d09673ea17199c8fe081..0fe027f0afce0443bd4ddf26d8542f9bd741df0a 100644 (file)
@@ -5900,188 +5900,6 @@ save_SetFragmentShaderConstantATI(GLuint dst, const GLfloat *value)
    }
 }
 
-static void GLAPIENTRY
-save_Attr1fNV(GLenum attr, GLfloat x)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_1F_NV, 2);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 1;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib1fNV(ctx->Exec, (attr, x));
-   }
-}
-
-static void GLAPIENTRY
-save_Attr2fNV(GLenum attr, GLfloat x, GLfloat y)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_2F_NV, 3);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-      n[3].f = y;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 2;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib2fNV(ctx->Exec, (attr, x, y));
-   }
-}
-
-static void GLAPIENTRY
-save_Attr3fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_3F_NV, 4);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-      n[3].f = y;
-      n[4].f = z;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 3;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib3fNV(ctx->Exec, (attr, x, y, z));
-   }
-}
-
-static void GLAPIENTRY
-save_Attr4fNV(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_4F_NV, 5);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-      n[3].f = y;
-      n[4].f = z;
-      n[5].f = w;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 4;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib4fNV(ctx->Exec, (attr, x, y, z, w));
-   }
-}
-
-
-static void GLAPIENTRY
-save_Attr1fARB(GLenum attr, GLfloat x)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_1F_ARB, 2);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 1;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, 0, 0, 1);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib1fARB(ctx->Exec, (attr, x));
-   }
-}
-
-static void GLAPIENTRY
-save_Attr2fARB(GLenum attr, GLfloat x, GLfloat y)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_2F_ARB, 3);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-      n[3].f = y;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 2;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, 0, 1);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib2fARB(ctx->Exec, (attr, x, y));
-   }
-}
-
-static void GLAPIENTRY
-save_Attr3fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_3F_ARB, 4);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-      n[3].f = y;
-      n[4].f = z;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 3;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, 1);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib3fARB(ctx->Exec, (attr, x, y, z));
-   }
-}
-
-static void GLAPIENTRY
-save_Attr4fARB(GLenum attr, GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_ATTR_4F_ARB, 5);
-   if (n) {
-      n[1].e = attr;
-      n[2].f = x;
-      n[3].f = y;
-      n[4].f = z;
-      n[5].f = w;
-   }
-
-   assert(attr < MAX_VERTEX_GENERIC_ATTRIBS);
-   ctx->ListState.ActiveAttribSize[attr] = 4;
-   ASSIGN_4V(ctx->ListState.CurrentAttrib[attr], x, y, z, w);
-
-   if (ctx->ExecuteFlag) {
-      CALL_VertexAttrib4fARB(ctx->Exec, (attr, x, y, z, w));
-   }
-}
-
-
 static void GLAPIENTRY
 save_EvalCoord1f(GLfloat x)
 {
@@ -6100,1339 +5918,205 @@ save_EvalCoord1f(GLfloat x)
 static void GLAPIENTRY
 save_EvalCoord1fv(const GLfloat * v)
 {
-   save_EvalCoord1f(v[0]);
-}
-
-static void GLAPIENTRY
-save_EvalCoord2f(GLfloat x, GLfloat y)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2);
-   if (n) {
-      n[1].f = x;
-      n[2].f = y;
-   }
-   if (ctx->ExecuteFlag) {
-      CALL_EvalCoord2f(ctx->Exec, (x, y));
-   }
-}
-
-static void GLAPIENTRY
-save_EvalCoord2fv(const GLfloat * v)
-{
-   save_EvalCoord2f(v[0], v[1]);
-}
-
-
-static void GLAPIENTRY
-save_EvalPoint1(GLint x)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1);
-   if (n) {
-      n[1].i = x;
-   }
-   if (ctx->ExecuteFlag) {
-      CALL_EvalPoint1(ctx->Exec, (x));
-   }
-}
-
-static void GLAPIENTRY
-save_EvalPoint2(GLint x, GLint y)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   SAVE_FLUSH_VERTICES(ctx);
-   n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2);
-   if (n) {
-      n[1].i = x;
-      n[2].i = y;
-   }
-   if (ctx->ExecuteFlag) {
-      CALL_EvalPoint2(ctx->Exec, (x, y));
-   }
-}
-
-static void GLAPIENTRY
-save_Indexf(GLfloat x)
-{
-   save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, x);
-}
-
-static void GLAPIENTRY
-save_Indexfv(const GLfloat * v)
-{
-   save_Attr1fNV(VERT_ATTRIB_COLOR_INDEX, v[0]);
-}
-
-static void GLAPIENTRY
-save_EdgeFlag(GLboolean x)
-{
-   save_Attr1fNV(VERT_ATTRIB_EDGEFLAG, x ? 1.0f : 0.0f);
-}
-
-
-/**
- * Compare 'count' elements of vectors 'a' and 'b'.
- * \return GL_TRUE if equal, GL_FALSE if different.
- */
-static inline GLboolean
-compare_vec(const GLfloat *a, const GLfloat *b, GLuint count)
-{
-   return memcmp( a, b, count * sizeof(GLfloat) ) == 0;
-}
-
-
-/**
- * This glMaterial function is used for glMaterial calls that are outside
- * a glBegin/End pair.  For glMaterial inside glBegin/End, see the VBO code.
- */
-static void GLAPIENTRY
-save_Materialfv(GLenum face, GLenum pname, const GLfloat * param)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   int args, i;
-   GLuint bitmask;
-
-   switch (face) {
-   case GL_BACK:
-   case GL_FRONT:
-   case GL_FRONT_AND_BACK:
-      break;
-   default:
-      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)");
-      return;
-   }
-
-   switch (pname) {
-   case GL_EMISSION:
-   case GL_AMBIENT:
-   case GL_DIFFUSE:
-   case GL_SPECULAR:
-   case GL_AMBIENT_AND_DIFFUSE:
-      args = 4;
-      break;
-   case GL_SHININESS:
-      args = 1;
-      break;
-   case GL_COLOR_INDEXES:
-      args = 3;
-      break;
-   default:
-      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)");
-      return;
-   }
-
-   if (ctx->ExecuteFlag) {
-      CALL_Materialfv(ctx->Exec, (face, pname, param));
-   }
-
-   bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL);
-
-   /* Try to eliminate redundant statechanges.  Because it is legal to
-    * call glMaterial even inside begin/end calls, don't need to worry
-    * about ctx->Driver.CurrentSavePrimitive here.
-    */
-   for (i = 0; i < MAT_ATTRIB_MAX; i++) {
-      if (bitmask & (1 << i)) {
-         if (ctx->ListState.ActiveMaterialSize[i] == args &&
-             compare_vec(ctx->ListState.CurrentMaterial[i], param, args)) {
-            /* no change in material value */
-            bitmask &= ~(1 << i);
-         }
-         else {
-            ctx->ListState.ActiveMaterialSize[i] = args;
-            COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param);
-         }
-      }
-   }
-
-   /* If this call has no effect, return early */
-   if (bitmask == 0)
-      return;
-
-   SAVE_FLUSH_VERTICES(ctx);
-
-   n = alloc_instruction(ctx, OPCODE_MATERIAL, 6);
-   if (n) {
-      n[1].e = face;
-      n[2].e = pname;
-      for (i = 0; i < args; i++)
-         n[3 + i].f = param[i];
-   }
-}
-
-static void GLAPIENTRY
-save_Begin(GLenum mode)
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (!_mesa_is_valid_prim_mode(ctx, mode)) {
-      /* compile this error into the display list */
-      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)");
-   }
-   else if (_mesa_inside_dlist_begin_end(ctx)) {
-      /* compile this error into the display list */
-      _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive glBegin");
-   }
-   else {
-      ctx->Driver.CurrentSavePrimitive = mode;
-
-      vbo_save_NotifyBegin(ctx, mode, false);
-   }
-}
-
-static void GLAPIENTRY
-save_End(void)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   SAVE_FLUSH_VERTICES(ctx);
-   (void) alloc_instruction(ctx, OPCODE_END, 0);
-   ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
-   if (ctx->ExecuteFlag) {
-      CALL_End(ctx->Exec, ());
-   }
-}
-
-static void GLAPIENTRY
-save_Rectf(GLfloat a, GLfloat b, GLfloat c, GLfloat d)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   Node *n;
-   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
-   n = alloc_instruction(ctx, OPCODE_RECTF, 4);
-   if (n) {
-      n[1].f = a;
-      n[2].f = b;
-      n[3].f = c;
-      n[4].f = d;
-   }
-   if (ctx->ExecuteFlag) {
-      CALL_Rectf(ctx->Exec, (a, b, c, d));
-   }
-}
-
-
-static void GLAPIENTRY
-save_Vertex2f(GLfloat x, GLfloat y)
-{
-   save_Attr2fNV(VERT_ATTRIB_POS, x, y);
-}
-
-static void GLAPIENTRY
-save_Vertex2fv(const GLfloat * v)
-{
-   save_Attr2fNV(VERT_ATTRIB_POS, v[0], v[1]);
-}
-
-static void GLAPIENTRY
-save_Vertex3f(GLfloat x, GLfloat y, GLfloat z)
-{
-   save_Attr3fNV(VERT_ATTRIB_POS, x, y, z);
-}
-
-static void GLAPIENTRY
-save_Vertex3fv(const GLfloat * v)
-{
-   save_Attr3fNV(VERT_ATTRIB_POS, v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-save_Vertex4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   save_Attr4fNV(VERT_ATTRIB_POS, x, y, z, w);
-}
-
-static void GLAPIENTRY
-save_Vertex4fv(const GLfloat * v)
-{
-   save_Attr4fNV(VERT_ATTRIB_POS, v[0], v[1], v[2], v[3]);
-}
-
-static void GLAPIENTRY
-save_TexCoord1f(GLfloat x)
-{
-   save_Attr1fNV(VERT_ATTRIB_TEX0, x);
-}
-
-static void GLAPIENTRY
-save_TexCoord1fv(const GLfloat * v)
-{
-   save_Attr1fNV(VERT_ATTRIB_TEX0, v[0]);
-}
-
-static void GLAPIENTRY
-save_TexCoord2f(GLfloat x, GLfloat y)
-{
-   save_Attr2fNV(VERT_ATTRIB_TEX0, x, y);
-}
-
-static void GLAPIENTRY
-save_TexCoord2fv(const GLfloat * v)
-{
-   save_Attr2fNV(VERT_ATTRIB_TEX0, v[0], v[1]);
-}
-
-static void GLAPIENTRY
-save_TexCoord3f(GLfloat x, GLfloat y, GLfloat z)
-{
-   save_Attr3fNV(VERT_ATTRIB_TEX0, x, y, z);
-}
-
-static void GLAPIENTRY
-save_TexCoord3fv(const GLfloat * v)
-{
-   save_Attr3fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-save_TexCoord4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   save_Attr4fNV(VERT_ATTRIB_TEX0, x, y, z, w);
-}
-
-static void GLAPIENTRY
-save_TexCoord4fv(const GLfloat * v)
-{
-   save_Attr4fNV(VERT_ATTRIB_TEX0, v[0], v[1], v[2], v[3]);
-}
-
-static void GLAPIENTRY
-save_Normal3f(GLfloat x, GLfloat y, GLfloat z)
-{
-   save_Attr3fNV(VERT_ATTRIB_NORMAL, x, y, z);
-}
-
-static void GLAPIENTRY
-save_Normal3fv(const GLfloat * v)
-{
-   save_Attr3fNV(VERT_ATTRIB_NORMAL, v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-save_FogCoordfEXT(GLfloat x)
-{
-   save_Attr1fNV(VERT_ATTRIB_FOG, x);
-}
-
-static void GLAPIENTRY
-save_FogCoordfvEXT(const GLfloat * v)
-{
-   save_Attr1fNV(VERT_ATTRIB_FOG, v[0]);
-}
-
-static void GLAPIENTRY
-save_Color3f(GLfloat x, GLfloat y, GLfloat z)
-{
-   save_Attr3fNV(VERT_ATTRIB_COLOR0, x, y, z);
-}
-
-static void GLAPIENTRY
-save_Color3fv(const GLfloat * v)
-{
-   save_Attr3fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-save_Color4f(GLfloat x, GLfloat y, GLfloat z, GLfloat w)
-{
-   save_Attr4fNV(VERT_ATTRIB_COLOR0, x, y, z, w);
-}
-
-static void GLAPIENTRY
-save_Color4fv(const GLfloat * v)
-{
-   save_Attr4fNV(VERT_ATTRIB_COLOR0, v[0], v[1], v[2], v[3]);
-}
-
-static void GLAPIENTRY
-save_SecondaryColor3fEXT(GLfloat x, GLfloat y, GLfloat z)
-{
-   save_Attr3fNV(VERT_ATTRIB_COLOR1, x, y, z);
-}
-
-static void GLAPIENTRY
-save_SecondaryColor3fvEXT(const GLfloat * v)
-{
-   save_Attr3fNV(VERT_ATTRIB_COLOR1, v[0], v[1], v[2]);
-}
-
-
-/**
- * Record a GL_INVALID_VALUE error when an invalid vertex attribute
- * index is found.
- */
-static void
-index_error(void)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_error(ctx, GL_INVALID_VALUE, "VertexAttribf(index)");
-}
-
-#define ATTR1F( A, X )          save_Attr1fNV(A, X)
-#define ATTR2F( A, X, Y )       save_Attr2fNV(A, X, Y)
-#define ATTR3F( A, X, Y, Z )    save_Attr3fNV(A, X, Y, Z)
-#define ATTR4F( A, X, Y, Z, W ) save_Attr4fNV(A, X, Y, Z, W)
-
-#define ATTR1FV( A, V )          save_Attr1fNV(A, V[0])
-#define ATTR2FV( A, V )          save_Attr2fNV(A, V[0], V[1])
-#define ATTR3FV( A, V )          save_Attr3fNV(A, V[0], V[0], V[2])
-#define ATTR4FV( A, V )          save_Attr4fNV(A, V[0], V[1], V[2], V[3])
-
-#define ATTRUI10_1( A, UI ) ATTR1F( A, (UI) & 0x3ff)
-#define ATTRUI10_2( A, UI ) ATTR2F( A, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff)
-#define ATTRUI10_3( A, UI ) ATTR3F( A, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff)
-#define ATTRUI10_4( A, UI ) ATTR4F( A, (UI) & 0x3ff, ((UI) >> 10) & 0x3ff, ((UI) >> 20) & 0x3ff, ((UI) >> 30) & 0x3 )
-
-#define ATTRUI10N_1( A, UI ) ATTR1F( A, conv_ui10_to_norm_float((UI) & 0x3ff))
-#define ATTRUI10N_2( A, UI ) ATTR2F( A, \
-                                  conv_ui10_to_norm_float((UI) & 0x3ff), \
-                                  conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff))
-#define ATTRUI10N_3( A, UI ) ATTR3F( A, \
-                                  conv_ui10_to_norm_float((UI) & 0x3ff), \
-                                  conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
-                                  conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff))
-#define ATTRUI10N_4( A, UI ) ATTR4F( A, \
-                                  conv_ui10_to_norm_float((UI) & 0x3ff), \
-                                  conv_ui10_to_norm_float(((UI) >> 10) & 0x3ff), \
-                                  conv_ui10_to_norm_float(((UI) >> 20) & 0x3ff), \
-                                  conv_ui2_to_norm_float(((UI) >> 30) & 0x3) )
-
-#define ATTRI10_1( A, I10 ) ATTR1F( A, conv_i10_to_i((I10) & 0x3ff))
-#define ATTRI10_2( A, I10 ) ATTR2F( A, \
-                               conv_i10_to_i((I10) & 0x3ff),           \
-                               conv_i10_to_i(((I10) >> 10) & 0x3ff))
-#define ATTRI10_3( A, I10 ) ATTR3F( A, \
-                               conv_i10_to_i((I10) & 0x3ff),       \
-                               conv_i10_to_i(((I10) >> 10) & 0x3ff), \
-                               conv_i10_to_i(((I10) >> 20) & 0x3ff))
-#define ATTRI10_4( A, I10 ) ATTR4F( A, \
-                               conv_i10_to_i((I10) & 0x3ff),           \
-                               conv_i10_to_i(((I10) >> 10) & 0x3ff), \
-                               conv_i10_to_i(((I10) >> 20) & 0x3ff), \
-                               conv_i2_to_i(((I10) >> 30) & 0x3))
-
-#define ATTRI10N_1(ctx, A, I10) ATTR1F(A, conv_i10_to_norm_float(ctx, (I10) & 0x3ff))
-#define ATTRI10N_2(ctx, A, I10) ATTR2F(A, \
-                               conv_i10_to_norm_float(ctx, (I10) & 0x3ff),             \
-                               conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff))
-#define ATTRI10N_3(ctx, A, I10) ATTR3F(A, \
-                               conv_i10_to_norm_float(ctx, (I10) & 0x3ff),         \
-                               conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
-                               conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff))
-#define ATTRI10N_4(ctx, A, I10) ATTR4F(A, \
-                               conv_i10_to_norm_float(ctx, (I10) & 0x3ff),             \
-                               conv_i10_to_norm_float(ctx, ((I10) >> 10) & 0x3ff), \
-                               conv_i10_to_norm_float(ctx, ((I10) >> 20) & 0x3ff), \
-                               conv_i2_to_norm_float(ctx, ((I10) >> 30) & 0x3))
-
-#define ATTR_UI(ctx, val, type, normalized, attr, arg) do {    \
-   if ((type) == GL_UNSIGNED_INT_2_10_10_10_REV) {             \
-      if (normalized) {                                                \
-        ATTRUI10N_##val((attr), (arg));                        \
-      } else {                                                 \
-        ATTRUI10_##val((attr), (arg));                         \
-      }                                                                \
-   } else if ((type) == GL_INT_2_10_10_10_REV) {               \
-      if (normalized) {                                                \
-        ATTRI10N_##val(ctx, (attr), (arg));                    \
-      } else {                                                 \
-        ATTRI10_##val((attr), (arg));                          \
-      }                                                                \
-   } else if ((type) == GL_UNSIGNED_INT_10F_11F_11F_REV) {     \
-      float res[4];                                            \
-      res[3] = 1;                                               \
-      r11g11b10f_to_float3((arg), res);                                \
-      ATTR##val##FV((attr), res);                              \
-   }                                                            \
-} while(0)
-
-#define ATTR_UI_INDEX(ctx, val, type, normalized, index, arg) do {     \
-      if ((index) == 0 && _mesa_attr_zero_aliases_vertex(ctx)) {       \
-        ATTR_UI(ctx, val, (type), normalized, 0, (arg));               \
-      } else if ((index) < MAX_VERTEX_GENERIC_ATTRIBS) {               \
-        ATTR_UI(ctx, val, (type), normalized, VERT_ATTRIB_GENERIC0 + (index), (arg)); \
-      } else                                                           \
-        index_error();                                                 \
-   } while(0)
-
-static void GLAPIENTRY
-save_VertexP2ui(GLenum type, GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2ui");
-   ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_POS, value);
-}
-
-static void GLAPIENTRY
-save_VertexP2uiv(GLenum type, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP2uiv");
-   ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_POS, value[0]);
-}
-
-static void GLAPIENTRY
-save_VertexP3ui(GLenum type, GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3ui");
-   ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_POS, value);
-}
-
-static void GLAPIENTRY
-save_VertexP3uiv(GLenum type, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP3uiv");
-   ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_POS, value[0]);
-}
-
-static void GLAPIENTRY
-save_VertexP4ui(GLenum type, GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4ui");
-   ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_POS, value);
-}
-
-static void GLAPIENTRY
-save_VertexP4uiv(GLenum type, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexP4uiv");
-   ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_POS, value[0]);
-}
-
-static void GLAPIENTRY
-save_TexCoordP1ui(GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1ui");
-   ATTR_UI(ctx, 1, type, 0, VERT_ATTRIB_TEX0, coords);
-}
-
-static void GLAPIENTRY
-save_TexCoordP1uiv(GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP1uiv");
-   ATTR_UI(ctx, 1, type, 0, VERT_ATTRIB_TEX0, coords[0]);
-}
-
-static void GLAPIENTRY
-save_TexCoordP2ui(GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2ui");
-   ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_TEX0, coords);
-}
-
-static void GLAPIENTRY
-save_TexCoordP2uiv(GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP2uiv");
-   ATTR_UI(ctx, 2, type, 0, VERT_ATTRIB_TEX0, coords[0]);
-}
-
-static void GLAPIENTRY
-save_TexCoordP3ui(GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3ui");
-   ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_TEX0, coords);
-}
-
-static void GLAPIENTRY
-save_TexCoordP3uiv(GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP3uiv");
-   ATTR_UI(ctx, 3, type, 0, VERT_ATTRIB_TEX0, coords[0]);
-}
-
-static void GLAPIENTRY
-save_TexCoordP4ui(GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4ui");
-   ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_TEX0, coords);
-}
-
-static void GLAPIENTRY
-save_TexCoordP4uiv(GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glTexCoordP4uiv");
-   ATTR_UI(ctx, 4, type, 0, VERT_ATTRIB_TEX0, coords[0]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP1ui(GLenum target, GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1ui");
-   ATTR_UI(ctx, 1, type, 0, attr, coords);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP1uiv(GLenum target, GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP1uiv");
-   ATTR_UI(ctx, 1, type, 0, attr, coords[0]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP2ui(GLenum target, GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2ui");
-   ATTR_UI(ctx, 2, type, 0, attr, coords);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP2uiv(GLenum target, GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP2uiv");
-   ATTR_UI(ctx, 2, type, 0, attr, coords[0]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP3ui(GLenum target, GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3ui");
-   ATTR_UI(ctx, 3, type, 0, attr, coords);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP3uiv(GLenum target, GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP3uiv");
-   ATTR_UI(ctx, 3, type, 0, attr, coords[0]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP4ui(GLenum target, GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4ui");
-   ATTR_UI(ctx, 4, type, 0, attr, coords);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoordP4uiv(GLenum target, GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glMultiTexCoordP4uiv");
-   ATTR_UI(ctx, 4, type, 0, attr, coords[0]);
-}
-
-static void GLAPIENTRY
-save_NormalP3ui(GLenum type, GLuint coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3ui");
-   ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_NORMAL, coords);
-}
-
-static void GLAPIENTRY
-save_NormalP3uiv(GLenum type, const GLuint *coords)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glNormalP3uiv");
-   ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_NORMAL, coords[0]);
-}
-
-static void GLAPIENTRY
-save_ColorP3ui(GLenum type, GLuint color)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3ui");
-   ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR0, color);
-}
-
-static void GLAPIENTRY
-save_ColorP3uiv(GLenum type, const GLuint *color)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP3uiv");
-   ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR0, color[0]);
-}
-
-static void GLAPIENTRY
-save_ColorP4ui(GLenum type, GLuint color)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4ui");
-   ATTR_UI(ctx, 4, type, 1, VERT_ATTRIB_COLOR0, color);
-}
-
-static void GLAPIENTRY
-save_ColorP4uiv(GLenum type, const GLuint *color)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glColorP4uiv");
-   ATTR_UI(ctx, 4, type, 1, VERT_ATTRIB_COLOR0, color[0]);
-}
-
-static void GLAPIENTRY
-save_SecondaryColorP3ui(GLenum type, GLuint color)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3ui");
-   ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR1, color);
-}
-
-static void GLAPIENTRY
-save_SecondaryColorP3uiv(GLenum type, const GLuint *color)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glSecondaryColorP3uiv");
-   ATTR_UI(ctx, 3, type, 1, VERT_ATTRIB_COLOR1, color[0]);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP1ui(GLuint index, GLenum type, GLboolean normalized,
-                      GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1ui");
-   ATTR_UI_INDEX(ctx, 1, type, normalized, index, value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP2ui(GLuint index, GLenum type, GLboolean normalized,
-                      GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2ui");
-   ATTR_UI_INDEX(ctx, 2, type, normalized, index, value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP3ui(GLuint index, GLenum type, GLboolean normalized,
-                      GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3ui");
-   ATTR_UI_INDEX(ctx, 3, type, normalized, index, value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP4ui(GLuint index, GLenum type, GLboolean normalized,
-                      GLuint value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4ui");
-   ATTR_UI_INDEX(ctx, 4, type, normalized, index, value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP1uiv(GLuint index, GLenum type, GLboolean normalized,
-                       const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP1uiv");
-   ATTR_UI_INDEX(ctx, 1, type, normalized, index, *value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP2uiv(GLuint index, GLenum type, GLboolean normalized,
-                       const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP2uiv");
-   ATTR_UI_INDEX(ctx, 2, type, normalized, index, *value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP3uiv(GLuint index, GLenum type, GLboolean normalized,
-                       const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE_EXT(ctx, type, "glVertexAttribP3uiv");
-   ATTR_UI_INDEX(ctx, 3, type, normalized, index, *value);
-}
-
-static void GLAPIENTRY
-save_VertexAttribP4uiv(GLuint index, GLenum type, GLboolean normalized,
-                       const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ERROR_IF_NOT_PACKED_TYPE(ctx, type, "glVertexAttribP4uiv");
-   ATTR_UI_INDEX(ctx, 4, type, normalized, index, *value);
-}
-
-
-/* Just call the respective ATTR for texcoord
- */
-static void GLAPIENTRY
-save_MultiTexCoord1f(GLenum target, GLfloat x)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr1fNV(attr, x);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord1fv(GLenum target, const GLfloat * v)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr1fNV(attr, v[0]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord2f(GLenum target, GLfloat x, GLfloat y)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr2fNV(attr, x, y);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord2fv(GLenum target, const GLfloat * v)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr2fNV(attr, v[0], v[1]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord3f(GLenum target, GLfloat x, GLfloat y, GLfloat z)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr3fNV(attr, x, y, z);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord3fv(GLenum target, const GLfloat * v)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr3fNV(attr, v[0], v[1], v[2]);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord4f(GLenum target, GLfloat x, GLfloat y,
-                     GLfloat z, GLfloat w)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr4fNV(attr, x, y, z, w);
-}
-
-static void GLAPIENTRY
-save_MultiTexCoord4fv(GLenum target, const GLfloat * v)
-{
-   GLuint attr = (target & 0x7) + VERT_ATTRIB_TEX0;
-   save_Attr4fNV(attr, v[0], v[1], v[2], v[3]);
-}
-
-static void GLAPIENTRY
-save_VertexAttrib1fNV(GLuint index, GLfloat x)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr1fNV(index, x);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib1fvNV(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr1fNV(index, v[0]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib2fNV(GLuint index, GLfloat x, GLfloat y)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr2fNV(index, x, y);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib2fvNV(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr2fNV(index, v[0], v[1]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib3fNV(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr3fNV(index, x, y, z);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib3fvNV(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr3fNV(index, v[0], v[1], v[2]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib4fNV(GLuint index, GLfloat x, GLfloat y,
-                      GLfloat z, GLfloat w)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr4fNV(index, x, y, z, w);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib4fvNV(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr4fNV(index, v[0], v[1], v[2], v[3]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib1fARB(GLuint index, GLfloat x)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr1fARB(index, x);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib1fvARB(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr1fARB(index, v[0]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib2fARB(GLuint index, GLfloat x, GLfloat y)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr2fARB(index, x, y);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib2fvARB(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr2fARB(index, v[0], v[1]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib3fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr3fARB(index, x, y, z);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib3fvARB(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr3fARB(index, v[0], v[1], v[2]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib4fARB(GLuint index, GLfloat x, GLfloat y, GLfloat z,
-                       GLfloat w)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr4fARB(index, x, y, z, w);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttrib4fvARB(GLuint index, const GLfloat * v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_Attr4fARB(index, v[0], v[1], v[2], v[3]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttribL1d(GLuint index, GLdouble x)
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_1D, 3);
-      if (n) {
-         n[1].ui = index;
-         ASSIGN_DOUBLE_TO_NODES(n, 2, x);
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 1;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLdouble));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribL1d(ctx->Exec, (index, x));
-      }
-   } else {
-      index_error();
-   }
-}
-
-static void GLAPIENTRY
-save_VertexAttribL1dv(GLuint index, const GLdouble *v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_VertexAttribL1d(index, v[0]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttribL2d(GLuint index, GLdouble x, GLdouble y)
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_2D, 5);
-      if (n) {
-         n[1].ui = index;
-         ASSIGN_DOUBLE_TO_NODES(n, 2, x);
-         ASSIGN_DOUBLE_TO_NODES(n, 4, y);
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 2;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2],
-             2 * sizeof(GLdouble));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribL2d(ctx->Exec, (index, x, y));
-      }
-   } else {
-      index_error();
-   }
-}
-
-static void GLAPIENTRY
-save_VertexAttribL2dv(GLuint index, const GLdouble *v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_VertexAttribL2d(index, v[0], v[1]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttribL3d(GLuint index, GLdouble x, GLdouble y, GLdouble z)
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_3D, 7);
-      if (n) {
-         n[1].ui = index;
-         ASSIGN_DOUBLE_TO_NODES(n, 2, x);
-         ASSIGN_DOUBLE_TO_NODES(n, 4, y);
-         ASSIGN_DOUBLE_TO_NODES(n, 6, z);
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 3;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2],
-             3 * sizeof(GLdouble));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribL3d(ctx->Exec, (index, x, y, z));
-      }
-   } else {
-      index_error();
-   }
-}
-
-static void GLAPIENTRY
-save_VertexAttribL3dv(GLuint index, const GLdouble *v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_VertexAttribL3d(index, v[0], v[1], v[2]);
-   else
-      index_error();
-}
-
-static void GLAPIENTRY
-save_VertexAttribL4d(GLuint index, GLdouble x, GLdouble y, GLdouble z,
-                       GLdouble w)
-{
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_4D, 9);
-      if (n) {
-         n[1].ui = index;
-         ASSIGN_DOUBLE_TO_NODES(n, 2, x);
-         ASSIGN_DOUBLE_TO_NODES(n, 4, y);
-         ASSIGN_DOUBLE_TO_NODES(n, 6, z);
-         ASSIGN_DOUBLE_TO_NODES(n, 8, w);
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 4;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2],
-             4 * sizeof(GLdouble));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribL4d(ctx->Exec, (index, x, y, z, w));
-      }
-   } else {
-      index_error();
-   }
-}
-
-static void GLAPIENTRY
-save_VertexAttribL4dv(GLuint index, const GLdouble *v)
-{
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS)
-      save_VertexAttribL4d(index, v[0], v[1], v[2], v[3]);
-   else
-      index_error();
+   save_EvalCoord1f(v[0]);
 }
 
 static void GLAPIENTRY
-save_VertexAttribI1i(GLuint index, GLint x)
+save_EvalCoord2f(GLfloat x, GLfloat y)
 {
    GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_1I, 2);
-      if (n) {
-         n[1].ui = index;
-         n[2].i = x;
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 1;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribI1iEXT(ctx->Exec, (index, x));
-      }
-   } else {
-      index_error();
+   Node *n;
+   SAVE_FLUSH_VERTICES(ctx);
+   n = alloc_instruction(ctx, OPCODE_EVAL_C2, 2);
+   if (n) {
+      n[1].f = x;
+      n[2].f = y;
+   }
+   if (ctx->ExecuteFlag) {
+      CALL_EvalCoord2f(ctx->Exec, (x, y));
    }
 }
 
 static void GLAPIENTRY
-save_VertexAttribI2i(GLuint index, GLint x, GLint y)
+save_EvalCoord2fv(const GLfloat * v)
 {
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_2I, 3);
-      if (n) {
-         n[1].ui = index;
-         n[2].i = x;
-         n[3].i = y;
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 1;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribI2iEXT(ctx->Exec, (index, x, y));
-      }
-   } else {
-      index_error();
-   }
+   save_EvalCoord2f(v[0], v[1]);
 }
 
+
 static void GLAPIENTRY
-save_VertexAttribI3i(GLuint index, GLint x, GLint y, GLint z)
+save_EvalPoint1(GLint x)
 {
    GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_3I, 4);
-      if (n) {
-         n[1].ui = index;
-         n[2].i = x;
-         n[3].i = y;
-         n[4].i = z;
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 1;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribI3iEXT(ctx->Exec, (index, x, y, z));
-      }
-   } else {
-      index_error();
+   Node *n;
+   SAVE_FLUSH_VERTICES(ctx);
+   n = alloc_instruction(ctx, OPCODE_EVAL_P1, 1);
+   if (n) {
+      n[1].i = x;
+   }
+   if (ctx->ExecuteFlag) {
+      CALL_EvalPoint1(ctx->Exec, (x));
    }
 }
 
 static void GLAPIENTRY
-save_VertexAttribI4i(GLuint index, GLint x, GLint y, GLint z, GLint w)
+save_EvalPoint2(GLint x, GLint y)
 {
    GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_3I, 5);
-      if (n) {
-         n[1].ui = index;
-         n[2].i = x;
-         n[3].i = y;
-         n[4].i = z;
-         n[5].i = w;
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 1;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLint));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribI4iEXT(ctx->Exec, (index, x, y, z, w));
-      }
-   } else {
-      index_error();
+   Node *n;
+   SAVE_FLUSH_VERTICES(ctx);
+   n = alloc_instruction(ctx, OPCODE_EVAL_P2, 2);
+   if (n) {
+      n[1].i = x;
+      n[2].i = y;
+   }
+   if (ctx->ExecuteFlag) {
+      CALL_EvalPoint2(ctx->Exec, (x, y));
    }
 }
 
-static void GLAPIENTRY
-save_VertexAttribI2iv(GLuint index, const GLint *v)
-{
-   save_VertexAttribI2i(index, v[0], v[1]);
-}
 
-static void GLAPIENTRY
-save_VertexAttribI3iv(GLuint index, const GLint *v)
+/**
+ * Compare 'count' elements of vectors 'a' and 'b'.
+ * \return GL_TRUE if equal, GL_FALSE if different.
+ */
+static inline GLboolean
+compare_vec(const GLfloat *a, const GLfloat *b, GLuint count)
 {
-   save_VertexAttribI3i(index, v[0], v[1], v[2]);
+   return memcmp( a, b, count * sizeof(GLfloat) ) == 0;
 }
 
+
+/**
+ * This glMaterial function is used for glMaterial calls that are outside
+ * a glBegin/End pair.  For glMaterial inside glBegin/End, see the VBO code.
+ */
 static void GLAPIENTRY
-save_VertexAttribI4iv(GLuint index, const GLint *v)
+save_Materialfv(GLenum face, GLenum pname, const GLfloat * param)
 {
-   save_VertexAttribI4i(index, v[0], v[1], v[2], v[3]);
-}
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   int args, i;
+   GLuint bitmask;
 
+   switch (face) {
+   case GL_BACK:
+   case GL_FRONT:
+   case GL_FRONT_AND_BACK:
+      break;
+   default:
+      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(face)");
+      return;
+   }
 
+   switch (pname) {
+   case GL_EMISSION:
+   case GL_AMBIENT:
+   case GL_DIFFUSE:
+   case GL_SPECULAR:
+   case GL_AMBIENT_AND_DIFFUSE:
+      args = 4;
+      break;
+   case GL_SHININESS:
+      args = 1;
+      break;
+   case GL_COLOR_INDEXES:
+      args = 3;
+      break;
+   default:
+      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glMaterial(pname)");
+      return;
+   }
 
-static void GLAPIENTRY
-save_VertexAttribI1ui(GLuint index, GLuint x)
-{
-   save_VertexAttribI1i(index, x);
-}
+   if (ctx->ExecuteFlag) {
+      CALL_Materialfv(ctx->Exec, (face, pname, param));
+   }
 
-static void GLAPIENTRY
-save_VertexAttribI2ui(GLuint index, GLuint x, GLuint y)
-{
-   save_VertexAttribI2i(index, x, y);
-}
+   bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL);
 
-static void GLAPIENTRY
-save_VertexAttribI3ui(GLuint index, GLuint x, GLuint y, GLuint z)
-{
-   save_VertexAttribI3i(index, x, y, z);
-}
+   /* Try to eliminate redundant statechanges.  Because it is legal to
+    * call glMaterial even inside begin/end calls, don't need to worry
+    * about ctx->Driver.CurrentSavePrimitive here.
+    */
+   for (i = 0; i < MAT_ATTRIB_MAX; i++) {
+      if (bitmask & (1 << i)) {
+         if (ctx->ListState.ActiveMaterialSize[i] == args &&
+             compare_vec(ctx->ListState.CurrentMaterial[i], param, args)) {
+            /* no change in material value */
+            bitmask &= ~(1 << i);
+         }
+         else {
+            ctx->ListState.ActiveMaterialSize[i] = args;
+            COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param);
+         }
+      }
+   }
 
-static void GLAPIENTRY
-save_VertexAttribI4ui(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w)
-{
-   save_VertexAttribI4i(index, x, y, z, w);
-}
+   /* If this call has no effect, return early */
+   if (bitmask == 0)
+      return;
 
-static void GLAPIENTRY
-save_VertexAttribI2uiv(GLuint index, const GLuint *v)
-{
-   save_VertexAttribI2i(index, v[0], v[1]);
-}
+   SAVE_FLUSH_VERTICES(ctx);
 
-static void GLAPIENTRY
-save_VertexAttribI3uiv(GLuint index, const GLuint *v)
-{
-   save_VertexAttribI3i(index, v[0], v[1], v[2]);
+   n = alloc_instruction(ctx, OPCODE_MATERIAL, 6);
+   if (n) {
+      n[1].e = face;
+      n[2].e = pname;
+      for (i = 0; i < args; i++)
+         n[3 + i].f = param[i];
+   }
 }
 
 static void GLAPIENTRY
-save_VertexAttribI4uiv(GLuint index, const GLuint *v)
+save_Begin(GLenum mode)
 {
-   save_VertexAttribI4i(index, v[0], v[1], v[2], v[3]);
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (!_mesa_is_valid_prim_mode(ctx, mode)) {
+      /* compile this error into the display list */
+      _mesa_compile_error(ctx, GL_INVALID_ENUM, "glBegin(mode)");
+   }
+   else if (_mesa_inside_dlist_begin_end(ctx)) {
+      /* compile this error into the display list */
+      _mesa_compile_error(ctx, GL_INVALID_OPERATION, "recursive glBegin");
+   }
+   else {
+      ctx->Driver.CurrentSavePrimitive = mode;
+
+      vbo_save_NotifyBegin(ctx, mode, false);
+   }
 }
 
 static void GLAPIENTRY
-save_VertexAttribL1ui64ARB(GLuint index, GLuint64EXT x)
+save_End(void)
 {
    GET_CURRENT_CONTEXT(ctx);
-
-   if (index < MAX_VERTEX_GENERIC_ATTRIBS) {
-      Node *n;
-      SAVE_FLUSH_VERTICES(ctx);
-      n = alloc_instruction(ctx, OPCODE_ATTR_1UI64, 3);
-      if (n) {
-         n[1].ui = index;
-         ASSIGN_UINT64_TO_NODES(n, 2, x);
-      }
-
-      ctx->ListState.ActiveAttribSize[index] = 1;
-      memcpy(ctx->ListState.CurrentAttrib[index], &n[2], sizeof(GLdouble));
-
-      if (ctx->ExecuteFlag) {
-         CALL_VertexAttribL1ui64ARB(ctx->Exec, (index, x));
-      }
-   } else {
-      index_error();
+   SAVE_FLUSH_VERTICES(ctx);
+   (void) alloc_instruction(ctx, OPCODE_END, 0);
+   ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
+   if (ctx->ExecuteFlag) {
+      CALL_End(ctx->Exec, ());
    }
 }
 
 static void GLAPIENTRY
-save_VertexAttribL1ui64vARB(GLuint index, const GLuint64EXT *v)
+save_Rectf(GLfloat a, GLfloat b, GLfloat c, GLfloat d)
 {
-   save_VertexAttribL1ui64ARB(index, v[0]);
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_RECTF, 4);
+   if (n) {
+      n[1].f = a;
+      n[2].f = b;
+      n[3].f = c;
+      n[4].f = d;
+   }
+   if (ctx->ExecuteFlag) {
+      CALL_Rectf(ctx->Exec, (a, b, c, d));
+   }
 }
 
-
 static void GLAPIENTRY
 save_PrimitiveRestartNV(void)
 {
@@ -7658,6 +6342,171 @@ save_DispatchComputeIndirect(GLintptr indirect)
                "glDispatchComputeIndirect() during display list compile");
 }
 
+static void ALWAYS_INLINE
+save_Attr32bit(struct gl_context *ctx, unsigned attr, unsigned size,
+               GLenum type, uint32_t x, uint32_t y, uint32_t z, uint32_t w)
+{
+   Node *n;
+   SAVE_FLUSH_VERTICES(ctx);
+   unsigned base_op;
+   unsigned index = attr;
+
+   /* We don't care about GL_INT vs GL_UNSIGNED_INT. The idea is to get W=1
+    * right for 3 or lower number of components, so only distinguish between
+    * FLOAT and INT.
+    */
+   if (type == GL_FLOAT) {
+      if (attr >= VERT_ATTRIB_GENERIC0) {
+         base_op = OPCODE_ATTR_1F_ARB;
+         attr -= VERT_ATTRIB_GENERIC0;
+      } else {
+         base_op = OPCODE_ATTR_1F_NV;
+      }
+   } else {
+      base_op = OPCODE_ATTR_1I;
+      attr -= VERT_ATTRIB_GENERIC0;
+   }
+
+   n = alloc_instruction(ctx, base_op + size - 1, 1 + size);
+   if (n) {
+      n[1].ui = attr;
+      n[2].ui = x;
+      if (size >= 2) n[3].ui = y;
+      if (size >= 3) n[4].ui = z;
+      if (size >= 4) n[5].ui = w;
+   }
+
+   ctx->ListState.ActiveAttribSize[index] = size;
+   ASSIGN_4V(ctx->ListState.CurrentAttrib[index], x, y, z, w);
+
+   if (ctx->ExecuteFlag) {
+      if (type == GL_FLOAT) {
+         if (base_op == OPCODE_ATTR_1F_NV) {
+            if (size == 4)
+               CALL_VertexAttrib4fNV(ctx->Exec, (attr, uif(x), uif(y), uif(z), uif(w)));
+            else if (size == 3)
+               CALL_VertexAttrib3fNV(ctx->Exec, (attr, uif(x), uif(y), uif(z)));
+            else if (size == 2)
+               CALL_VertexAttrib2fNV(ctx->Exec, (attr, uif(x), uif(y)));
+            else
+               CALL_VertexAttrib1fNV(ctx->Exec, (attr, uif(x)));
+         } else {
+            if (size == 4)
+               CALL_VertexAttrib4fARB(ctx->Exec, (attr, uif(x), uif(y), uif(z), uif(w)));
+            else if (size == 3)
+               CALL_VertexAttrib3fARB(ctx->Exec, (attr, uif(x), uif(y), uif(z)));
+            else if (size == 2)
+               CALL_VertexAttrib2fARB(ctx->Exec, (attr, uif(x), uif(y)));
+            else
+               CALL_VertexAttrib1fARB(ctx->Exec, (attr, uif(x)));
+         }
+      } else {
+         if (size == 4)
+            CALL_VertexAttribI4iEXT(ctx->Exec, (attr, x, y, z, w));
+         else if (size == 3)
+            CALL_VertexAttribI3iEXT(ctx->Exec, (attr, x, y, z));
+         else if (size == 2)
+            CALL_VertexAttribI2iEXT(ctx->Exec, (attr, x, y));
+         else
+            CALL_VertexAttribI1iEXT(ctx->Exec, (attr, x));
+      }
+   }
+}
+
+static void ALWAYS_INLINE
+save_Attr64bit(struct gl_context *ctx, unsigned attr, unsigned size,
+               GLenum type, uint64_t x, uint64_t y, uint64_t z, uint64_t w)
+{
+   Node *n;
+   SAVE_FLUSH_VERTICES(ctx);
+   unsigned base_op;
+   unsigned index = attr;
+
+   if (type == GL_DOUBLE) {
+      base_op = OPCODE_ATTR_1D;
+   } else {
+      base_op = OPCODE_ATTR_1UI64;
+      assert(size == 1);
+   }
+
+   attr -= VERT_ATTRIB_GENERIC0;
+   n = alloc_instruction(ctx, base_op + size - 1, 1 + size * 2);
+   if (n) {
+      n[1].ui = attr;
+      ASSIGN_UINT64_TO_NODES(n, 2, x);
+      if (size >= 2) ASSIGN_UINT64_TO_NODES(n, 4, y);
+      if (size >= 3) ASSIGN_UINT64_TO_NODES(n, 6, z);
+      if (size >= 4) ASSIGN_UINT64_TO_NODES(n, 8, w);
+   }
+
+   ctx->ListState.ActiveAttribSize[index] = size;
+   memcpy(ctx->ListState.CurrentAttrib[index], &n[2], size * sizeof(uint64_t));
+
+   if (ctx->ExecuteFlag) {
+      uint64_t v[] = {x, y, z, w};
+      if (type == GL_DOUBLE) {
+         if (size == 4)
+            CALL_VertexAttribL4dv(ctx->Exec, (attr, (GLdouble*)v));
+         else if (size == 3)
+            CALL_VertexAttribL3dv(ctx->Exec, (attr, (GLdouble*)v));
+         else if (size == 2)
+            CALL_VertexAttribL2dv(ctx->Exec, (attr, (GLdouble*)v));
+         else
+            CALL_VertexAttribL1d(ctx->Exec, (attr, UINT64_AS_DOUBLE(x)));
+      } else {
+         CALL_VertexAttribL1ui64ARB(ctx->Exec, (attr, x));
+      }
+   }
+}
+
+/**
+ * If index=0, does glVertexAttrib*() alias glVertex() to emit a vertex?
+ * It depends on a few things, including whether we're inside or outside
+ * of glBegin/glEnd.
+ */
+static inline bool
+is_vertex_position(const struct gl_context *ctx, GLuint index)
+{
+   return (index == 0 &&
+           _mesa_attr_zero_aliases_vertex(ctx) &&
+           _mesa_inside_dlist_begin_end(ctx));
+}
+
+/**
+ * This macro is used to implement all the glVertex, glColor, glTexCoord,
+ * glVertexAttrib, etc functions.
+ * \param A  VBO_ATTRIB_x attribute index
+ * \param N  attribute size (1..4)
+ * \param T  type (GL_FLOAT, GL_DOUBLE, GL_INT, GL_UNSIGNED_INT)
+ * \param C  cast type (uint32_t or uint64_t)
+ * \param V0, V1, v2, V3  attribute value
+ */
+#define ATTR_UNION(A, N, T, C, V0, V1, V2, V3)                          \
+do {                                                                    \
+   if (sizeof(C) == 4) {                                                \
+      save_Attr32bit(ctx, A, N, T, V0, V1, V2, V3);                     \
+   } else {                                                             \
+      save_Attr64bit(ctx, A, N, T, V0, V1, V2, V3);                     \
+   }                                                                    \
+} while (0)
+
+#undef ERROR
+#define ERROR(err) _mesa_error(ctx, err, __func__)
+#define TAG(x) save_##x
+
+#define VBO_ATTRIB_POS           VERT_ATTRIB_POS
+#define VBO_ATTRIB_NORMAL        VERT_ATTRIB_NORMAL
+#define VBO_ATTRIB_COLOR0        VERT_ATTRIB_COLOR0
+#define VBO_ATTRIB_COLOR1        VERT_ATTRIB_COLOR1
+#define VBO_ATTRIB_FOG           VERT_ATTRIB_FOG
+#define VBO_ATTRIB_COLOR_INDEX   VERT_ATTRIB_COLOR_INDEX
+#define VBO_ATTRIB_EDGEFLAG      VERT_ATTRIB_EDGEFLAG
+#define VBO_ATTRIB_TEX0          VERT_ATTRIB_TEX0
+#define VBO_ATTRIB_GENERIC0      VERT_ATTRIB_GENERIC0
+#define VBO_ATTRIB_MAX           VERT_ATTRIB_MAX
+
+#include "vbo/vbo_attrib_tmp.h"
+
 static void GLAPIENTRY
 save_UseProgram(GLuint program)
 {
index 8b09e7b20e93d0086ee14e0cdbef878bf828753d..efdb0a0957060015450035a52aad43a357065129 100644 (file)
@@ -204,6 +204,16 @@ static inline uint64_t DOUBLE_AS_UINT64(double d)
    return tmp.u64;
 }
 
+static inline double UINT64_AS_DOUBLE(uint64_t u)
+{
+   union {
+      double d;
+      uint64_t u64;
+   } tmp;
+   tmp.u64 = u;
+   return tmp.d;
+}
+
 /* First sign-extend x, then return uint32_t. */
 #define INT_AS_UINT(x) ((uint32_t)((int32_t)(x)))
 #define FLOAT_AS_UINT(x) (FLOAT_AS_UNION(x).u)
index c7889668f585f736e4419de0c10db4874f7ced75..f267bb723caa7d775b992ecaf9a399534b983e60 100644 (file)
@@ -4584,7 +4584,7 @@ struct gl_dlist_state
    GLvertexformat ListVtxfmt;
 
    GLubyte ActiveAttribSize[VERT_ATTRIB_MAX];
-   GLfloat CurrentAttrib[VERT_ATTRIB_MAX][8];
+   uint32_t CurrentAttrib[VERT_ATTRIB_MAX][8];
 
    GLubyte ActiveMaterialSize[MAT_ATTRIB_MAX];
    GLfloat CurrentMaterial[MAT_ATTRIB_MAX][4];
index 3e96c7d2fbac5c79c35ad257f3d62070dd8c1f27..f5ef0ac56c3462ac6243efe70937ff865dabdada 100644 (file)
@@ -111,7 +111,7 @@ install_vtxfmt(struct gl_context *ctx, struct _glapi_table *tab,
       SET_PrimitiveRestartNV(tab, vfmt->PrimitiveRestartNV);
    }
 
-   /* Originally for GL_NV_vertex_program, this is also used by dlist.c */
+   /* Originally for GL_NV_vertex_program, this is now only used by dlist.c */
    if (ctx->API == API_OPENGL_COMPAT) {
       SET_VertexAttrib1fNV(tab, vfmt->VertexAttrib1fNV);
       SET_VertexAttrib1fvNV(tab, vfmt->VertexAttrib1fvNV);