Add support for GL_APPLE_vertex_array_object. Several test programs
authorIan Romanick <idr@us.ibm.com>
Mon, 12 Jun 2006 16:26:29 +0000 (16:26 +0000)
committerIan Romanick <idr@us.ibm.com>
Mon, 12 Jun 2006 16:26:29 +0000 (16:26 +0000)
and demos are also added.

Adding basic support to drivers should be as easy as just enabling the
extension, though thorough test would also be required.

42 files changed:
progs/demos/Makefile
progs/demos/vao_demo.c [new file with mode: 0644]
progs/tests/Makefile
progs/tests/vao-01.c [new file with mode: 0644]
progs/tests/vao-02.c [new file with mode: 0644]
src/mesa/array_cache/ac_context.c
src/mesa/array_cache/ac_import.c
src/mesa/drivers/common/driverfuncs.c
src/mesa/drivers/dri/common/extension_helper.h
src/mesa/glapi/APPLE_vertex_array_object.xml [new file with mode: 0644]
src/mesa/glapi/dispatch.h
src/mesa/glapi/gl_API.xml
src/mesa/glapi/glapioffsets.h
src/mesa/glapi/glapitable.h
src/mesa/glapi/glapitemp.h
src/mesa/glapi/glprocs.h
src/mesa/main/api_arrayelt.c
src/mesa/main/api_validate.c
src/mesa/main/arrayobj.c [new file with mode: 0644]
src/mesa/main/arrayobj.h [new file with mode: 0644]
src/mesa/main/attrib.c
src/mesa/main/bufferobj.c
src/mesa/main/bufferobj.h
src/mesa/main/context.c
src/mesa/main/dd.h
src/mesa/main/dlist.c
src/mesa/main/enable.c
src/mesa/main/enums.c
src/mesa/main/extensions.c
src/mesa/main/get.c
src/mesa/main/get_gen.py
src/mesa/main/getstring.c
src/mesa/main/mtypes.h
src/mesa/main/state.c
src/mesa/main/varray.c
src/mesa/shader/arbprogram.c
src/mesa/shader/nvprogram.c
src/mesa/sources
src/mesa/sparc/glapi_sparc.S
src/mesa/tnl/t_array_import.c
src/mesa/x86-64/glapi_x86-64.S
src/mesa/x86/glapi_x86.S

index c7a4cc7..87b5b84 100644 (file)
@@ -60,6 +60,7 @@ PROGS = \
        trispd \
        tunnel \
        tunnel2 \
+       vao_demo \
        winpos
 
 
diff --git a/progs/demos/vao_demo.c b/progs/demos/vao_demo.c
new file mode 100644 (file)
index 0000000..e6a89f6
--- /dev/null
@@ -0,0 +1,323 @@
+/*
+ * (C) Copyright IBM Corporation 2006
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 (including the next
+ * paragraph) 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 NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * IBM AND/OR THEIR SUPPLIERS 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.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef __darwin__
+#include <GLUT/glut.h>
+
+typedef void (* PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
+typedef void (* PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef void (* PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef GLboolean (* PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
+
+#else
+#include <GL/glut.h>
+#endif
+
+static PFNGLBINDVERTEXARRAYAPPLEPROC bind_vertex_array = NULL;
+static PFNGLGENVERTEXARRAYSAPPLEPROC gen_vertex_arrays = NULL;
+static PFNGLDELETEVERTEXARRAYSAPPLEPROC delete_vertex_arrays = NULL;
+static PFNGLISVERTEXARRAYAPPLEPROC is_vertex_array = NULL;
+
+static int Width = 400;
+static int Height = 200;
+static const GLfloat Near = 5.0, Far = 25.0;
+static GLfloat angle = 0.0;
+
+static GLuint cube_array_obj = 0;
+static GLuint oct_array_obj = 0;
+
+static const GLfloat cube_vert[] = {
+    -0.5, -0.5, -0.5,  1.0,
+     0.5, -0.5, -0.5,  1.0,
+     0.5,  0.5, -0.5,  1.0,
+    -0.5,  0.5, -0.5,  1.0,
+
+    -0.5, -0.5,  0.5,  1.0,
+     0.5, -0.5,  0.5,  1.0,
+     0.5,  0.5,  0.5,  1.0,
+    -0.5,  0.5,  0.5,  1.0,
+
+    -0.5,  0.5, -0.5,  1.0,
+     0.5,  0.5, -0.5,  1.0,
+     0.5,  0.5,  0.5,  1.0,
+    -0.5,  0.5,  0.5,  1.0,
+
+    -0.5, -0.5, -0.5,  1.0,
+     0.5, -0.5, -0.5,  1.0,
+     0.5, -0.5,  0.5,  1.0,
+    -0.5, -0.5,  0.5,  1.0,
+
+     0.5, -0.5, -0.5,  1.0,
+     0.5, -0.5,  0.5,  1.0,
+     0.5,  0.5,  0.5,  1.0,
+     0.5,  0.5, -0.5,  1.0,
+
+    -0.5, -0.5, -0.5,  1.0,
+    -0.5, -0.5,  0.5,  1.0,
+    -0.5,  0.5,  0.5,  1.0,
+    -0.5,  0.5, -0.5,  1.0,
+
+};
+
+static const GLfloat cube_color[] = {
+     1.0, 0.0, 0.0, 1.0,
+     1.0, 0.0, 0.0, 1.0,
+     1.0, 0.0, 0.0, 1.0,
+     1.0, 0.0, 0.0, 1.0,
+
+     0.0, 1.0, 0.0, 1.0,
+     0.0, 1.0, 0.0, 1.0,
+     0.0, 1.0, 0.0, 1.0,
+     0.0, 1.0, 0.0, 1.0,
+
+     0.0, 0.0, 1.0, 1.0,
+     0.0, 0.0, 1.0, 1.0,
+     0.0, 0.0, 1.0, 1.0,
+     0.0, 0.0, 1.0, 1.0,
+
+     1.0, 0.0, 1.0, 1.0,
+     1.0, 0.0, 1.0, 1.0,
+     1.0, 0.0, 1.0, 1.0,
+     1.0, 0.0, 1.0, 1.0,
+
+     1.0, 1.0, 1.0, 1.0,
+     1.0, 1.0, 1.0, 1.0,
+     1.0, 1.0, 1.0, 1.0,
+     1.0, 1.0, 1.0, 1.0,
+
+     0.5, 0.5, 0.5, 1.0,
+     0.5, 0.5, 0.5, 1.0,
+     0.5, 0.5, 0.5, 1.0,
+     0.5, 0.5, 0.5, 1.0,
+};
+
+static const GLfloat oct_vert[] = {
+    0.0,  0.0,  0.7071, 1.0,
+    0.5,  0.5,  0.0,  1.0,
+   -0.5,  0.5,  0.0,  1.0,
+
+    0.0,  0.0,  0.7071, 1.0,
+    0.5, -0.5,  0.0,  1.0,
+   -0.5, -0.5,  0.0,  1.0,
+
+    0.0,  0.0,  0.7071, 1.0,
+   -0.5, -0.5,  0.0,  1.0,
+   -0.5,  0.5,  0.0,  1.0,
+
+    0.0,  0.0,  0.7071, 1.0,
+    0.5,  0.5,  0.0,  1.0,
+    0.5, -0.5,  0.0,  1.0,
+
+
+    0.0,  0.0, -0.7071, 1.0,
+    0.5,  0.5,  0.0,  1.0,
+   -0.5,  0.5,  0.0,  1.0,
+
+    0.0,  0.0, -0.7071, 1.0,
+    0.5, -0.5,  0.0,  1.0,
+   -0.5, -0.5,  0.0,  1.0,
+
+    0.0,  0.0, -0.7071, 1.0,
+   -0.5, -0.5,  0.0,  1.0,
+   -0.5,  0.5,  0.0,  1.0,
+
+    0.0,  0.0, -0.7071, 1.0,
+    0.5,  0.5,  0.0,  1.0,
+    0.5, -0.5,  0.0,  1.0,
+};
+
+static const GLfloat oct_color[] = {
+     1.0, 0.64, 0.0, 1.0,
+     1.0, 0.64, 0.0, 1.0,
+     1.0, 0.64, 0.0, 1.0,
+
+     0.8, 0.51, 0.0, 1.0,
+     0.8, 0.51, 0.0, 1.0,
+     0.8, 0.51, 0.0, 1.0,
+
+     0.5, 0.32, 0.0, 1.0,
+     0.5, 0.32, 0.0, 1.0,
+     0.5, 0.32, 0.0, 1.0,
+
+     0.2, 0.13, 0.0, 1.0,
+     0.2, 0.13, 0.0, 1.0,
+     0.2, 0.13, 0.0, 1.0,
+
+     0.2, 0.13, 0.0, 1.0,
+     0.2, 0.13, 0.0, 1.0,
+     0.2, 0.13, 0.0, 1.0,
+
+     0.5, 0.32, 0.0, 1.0,
+     0.5, 0.32, 0.0, 1.0,
+     0.5, 0.32, 0.0, 1.0,
+
+     0.8, 0.51, 0.0, 1.0,
+     0.8, 0.51, 0.0, 1.0,
+     0.8, 0.51, 0.0, 1.0,
+
+     1.0, 0.64, 0.0, 1.0,
+     1.0, 0.64, 0.0, 1.0,
+     1.0, 0.64, 0.0, 1.0,
+};
+
+static void Display( void )
+{
+   glClearColor(0.1, 0.1, 0.4, 0);
+   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
+
+   glMatrixMode( GL_MODELVIEW );
+   glLoadIdentity();
+   glTranslatef( 0.0, 0.0, -15.0 );
+   glRotatef( angle, 0.0 * angle , 0.0 * angle, 1.0 );
+
+
+   (*bind_vertex_array)( cube_array_obj );
+   glPushMatrix();
+   glTranslatef(-1.5, 0, 0);
+   glRotatef( angle, 0.3 * angle , 0.8 * angle, 1.0 );
+   glDrawArrays( GL_QUADS, 0, 4 * 6 );
+   glPopMatrix();
+
+
+   (*bind_vertex_array)( oct_array_obj );
+   glPushMatrix();
+   glTranslatef(1.5, 0, 0);
+   glRotatef( angle, 0.3 * angle , 0.8 * angle, 1.0 );
+   glDrawArrays( GL_TRIANGLES, 0, 3 * 8 );
+   glPopMatrix();
+
+   glutSwapBuffers();
+}
+
+
+static void Idle( void )
+{
+   static double t0 = -1.;
+   double dt, t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
+   if (t0 < 0.0)
+      t0 = t;
+   dt = t - t0;
+   t0 = t;
+
+   angle += 70.0 * dt;  /* 70 degrees per second */
+   angle = fmod(angle, 360.0); /* prevents eventual overflow */
+
+   glutPostRedisplay();
+}
+
+
+static void Visible( int vis )
+{
+   if ( vis == GLUT_VISIBLE ) {
+      glutIdleFunc( Idle );
+   }
+   else {
+      glutIdleFunc( NULL );
+   }
+}
+static void Reshape( int width, int height )
+{
+   GLfloat ar = (float) width / (float) height;
+   Width = width;
+   Height = height;
+   glViewport( 0, 0, width, height );
+   glMatrixMode( GL_PROJECTION );
+   glLoadIdentity();
+   glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+   (void) x;
+   (void) y;
+   switch (key) {
+      case 27:
+         exit(0);
+         break;
+   }
+   glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+   const char * const ver_string = (const char * const)
+       glGetString( GL_VERSION );
+
+   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+   printf("GL_VERSION = %s\n", ver_string);
+
+   if ( !glutExtensionSupported("GL_APPLE_vertex_array_object") ) {
+      printf("Sorry, this program requires GL_APPLE_vertex_array_object\n");
+      exit(1);
+   }
+
+   bind_vertex_array = glutGetProcAddress( "glBindVertexArrayAPPLE" );
+   gen_vertex_arrays = glutGetProcAddress( "glGenVertexArraysAPPLE" );
+   delete_vertex_arrays = glutGetProcAddress( "glDeleteVertexArraysAPPLE" );
+   is_vertex_array = glutGetProcAddress( "glIsVertexArrayAPPLE" );
+
+
+   glEnable( GL_DEPTH_TEST );
+   
+   (*gen_vertex_arrays)( 1, & cube_array_obj );
+   (*bind_vertex_array)( cube_array_obj );
+   glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, cube_vert);
+   glColorPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, cube_color);
+   glEnableClientState( GL_VERTEX_ARRAY );
+   glEnableClientState( GL_COLOR_ARRAY );
+
+   (*gen_vertex_arrays)( 1, & oct_array_obj );
+   (*bind_vertex_array)( oct_array_obj );
+   glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, oct_vert);
+   glColorPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, oct_color);
+   glEnableClientState( GL_VERTEX_ARRAY );
+   glEnableClientState( GL_COLOR_ARRAY );
+
+   (*bind_vertex_array)( 0 );
+   glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xDEADBEEF );
+   glColorPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xBADDC0DE );
+}
+
+
+int main( int argc, char *argv[] )
+{
+   glutInit( &argc, argv );
+   glutInitWindowPosition( 0, 0 );
+   glutInitWindowSize( Width, Height );
+   glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH );
+   glutCreateWindow( "GL_APPLE_vertex_array_object demo" );
+   glutReshapeFunc( Reshape );
+   glutKeyboardFunc( Key );
+   glutDisplayFunc( Display );
+   glutVisibilityFunc( Visible );
+   Init();
+   glutMainLoop();
+   return 0;
+}
index 7f6655d..5f5453b 100644 (file)
@@ -64,6 +64,8 @@ SOURCES = \
        texobjshare.c \
        texrect.c \
        texwrap.c \
+       vao-01.c \
+       vao-02.c \
        vparray.c \
        vptest1.c \
        vptest2.c \
diff --git a/progs/tests/vao-01.c b/progs/tests/vao-01.c
new file mode 100644 (file)
index 0000000..c1849a0
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * (C) Copyright IBM Corporation 2006
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 (including the next
+ * paragraph) 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 NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * IBM AND/OR THEIR SUPPLIERS 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.
+ */
+
+/**
+ * \file vao-01.c
+ *
+ * Simple test of APPLE_vertex_array_object functionality.  This test creates
+ * a VAO, pushed it (via \c glPushClientAttrib), modifies the VAO, then pops
+ * it (via \c glPopClientAttrib).  After popping, the state of the VAO is
+ * examined.
+ * 
+ * According the the APPLE_vertex_array_object spec, the contents of the VAO
+ * should be restored to the values that they had when pushed.
+ * 
+ * \author Ian Romanick <idr@us.ibm.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef __darwin__
+#include <GLUT/glut.h>
+
+typedef void (* PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
+typedef void (* PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef void (* PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef GLboolean (* PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
+
+#else
+#include <GL/glut.h>
+#endif
+
+static PFNGLBINDVERTEXARRAYAPPLEPROC bind_vertex_array = NULL;
+static PFNGLGENVERTEXARRAYSAPPLEPROC gen_vertex_arrays = NULL;
+static PFNGLDELETEVERTEXARRAYSAPPLEPROC delete_vertex_arrays = NULL;
+static PFNGLISVERTEXARRAYAPPLEPROC is_vertex_array = NULL;
+
+static int Width = 400;
+static int Height = 200;
+static const GLfloat Near = 5.0, Far = 25.0;
+
+
+static void Display( void )
+{
+}
+
+
+static void Idle( void )
+{
+}
+
+
+static void Visible( int vis )
+{
+   if ( vis == GLUT_VISIBLE ) {
+      glutIdleFunc( Idle );
+   }
+   else {
+      glutIdleFunc( NULL );
+   }
+}
+static void Reshape( int width, int height )
+{
+   GLfloat ar = (float) width / (float) height;
+   Width = width;
+   Height = height;
+   glViewport( 0, 0, width, height );
+   glMatrixMode( GL_PROJECTION );
+   glLoadIdentity();
+   glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+   (void) x;
+   (void) y;
+   switch (key) {
+      case 27:
+         exit(0);
+         break;
+   }
+   glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+   const char * const ver_string = (const char * const)
+       glGetString( GL_VERSION );
+   GLuint obj;
+   int pass = 1;
+   void * ptr;
+
+
+   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+   printf("GL_VERSION = %s\n\n", ver_string);
+
+   if ( !glutExtensionSupported("GL_APPLE_vertex_array_object") ) {
+      printf("Sorry, this program requires GL_APPLE_vertex_array_object\n");
+      exit(2);
+   }
+
+   bind_vertex_array = glutGetProcAddress( "glBindVertexArrayAPPLE" );
+   gen_vertex_arrays = glutGetProcAddress( "glGenVertexArraysAPPLE" );
+   delete_vertex_arrays = glutGetProcAddress( "glDeleteVertexArraysAPPLE" );
+   is_vertex_array = glutGetProcAddress( "glIsVertexArrayAPPLE" );
+
+
+   (*gen_vertex_arrays)( 1, & obj );
+   (*bind_vertex_array)( obj );
+   glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xDEADBEEF);
+   glEnableClientState( GL_VERTEX_ARRAY );
+
+   glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
+
+   glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xBADDC0DE);
+   glDisableClientState( GL_VERTEX_ARRAY );
+
+   glPopClientAttrib();
+
+   if ( ! glIsEnabled( GL_VERTEX_ARRAY ) ) {
+      printf( "Array state is incorrectly disabled.\n" );
+      pass = 0;
+   }
+
+   glGetPointerv( GL_VERTEX_ARRAY_POINTER, & ptr );
+   if ( ptr != (void *) 0xDEADBEEF ) {
+      printf( "Array pointer is incorrectly set to 0x%p.\n", ptr );
+      pass = 0;
+   }
+
+   if ( ! pass ) {
+      printf( "FAIL!\n" );
+      exit(1);
+   }
+}
+
+
+int main( int argc, char *argv[] )
+{
+   glutInit( &argc, argv );
+   glutInitWindowPosition( 0, 0 );
+   glutInitWindowSize( Width, Height );
+   glutInitDisplayMode( GLUT_RGB );
+   glutCreateWindow( "GL_APPLE_vertex_array_object demo" );
+   glutReshapeFunc( Reshape );
+   glutKeyboardFunc( Key );
+   glutDisplayFunc( Display );
+   glutVisibilityFunc( Visible );
+
+   Init();
+
+   return 0;
+}
diff --git a/progs/tests/vao-02.c b/progs/tests/vao-02.c
new file mode 100644 (file)
index 0000000..87d4531
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * (C) Copyright IBM Corporation 2006
+ * 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
+ * on the rights to use, copy, modify, merge, publish, distribute, sub
+ * license, 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 (including the next
+ * paragraph) 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 NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * IBM AND/OR THEIR SUPPLIERS 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.
+ */
+
+/**
+ * \file vao-02.c
+ *
+ * Simple test of APPLE_vertex_array_object functionality.  This test creates
+ * a VAO, pushed it (via \c glPushClientAttrib), deletes the VAO, then pops
+ * it (via \c glPopClientAttrib).  After popping, the state of the VAO is
+ * examined.
+ * 
+ * According the the APPLE_vertex_array_object spec, the contents of the VAO
+ * should be restored to the values that they had when pushed.
+ * 
+ * \author Ian Romanick <idr@us.ibm.com>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#ifdef __darwin__
+#include <GLUT/glut.h>
+
+typedef void (* PFNGLBINDVERTEXARRAYAPPLEPROC) (GLuint array);
+typedef void (* PFNGLDELETEVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef void (* PFNGLGENVERTEXARRAYSAPPLEPROC) (GLsizei n, const GLuint *arrays);
+typedef GLboolean (* PFNGLISVERTEXARRAYAPPLEPROC) (GLuint array);
+
+#else
+#include <GL/glut.h>
+#endif
+
+static PFNGLBINDVERTEXARRAYAPPLEPROC bind_vertex_array = NULL;
+static PFNGLGENVERTEXARRAYSAPPLEPROC gen_vertex_arrays = NULL;
+static PFNGLDELETEVERTEXARRAYSAPPLEPROC delete_vertex_arrays = NULL;
+static PFNGLISVERTEXARRAYAPPLEPROC is_vertex_array = NULL;
+
+static int Width = 400;
+static int Height = 200;
+static const GLfloat Near = 5.0, Far = 25.0;
+
+
+static void Display( void )
+{
+}
+
+
+static void Idle( void )
+{
+}
+
+
+static void Visible( int vis )
+{
+   if ( vis == GLUT_VISIBLE ) {
+      glutIdleFunc( Idle );
+   }
+   else {
+      glutIdleFunc( NULL );
+   }
+}
+static void Reshape( int width, int height )
+{
+   GLfloat ar = (float) width / (float) height;
+   Width = width;
+   Height = height;
+   glViewport( 0, 0, width, height );
+   glMatrixMode( GL_PROJECTION );
+   glLoadIdentity();
+   glFrustum( -ar, ar, -1.0, 1.0, Near, Far );
+}
+
+
+static void Key( unsigned char key, int x, int y )
+{
+   (void) x;
+   (void) y;
+   switch (key) {
+      case 27:
+         exit(0);
+         break;
+   }
+   glutPostRedisplay();
+}
+
+
+static void Init( void )
+{
+   const char * const ver_string = (const char * const)
+       glGetString( GL_VERSION );
+   GLuint obj;
+   int pass = 1;
+   void * ptr;
+   GLenum err;
+
+
+   printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
+   printf("GL_VERSION = %s\n\n", ver_string);
+
+   if ( !glutExtensionSupported("GL_APPLE_vertex_array_object") ) {
+      printf("Sorry, this program requires GL_APPLE_vertex_array_object\n");
+      exit(2);
+   }
+
+   bind_vertex_array = glutGetProcAddress( "glBindVertexArrayAPPLE" );
+   gen_vertex_arrays = glutGetProcAddress( "glGenVertexArraysAPPLE" );
+   delete_vertex_arrays = glutGetProcAddress( "glDeleteVertexArraysAPPLE" );
+   is_vertex_array = glutGetProcAddress( "glIsVertexArrayAPPLE" );
+
+
+   (*gen_vertex_arrays)( 1, & obj );
+   (*bind_vertex_array)( obj );
+   glVertexPointer( 4, GL_FLOAT, sizeof(GLfloat) * 4, (void *) 0xDEADBEEF);
+   glEnableClientState( GL_VERTEX_ARRAY );
+
+   glPushClientAttrib( GL_CLIENT_VERTEX_ARRAY_BIT );
+
+   (*delete_vertex_arrays)( 1, & obj );
+   
+   err = glGetError();
+   if (err) {
+      printf( "glGetError incorrectly returned 0x%04x.\n", err );
+      pass = 0;
+   }
+
+   if ( (*is_vertex_array)( obj ) ) {
+      printf( "Array object is incorrectly still valid.\n" );
+      pass = 0;
+   }
+
+   err = glGetError();
+   if (err) {
+      printf( "glGetError incorrectly returned 0x%04x.\n", err );
+      pass = 0;
+   }
+
+   glPopClientAttrib();
+
+   err = glGetError();
+   if (err) {
+      printf( "glGetError incorrectly returned 0x%04x.\n", err );
+      pass = 0;
+   }
+
+   if ( ! (*is_vertex_array)( obj ) ) {
+      printf( "Array object is incorrectly invalid.\n" );
+      pass = 0;
+   }
+
+   if ( ! glIsEnabled( GL_VERTEX_ARRAY ) ) {
+      printf( "Array state is incorrectly disabled.\n" );
+      pass = 0;
+   }
+
+   glGetPointerv( GL_VERTEX_ARRAY_POINTER, & ptr );
+   if ( ptr != (void *) 0xDEADBEEF ) {
+      printf( "Array pointer is incorrectly set to 0x%p.\n", ptr );
+      pass = 0;
+   }
+
+   if ( ! pass ) {
+      printf( "FAIL!\n" );
+      exit(1);
+   }
+}
+
+
+int main( int argc, char *argv[] )
+{
+   glutInit( &argc, argv );
+   glutInitWindowPosition( 0, 0 );
+   glutInitWindowSize( Width, Height );
+   glutInitDisplayMode( GLUT_RGB );
+   glutCreateWindow( "GL_APPLE_vertex_array_object demo" );
+   glutReshapeFunc( Reshape );
+   glutKeyboardFunc( Key );
+   glutDisplayFunc( Display );
+   glutVisibilityFunc( Visible );
+
+   Init();
+
+   return 0;
+}
index ff143c1..5d5ad5e 100644 (file)
@@ -292,7 +292,7 @@ static void _ac_raw_init( GLcontext *ctx )
    ac->Raw.Index = ac->Fallback.Index;
    ac->Raw.Normal = ac->Fallback.Normal;
    ac->Raw.SecondaryColor = ac->Fallback.SecondaryColor;
-   ac->Raw.Vertex = ctx->Array.Vertex;
+   ac->Raw.Vertex = ctx->Array.ArrayObj->Vertex;
 
    ac->IsCached.Color = GL_FALSE;
    ac->IsCached.EdgeFlag = GL_FALSE;
index 6220600..deae44a 100644 (file)
@@ -50,8 +50,8 @@ reset_texcoord( GLcontext *ctx, GLuint unit )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.TexCoord[unit].Enabled) {
-      ac->Raw.TexCoord[unit] = ctx->Array.TexCoord[unit];
+   if (ctx->Array.ArrayObj->TexCoord[unit].Enabled) {
+      ac->Raw.TexCoord[unit] = ctx->Array.ArrayObj->TexCoord[unit];
       STRIDE_ARRAY(ac->Raw.TexCoord[unit], ac->start);
    }
    else {
@@ -73,9 +73,9 @@ static void
 reset_vertex( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
-   ASSERT(ctx->Array.Vertex.Enabled
-          || (ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[0].Enabled));
-   ac->Raw.Vertex = ctx->Array.Vertex;
+   ASSERT(ctx->Array.ArrayObj->Vertex.Enabled
+          || (ctx->VertexProgram._Enabled && ctx->Array.ArrayObj->VertexAttrib[0].Enabled));
+   ac->Raw.Vertex = ctx->Array.ArrayObj->Vertex;
    STRIDE_ARRAY(ac->Raw.Vertex, ac->start);
    ac->IsCached.Vertex = GL_FALSE;
    ac->NewArrayState &= ~_NEW_ARRAY_VERTEX;
@@ -87,8 +87,8 @@ reset_normal( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.Normal.Enabled) {
-      ac->Raw.Normal = ctx->Array.Normal;
+   if (ctx->Array.ArrayObj->Normal.Enabled) {
+      ac->Raw.Normal = ctx->Array.ArrayObj->Normal;
       STRIDE_ARRAY(ac->Raw.Normal, ac->start);
    }
    else {
@@ -105,8 +105,8 @@ reset_color( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.Color.Enabled) {
-      ac->Raw.Color = ctx->Array.Color;
+   if (ctx->Array.ArrayObj->Color.Enabled) {
+      ac->Raw.Color = ctx->Array.ArrayObj->Color;
       STRIDE_ARRAY(ac->Raw.Color, ac->start);
    }
    else
@@ -122,8 +122,8 @@ reset_secondarycolor( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.SecondaryColor.Enabled) {
-      ac->Raw.SecondaryColor = ctx->Array.SecondaryColor;
+   if (ctx->Array.ArrayObj->SecondaryColor.Enabled) {
+      ac->Raw.SecondaryColor = ctx->Array.ArrayObj->SecondaryColor;
       STRIDE_ARRAY(ac->Raw.SecondaryColor, ac->start);
    }
    else
@@ -139,8 +139,8 @@ reset_index( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.Index.Enabled) {
-      ac->Raw.Index = ctx->Array.Index;
+   if (ctx->Array.ArrayObj->Index.Enabled) {
+      ac->Raw.Index = ctx->Array.ArrayObj->Index;
       STRIDE_ARRAY(ac->Raw.Index, ac->start);
    }
    else
@@ -156,8 +156,8 @@ reset_fogcoord( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.FogCoord.Enabled) {
-      ac->Raw.FogCoord = ctx->Array.FogCoord;
+   if (ctx->Array.ArrayObj->FogCoord.Enabled) {
+      ac->Raw.FogCoord = ctx->Array.ArrayObj->FogCoord;
       STRIDE_ARRAY(ac->Raw.FogCoord, ac->start);
    }
    else
@@ -173,8 +173,8 @@ reset_edgeflag( GLcontext *ctx )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.EdgeFlag.Enabled) {
-      ac->Raw.EdgeFlag = ctx->Array.EdgeFlag;
+   if (ctx->Array.ArrayObj->EdgeFlag.Enabled) {
+      ac->Raw.EdgeFlag = ctx->Array.ArrayObj->EdgeFlag;
       STRIDE_ARRAY(ac->Raw.EdgeFlag, ac->start);
    }
    else
@@ -190,8 +190,8 @@ reset_attrib( GLcontext *ctx, GLuint index )
 {
    ACcontext *ac = AC_CONTEXT(ctx);
 
-   if (ctx->Array.VertexAttrib[index].Enabled) {
-      ac->Raw.Attrib[index] = ctx->Array.VertexAttrib[index];
+   if (ctx->Array.ArrayObj->VertexAttrib[index].Enabled) {
+      ac->Raw.Attrib[index] = ctx->Array.ArrayObj->VertexAttrib[index];
       STRIDE_ARRAY(ac->Raw.Attrib[index], ac->start);
    }
    else
@@ -831,7 +831,7 @@ _ac_import_range( GLcontext *ctx, GLuint start, GLuint count )
        * the whole locked range always be dealt with, otherwise hard to
        * maintain cached data in the face of clipping.
        */
-      ac->NewArrayState |= ~ctx->Array._Enabled;
+      ac->NewArrayState |= ~ctx->Array.ArrayObj->_Enabled;
       ac->start = ctx->Array.LockFirst;
       ac->count = ctx->Array.LockCount;
       ASSERT(ac->start == start); /* hmm? */
index 9838e0b..3ccbe54 100644 (file)
@@ -43,6 +43,7 @@
 #include "fbobject.h"
 #include "texrender.h"
 #endif
+#include "arrayobj.h"
 
 #include "driverfuncs.h"
 #include "tnl/tnl.h"
@@ -220,6 +221,11 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
    driver->BeginQuery = NULL;
    driver->EndQuery = NULL;
 
+   /* APPLE_vertex_array_object */
+   driver->NewArrayObject = _mesa_new_array_object;
+   driver->DeleteArrayObject = _mesa_delete_array_object;
+   driver->BindArrayObject = NULL;
+
    /* T&L stuff */
    driver->NeedValidate = GL_FALSE;
    driver->ValidateTnlModule = NULL;
index c21607c..6c8f71d 100644 (file)
@@ -397,6 +397,13 @@ static const char UniformMatrix4fvARB_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_vertex_array_object)
+static const char DeleteVertexArraysAPPLE_names[] = 
+    "ip\0" /* Parameter signature */
+    "glDeleteVertexArraysAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_SGIX_instruments)
 static const char ReadInstrumentsSGIX_names[] = 
     "i\0" /* Parameter signature */
@@ -2472,6 +2479,13 @@ static const char ReplacementCodeuivSUN_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_vertex_array_object)
+static const char GenVertexArraysAPPLE_names[] = 
+    "ip\0" /* Parameter signature */
+    "glGenVertexArraysAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_VERSION_1_4) || defined(need_GL_ARB_window_pos) || defined(need_GL_MESA_window_pos)
 static const char WindowPos2iMESA_names[] = 
     "ii\0" /* Parameter signature */
@@ -3775,6 +3789,13 @@ static const char TexCoord4fVertex4fSUN_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_vertex_array_object)
+static const char BindVertexArrayAPPLE_names[] = 
+    "i\0" /* Parameter signature */
+    "glBindVertexArrayAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_ARB_vertex_program)
 static const char GetProgramLocalParameterdvARB_names[] = 
     "iip\0" /* Parameter signature */
@@ -3806,6 +3827,13 @@ static const char BlendFuncSeparateEXT_names[] =
     "";
 #endif
 
+#if defined(need_GL_APPLE_vertex_array_object)
+static const char IsVertexArrayAPPLE_names[] = 
+    "i\0" /* Parameter signature */
+    "glIsVertexArrayAPPLE\0"
+    "";
+#endif
+
 #if defined(need_GL_NV_vertex_program)
 static const char ProgramParameters4dvNV_names[] = 
     "iiip\0" /* Parameter signature */
@@ -4606,6 +4634,16 @@ static const struct dri_extension_function GL_3DFX_tbuffer_functions[] = {
 };
 #endif
 
+#if defined(need_GL_APPLE_vertex_array_object)
+static const struct dri_extension_function GL_APPLE_vertex_array_object_functions[] = {
+    { DeleteVertexArraysAPPLE_names, DeleteVertexArraysAPPLE_remap_index, 820 },
+    { GenVertexArraysAPPLE_names, GenVertexArraysAPPLE_remap_index, 821 },
+    { BindVertexArrayAPPLE_names, BindVertexArrayAPPLE_remap_index, 819 },
+    { IsVertexArrayAPPLE_names, IsVertexArrayAPPLE_remap_index, 822 },
+    { NULL, 0, 0 }
+};
+#endif
+
 #if defined(need_GL_ARB_draw_buffers)
 static const struct dri_extension_function GL_ARB_draw_buffers_functions[] = {
     { DrawBuffersARB_names, DrawBuffersARB_remap_index, 413 },
diff --git a/src/mesa/glapi/APPLE_vertex_array_object.xml b/src/mesa/glapi/APPLE_vertex_array_object.xml
new file mode 100644 (file)
index 0000000..3c0c1cc
--- /dev/null
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<!DOCTYPE OpenGLAPI SYSTEM "gl_API.dtd">
+
+<OpenGLAPI>
+<category name="GL_APPLE_vertex_array_object" number="273">
+    <enum name="VERTEX_ARRAY_BINDING_APPLE"               value="0x85B5"/>
+
+    <function name="BindVertexArrayAPPLE" offset="819">
+        <param name="array" type="GLuint"/>
+    </function>
+
+    <function name="DeleteVertexArraysAPPLE" offset="820">
+        <param name="n" type="GLsizei"/>
+       <param name="arrays" type="const GLuint *" count="n"/>
+    </function>
+
+    <function name="GenVertexArraysAPPLE" offset="821">
+        <param name="n" type="GLsizei"/>
+       <param name="arrays" type="GLuint *" count="n" output="true"/>
+    </function>
+
+    <function name="IsVertexArrayAPPLE" offset="822">
+        <param name="array" type="GLuint"/>
+       <return type="GLboolean"/>
+    </function>
+</category>
+</OpenGLAPI>
index d1d21be..cccfc3f 100644 (file)
 #define CALL_BlitFramebufferEXT(disp, parameters) (*((disp)->BlitFramebufferEXT)) parameters
 #define GET_BlitFramebufferEXT(disp) ((disp)->BlitFramebufferEXT)
 #define SET_BlitFramebufferEXT(disp, fn) ((disp)->BlitFramebufferEXT = fn)
+#define CALL_BindVertexArrayAPPLE(disp, parameters) (*((disp)->BindVertexArrayAPPLE)) parameters
+#define GET_BindVertexArrayAPPLE(disp) ((disp)->BindVertexArrayAPPLE)
+#define SET_BindVertexArrayAPPLE(disp, fn) ((disp)->BindVertexArrayAPPLE = fn)
+#define CALL_DeleteVertexArraysAPPLE(disp, parameters) (*((disp)->DeleteVertexArraysAPPLE)) parameters
+#define GET_DeleteVertexArraysAPPLE(disp) ((disp)->DeleteVertexArraysAPPLE)
+#define SET_DeleteVertexArraysAPPLE(disp, fn) ((disp)->DeleteVertexArraysAPPLE = fn)
+#define CALL_GenVertexArraysAPPLE(disp, parameters) (*((disp)->GenVertexArraysAPPLE)) parameters
+#define GET_GenVertexArraysAPPLE(disp) ((disp)->GenVertexArraysAPPLE)
+#define SET_GenVertexArraysAPPLE(disp, fn) ((disp)->GenVertexArraysAPPLE = fn)
+#define CALL_IsVertexArrayAPPLE(disp, parameters) (*((disp)->IsVertexArrayAPPLE)) parameters
+#define GET_IsVertexArrayAPPLE(disp) ((disp)->IsVertexArrayAPPLE)
+#define SET_IsVertexArrayAPPLE(disp, fn) ((disp)->IsVertexArrayAPPLE = fn)
 
 #else
 
-#define driDispatchRemapTable_size 411
+#define driDispatchRemapTable_size 415
 extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 
 #define LoadTransposeMatrixfARB_remap_index 0
@@ -2932,6 +2944,10 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define GetQueryObjecti64vEXT_remap_index 408
 #define GetQueryObjectui64vEXT_remap_index 409
 #define BlitFramebufferEXT_remap_index 410
+#define BindVertexArrayAPPLE_remap_index 411
+#define DeleteVertexArraysAPPLE_remap_index 412
+#define GenVertexArraysAPPLE_remap_index 413
+#define IsVertexArrayAPPLE_remap_index 414
 
 #define CALL_LoadTransposeMatrixfARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(const GLfloat *)), driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index], parameters)
 #define GET_LoadTransposeMatrixfARB(disp) GET_by_offset(disp, driDispatchRemapTable[LoadTransposeMatrixfARB_remap_index])
@@ -4166,6 +4182,18 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define CALL_BlitFramebufferEXT(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLint, GLbitfield, GLenum)), driDispatchRemapTable[BlitFramebufferEXT_remap_index], parameters)
 #define GET_BlitFramebufferEXT(disp) GET_by_offset(disp, driDispatchRemapTable[BlitFramebufferEXT_remap_index])
 #define SET_BlitFramebufferEXT(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BlitFramebufferEXT_remap_index], fn)
+#define CALL_BindVertexArrayAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[BindVertexArrayAPPLE_remap_index], parameters)
+#define GET_BindVertexArrayAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[BindVertexArrayAPPLE_remap_index])
+#define SET_BindVertexArrayAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[BindVertexArrayAPPLE_remap_index], fn)
+#define CALL_DeleteVertexArraysAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLuint *)), driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index], parameters)
+#define GET_DeleteVertexArraysAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index])
+#define SET_DeleteVertexArraysAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index], fn)
+#define CALL_GenVertexArraysAPPLE(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, GLuint *)), driDispatchRemapTable[GenVertexArraysAPPLE_remap_index], parameters)
+#define GET_GenVertexArraysAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[GenVertexArraysAPPLE_remap_index])
+#define SET_GenVertexArraysAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[GenVertexArraysAPPLE_remap_index], fn)
+#define CALL_IsVertexArrayAPPLE(disp, parameters) CALL_by_offset(disp, (GLboolean (GLAPIENTRYP)(GLuint)), driDispatchRemapTable[IsVertexArrayAPPLE_remap_index], parameters)
+#define GET_IsVertexArrayAPPLE(disp) GET_by_offset(disp, driDispatchRemapTable[IsVertexArrayAPPLE_remap_index])
+#define SET_IsVertexArrayAPPLE(disp, fn) SET_by_offset(disp, driDispatchRemapTable[IsVertexArrayAPPLE_remap_index], fn)
 
 #endif /* !defined(IN_DRI_DRIVER) */
 
index 9fb99e3..eb284ae 100644 (file)
     </function>
 </category>
 
+<xi:include href="APPLE_vertex_array_object.xml" xmlns:xi="http://www.w3.org/2001/XInclude"/>
+
 <category name="GL_APPLE_ycbcr_422" number="275">
     <enum name="YCBCR_422_APPLE"                          value="0x85B9"/>
     <enum name="UNSIGNED_SHORT_8_8_APPLE"                 value="0x85BA"/>
index dfa927f..9d3e896 100644 (file)
 #define _gloffset_GetQueryObjecti64vEXT 816
 #define _gloffset_GetQueryObjectui64vEXT 817
 #define _gloffset_BlitFramebufferEXT 818
-#define _gloffset_FIRST_DYNAMIC 819
+#define _gloffset_BindVertexArrayAPPLE 819
+#define _gloffset_DeleteVertexArraysAPPLE 820
+#define _gloffset_GenVertexArraysAPPLE 821
+#define _gloffset_IsVertexArrayAPPLE 822
+#define _gloffset_FIRST_DYNAMIC 823
 
 #else
 
 #define _gloffset_GetQueryObjecti64vEXT driDispatchRemapTable[GetQueryObjecti64vEXT_remap_index]
 #define _gloffset_GetQueryObjectui64vEXT driDispatchRemapTable[GetQueryObjectui64vEXT_remap_index]
 #define _gloffset_BlitFramebufferEXT driDispatchRemapTable[BlitFramebufferEXT_remap_index]
+#define _gloffset_BindVertexArrayAPPLE driDispatchRemapTable[BindVertexArrayAPPLE_remap_index]
+#define _gloffset_DeleteVertexArraysAPPLE driDispatchRemapTable[DeleteVertexArraysAPPLE_remap_index]
+#define _gloffset_GenVertexArraysAPPLE driDispatchRemapTable[GenVertexArraysAPPLE_remap_index]
+#define _gloffset_IsVertexArrayAPPLE driDispatchRemapTable[IsVertexArrayAPPLE_remap_index]
 
 #endif /* !defined(IN_DRI_DRIVER) */
 
index c672e7e..d356300 100644 (file)
@@ -856,6 +856,10 @@ struct _glapi_table
    void (GLAPIENTRYP GetQueryObjecti64vEXT)(GLuint id, GLenum pname, GLint64EXT * params); /* 816 */
    void (GLAPIENTRYP GetQueryObjectui64vEXT)(GLuint id, GLenum pname, GLuint64EXT * params); /* 817 */
    void (GLAPIENTRYP BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); /* 818 */
+   void (GLAPIENTRYP BindVertexArrayAPPLE)(GLuint array); /* 819 */
+   void (GLAPIENTRYP DeleteVertexArraysAPPLE)(GLsizei n, const GLuint * arrays); /* 820 */
+   void (GLAPIENTRYP GenVertexArraysAPPLE)(GLsizei n, GLuint * arrays); /* 821 */
+   GLboolean (GLAPIENTRYP IsVertexArrayAPPLE)(GLuint array); /* 822 */
 };
 
 #endif /* !defined( _GLAPI_TABLE_H_ ) */
index a449409..50c19ae 100644 (file)
@@ -5055,6 +5055,26 @@ KEYWORD1 void KEYWORD2 NAME(BlitFramebufferEXT)(GLint srcX0, GLint srcY0, GLint
    DISPATCH(BlitFramebufferEXT, (srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter), (F, "glBlitFramebufferEXT(%d, %d, %d, %d, %d, %d, %d, %d, %d, 0x%x);\n", srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter));
 }
 
+KEYWORD1 void KEYWORD2 NAME(BindVertexArrayAPPLE)(GLuint array)
+{
+   DISPATCH(BindVertexArrayAPPLE, (array), (F, "glBindVertexArrayAPPLE(%d);\n", array));
+}
+
+KEYWORD1 void KEYWORD2 NAME(DeleteVertexArraysAPPLE)(GLsizei n, const GLuint * arrays)
+{
+   DISPATCH(DeleteVertexArraysAPPLE, (n, arrays), (F, "glDeleteVertexArraysAPPLE(%d, %p);\n", n, (const void *) arrays));
+}
+
+KEYWORD1 void KEYWORD2 NAME(GenVertexArraysAPPLE)(GLsizei n, GLuint * arrays)
+{
+   DISPATCH(GenVertexArraysAPPLE, (n, arrays), (F, "glGenVertexArraysAPPLE(%d, %p);\n", n, (const void *) arrays));
+}
+
+KEYWORD1 GLboolean KEYWORD2 NAME(IsVertexArrayAPPLE)(GLuint array)
+{
+   RETURN_DISPATCH(IsVertexArrayAPPLE, (array), (F, "glIsVertexArrayAPPLE(%d);\n", array));
+}
+
 
 #endif /* defined( NAME ) */
 
@@ -5888,6 +5908,10 @@ static _glapi_proc DISPATCH_TABLE_NAME[] = {
    TABLE_ENTRY(GetQueryObjecti64vEXT),
    TABLE_ENTRY(GetQueryObjectui64vEXT),
    TABLE_ENTRY(BlitFramebufferEXT),
+   TABLE_ENTRY(BindVertexArrayAPPLE),
+   TABLE_ENTRY(DeleteVertexArraysAPPLE),
+   TABLE_ENTRY(GenVertexArraysAPPLE),
+   TABLE_ENTRY(IsVertexArrayAPPLE),
    /* A whole bunch of no-op functions.  These might be called
     * when someone tries to call a dynamically-registered
     * extension function without a current rendering context.
index b41c418..1c72f6f 100644 (file)
@@ -865,6 +865,10 @@ static const char gl_string_table[] =
     "glGetQueryObjecti64vEXT\0"
     "glGetQueryObjectui64vEXT\0"
     "glBlitFramebufferEXT\0"
+    "glBindVertexArrayAPPLE\0"
+    "glDeleteVertexArraysAPPLE\0"
+    "glGenVertexArraysAPPLE\0"
+    "glIsVertexArrayAPPLE\0"
     "glArrayElementEXT\0"
     "glBindTextureEXT\0"
     "glDrawArraysEXT\0"
@@ -1865,184 +1869,188 @@ static const glprocs_table_t static_functions[] = {
     NAME_FUNC_OFFSET( 14671, glGetQueryObjecti64vEXT, _gloffset_GetQueryObjecti64vEXT ),
     NAME_FUNC_OFFSET( 14695, glGetQueryObjectui64vEXT, _gloffset_GetQueryObjectui64vEXT ),
     NAME_FUNC_OFFSET( 14720, glBlitFramebufferEXT, _gloffset_BlitFramebufferEXT ),
-    NAME_FUNC_OFFSET( 14741, glArrayElementEXT, _gloffset_ArrayElement ),
-    NAME_FUNC_OFFSET( 14759, glBindTextureEXT, _gloffset_BindTexture ),
-    NAME_FUNC_OFFSET( 14776, glDrawArraysEXT, _gloffset_DrawArrays ),
-    NAME_FUNC_OFFSET( 14792, glCopyTexImage1DEXT, _gloffset_CopyTexImage1D ),
-    NAME_FUNC_OFFSET( 14812, glCopyTexImage2DEXT, _gloffset_CopyTexImage2D ),
-    NAME_FUNC_OFFSET( 14832, glCopyTexSubImage1DEXT, _gloffset_CopyTexSubImage1D ),
-    NAME_FUNC_OFFSET( 14855, glCopyTexSubImage2DEXT, _gloffset_CopyTexSubImage2D ),
-    NAME_FUNC_OFFSET( 14878, glDeleteTexturesEXT, _gloffset_DeleteTextures ),
-    NAME_FUNC_OFFSET( 14898, glGetPointervEXT, _gloffset_GetPointerv ),
-    NAME_FUNC_OFFSET( 14915, glPrioritizeTexturesEXT, _gloffset_PrioritizeTextures ),
-    NAME_FUNC_OFFSET( 14939, glTexSubImage1DEXT, _gloffset_TexSubImage1D ),
-    NAME_FUNC_OFFSET( 14958, glTexSubImage2DEXT, _gloffset_TexSubImage2D ),
-    NAME_FUNC_OFFSET( 14977, glBlendColorEXT, _gloffset_BlendColor ),
-    NAME_FUNC_OFFSET( 14993, glBlendEquationEXT, _gloffset_BlendEquation ),
-    NAME_FUNC_OFFSET( 15012, glDrawRangeElementsEXT, _gloffset_DrawRangeElements ),
-    NAME_FUNC_OFFSET( 15035, glColorTableSGI, _gloffset_ColorTable ),
-    NAME_FUNC_OFFSET( 15051, glColorTableEXT, _gloffset_ColorTable ),
-    NAME_FUNC_OFFSET( 15067, glColorTableParameterfvSGI, _gloffset_ColorTableParameterfv ),
-    NAME_FUNC_OFFSET( 15094, glColorTableParameterivSGI, _gloffset_ColorTableParameteriv ),
-    NAME_FUNC_OFFSET( 15121, glCopyColorTableSGI, _gloffset_CopyColorTable ),
-    NAME_FUNC_OFFSET( 15141, glColorSubTableEXT, _gloffset_ColorSubTable ),
-    NAME_FUNC_OFFSET( 15160, glCopyColorSubTableEXT, _gloffset_CopyColorSubTable ),
-    NAME_FUNC_OFFSET( 15183, glConvolutionFilter1DEXT, _gloffset_ConvolutionFilter1D ),
-    NAME_FUNC_OFFSET( 15208, glConvolutionFilter2DEXT, _gloffset_ConvolutionFilter2D ),
-    NAME_FUNC_OFFSET( 15233, glConvolutionParameterfEXT, _gloffset_ConvolutionParameterf ),
-    NAME_FUNC_OFFSET( 15260, glConvolutionParameterfvEXT, _gloffset_ConvolutionParameterfv ),
-    NAME_FUNC_OFFSET( 15288, glConvolutionParameteriEXT, _gloffset_ConvolutionParameteri ),
-    NAME_FUNC_OFFSET( 15315, glConvolutionParameterivEXT, _gloffset_ConvolutionParameteriv ),
-    NAME_FUNC_OFFSET( 15343, glCopyConvolutionFilter1DEXT, _gloffset_CopyConvolutionFilter1D ),
-    NAME_FUNC_OFFSET( 15372, glCopyConvolutionFilter2DEXT, _gloffset_CopyConvolutionFilter2D ),
-    NAME_FUNC_OFFSET( 15401, glSeparableFilter2DEXT, _gloffset_SeparableFilter2D ),
-    NAME_FUNC_OFFSET( 15424, glHistogramEXT, _gloffset_Histogram ),
-    NAME_FUNC_OFFSET( 15439, glMinmaxEXT, _gloffset_Minmax ),
-    NAME_FUNC_OFFSET( 15451, glResetHistogramEXT, _gloffset_ResetHistogram ),
-    NAME_FUNC_OFFSET( 15471, glResetMinmaxEXT, _gloffset_ResetMinmax ),
-    NAME_FUNC_OFFSET( 15488, glTexImage3DEXT, _gloffset_TexImage3D ),
-    NAME_FUNC_OFFSET( 15504, glTexSubImage3DEXT, _gloffset_TexSubImage3D ),
-    NAME_FUNC_OFFSET( 15523, glCopyTexSubImage3DEXT, _gloffset_CopyTexSubImage3D ),
-    NAME_FUNC_OFFSET( 15546, glActiveTexture, _gloffset_ActiveTextureARB ),
-    NAME_FUNC_OFFSET( 15562, glClientActiveTexture, _gloffset_ClientActiveTextureARB ),
-    NAME_FUNC_OFFSET( 15584, glMultiTexCoord1d, _gloffset_MultiTexCoord1dARB ),
-    NAME_FUNC_OFFSET( 15602, glMultiTexCoord1dv, _gloffset_MultiTexCoord1dvARB ),
-    NAME_FUNC_OFFSET( 15621, glMultiTexCoord1f, _gloffset_MultiTexCoord1fARB ),
-    NAME_FUNC_OFFSET( 15639, glMultiTexCoord1fv, _gloffset_MultiTexCoord1fvARB ),
-    NAME_FUNC_OFFSET( 15658, glMultiTexCoord1i, _gloffset_MultiTexCoord1iARB ),
-    NAME_FUNC_OFFSET( 15676, glMultiTexCoord1iv, _gloffset_MultiTexCoord1ivARB ),
-    NAME_FUNC_OFFSET( 15695, glMultiTexCoord1s, _gloffset_MultiTexCoord1sARB ),
-    NAME_FUNC_OFFSET( 15713, glMultiTexCoord1sv, _gloffset_MultiTexCoord1svARB ),
-    NAME_FUNC_OFFSET( 15732, glMultiTexCoord2d, _gloffset_MultiTexCoord2dARB ),
-    NAME_FUNC_OFFSET( 15750, glMultiTexCoord2dv, _gloffset_MultiTexCoord2dvARB ),
-    NAME_FUNC_OFFSET( 15769, glMultiTexCoord2f, _gloffset_MultiTexCoord2fARB ),
-    NAME_FUNC_OFFSET( 15787, glMultiTexCoord2fv, _gloffset_MultiTexCoord2fvARB ),
-    NAME_FUNC_OFFSET( 15806, glMultiTexCoord2i, _gloffset_MultiTexCoord2iARB ),
-    NAME_FUNC_OFFSET( 15824, glMultiTexCoord2iv, _gloffset_MultiTexCoord2ivARB ),
-    NAME_FUNC_OFFSET( 15843, glMultiTexCoord2s, _gloffset_MultiTexCoord2sARB ),
-    NAME_FUNC_OFFSET( 15861, glMultiTexCoord2sv, _gloffset_MultiTexCoord2svARB ),
-    NAME_FUNC_OFFSET( 15880, glMultiTexCoord3d, _gloffset_MultiTexCoord3dARB ),
-    NAME_FUNC_OFFSET( 15898, glMultiTexCoord3dv, _gloffset_MultiTexCoord3dvARB ),
-    NAME_FUNC_OFFSET( 15917, glMultiTexCoord3f, _gloffset_MultiTexCoord3fARB ),
-    NAME_FUNC_OFFSET( 15935, glMultiTexCoord3fv, _gloffset_MultiTexCoord3fvARB ),
-    NAME_FUNC_OFFSET( 15954, glMultiTexCoord3i, _gloffset_MultiTexCoord3iARB ),
-    NAME_FUNC_OFFSET( 15972, glMultiTexCoord3iv, _gloffset_MultiTexCoord3ivARB ),
-    NAME_FUNC_OFFSET( 15991, glMultiTexCoord3s, _gloffset_MultiTexCoord3sARB ),
-    NAME_FUNC_OFFSET( 16009, glMultiTexCoord3sv, _gloffset_MultiTexCoord3svARB ),
-    NAME_FUNC_OFFSET( 16028, glMultiTexCoord4d, _gloffset_MultiTexCoord4dARB ),
-    NAME_FUNC_OFFSET( 16046, glMultiTexCoord4dv, _gloffset_MultiTexCoord4dvARB ),
-    NAME_FUNC_OFFSET( 16065, glMultiTexCoord4f, _gloffset_MultiTexCoord4fARB ),
-    NAME_FUNC_OFFSET( 16083, glMultiTexCoord4fv, _gloffset_MultiTexCoord4fvARB ),
-    NAME_FUNC_OFFSET( 16102, glMultiTexCoord4i, _gloffset_MultiTexCoord4iARB ),
-    NAME_FUNC_OFFSET( 16120, glMultiTexCoord4iv, _gloffset_MultiTexCoord4ivARB ),
-    NAME_FUNC_OFFSET( 16139, glMultiTexCoord4s, _gloffset_MultiTexCoord4sARB ),
-    NAME_FUNC_OFFSET( 16157, glMultiTexCoord4sv, _gloffset_MultiTexCoord4svARB ),
-    NAME_FUNC_OFFSET( 16176, glLoadTransposeMatrixf, _gloffset_LoadTransposeMatrixfARB ),
-    NAME_FUNC_OFFSET( 16199, glLoadTransposeMatrixd, _gloffset_LoadTransposeMatrixdARB ),
-    NAME_FUNC_OFFSET( 16222, glMultTransposeMatrixf, _gloffset_MultTransposeMatrixfARB ),
-    NAME_FUNC_OFFSET( 16245, glMultTransposeMatrixd, _gloffset_MultTransposeMatrixdARB ),
-    NAME_FUNC_OFFSET( 16268, glSampleCoverage, _gloffset_SampleCoverageARB ),
-    NAME_FUNC_OFFSET( 16285, glDrawBuffersATI, _gloffset_DrawBuffersARB ),
-    NAME_FUNC_OFFSET( 16302, glSampleMaskEXT, _gloffset_SampleMaskSGIS ),
-    NAME_FUNC_OFFSET( 16318, glSamplePatternEXT, _gloffset_SamplePatternSGIS ),
-    NAME_FUNC_OFFSET( 16337, glPointParameterf, _gloffset_PointParameterfEXT ),
-    NAME_FUNC_OFFSET( 16355, glPointParameterfARB, _gloffset_PointParameterfEXT ),
-    NAME_FUNC_OFFSET( 16376, glPointParameterfSGIS, _gloffset_PointParameterfEXT ),
-    NAME_FUNC_OFFSET( 16398, glPointParameterfv, _gloffset_PointParameterfvEXT ),
-    NAME_FUNC_OFFSET( 16417, glPointParameterfvARB, _gloffset_PointParameterfvEXT ),
-    NAME_FUNC_OFFSET( 16439, glPointParameterfvSGIS, _gloffset_PointParameterfvEXT ),
-    NAME_FUNC_OFFSET( 16462, glWindowPos2d, _gloffset_WindowPos2dMESA ),
-    NAME_FUNC_OFFSET( 16476, glWindowPos2dARB, _gloffset_WindowPos2dMESA ),
-    NAME_FUNC_OFFSET( 16493, glWindowPos2dv, _gloffset_WindowPos2dvMESA ),
-    NAME_FUNC_OFFSET( 16508, glWindowPos2dvARB, _gloffset_WindowPos2dvMESA ),
-    NAME_FUNC_OFFSET( 16526, glWindowPos2f, _gloffset_WindowPos2fMESA ),
-    NAME_FUNC_OFFSET( 16540, glWindowPos2fARB, _gloffset_WindowPos2fMESA ),
-    NAME_FUNC_OFFSET( 16557, glWindowPos2fv, _gloffset_WindowPos2fvMESA ),
-    NAME_FUNC_OFFSET( 16572, glWindowPos2fvARB, _gloffset_WindowPos2fvMESA ),
-    NAME_FUNC_OFFSET( 16590, glWindowPos2i, _gloffset_WindowPos2iMESA ),
-    NAME_FUNC_OFFSET( 16604, glWindowPos2iARB, _gloffset_WindowPos2iMESA ),
-    NAME_FUNC_OFFSET( 16621, glWindowPos2iv, _gloffset_WindowPos2ivMESA ),
-    NAME_FUNC_OFFSET( 16636, glWindowPos2ivARB, _gloffset_WindowPos2ivMESA ),
-    NAME_FUNC_OFFSET( 16654, glWindowPos2s, _gloffset_WindowPos2sMESA ),
-    NAME_FUNC_OFFSET( 16668, glWindowPos2sARB, _gloffset_WindowPos2sMESA ),
-    NAME_FUNC_OFFSET( 16685, glWindowPos2sv, _gloffset_WindowPos2svMESA ),
-    NAME_FUNC_OFFSET( 16700, glWindowPos2svARB, _gloffset_WindowPos2svMESA ),
-    NAME_FUNC_OFFSET( 16718, glWindowPos3d, _gloffset_WindowPos3dMESA ),
-    NAME_FUNC_OFFSET( 16732, glWindowPos3dARB, _gloffset_WindowPos3dMESA ),
-    NAME_FUNC_OFFSET( 16749, glWindowPos3dv, _gloffset_WindowPos3dvMESA ),
-    NAME_FUNC_OFFSET( 16764, glWindowPos3dvARB, _gloffset_WindowPos3dvMESA ),
-    NAME_FUNC_OFFSET( 16782, glWindowPos3f, _gloffset_WindowPos3fMESA ),
-    NAME_FUNC_OFFSET( 16796, glWindowPos3fARB, _gloffset_WindowPos3fMESA ),
-    NAME_FUNC_OFFSET( 16813, glWindowPos3fv, _gloffset_WindowPos3fvMESA ),
-    NAME_FUNC_OFFSET( 16828, glWindowPos3fvARB, _gloffset_WindowPos3fvMESA ),
-    NAME_FUNC_OFFSET( 16846, glWindowPos3i, _gloffset_WindowPos3iMESA ),
-    NAME_FUNC_OFFSET( 16860, glWindowPos3iARB, _gloffset_WindowPos3iMESA ),
-    NAME_FUNC_OFFSET( 16877, glWindowPos3iv, _gloffset_WindowPos3ivMESA ),
-    NAME_FUNC_OFFSET( 16892, glWindowPos3ivARB, _gloffset_WindowPos3ivMESA ),
-    NAME_FUNC_OFFSET( 16910, glWindowPos3s, _gloffset_WindowPos3sMESA ),
-    NAME_FUNC_OFFSET( 16924, glWindowPos3sARB, _gloffset_WindowPos3sMESA ),
-    NAME_FUNC_OFFSET( 16941, glWindowPos3sv, _gloffset_WindowPos3svMESA ),
-    NAME_FUNC_OFFSET( 16956, glWindowPos3svARB, _gloffset_WindowPos3svMESA ),
-    NAME_FUNC_OFFSET( 16974, glBlendFuncSeparate, _gloffset_BlendFuncSeparateEXT ),
-    NAME_FUNC_OFFSET( 16994, glBlendFuncSeparateINGR, _gloffset_BlendFuncSeparateEXT ),
-    NAME_FUNC_OFFSET( 17018, glFogCoordf, _gloffset_FogCoordfEXT ),
-    NAME_FUNC_OFFSET( 17030, glFogCoordfv, _gloffset_FogCoordfvEXT ),
-    NAME_FUNC_OFFSET( 17043, glFogCoordd, _gloffset_FogCoorddEXT ),
-    NAME_FUNC_OFFSET( 17055, glFogCoorddv, _gloffset_FogCoorddvEXT ),
-    NAME_FUNC_OFFSET( 17068, glFogCoordPointer, _gloffset_FogCoordPointerEXT ),
-    NAME_FUNC_OFFSET( 17086, glCompressedTexImage3D, _gloffset_CompressedTexImage3DARB ),
-    NAME_FUNC_OFFSET( 17109, glCompressedTexImage2D, _gloffset_CompressedTexImage2DARB ),
-    NAME_FUNC_OFFSET( 17132, glCompressedTexImage1D, _gloffset_CompressedTexImage1DARB ),
-    NAME_FUNC_OFFSET( 17155, glCompressedTexSubImage3D, _gloffset_CompressedTexSubImage3DARB ),
-    NAME_FUNC_OFFSET( 17181, glCompressedTexSubImage2D, _gloffset_CompressedTexSubImage2DARB ),
-    NAME_FUNC_OFFSET( 17207, glCompressedTexSubImage1D, _gloffset_CompressedTexSubImage1DARB ),
-    NAME_FUNC_OFFSET( 17233, glGetCompressedTexImage, _gloffset_GetCompressedTexImageARB ),
-    NAME_FUNC_OFFSET( 17257, glSecondaryColor3b, _gloffset_SecondaryColor3bEXT ),
-    NAME_FUNC_OFFSET( 17276, glSecondaryColor3bv, _gloffset_SecondaryColor3bvEXT ),
-    NAME_FUNC_OFFSET( 17296, glSecondaryColor3d, _gloffset_SecondaryColor3dEXT ),
-    NAME_FUNC_OFFSET( 17315, glSecondaryColor3dv, _gloffset_SecondaryColor3dvEXT ),
-    NAME_FUNC_OFFSET( 17335, glSecondaryColor3f, _gloffset_SecondaryColor3fEXT ),
-    NAME_FUNC_OFFSET( 17354, glSecondaryColor3fv, _gloffset_SecondaryColor3fvEXT ),
-    NAME_FUNC_OFFSET( 17374, glSecondaryColor3i, _gloffset_SecondaryColor3iEXT ),
-    NAME_FUNC_OFFSET( 17393, glSecondaryColor3iv, _gloffset_SecondaryColor3ivEXT ),
-    NAME_FUNC_OFFSET( 17413, glSecondaryColor3s, _gloffset_SecondaryColor3sEXT ),
-    NAME_FUNC_OFFSET( 17432, glSecondaryColor3sv, _gloffset_SecondaryColor3svEXT ),
-    NAME_FUNC_OFFSET( 17452, glSecondaryColor3ub, _gloffset_SecondaryColor3ubEXT ),
-    NAME_FUNC_OFFSET( 17472, glSecondaryColor3ubv, _gloffset_SecondaryColor3ubvEXT ),
-    NAME_FUNC_OFFSET( 17493, glSecondaryColor3ui, _gloffset_SecondaryColor3uiEXT ),
-    NAME_FUNC_OFFSET( 17513, glSecondaryColor3uiv, _gloffset_SecondaryColor3uivEXT ),
-    NAME_FUNC_OFFSET( 17534, glSecondaryColor3us, _gloffset_SecondaryColor3usEXT ),
-    NAME_FUNC_OFFSET( 17554, glSecondaryColor3usv, _gloffset_SecondaryColor3usvEXT ),
-    NAME_FUNC_OFFSET( 17575, glSecondaryColorPointer, _gloffset_SecondaryColorPointerEXT ),
-    NAME_FUNC_OFFSET( 17599, glBindProgramARB, _gloffset_BindProgramNV ),
-    NAME_FUNC_OFFSET( 17616, glDeleteProgramsARB, _gloffset_DeleteProgramsNV ),
-    NAME_FUNC_OFFSET( 17636, glGenProgramsARB, _gloffset_GenProgramsNV ),
-    NAME_FUNC_OFFSET( 17653, glGetVertexAttribPointervARB, _gloffset_GetVertexAttribPointervNV ),
-    NAME_FUNC_OFFSET( 17682, glIsProgramARB, _gloffset_IsProgramNV ),
-    NAME_FUNC_OFFSET( 17697, glPointParameteri, _gloffset_PointParameteriNV ),
-    NAME_FUNC_OFFSET( 17715, glPointParameteriv, _gloffset_PointParameterivNV ),
-    NAME_FUNC_OFFSET( 17734, glMultiDrawArrays, _gloffset_MultiDrawArraysEXT ),
-    NAME_FUNC_OFFSET( 17752, glMultiDrawElements, _gloffset_MultiDrawElementsEXT ),
-    NAME_FUNC_OFFSET( 17772, glBindBuffer, _gloffset_BindBufferARB ),
-    NAME_FUNC_OFFSET( 17785, glBufferData, _gloffset_BufferDataARB ),
-    NAME_FUNC_OFFSET( 17798, glBufferSubData, _gloffset_BufferSubDataARB ),
-    NAME_FUNC_OFFSET( 17814, glDeleteBuffers, _gloffset_DeleteBuffersARB ),
-    NAME_FUNC_OFFSET( 17830, glGenBuffers, _gloffset_GenBuffersARB ),
-    NAME_FUNC_OFFSET( 17843, glGetBufferParameteriv, _gloffset_GetBufferParameterivARB ),
-    NAME_FUNC_OFFSET( 17866, glGetBufferPointerv, _gloffset_GetBufferPointervARB ),
-    NAME_FUNC_OFFSET( 17886, glGetBufferSubData, _gloffset_GetBufferSubDataARB ),
-    NAME_FUNC_OFFSET( 17905, glIsBuffer, _gloffset_IsBufferARB ),
-    NAME_FUNC_OFFSET( 17916, glMapBuffer, _gloffset_MapBufferARB ),
-    NAME_FUNC_OFFSET( 17928, glUnmapBuffer, _gloffset_UnmapBufferARB ),
-    NAME_FUNC_OFFSET( 17942, glGenQueries, _gloffset_GenQueriesARB ),
-    NAME_FUNC_OFFSET( 17955, glDeleteQueries, _gloffset_DeleteQueriesARB ),
-    NAME_FUNC_OFFSET( 17971, glIsQuery, _gloffset_IsQueryARB ),
-    NAME_FUNC_OFFSET( 17981, glBeginQuery, _gloffset_BeginQueryARB ),
-    NAME_FUNC_OFFSET( 17994, glEndQuery, _gloffset_EndQueryARB ),
-    NAME_FUNC_OFFSET( 18005, glGetQueryiv, _gloffset_GetQueryivARB ),
-    NAME_FUNC_OFFSET( 18018, glGetQueryObjectiv, _gloffset_GetQueryObjectivARB ),
-    NAME_FUNC_OFFSET( 18037, glGetQueryObjectuiv, _gloffset_GetQueryObjectuivARB ),
-    NAME_FUNC_OFFSET( 18057, glBlendEquationSeparateATI, _gloffset_BlendEquationSeparateEXT ),
+    NAME_FUNC_OFFSET( 14741, glBindVertexArrayAPPLE, _gloffset_BindVertexArrayAPPLE ),
+    NAME_FUNC_OFFSET( 14764, glDeleteVertexArraysAPPLE, _gloffset_DeleteVertexArraysAPPLE ),
+    NAME_FUNC_OFFSET( 14790, glGenVertexArraysAPPLE, _gloffset_GenVertexArraysAPPLE ),
+    NAME_FUNC_OFFSET( 14813, glIsVertexArrayAPPLE, _gloffset_IsVertexArrayAPPLE ),
+    NAME_FUNC_OFFSET( 14834, glArrayElementEXT, _gloffset_ArrayElement ),
+    NAME_FUNC_OFFSET( 14852, glBindTextureEXT, _gloffset_BindTexture ),
+    NAME_FUNC_OFFSET( 14869, glDrawArraysEXT, _gloffset_DrawArrays ),
+    NAME_FUNC_OFFSET( 14885, glCopyTexImage1DEXT, _gloffset_CopyTexImage1D ),
+    NAME_FUNC_OFFSET( 14905, glCopyTexImage2DEXT, _gloffset_CopyTexImage2D ),
+    NAME_FUNC_OFFSET( 14925, glCopyTexSubImage1DEXT, _gloffset_CopyTexSubImage1D ),
+    NAME_FUNC_OFFSET( 14948, glCopyTexSubImage2DEXT, _gloffset_CopyTexSubImage2D ),
+    NAME_FUNC_OFFSET( 14971, glDeleteTexturesEXT, _gloffset_DeleteTextures ),
+    NAME_FUNC_OFFSET( 14991, glGetPointervEXT, _gloffset_GetPointerv ),
+    NAME_FUNC_OFFSET( 15008, glPrioritizeTexturesEXT, _gloffset_PrioritizeTextures ),
+    NAME_FUNC_OFFSET( 15032, glTexSubImage1DEXT, _gloffset_TexSubImage1D ),
+    NAME_FUNC_OFFSET( 15051, glTexSubImage2DEXT, _gloffset_TexSubImage2D ),
+    NAME_FUNC_OFFSET( 15070, glBlendColorEXT, _gloffset_BlendColor ),
+    NAME_FUNC_OFFSET( 15086, glBlendEquationEXT, _gloffset_BlendEquation ),
+    NAME_FUNC_OFFSET( 15105, glDrawRangeElementsEXT, _gloffset_DrawRangeElements ),
+    NAME_FUNC_OFFSET( 15128, glColorTableSGI, _gloffset_ColorTable ),
+    NAME_FUNC_OFFSET( 15144, glColorTableEXT, _gloffset_ColorTable ),
+    NAME_FUNC_OFFSET( 15160, glColorTableParameterfvSGI, _gloffset_ColorTableParameterfv ),
+    NAME_FUNC_OFFSET( 15187, glColorTableParameterivSGI, _gloffset_ColorTableParameteriv ),
+    NAME_FUNC_OFFSET( 15214, glCopyColorTableSGI, _gloffset_CopyColorTable ),
+    NAME_FUNC_OFFSET( 15234, glColorSubTableEXT, _gloffset_ColorSubTable ),
+    NAME_FUNC_OFFSET( 15253, glCopyColorSubTableEXT, _gloffset_CopyColorSubTable ),
+    NAME_FUNC_OFFSET( 15276, glConvolutionFilter1DEXT, _gloffset_ConvolutionFilter1D ),
+    NAME_FUNC_OFFSET( 15301, glConvolutionFilter2DEXT, _gloffset_ConvolutionFilter2D ),
+    NAME_FUNC_OFFSET( 15326, glConvolutionParameterfEXT, _gloffset_ConvolutionParameterf ),
+    NAME_FUNC_OFFSET( 15353, glConvolutionParameterfvEXT, _gloffset_ConvolutionParameterfv ),
+    NAME_FUNC_OFFSET( 15381, glConvolutionParameteriEXT, _gloffset_ConvolutionParameteri ),
+    NAME_FUNC_OFFSET( 15408, glConvolutionParameterivEXT, _gloffset_ConvolutionParameteriv ),
+    NAME_FUNC_OFFSET( 15436, glCopyConvolutionFilter1DEXT, _gloffset_CopyConvolutionFilter1D ),
+    NAME_FUNC_OFFSET( 15465, glCopyConvolutionFilter2DEXT, _gloffset_CopyConvolutionFilter2D ),
+    NAME_FUNC_OFFSET( 15494, glSeparableFilter2DEXT, _gloffset_SeparableFilter2D ),
+    NAME_FUNC_OFFSET( 15517, glHistogramEXT, _gloffset_Histogram ),
+    NAME_FUNC_OFFSET( 15532, glMinmaxEXT, _gloffset_Minmax ),
+    NAME_FUNC_OFFSET( 15544, glResetHistogramEXT, _gloffset_ResetHistogram ),
+    NAME_FUNC_OFFSET( 15564, glResetMinmaxEXT, _gloffset_ResetMinmax ),
+    NAME_FUNC_OFFSET( 15581, glTexImage3DEXT, _gloffset_TexImage3D ),
+    NAME_FUNC_OFFSET( 15597, glTexSubImage3DEXT, _gloffset_TexSubImage3D ),
+    NAME_FUNC_OFFSET( 15616, glCopyTexSubImage3DEXT, _gloffset_CopyTexSubImage3D ),
+    NAME_FUNC_OFFSET( 15639, glActiveTexture, _gloffset_ActiveTextureARB ),
+    NAME_FUNC_OFFSET( 15655, glClientActiveTexture, _gloffset_ClientActiveTextureARB ),
+    NAME_FUNC_OFFSET( 15677, glMultiTexCoord1d, _gloffset_MultiTexCoord1dARB ),
+    NAME_FUNC_OFFSET( 15695, glMultiTexCoord1dv, _gloffset_MultiTexCoord1dvARB ),
+    NAME_FUNC_OFFSET( 15714, glMultiTexCoord1f, _gloffset_MultiTexCoord1fARB ),
+    NAME_FUNC_OFFSET( 15732, glMultiTexCoord1fv, _gloffset_MultiTexCoord1fvARB ),
+    NAME_FUNC_OFFSET( 15751, glMultiTexCoord1i, _gloffset_MultiTexCoord1iARB ),
+    NAME_FUNC_OFFSET( 15769, glMultiTexCoord1iv, _gloffset_MultiTexCoord1ivARB ),
+    NAME_FUNC_OFFSET( 15788, glMultiTexCoord1s, _gloffset_MultiTexCoord1sARB ),
+    NAME_FUNC_OFFSET( 15806, glMultiTexCoord1sv, _gloffset_MultiTexCoord1svARB ),
+    NAME_FUNC_OFFSET( 15825, glMultiTexCoord2d, _gloffset_MultiTexCoord2dARB ),
+    NAME_FUNC_OFFSET( 15843, glMultiTexCoord2dv, _gloffset_MultiTexCoord2dvARB ),
+    NAME_FUNC_OFFSET( 15862, glMultiTexCoord2f, _gloffset_MultiTexCoord2fARB ),
+    NAME_FUNC_OFFSET( 15880, glMultiTexCoord2fv, _gloffset_MultiTexCoord2fvARB ),
+    NAME_FUNC_OFFSET( 15899, glMultiTexCoord2i, _gloffset_MultiTexCoord2iARB ),
+    NAME_FUNC_OFFSET( 15917, glMultiTexCoord2iv, _gloffset_MultiTexCoord2ivARB ),
+    NAME_FUNC_OFFSET( 15936, glMultiTexCoord2s, _gloffset_MultiTexCoord2sARB ),
+    NAME_FUNC_OFFSET( 15954, glMultiTexCoord2sv, _gloffset_MultiTexCoord2svARB ),
+    NAME_FUNC_OFFSET( 15973, glMultiTexCoord3d, _gloffset_MultiTexCoord3dARB ),
+    NAME_FUNC_OFFSET( 15991, glMultiTexCoord3dv, _gloffset_MultiTexCoord3dvARB ),
+    NAME_FUNC_OFFSET( 16010, glMultiTexCoord3f, _gloffset_MultiTexCoord3fARB ),
+    NAME_FUNC_OFFSET( 16028, glMultiTexCoord3fv, _gloffset_MultiTexCoord3fvARB ),
+    NAME_FUNC_OFFSET( 16047, glMultiTexCoord3i, _gloffset_MultiTexCoord3iARB ),
+    NAME_FUNC_OFFSET( 16065, glMultiTexCoord3iv, _gloffset_MultiTexCoord3ivARB ),
+    NAME_FUNC_OFFSET( 16084, glMultiTexCoord3s, _gloffset_MultiTexCoord3sARB ),
+    NAME_FUNC_OFFSET( 16102, glMultiTexCoord3sv, _gloffset_MultiTexCoord3svARB ),
+    NAME_FUNC_OFFSET( 16121, glMultiTexCoord4d, _gloffset_MultiTexCoord4dARB ),
+    NAME_FUNC_OFFSET( 16139, glMultiTexCoord4dv, _gloffset_MultiTexCoord4dvARB ),
+    NAME_FUNC_OFFSET( 16158, glMultiTexCoord4f, _gloffset_MultiTexCoord4fARB ),
+    NAME_FUNC_OFFSET( 16176, glMultiTexCoord4fv, _gloffset_MultiTexCoord4fvARB ),
+    NAME_FUNC_OFFSET( 16195, glMultiTexCoord4i, _gloffset_MultiTexCoord4iARB ),
+    NAME_FUNC_OFFSET( 16213, glMultiTexCoord4iv, _gloffset_MultiTexCoord4ivARB ),
+    NAME_FUNC_OFFSET( 16232, glMultiTexCoord4s, _gloffset_MultiTexCoord4sARB ),
+    NAME_FUNC_OFFSET( 16250, glMultiTexCoord4sv, _gloffset_MultiTexCoord4svARB ),
+    NAME_FUNC_OFFSET( 16269, glLoadTransposeMatrixf, _gloffset_LoadTransposeMatrixfARB ),
+    NAME_FUNC_OFFSET( 16292, glLoadTransposeMatrixd, _gloffset_LoadTransposeMatrixdARB ),
+    NAME_FUNC_OFFSET( 16315, glMultTransposeMatrixf, _gloffset_MultTransposeMatrixfARB ),
+    NAME_FUNC_OFFSET( 16338, glMultTransposeMatrixd, _gloffset_MultTransposeMatrixdARB ),
+    NAME_FUNC_OFFSET( 16361, glSampleCoverage, _gloffset_SampleCoverageARB ),
+    NAME_FUNC_OFFSET( 16378, glDrawBuffersATI, _gloffset_DrawBuffersARB ),
+    NAME_FUNC_OFFSET( 16395, glSampleMaskEXT, _gloffset_SampleMaskSGIS ),
+    NAME_FUNC_OFFSET( 16411, glSamplePatternEXT, _gloffset_SamplePatternSGIS ),
+    NAME_FUNC_OFFSET( 16430, glPointParameterf, _gloffset_PointParameterfEXT ),
+    NAME_FUNC_OFFSET( 16448, glPointParameterfARB, _gloffset_PointParameterfEXT ),
+    NAME_FUNC_OFFSET( 16469, glPointParameterfSGIS, _gloffset_PointParameterfEXT ),
+    NAME_FUNC_OFFSET( 16491, glPointParameterfv, _gloffset_PointParameterfvEXT ),
+    NAME_FUNC_OFFSET( 16510, glPointParameterfvARB, _gloffset_PointParameterfvEXT ),
+    NAME_FUNC_OFFSET( 16532, glPointParameterfvSGIS, _gloffset_PointParameterfvEXT ),
+    NAME_FUNC_OFFSET( 16555, glWindowPos2d, _gloffset_WindowPos2dMESA ),
+    NAME_FUNC_OFFSET( 16569, glWindowPos2dARB, _gloffset_WindowPos2dMESA ),
+    NAME_FUNC_OFFSET( 16586, glWindowPos2dv, _gloffset_WindowPos2dvMESA ),
+    NAME_FUNC_OFFSET( 16601, glWindowPos2dvARB, _gloffset_WindowPos2dvMESA ),
+    NAME_FUNC_OFFSET( 16619, glWindowPos2f, _gloffset_WindowPos2fMESA ),
+    NAME_FUNC_OFFSET( 16633, glWindowPos2fARB, _gloffset_WindowPos2fMESA ),
+    NAME_FUNC_OFFSET( 16650, glWindowPos2fv, _gloffset_WindowPos2fvMESA ),
+    NAME_FUNC_OFFSET( 16665, glWindowPos2fvARB, _gloffset_WindowPos2fvMESA ),
+    NAME_FUNC_OFFSET( 16683, glWindowPos2i, _gloffset_WindowPos2iMESA ),
+    NAME_FUNC_OFFSET( 16697, glWindowPos2iARB, _gloffset_WindowPos2iMESA ),
+    NAME_FUNC_OFFSET( 16714, glWindowPos2iv, _gloffset_WindowPos2ivMESA ),
+    NAME_FUNC_OFFSET( 16729, glWindowPos2ivARB, _gloffset_WindowPos2ivMESA ),
+    NAME_FUNC_OFFSET( 16747, glWindowPos2s, _gloffset_WindowPos2sMESA ),
+    NAME_FUNC_OFFSET( 16761, glWindowPos2sARB, _gloffset_WindowPos2sMESA ),
+    NAME_FUNC_OFFSET( 16778, glWindowPos2sv, _gloffset_WindowPos2svMESA ),
+    NAME_FUNC_OFFSET( 16793, glWindowPos2svARB, _gloffset_WindowPos2svMESA ),
+    NAME_FUNC_OFFSET( 16811, glWindowPos3d, _gloffset_WindowPos3dMESA ),
+    NAME_FUNC_OFFSET( 16825, glWindowPos3dARB, _gloffset_WindowPos3dMESA ),
+    NAME_FUNC_OFFSET( 16842, glWindowPos3dv, _gloffset_WindowPos3dvMESA ),
+    NAME_FUNC_OFFSET( 16857, glWindowPos3dvARB, _gloffset_WindowPos3dvMESA ),
+    NAME_FUNC_OFFSET( 16875, glWindowPos3f, _gloffset_WindowPos3fMESA ),
+    NAME_FUNC_OFFSET( 16889, glWindowPos3fARB, _gloffset_WindowPos3fMESA ),
+    NAME_FUNC_OFFSET( 16906, glWindowPos3fv, _gloffset_WindowPos3fvMESA ),
+    NAME_FUNC_OFFSET( 16921, glWindowPos3fvARB, _gloffset_WindowPos3fvMESA ),
+    NAME_FUNC_OFFSET( 16939, glWindowPos3i, _gloffset_WindowPos3iMESA ),
+    NAME_FUNC_OFFSET( 16953, glWindowPos3iARB, _gloffset_WindowPos3iMESA ),
+    NAME_FUNC_OFFSET( 16970, glWindowPos3iv, _gloffset_WindowPos3ivMESA ),
+    NAME_FUNC_OFFSET( 16985, glWindowPos3ivARB, _gloffset_WindowPos3ivMESA ),
+    NAME_FUNC_OFFSET( 17003, glWindowPos3s, _gloffset_WindowPos3sMESA ),
+    NAME_FUNC_OFFSET( 17017, glWindowPos3sARB, _gloffset_WindowPos3sMESA ),
+    NAME_FUNC_OFFSET( 17034, glWindowPos3sv, _gloffset_WindowPos3svMESA ),
+    NAME_FUNC_OFFSET( 17049, glWindowPos3svARB, _gloffset_WindowPos3svMESA ),
+    NAME_FUNC_OFFSET( 17067, glBlendFuncSeparate, _gloffset_BlendFuncSeparateEXT ),
+    NAME_FUNC_OFFSET( 17087, glBlendFuncSeparateINGR, _gloffset_BlendFuncSeparateEXT ),
+    NAME_FUNC_OFFSET( 17111, glFogCoordf, _gloffset_FogCoordfEXT ),
+    NAME_FUNC_OFFSET( 17123, glFogCoordfv, _gloffset_FogCoordfvEXT ),
+    NAME_FUNC_OFFSET( 17136, glFogCoordd, _gloffset_FogCoorddEXT ),
+    NAME_FUNC_OFFSET( 17148, glFogCoorddv, _gloffset_FogCoorddvEXT ),
+    NAME_FUNC_OFFSET( 17161, glFogCoordPointer, _gloffset_FogCoordPointerEXT ),
+    NAME_FUNC_OFFSET( 17179, glCompressedTexImage3D, _gloffset_CompressedTexImage3DARB ),
+    NAME_FUNC_OFFSET( 17202, glCompressedTexImage2D, _gloffset_CompressedTexImage2DARB ),
+    NAME_FUNC_OFFSET( 17225, glCompressedTexImage1D, _gloffset_CompressedTexImage1DARB ),
+    NAME_FUNC_OFFSET( 17248, glCompressedTexSubImage3D, _gloffset_CompressedTexSubImage3DARB ),
+    NAME_FUNC_OFFSET( 17274, glCompressedTexSubImage2D, _gloffset_CompressedTexSubImage2DARB ),
+    NAME_FUNC_OFFSET( 17300, glCompressedTexSubImage1D, _gloffset_CompressedTexSubImage1DARB ),
+    NAME_FUNC_OFFSET( 17326, glGetCompressedTexImage, _gloffset_GetCompressedTexImageARB ),
+    NAME_FUNC_OFFSET( 17350, glSecondaryColor3b, _gloffset_SecondaryColor3bEXT ),
+    NAME_FUNC_OFFSET( 17369, glSecondaryColor3bv, _gloffset_SecondaryColor3bvEXT ),
+    NAME_FUNC_OFFSET( 17389, glSecondaryColor3d, _gloffset_SecondaryColor3dEXT ),
+    NAME_FUNC_OFFSET( 17408, glSecondaryColor3dv, _gloffset_SecondaryColor3dvEXT ),
+    NAME_FUNC_OFFSET( 17428, glSecondaryColor3f, _gloffset_SecondaryColor3fEXT ),
+    NAME_FUNC_OFFSET( 17447, glSecondaryColor3fv, _gloffset_SecondaryColor3fvEXT ),
+    NAME_FUNC_OFFSET( 17467, glSecondaryColor3i, _gloffset_SecondaryColor3iEXT ),
+    NAME_FUNC_OFFSET( 17486, glSecondaryColor3iv, _gloffset_SecondaryColor3ivEXT ),
+    NAME_FUNC_OFFSET( 17506, glSecondaryColor3s, _gloffset_SecondaryColor3sEXT ),
+    NAME_FUNC_OFFSET( 17525, glSecondaryColor3sv, _gloffset_SecondaryColor3svEXT ),
+    NAME_FUNC_OFFSET( 17545, glSecondaryColor3ub, _gloffset_SecondaryColor3ubEXT ),
+    NAME_FUNC_OFFSET( 17565, glSecondaryColor3ubv, _gloffset_SecondaryColor3ubvEXT ),
+    NAME_FUNC_OFFSET( 17586, glSecondaryColor3ui, _gloffset_SecondaryColor3uiEXT ),
+    NAME_FUNC_OFFSET( 17606, glSecondaryColor3uiv, _gloffset_SecondaryColor3uivEXT ),
+    NAME_FUNC_OFFSET( 17627, glSecondaryColor3us, _gloffset_SecondaryColor3usEXT ),
+    NAME_FUNC_OFFSET( 17647, glSecondaryColor3usv, _gloffset_SecondaryColor3usvEXT ),
+    NAME_FUNC_OFFSET( 17668, glSecondaryColorPointer, _gloffset_SecondaryColorPointerEXT ),
+    NAME_FUNC_OFFSET( 17692, glBindProgramARB, _gloffset_BindProgramNV ),
+    NAME_FUNC_OFFSET( 17709, glDeleteProgramsARB, _gloffset_DeleteProgramsNV ),
+    NAME_FUNC_OFFSET( 17729, glGenProgramsARB, _gloffset_GenProgramsNV ),
+    NAME_FUNC_OFFSET( 17746, glGetVertexAttribPointervARB, _gloffset_GetVertexAttribPointervNV ),
+    NAME_FUNC_OFFSET( 17775, glIsProgramARB, _gloffset_IsProgramNV ),
+    NAME_FUNC_OFFSET( 17790, glPointParameteri, _gloffset_PointParameteriNV ),
+    NAME_FUNC_OFFSET( 17808, glPointParameteriv, _gloffset_PointParameterivNV ),
+    NAME_FUNC_OFFSET( 17827, glMultiDrawArrays, _gloffset_MultiDrawArraysEXT ),
+    NAME_FUNC_OFFSET( 17845, glMultiDrawElements, _gloffset_MultiDrawElementsEXT ),
+    NAME_FUNC_OFFSET( 17865, glBindBuffer, _gloffset_BindBufferARB ),
+    NAME_FUNC_OFFSET( 17878, glBufferData, _gloffset_BufferDataARB ),
+    NAME_FUNC_OFFSET( 17891, glBufferSubData, _gloffset_BufferSubDataARB ),
+    NAME_FUNC_OFFSET( 17907, glDeleteBuffers, _gloffset_DeleteBuffersARB ),
+    NAME_FUNC_OFFSET( 17923, glGenBuffers, _gloffset_GenBuffersARB ),
+    NAME_FUNC_OFFSET( 17936, glGetBufferParameteriv, _gloffset_GetBufferParameterivARB ),
+    NAME_FUNC_OFFSET( 17959, glGetBufferPointerv, _gloffset_GetBufferPointervARB ),
+    NAME_FUNC_OFFSET( 17979, glGetBufferSubData, _gloffset_GetBufferSubDataARB ),
+    NAME_FUNC_OFFSET( 17998, glIsBuffer, _gloffset_IsBufferARB ),
+    NAME_FUNC_OFFSET( 18009, glMapBuffer, _gloffset_MapBufferARB ),
+    NAME_FUNC_OFFSET( 18021, glUnmapBuffer, _gloffset_UnmapBufferARB ),
+    NAME_FUNC_OFFSET( 18035, glGenQueries, _gloffset_GenQueriesARB ),
+    NAME_FUNC_OFFSET( 18048, glDeleteQueries, _gloffset_DeleteQueriesARB ),
+    NAME_FUNC_OFFSET( 18064, glIsQuery, _gloffset_IsQueryARB ),
+    NAME_FUNC_OFFSET( 18074, glBeginQuery, _gloffset_BeginQueryARB ),
+    NAME_FUNC_OFFSET( 18087, glEndQuery, _gloffset_EndQueryARB ),
+    NAME_FUNC_OFFSET( 18098, glGetQueryiv, _gloffset_GetQueryivARB ),
+    NAME_FUNC_OFFSET( 18111, glGetQueryObjectiv, _gloffset_GetQueryObjectivARB ),
+    NAME_FUNC_OFFSET( 18130, glGetQueryObjectuiv, _gloffset_GetQueryObjectuivARB ),
+    NAME_FUNC_OFFSET( 18150, glBlendEquationSeparateATI, _gloffset_BlendEquationSeparateEXT ),
     NAME_FUNC_OFFSET( -1, NULL, 0 )
 };
 
index 9c65ae5..dda659b 100644 (file)
@@ -1078,38 +1078,38 @@ static void _ae_update_state( GLcontext *ctx )
    GLuint i;
 
    /* conventional vertex arrays */
-  if (ctx->Array.Index.Enabled) {
-      aa->array = &ctx->Array.Index;
+  if (ctx->Array.ArrayObj->Index.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->Index;
       aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)];
       aa++;
    }
-   if (ctx->Array.EdgeFlag.Enabled) {
-      aa->array = &ctx->Array.EdgeFlag;
+   if (ctx->Array.ArrayObj->EdgeFlag.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->EdgeFlag;
       aa->offset = _gloffset_EdgeFlagv;
       aa++;
    }
-   if (ctx->Array.Normal.Enabled) {
-      aa->array = &ctx->Array.Normal;
+   if (ctx->Array.ArrayObj->Normal.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->Normal;
       aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)];
       aa++;
    }
-   if (ctx->Array.Color.Enabled) {
-      aa->array = &ctx->Array.Color;
+   if (ctx->Array.ArrayObj->Color.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->Color;
       aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
       aa++;
    }
-   if (ctx->Array.SecondaryColor.Enabled) {
-      aa->array = &ctx->Array.SecondaryColor;
+   if (ctx->Array.ArrayObj->SecondaryColor.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->SecondaryColor;
       aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
       aa++;
    }
-   if (ctx->Array.FogCoord.Enabled) {
-      aa->array = &ctx->Array.FogCoord;
+   if (ctx->Array.ArrayObj->FogCoord.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->FogCoord;
       aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
       aa++;
    }
    for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
-      struct gl_client_array *attribArray = &ctx->Array.TexCoord[i];
+      struct gl_client_array *attribArray = &ctx->Array.ArrayObj->TexCoord[i];
       if (attribArray->Enabled) {
          /* NOTE: we use generic glVertexAttribNV functions here.
           * If we ever remove GL_NV_vertex_program this will have to change.
@@ -1126,7 +1126,7 @@ static void _ae_update_state( GLcontext *ctx )
 
    /* generic vertex attribute arrays */
    for (i = 1; i < VERT_ATTRIB_MAX; i++) {  /* skip zero! */
-      struct gl_client_array *attribArray = &ctx->Array.VertexAttrib[i];
+      struct gl_client_array *attribArray = &ctx->Array.ArrayObj->VertexAttrib[i];
       if (attribArray->Enabled) {
          at->array = attribArray;
          /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
@@ -1151,17 +1151,17 @@ static void _ae_update_state( GLcontext *ctx )
    }
 
    /* finally, vertex position */
-   if (ctx->Array.VertexAttrib[0].Enabled) {
+   if (ctx->Array.ArrayObj->VertexAttrib[0].Enabled) {
       /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
        * issued as the last (provoking) attribute).
        */
-      aa->array = &ctx->Array.VertexAttrib[0];
+      aa->array = &ctx->Array.ArrayObj->VertexAttrib[0];
       assert(aa->array->Size >= 2); /* XXX fix someday? */
       aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
       aa++;
    }
-   else if (ctx->Array.Vertex.Enabled) {
-      aa->array = &ctx->Array.Vertex;
+   else if (ctx->Array.ArrayObj->Vertex.Enabled) {
+      aa->array = &ctx->Array.ArrayObj->Vertex;
       aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
       aa++;
    }
index d1c8f42..3d20ba7 100644 (file)
@@ -60,8 +60,8 @@ _mesa_validate_DrawElements(GLcontext *ctx,
       _mesa_update_state(ctx);
 
    /* Always need vertex positions */
-   if (!ctx->Array.Vertex.Enabled
-       && !(ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[0].Enabled))
+   if (!ctx->Array.ArrayObj->Vertex.Enabled
+       && !(ctx->VertexProgram._Enabled && ctx->Array.ArrayObj->VertexAttrib[0].Enabled))
       return GL_FALSE;
 
    /* Vertex buffer object tests */
@@ -166,8 +166,8 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
       _mesa_update_state(ctx);
 
    /* Always need vertex positions */
-   if (!ctx->Array.Vertex.Enabled
-       && !(ctx->VertexProgram._Enabled && ctx->Array.VertexAttrib[0].Enabled))
+   if (!ctx->Array.ArrayObj->Vertex.Enabled
+       && !(ctx->VertexProgram._Enabled && ctx->Array.ArrayObj->VertexAttrib[0].Enabled))
       return GL_FALSE;
 
    if (ctx->Const.CheckArrayBounds) {
@@ -226,7 +226,7 @@ _mesa_validate_DrawArrays(GLcontext *ctx,
       _mesa_update_state(ctx);
 
    /* Always need vertex positions */
-   if (!ctx->Array.Vertex.Enabled && !ctx->Array.VertexAttrib[0].Enabled)
+   if (!ctx->Array.ArrayObj->Vertex.Enabled && !ctx->Array.ArrayObj->VertexAttrib[0].Enabled)
       return GL_FALSE;
 
    if (ctx->Const.CheckArrayBounds) {
diff --git a/src/mesa/main/arrayobj.c b/src/mesa/main/arrayobj.c
new file mode 100644 (file)
index 0000000..86f2e16
--- /dev/null
@@ -0,0 +1,426 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5
+ *
+ * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ * (C) Copyright IBM Corporation 2006
+ *
+ * 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 OR IBM 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.
+ */
+
+
+/**
+ * \file arrayobj.c
+ * Functions for the GL_APPLE_vertex_array_object extension.
+ *
+ * \todo
+ * The code in this file borrows a lot from bufferobj.c.  There's a certain
+ * amount of cruft left over from that origin that may be unnecessary.
+ *
+ * \author Ian Romanick <idr@us.ibm.com>
+ * \author Brian Paul
+ */
+
+
+#include "glheader.h"
+#include "hash.h"
+#include "imports.h"
+#include "context.h"
+#if FEATURE_ARB_vertex_buffer_object
+#include "bufferobj.h"
+#endif
+#include "arrayobj.h"
+#include "dispatch.h"
+
+
+/**
+ * Look up the array object for the given ID.
+ * 
+ * \returns
+ * Either a pointer to the array object with the specified ID or \c NULL for
+ * a non-existent ID.  The spec defines ID 0 as being technically
+ * non-existent.
+ */
+
+static INLINE struct gl_array_object *
+lookup_arrayobj(GLcontext *ctx, GLuint id)
+{
+   return (id == 0) 
+     ? NULL 
+     : (struct gl_array_object *) _mesa_HashLookup(ctx->Shared->ArrayObjects,
+                                                  id);
+}
+
+
+/**
+ * Allocate and initialize a new array object.
+ * 
+ * This function is intended to be called via
+ * \c dd_function_table::NewArrayObject.
+ */
+struct gl_array_object *
+_mesa_new_array_object( GLcontext *ctx, GLuint name )
+{
+   struct gl_array_object *obj;
+
+   (void) ctx;
+
+   obj = MALLOC_STRUCT(gl_array_object);
+   _mesa_initialize_array_object(ctx, obj, name);
+   return obj;
+}
+
+
+/**
+ * Delete an array object.
+ * 
+ * This function is intended to be called via
+ * \c dd_function_table::DeleteArrayObject.
+ */
+void
+_mesa_delete_array_object( GLcontext *ctx, struct gl_array_object *obj )
+{
+   (void) ctx;
+
+   _mesa_free(obj);
+}
+
+
+void
+_mesa_initialize_array_object( GLcontext *ctx,
+                              struct gl_array_object *obj,
+                              GLuint name )
+{
+   GLuint i;
+
+
+   obj->Name = name;
+
+   /* Vertex arrays */
+   obj->Vertex.Size = 4;
+   obj->Vertex.Type = GL_FLOAT;
+   obj->Vertex.Stride = 0;
+   obj->Vertex.StrideB = 0;
+   obj->Vertex.Ptr = NULL;
+   obj->Vertex.Enabled = GL_FALSE;
+   obj->Vertex.Flags = CA_CLIENT_DATA;
+   obj->Normal.Type = GL_FLOAT;
+   obj->Normal.Stride = 0;
+   obj->Normal.StrideB = 0;
+   obj->Normal.Ptr = NULL;
+   obj->Normal.Enabled = GL_FALSE;
+   obj->Normal.Flags = CA_CLIENT_DATA;
+   obj->Color.Size = 4;
+   obj->Color.Type = GL_FLOAT;
+   obj->Color.Stride = 0;
+   obj->Color.StrideB = 0;
+   obj->Color.Ptr = NULL;
+   obj->Color.Enabled = GL_FALSE;
+   obj->Color.Flags = CA_CLIENT_DATA;
+   obj->SecondaryColor.Size = 4;
+   obj->SecondaryColor.Type = GL_FLOAT;
+   obj->SecondaryColor.Stride = 0;
+   obj->SecondaryColor.StrideB = 0;
+   obj->SecondaryColor.Ptr = NULL;
+   obj->SecondaryColor.Enabled = GL_FALSE;
+   obj->SecondaryColor.Flags = CA_CLIENT_DATA;
+   obj->FogCoord.Size = 1;
+   obj->FogCoord.Type = GL_FLOAT;
+   obj->FogCoord.Stride = 0;
+   obj->FogCoord.StrideB = 0;
+   obj->FogCoord.Ptr = NULL;
+   obj->FogCoord.Enabled = GL_FALSE;
+   obj->FogCoord.Flags = CA_CLIENT_DATA;
+   obj->Index.Type = GL_FLOAT;
+   obj->Index.Stride = 0;
+   obj->Index.StrideB = 0;
+   obj->Index.Ptr = NULL;
+   obj->Index.Enabled = GL_FALSE;
+   obj->Index.Flags = CA_CLIENT_DATA;
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
+      obj->TexCoord[i].Size = 4;
+      obj->TexCoord[i].Type = GL_FLOAT;
+      obj->TexCoord[i].Stride = 0;
+      obj->TexCoord[i].StrideB = 0;
+      obj->TexCoord[i].Ptr = NULL;
+      obj->TexCoord[i].Enabled = GL_FALSE;
+      obj->TexCoord[i].Flags = CA_CLIENT_DATA;
+   }
+   obj->EdgeFlag.Stride = 0;
+   obj->EdgeFlag.StrideB = 0;
+   obj->EdgeFlag.Ptr = NULL;
+   obj->EdgeFlag.Enabled = GL_FALSE;
+   obj->EdgeFlag.Flags = CA_CLIENT_DATA;
+   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
+      obj->VertexAttrib[i].Size = 4;
+      obj->VertexAttrib[i].Type = GL_FLOAT;
+      obj->VertexAttrib[i].Stride = 0;
+      obj->VertexAttrib[i].StrideB = 0;
+      obj->VertexAttrib[i].Ptr = NULL;
+      obj->VertexAttrib[i].Enabled = GL_FALSE;
+      obj->VertexAttrib[i].Normalized = GL_FALSE;
+      obj->VertexAttrib[i].Flags = CA_CLIENT_DATA;
+   }
+
+
+#if FEATURE_ARB_vertex_buffer_object
+   /* Vertex array buffers */
+   obj->Vertex.BufferObj = ctx->Array.NullBufferObj;
+   obj->Normal.BufferObj = ctx->Array.NullBufferObj;
+   obj->Color.BufferObj = ctx->Array.NullBufferObj;
+   obj->SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
+   obj->FogCoord.BufferObj = ctx->Array.NullBufferObj;
+   obj->Index.BufferObj = ctx->Array.NullBufferObj;
+   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
+      obj->TexCoord[i].BufferObj = ctx->Array.NullBufferObj;
+   }
+   obj->EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
+   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
+      obj->VertexAttrib[i].BufferObj = ctx->Array.NullBufferObj;
+   }
+#endif
+}
+
+
+/**
+ * Add the given array object to the array object pool.
+ */
+void
+_mesa_save_array_object( GLcontext *ctx, struct gl_array_object *obj )
+{
+   if (obj->Name > 0) {
+      /* insert into hash table */
+      _mesa_HashInsert(ctx->Shared->ArrayObjects, obj->Name, obj);
+   }
+}
+
+
+/**
+ * Remove the given array object from the array object pool.
+ * Do not deallocate the array object though.
+ */
+void
+_mesa_remove_array_object( GLcontext *ctx, struct gl_array_object *obj )
+{
+   if (obj->Name > 0) {
+      /* remove from hash table */
+      _mesa_HashRemove(ctx->Shared->ArrayObjects, obj->Name);
+   }
+}
+
+
+/**********************************************************************/
+/* API Functions                                                      */
+/**********************************************************************/
+
+/**
+ * Bind a new array.
+ *
+ * \todo
+ * The binding could be done more efficiently by comparing the non-NULL
+ * pointers in the old and new objects.  The only arrays that are "dirty" are
+ * the ones that are non-NULL in either object.
+ */
+void GLAPIENTRY
+_mesa_BindVertexArrayAPPLE( GLuint id )
+{
+   GET_CURRENT_CONTEXT(ctx);
+   struct gl_array_object * const oldObj = ctx->Array.ArrayObj;
+   struct gl_array_object *newObj = NULL;
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+
+   ASSERT(oldObj != NULL);
+
+   if ( oldObj->Name == id )
+      return;   /* rebinding the same array object- no change */
+
+   /*
+    * Get pointer to new array object (newBufObj)
+    */
+   if (id == 0) {
+      /* The spec says there is no array object named 0, but we use
+       * one internally because it simplifies things.
+       */
+      newObj = ctx->Array.DefaultArrayObj;
+   }
+   else {
+      /* non-default array object */
+      newObj = lookup_arrayobj(ctx, id);
+      if (!newObj) {
+         /* If this is a new array object id, allocate an array object now.
+         */
+
+        newObj = (*ctx->Driver.NewArrayObject)(ctx, id);
+         if (!newObj) {
+            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindVertexArrayAPPLE");
+            return;
+         }
+         _mesa_save_array_object(ctx, newObj);
+      }
+   }
+
+
+   ctx->NewState |= _NEW_ARRAY;
+   ctx->Array.NewState |= _NEW_ARRAY_ALL;
+   ctx->Array.ArrayObj = newObj;
+
+
+   /* Pass BindVertexArray call to device driver */
+   if (ctx->Driver.BindArrayObject && newObj)
+      (*ctx->Driver.BindArrayObject)( ctx, newObj );
+}
+
+
+/**
+ * Delete a set of array objects.
+ * 
+ * \param n      Number of array objects to delete.
+ * \param ids    Array of \c n array object IDs.
+ */
+void GLAPIENTRY
+_mesa_DeleteVertexArraysAPPLE(GLsizei n, const GLuint *ids)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLsizei i;
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (n < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteVertexArrayAPPLE(n)");
+      return;
+   }
+
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+
+   for (i = 0; i < n; i++) {
+      struct gl_array_object *obj = lookup_arrayobj(ctx, ids[i]);
+
+      if ( obj != NULL ) {
+        ASSERT( obj->Name == ids[i] );
+
+
+        /* If the array object is currently bound, the spec says "the binding
+         * for that object reverts to zero and the default vertex array
+         * becomes current."
+         */
+        if ( obj == ctx->Array.ArrayObj ) {
+           CALL_BindVertexArrayAPPLE( ctx->Exec, (0) );
+        }
+
+#if FEATURE_ARB_vertex_buffer_object
+        /* Unbind any buffer objects that might be bound to arrays in
+         * this array object.
+         */
+        _mesa_unbind_buffer_object( ctx, obj->Vertex.BufferObj );
+        _mesa_unbind_buffer_object( ctx, obj->Normal.BufferObj );
+        _mesa_unbind_buffer_object( ctx, obj->Color.BufferObj );
+        _mesa_unbind_buffer_object( ctx, obj->SecondaryColor.BufferObj );
+        _mesa_unbind_buffer_object( ctx, obj->FogCoord.BufferObj );
+        _mesa_unbind_buffer_object( ctx, obj->Index.BufferObj );
+        for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
+           _mesa_unbind_buffer_object( ctx, obj->TexCoord[i].BufferObj );
+        }
+        _mesa_unbind_buffer_object( ctx, obj->EdgeFlag.BufferObj );
+        for (i = 0; i < VERT_ATTRIB_MAX; i++) {
+           _mesa_unbind_buffer_object( ctx, obj->VertexAttrib[i].BufferObj );
+        }
+#endif
+
+        /* The ID is immediately freed for re-use */
+        _mesa_remove_array_object(ctx, obj);
+        ctx->Driver.DeleteArrayObject(ctx, obj);
+      }
+   }
+
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+}
+
+
+/**
+ * Generate a set of unique array object IDs and store them in \c buffer.
+ * 
+ * \param n       Number of IDs to generate.
+ * \param buffer  Array of \c n locations to store the IDs.
+ */
+void GLAPIENTRY
+_mesa_GenVertexArraysAPPLE(GLsizei n, GLuint *buffer)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLuint first;
+   GLint i;
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (n < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGenVertexArraysAPPLE");
+      return;
+   }
+
+   if (!buffer) {
+      return;
+   }
+
+   /*
+    * This must be atomic (generation and allocation of array object IDs)
+    */
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+
+   first = _mesa_HashFindFreeKeyBlock(ctx->Shared->ArrayObjects, n);
+
+   /* Allocate new, empty array objects and return identifiers */
+   for (i = 0; i < n; i++) {
+      struct gl_array_object *obj;
+      GLuint name = first + i;
+
+      obj = (*ctx->Driver.NewArrayObject)( ctx, name );
+      if (!obj) {
+         _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenVertexArraysAPPLE");
+         return;
+      }
+      _mesa_save_array_object(ctx, obj);
+      buffer[i] = first + i;
+   }
+
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+}
+
+
+/**
+ * Determine if ID is the name of an array object.
+ * 
+ * \param id  ID of the potential array object.
+ * \return  \c GL_TRUE if \c id is the name of a array object, 
+ *          \c GL_FALSE otherwise.
+ */
+GLboolean GLAPIENTRY
+_mesa_IsVertexArrayAPPLE( GLuint id )
+{
+   struct gl_array_object * obj;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
+
+   if (id == 0)
+      return GL_FALSE;
+
+   _glthread_LOCK_MUTEX(ctx->Shared->Mutex);
+   obj = lookup_arrayobj(ctx, id);
+   _glthread_UNLOCK_MUTEX(ctx->Shared->Mutex);
+
+   return (obj != NULL) ? GL_TRUE : GL_FALSE;
+}
diff --git a/src/mesa/main/arrayobj.h b/src/mesa/main/arrayobj.h
new file mode 100644 (file)
index 0000000..c7d66ec
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5
+ *
+ * Copyright (C) 1999-2004  Brian Paul   All Rights Reserved.
+ * (C) Copyright IBM Corporation 2006
+ *
+ * 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 OR IBM 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 ARRAYOBJ_H
+#define ARRAYOBJ_H
+
+#include "context.h"
+
+/**
+ * \file arrayobj.h
+ * Functions for the GL_APPLE_vertex_array_object extension.
+ *
+ * \author Ian Romanick <idr@us.ibm.com>
+ * \author Brian Paul
+ */
+
+/*
+ * Internal functions
+ */
+
+struct gl_array_object * _mesa_new_array_object( GLcontext *ctx,
+    GLuint name );
+
+void _mesa_delete_array_object( GLcontext *ctx, struct gl_array_object *obj );
+
+void _mesa_initialize_array_object( GLcontext *ctx,
+    struct gl_array_object *obj, GLuint name );
+
+void _mesa_save_array_object( GLcontext *ctx, struct gl_array_object *obj );
+
+void _mesa_remove_array_object( GLcontext *ctx, struct gl_array_object *obj );
+
+
+
+/*
+ * API functions
+ */
+
+void GLAPIENTRY _mesa_BindVertexArrayAPPLE( GLuint id );
+
+void GLAPIENTRY _mesa_DeleteVertexArraysAPPLE(GLsizei n, const GLuint *ids);
+
+void GLAPIENTRY _mesa_GenVertexArraysAPPLE(GLsizei n, GLuint *buffer);
+
+GLboolean GLAPIENTRY _mesa_IsVertexArrayAPPLE( GLuint id );
+
+#endif /* ARRAYOBJ_H */
index eaf20a5..da6f1f9 100644 (file)
@@ -1210,17 +1210,17 @@ static void
 adjust_buffer_object_ref_counts(struct gl_array_attrib *array, GLint step)
 {
    GLuint i;
-   array->Vertex.BufferObj->RefCount += step;
-   array->Normal.BufferObj->RefCount += step;
-   array->Color.BufferObj->RefCount += step;
-   array->SecondaryColor.BufferObj->RefCount += step;
-   array->FogCoord.BufferObj->RefCount += step;
-   array->Index.BufferObj->RefCount += step;
-   array->EdgeFlag.BufferObj->RefCount += step;
+   array->ArrayObj->Vertex.BufferObj->RefCount += step;
+   array->ArrayObj->Normal.BufferObj->RefCount += step;
+   array->ArrayObj->Color.BufferObj->RefCount += step;
+   array->ArrayObj->SecondaryColor.BufferObj->RefCount += step;
+   array->ArrayObj->FogCoord.BufferObj->RefCount += step;
+   array->ArrayObj->Index.BufferObj->RefCount += step;
+   array->ArrayObj->EdgeFlag.BufferObj->RefCount += step;
    for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++)
-      array->TexCoord[i].BufferObj->RefCount += step;
+      array->ArrayObj->TexCoord[i].BufferObj->RefCount += step;
    for (i = 0; i < VERT_ATTRIB_MAX; i++)
-      array->VertexAttrib[i].BufferObj->RefCount += step;
+      array->ArrayObj->VertexAttrib[i].BufferObj->RefCount += step;
 
    array->ArrayBufferObj->RefCount += step;
    array->ElementArrayBufferObj->RefCount += step;
@@ -1272,8 +1272,16 @@ _mesa_PushClientAttrib(GLbitfield mask)
    }
    if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
       struct gl_array_attrib *attr;
+      struct gl_array_object *obj;
+
       attr = MALLOC_STRUCT( gl_array_attrib );
+      obj = MALLOC_STRUCT( gl_array_object );
+
       MEMCPY( attr, &ctx->Array, sizeof(struct gl_array_attrib) );
+      MEMCPY( obj, ctx->Array.ArrayObj, sizeof(struct gl_array_object) );
+
+      attr->ArrayObj = obj;
+
       newnode = new_attrib_node( GL_CLIENT_VERTEX_ARRAY_BIT );
       newnode->data = attr;
       newnode->next = head;
@@ -1331,13 +1339,31 @@ _mesa_PopClientAttrib(void)
                     sizeof(struct gl_pixelstore_attrib) );
            ctx->NewState |= _NEW_PACKUNPACK;
             break;
-         case GL_CLIENT_VERTEX_ARRAY_BIT:
+         case GL_CLIENT_VERTEX_ARRAY_BIT: {
+           struct gl_array_attrib * data =
+             (struct gl_array_attrib *) attr->data;
+
             adjust_buffer_object_ref_counts(&ctx->Array, -1);
-            MEMCPY( &ctx->Array, attr->data,
-                   sizeof(struct gl_array_attrib) );
-            /* decrement reference counts on buffer objects */
+        
+            ctx->Array.ActiveTexture = data->ActiveTexture;
+           ctx->Array.LockFirst = data->LockFirst;
+           ctx->Array.LockCount = data->LockCount;
+
+           _mesa_BindVertexArrayAPPLE( data->ArrayObj->Name );
+           
+           MEMCPY( ctx->Array.ArrayObj, data->ArrayObj,
+                   sizeof( struct gl_array_object ) );
+
+           FREE( data->ArrayObj );
+           
+           /* FIXME: Should some bits in ctx->Array->NewState also be set
+            * FIXME: here?  It seems like it should be set to inclusive-or
+            * FIXME: of the old ArrayObj->_Enabled and the new _Enabled.
+            */
+
            ctx->NewState |= _NEW_ARRAY;
             break;
+        }
          default:
             _mesa_problem( ctx, "Bad attrib flag in PopClientAttrib");
             break;
index d6cc78e..6deb823 100644 (file)
@@ -169,6 +169,22 @@ _mesa_delete_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
 }
 
 
+void
+_mesa_unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
+{
+   if (bufObj != ctx->Array.NullBufferObj) {
+      bufObj->RefCount--;
+      if (bufObj->RefCount <= 0) {
+        ASSERT(ctx->Array.ArrayBufferObj != bufObj);
+        ASSERT(ctx->Array.ElementArrayBufferObj != bufObj);
+        ASSERT(ctx->Array.ArrayObj->Vertex.BufferObj != bufObj);
+        ASSERT(ctx->Driver.DeleteBuffer);
+        ctx->Driver.DeleteBuffer(ctx, bufObj);
+      }
+   }
+}
+
+
 /**
  * Initialize a buffer object to default values.
  */
@@ -389,21 +405,6 @@ _mesa_init_buffer_objects( GLcontext *ctx )
 
    ctx->Array.ArrayBufferObj = ctx->Array.NullBufferObj;
    ctx->Array.ElementArrayBufferObj = ctx->Array.NullBufferObj;
-
-   /* Vertex array buffers */
-   ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
-   ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
-   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
-      ctx->Array.TexCoord[i].BufferObj = ctx->Array.NullBufferObj;
-   }
-   ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
-   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
-      ctx->Array.VertexAttrib[i].BufferObj = ctx->Array.NullBufferObj;
-   }
 }
 
 
@@ -585,52 +586,52 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
 
          ASSERT(bufObj->Name == ids[i]);
 
-         if (ctx->Array.Vertex.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->Vertex.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.Vertex.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->Vertex.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
-         if (ctx->Array.Normal.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->Normal.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.Normal.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->Normal.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
-         if (ctx->Array.Color.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->Color.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.Color.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->Color.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
-         if (ctx->Array.SecondaryColor.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->SecondaryColor.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
-         if (ctx->Array.FogCoord.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->FogCoord.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.FogCoord.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->FogCoord.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
-         if (ctx->Array.Index.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->Index.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.Index.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->Index.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
-         if (ctx->Array.EdgeFlag.BufferObj == bufObj) {
+         if (ctx->Array.ArrayObj->EdgeFlag.BufferObj == bufObj) {
             bufObj->RefCount--;
-            ctx->Array.EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
+            ctx->Array.ArrayObj->EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
             ctx->Array.NullBufferObj->RefCount++;
          }
          for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
-            if (ctx->Array.TexCoord[j].BufferObj == bufObj) {
+            if (ctx->Array.ArrayObj->TexCoord[j].BufferObj == bufObj) {
                bufObj->RefCount--;
-               ctx->Array.TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
+               ctx->Array.ArrayObj->TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
                ctx->Array.NullBufferObj->RefCount++;
             }
          }
          for (j = 0; j < VERT_ATTRIB_MAX; j++) {
-            if (ctx->Array.VertexAttrib[j].BufferObj == bufObj) {
+            if (ctx->Array.ArrayObj->VertexAttrib[j].BufferObj == bufObj) {
                bufObj->RefCount--;
-               ctx->Array.VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
+               ctx->Array.ArrayObj->VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
                ctx->Array.NullBufferObj->RefCount++;
             }
          }
@@ -649,16 +650,9 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
             _mesa_BindBufferARB( GL_PIXEL_UNPACK_BUFFER_EXT, 0 );
          }
 
-         /* The ID is immediately freed for re-use */
-         _mesa_remove_buffer_object(ctx, bufObj);
-         bufObj->RefCount--;
-         if (bufObj->RefCount <= 0) {
-            ASSERT(ctx->Array.ArrayBufferObj != bufObj);
-            ASSERT(ctx->Array.ElementArrayBufferObj != bufObj);
-            ASSERT(ctx->Array.Vertex.BufferObj != bufObj);
-            ASSERT(ctx->Driver.DeleteBuffer);
-            ctx->Driver.DeleteBuffer(ctx, bufObj);
-         }
+        /* The ID is immediately freed for re-use */
+        _mesa_remove_buffer_object(ctx, bufObj);
+        _mesa_unbind_buffer_object(ctx, bufObj);
       }
    }
 
index bc10053..05e27c9 100644 (file)
@@ -83,6 +83,8 @@ _mesa_validate_pbo_access(GLuint dimensions,
                           GLsizei width, GLsizei height, GLsizei depth,
                           GLenum format, GLenum type, const GLvoid *ptr);
 
+extern void
+_mesa_unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj );
 
 /*
  * API functions
index 2379c6d..08020db 100644 (file)
@@ -698,6 +698,7 @@ alloc_shared_state( GLcontext *ctx )
 #endif
 
    ss->BufferObjects = _mesa_NewHashTable();
+   ss->ArrayObjects = _mesa_NewHashTable();
 
    ss->GL2Objects = _mesa_NewHashTable ();
 
index 4d9cea1..6675d56 100644 (file)
@@ -833,6 +833,16 @@ struct dd_function_table {
 
 
    /**
+    * \name Vertex Array objects
+    */
+   /*@{*/
+   struct gl_array_object * (*NewArrayObject)(GLcontext *ctx, GLuint id);
+   void (*DeleteArrayObject)(GLcontext *ctx, struct gl_array_object *obj);
+   void (*BindArrayObject)(GLcontext *ctx, struct gl_array_object *obj);
+   /*@}*/
+
+
+   /**
     * \name Support for multiple T&L engines
     */
    /*@{*/
index cbf00f7..883fa73 100644 (file)
@@ -43,6 +43,7 @@
 #if FEATURE_ARB_vertex_buffer_object
 #include "bufferobj.h"
 #endif
+#include "arrayobj.h"
 #include "clip.h"
 #include "colormac.h"
 #include "colortab.h"
@@ -8031,6 +8032,12 @@ _mesa_init_dlist_table(struct _glapi_table *table)
    /* 268. GL_EXT_stencil_two_side */
    SET_ActiveStencilFaceEXT(table, save_ActiveStencilFaceEXT);
 
+   /* 273. GL_APPLE_vertex_array_object */
+   SET_BindVertexArrayAPPLE(table, _mesa_BindVertexArrayAPPLE);
+   SET_DeleteVertexArraysAPPLE(table, _mesa_DeleteVertexArraysAPPLE);
+   SET_GenVertexArraysAPPLE(table, _mesa_GenVertexArraysAPPLE);
+   SET_IsVertexArrayAPPLE(table, _mesa_IsVertexArrayAPPLE);
+
    /* ???. GL_EXT_depth_bounds_test */
    SET_DepthBoundsEXT(table, save_DepthBoundsEXT);
 
index af54fea..1d439e6 100644 (file)
@@ -57,35 +57,35 @@ client_state( GLcontext *ctx, GLenum cap, GLboolean state )
 
    switch (cap) {
       case GL_VERTEX_ARRAY:
-         var = &ctx->Array.Vertex.Enabled;
+         var = &ctx->Array.ArrayObj->Vertex.Enabled;
          flag = _NEW_ARRAY_VERTEX;
          break;
       case GL_NORMAL_ARRAY:
-         var = &ctx->Array.Normal.Enabled;
+         var = &ctx->Array.ArrayObj->Normal.Enabled;
          flag = _NEW_ARRAY_NORMAL;
          break;
       case GL_COLOR_ARRAY:
-         var = &ctx->Array.Color.Enabled;
+         var = &ctx->Array.ArrayObj->Color.Enabled;
          flag = _NEW_ARRAY_COLOR0;
          break;
       case GL_INDEX_ARRAY:
-         var = &ctx->Array.Index.Enabled;
+         var = &ctx->Array.ArrayObj->Index.Enabled;
          flag = _NEW_ARRAY_INDEX;
          break;
       case GL_TEXTURE_COORD_ARRAY:
-         var = &ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
+         var = &ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled;
          flag = _NEW_ARRAY_TEXCOORD(ctx->Array.ActiveTexture);
          break;
       case GL_EDGE_FLAG_ARRAY:
-         var = &ctx->Array.EdgeFlag.Enabled;
+         var = &ctx->Array.ArrayObj->EdgeFlag.Enabled;
          flag = _NEW_ARRAY_EDGEFLAG;
          break;
       case GL_FOG_COORDINATE_ARRAY_EXT:
-         var = &ctx->Array.FogCoord.Enabled;
+         var = &ctx->Array.ArrayObj->FogCoord.Enabled;
          flag = _NEW_ARRAY_FOGCOORD;
          break;
       case GL_SECONDARY_COLOR_ARRAY_EXT:
-         var = &ctx->Array.SecondaryColor.Enabled;
+         var = &ctx->Array.ArrayObj->SecondaryColor.Enabled;
          flag = _NEW_ARRAY_COLOR1;
          break;
 
@@ -109,7 +109,7 @@ client_state( GLcontext *ctx, GLenum cap, GLboolean state )
          CHECK_EXTENSION(NV_vertex_program, cap);
          {
             GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
-            var = &ctx->Array.VertexAttrib[n].Enabled;
+            var = &ctx->Array.ArrayObj->VertexAttrib[n].Enabled;
             flag = _NEW_ARRAY_ATTRIB(n);
          }
          break;
@@ -129,9 +129,9 @@ client_state( GLcontext *ctx, GLenum cap, GLboolean state )
    *var = state;
 
    if (state)
-      ctx->Array._Enabled |= flag;
+      ctx->Array.ArrayObj->_Enabled |= flag;
    else
-      ctx->Array._Enabled &= ~flag;
+      ctx->Array.ArrayObj->_Enabled &= ~flag;
 
    if (ctx->Driver.Enable) {
       (*ctx->Driver.Enable)( ctx, cap, state );
@@ -1206,23 +1206,23 @@ _mesa_IsEnabled( GLenum cap )
        * CLIENT STATE!!!
        */
       case GL_VERTEX_ARRAY:
-         return (ctx->Array.Vertex.Enabled != 0);
+         return (ctx->Array.ArrayObj->Vertex.Enabled != 0);
       case GL_NORMAL_ARRAY:
-         return (ctx->Array.Normal.Enabled != 0);
+         return (ctx->Array.ArrayObj->Normal.Enabled != 0);
       case GL_COLOR_ARRAY:
-         return (ctx->Array.Color.Enabled != 0);
+         return (ctx->Array.ArrayObj->Color.Enabled != 0);
       case GL_INDEX_ARRAY:
-         return (ctx->Array.Index.Enabled != 0);
+         return (ctx->Array.ArrayObj->Index.Enabled != 0);
       case GL_TEXTURE_COORD_ARRAY:
-         return (ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled != 0);
+         return (ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled != 0);
       case GL_EDGE_FLAG_ARRAY:
-         return (ctx->Array.EdgeFlag.Enabled != 0);
+         return (ctx->Array.ArrayObj->EdgeFlag.Enabled != 0);
       case GL_FOG_COORDINATE_ARRAY_EXT:
          CHECK_EXTENSION(EXT_fog_coord);
-         return (ctx->Array.FogCoord.Enabled != 0);
+         return (ctx->Array.ArrayObj->FogCoord.Enabled != 0);
       case GL_SECONDARY_COLOR_ARRAY_EXT:
          CHECK_EXTENSION(EXT_secondary_color);
-         return (ctx->Array.SecondaryColor.Enabled != 0);
+         return (ctx->Array.ArrayObj->SecondaryColor.Enabled != 0);
 
       /* GL_EXT_histogram */
       case GL_HISTOGRAM:
@@ -1331,7 +1331,7 @@ _mesa_IsEnabled( GLenum cap )
          CHECK_EXTENSION(NV_vertex_program);
          {
             GLint n = (GLint) cap - GL_VERTEX_ATTRIB_ARRAY0_NV;
-            return (ctx->Array.VertexAttrib[n].Enabled != 0);
+            return (ctx->Array.ArrayObj->VertexAttrib[n].Enabled != 0);
          }
       case GL_MAP1_VERTEX_ATTRIB0_4_NV:
       case GL_MAP1_VERTEX_ATTRIB1_4_NV:
index ecda0bf..2b3a275 100644 (file)
@@ -1593,6 +1593,7 @@ static const char enum_string_table[] =
    "GL_VENDOR\0"
    "GL_VERSION\0"
    "GL_VERTEX_ARRAY\0"
+   "GL_VERTEX_ARRAY_BINDING_APPLE\0"
    "GL_VERTEX_ARRAY_BUFFER_BINDING\0"
    "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB\0"
    "GL_VERTEX_ARRAY_POINTER\0"
@@ -1654,7 +1655,7 @@ static const char enum_string_table[] =
    "GL_ZOOM_Y\0"
    ;
 
-static const enum_elt all_enums[1617] =
+static const enum_elt all_enums[1618] =
 {
    {     0, 0x00000600 }, /* GL_2D */
    {     6, 0x00001407 }, /* GL_2_BYTES */
@@ -3214,70 +3215,70 @@ static const enum_elt all_enums[1617] =
    { 33142, 0x00001F00 }, /* GL_VENDOR */
    { 33152, 0x00001F02 }, /* GL_VERSION */
    { 33163, 0x00008074 }, /* GL_VERTEX_ARRAY */
-   { 33179, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
-   { 33210, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */
-   { 33245, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */
-   { 33269, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */
-   { 33290, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */
-   { 33313, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */
-   { 33334, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
-   { 33361, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
-   { 33389, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
-   { 33417, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
-   { 33445, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
-   { 33473, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
-   { 33501, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
-   { 33529, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
-   { 33556, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
-   { 33583, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
-   { 33610, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
-   { 33637, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
-   { 33664, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
-   { 33691, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
-   { 33718, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
-   { 33745, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
-   { 33772, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
-   { 33810, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */
-   { 33852, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
-   { 33887, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
-   { 33925, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
-   { 33960, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
-   { 33992, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
-   { 34026, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
-   { 34058, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */
-   { 34078, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */
-   { 34100, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */
-   { 34129, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */
-   { 34150, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
-   { 34183, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
-   { 34215, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
-   { 34246, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
-   { 34276, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */
-   { 34297, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */
-   { 34324, 0x00000BA2 }, /* GL_VIEWPORT */
-   { 34336, 0x00000800 }, /* GL_VIEWPORT_BIT */
-   { 34352, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */
-   { 34372, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
-   { 34403, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */
-   { 34438, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */
-   { 34466, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */
-   { 34491, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
-   { 34518, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */
-   { 34543, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */
-   { 34567, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */
-   { 34586, 0x000088B9 }, /* GL_WRITE_ONLY */
-   { 34600, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */
-   { 34618, 0x00001506 }, /* GL_XOR */
-   { 34625, 0x000085B9 }, /* GL_YCBCR_422_APPLE */
-   { 34644, 0x00008757 }, /* GL_YCBCR_MESA */
-   { 34658, 0x00000000 }, /* GL_ZERO */
-   { 34666, 0x00000D16 }, /* GL_ZOOM_X */
-   { 34676, 0x00000D17 }, /* GL_ZOOM_Y */
+   { 33179, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */
+   { 33209, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
+   { 33240, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */
+   { 33275, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */
+   { 33299, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */
+   { 33320, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */
+   { 33343, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */
+   { 33364, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
+   { 33391, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
+   { 33419, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
+   { 33447, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
+   { 33475, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
+   { 33503, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
+   { 33531, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
+   { 33559, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
+   { 33586, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
+   { 33613, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
+   { 33640, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
+   { 33667, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
+   { 33694, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
+   { 33721, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
+   { 33748, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
+   { 33775, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
+   { 33802, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
+   { 33840, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */
+   { 33882, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
+   { 33917, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
+   { 33955, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
+   { 33990, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
+   { 34022, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
+   { 34056, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
+   { 34088, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */
+   { 34108, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */
+   { 34130, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */
+   { 34159, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */
+   { 34180, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
+   { 34213, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
+   { 34245, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
+   { 34276, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
+   { 34306, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */
+   { 34327, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */
+   { 34354, 0x00000BA2 }, /* GL_VIEWPORT */
+   { 34366, 0x00000800 }, /* GL_VIEWPORT_BIT */
+   { 34382, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */
+   { 34402, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
+   { 34433, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */
+   { 34468, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */
+   { 34496, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */
+   { 34521, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
+   { 34548, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */
+   { 34573, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */
+   { 34597, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */
+   { 34616, 0x000088B9 }, /* GL_WRITE_ONLY */
+   { 34630, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */
+   { 34648, 0x00001506 }, /* GL_XOR */
+   { 34655, 0x000085B9 }, /* GL_YCBCR_422_APPLE */
+   { 34674, 0x00008757 }, /* GL_YCBCR_MESA */
+   { 34688, 0x00000000 }, /* GL_ZERO */
+   { 34696, 0x00000D16 }, /* GL_ZOOM_X */
+   { 34706, 0x00000D17 }, /* GL_ZOOM_Y */
 };
 
-static const unsigned reduced_enums[1236] =
+static const unsigned reduced_enums[1237] =
 {
-        26, /* GL_ALL_CLIENT_ATTRIB_BITS */
        389, /* GL_FALSE */
        566, /* GL_LINES */
        568, /* GL_LINE_LOOP */
@@ -3418,7 +3419,7 @@ static const unsigned reduced_enums[1236] =
       1309, /* GL_STENCIL_WRITEMASK */
        710, /* GL_MATRIX_MODE */
        867, /* GL_NORMALIZE */
-      1598, /* GL_VIEWPORT */
+      1599, /* GL_VIEWPORT */
        841, /* GL_MODELVIEW_STACK_DEPTH */
       1099, /* GL_PROJECTION_STACK_DEPTH */
       1500, /* GL_TEXTURE_STACK_DEPTH */
@@ -3498,8 +3499,8 @@ static const unsigned reduced_enums[1236] =
        513, /* GL_INDEX_OFFSET */
       1139, /* GL_RED_SCALE */
       1137, /* GL_RED_BIAS */
-      1615, /* GL_ZOOM_X */
-      1616, /* GL_ZOOM_Y */
+      1616, /* GL_ZOOM_X */
+      1617, /* GL_ZOOM_Y */
        476, /* GL_GREEN_SCALE */
        474, /* GL_GREEN_BIAS */
         86, /* GL_BLUE_SCALE */
@@ -3600,7 +3601,7 @@ static const unsigned reduced_enums[1236] =
        246, /* GL_COPY */
         46, /* GL_AND_INVERTED */
        865, /* GL_NOOP */
-      1611, /* GL_XOR */
+      1612, /* GL_XOR */
        927, /* GL_OR */
        866, /* GL_NOR */
        380, /* GL_EQUIV */
@@ -3825,9 +3826,9 @@ static const unsigned reduced_enums[1236] =
        503, /* GL_INDEX_ARRAY */
       1435, /* GL_TEXTURE_COORD_ARRAY */
        368, /* GL_EDGE_FLAG_ARRAY */
-      1561, /* GL_VERTEX_ARRAY_SIZE */
-      1563, /* GL_VERTEX_ARRAY_TYPE */
-      1562, /* GL_VERTEX_ARRAY_STRIDE */
+      1562, /* GL_VERTEX_ARRAY_SIZE */
+      1564, /* GL_VERTEX_ARRAY_TYPE */
+      1563, /* GL_VERTEX_ARRAY_STRIDE */
        873, /* GL_NORMAL_ARRAY_TYPE */
        872, /* GL_NORMAL_ARRAY_STRIDE */
        133, /* GL_COLOR_ARRAY_SIZE */
@@ -3839,7 +3840,7 @@ static const unsigned reduced_enums[1236] =
       1441, /* GL_TEXTURE_COORD_ARRAY_TYPE */
       1440, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
        372, /* GL_EDGE_FLAG_ARRAY_STRIDE */
-      1560, /* GL_VERTEX_ARRAY_POINTER */
+      1561, /* GL_VERTEX_ARRAY_POINTER */
        871, /* GL_NORMAL_ARRAY_POINTER */
        132, /* GL_COLOR_ARRAY_POINTER */
        506, /* GL_INDEX_ARRAY_POINTER */
@@ -3939,7 +3940,7 @@ static const unsigned reduced_enums[1236] =
        251, /* GL_CULL_VERTEX_EXT */
        253, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
        252, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
-      1608, /* GL_WRAP_BORDER_SUN */
+      1609, /* GL_WRAP_BORDER_SUN */
       1419, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
        555, /* GL_LIGHT_MODEL_COLOR_CONTROL */
       1240, /* GL_SINGLE_COLOR */
@@ -4092,18 +4093,19 @@ static const unsigned reduced_enums[1236] =
        913, /* GL_OPERAND1_ALPHA */
        919, /* GL_OPERAND2_ALPHA */
        925, /* GL_OPERAND3_ALPHA_NV */
-      1612, /* GL_YCBCR_422_APPLE */
+      1558, /* GL_VERTEX_ARRAY_BINDING_APPLE */
+      1613, /* GL_YCBCR_422_APPLE */
       1549, /* GL_UNSIGNED_SHORT_8_8_APPLE */
       1551, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
       1242, /* GL_SLICE_ACCUM_SUN */
       1118, /* GL_QUAD_MESH_SUN */
       1522, /* GL_TRIANGLE_MESH_SUN */
-      1589, /* GL_VERTEX_PROGRAM_ARB */
-      1597, /* GL_VERTEX_STATE_PROGRAM_NV */
-      1582, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
-      1585, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
-      1586, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
-      1587, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
+      1590, /* GL_VERTEX_PROGRAM_ARB */
+      1598, /* GL_VERTEX_STATE_PROGRAM_NV */
+      1583, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
+      1586, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
+      1587, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
+      1588, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
        277, /* GL_CURRENT_VERTEX_ATTRIB_ARB */
       1076, /* GL_PROGRAM_LENGTH_ARB */
       1090, /* GL_PROGRAM_STRING_ARB */
@@ -4124,33 +4126,33 @@ static const unsigned reduced_enums[1236] =
        702, /* GL_MATRIX7_NV */
        263, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
        260, /* GL_CURRENT_MATRIX_ARB */
-      1592, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
-      1594, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
+      1593, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
+      1595, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
       1088, /* GL_PROGRAM_PARAMETER_NV */
-      1584, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
+      1585, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
       1092, /* GL_PROGRAM_TARGET_NV */
       1089, /* GL_PROGRAM_RESIDENT_NV */
       1507, /* GL_TRACK_MATRIX_NV */
       1508, /* GL_TRACK_MATRIX_TRANSFORM_NV */
-      1590, /* GL_VERTEX_PROGRAM_BINDING_NV */
+      1591, /* GL_VERTEX_PROGRAM_BINDING_NV */
       1070, /* GL_PROGRAM_ERROR_POSITION_ARB */
        291, /* GL_DEPTH_CLAMP_NV */
-      1564, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
-      1571, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
-      1572, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
-      1573, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
-      1574, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
-      1575, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
-      1576, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
-      1577, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
-      1578, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
-      1579, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
-      1565, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
-      1566, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
-      1567, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
-      1568, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
-      1569, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
-      1570, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
+      1565, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
+      1572, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
+      1573, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
+      1574, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
+      1575, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
+      1576, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
+      1577, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
+      1578, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
+      1579, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
+      1580, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
+      1566, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
+      1567, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
+      1568, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
+      1569, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
+      1570, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
+      1571, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
        620, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
        627, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
        628, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
@@ -4189,14 +4191,14 @@ static const unsigned reduced_enums[1236] =
        218, /* GL_COMPRESSED_TEXTURE_FORMATS */
        788, /* GL_MAX_VERTEX_UNITS_ARB */
         18, /* GL_ACTIVE_VERTEX_UNITS_ARB */
-      1607, /* GL_WEIGHT_SUM_UNITY_ARB */
-      1588, /* GL_VERTEX_BLEND_ARB */
+      1608, /* GL_WEIGHT_SUM_UNITY_ARB */
+      1589, /* GL_VERTEX_BLEND_ARB */
        278, /* GL_CURRENT_WEIGHT_ARB */
-      1606, /* GL_WEIGHT_ARRAY_TYPE_ARB */
-      1605, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
-      1604, /* GL_WEIGHT_ARRAY_SIZE_ARB */
-      1603, /* GL_WEIGHT_ARRAY_POINTER_ARB */
-      1600, /* GL_WEIGHT_ARRAY_ARB */
+      1607, /* GL_WEIGHT_ARRAY_TYPE_ARB */
+      1606, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
+      1605, /* GL_WEIGHT_ARRAY_SIZE_ARB */
+      1604, /* GL_WEIGHT_ARRAY_POINTER_ARB */
+      1601, /* GL_WEIGHT_ARRAY_ARB */
        317, /* GL_DOT3_RGB */
        318, /* GL_DOT3_RGBA */
        216, /* GL_COMPRESSED_RGB_FXT1_3DFX */
@@ -4241,7 +4243,7 @@ static const unsigned reduced_enums[1236] =
        843, /* GL_MODULATE_ADD_ATI */
        844, /* GL_MODULATE_SIGNED_ADD_ATI */
        845, /* GL_MODULATE_SUBTRACT_ATI */
-      1613, /* GL_YCBCR_MESA */
+      1614, /* GL_YCBCR_MESA */
        934, /* GL_PACK_INVERT_MESA */
         97, /* GL_BUFFER_SIZE */
         99, /* GL_BUFFER_USAGE */
@@ -4299,7 +4301,7 @@ static const unsigned reduced_enums[1236] =
       1122, /* GL_QUERY_RESULT */
       1124, /* GL_QUERY_RESULT_AVAILABLE */
        785, /* GL_MAX_VERTEX_ATTRIBS_ARB */
-      1583, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
+      1584, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
        308, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
        307, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
        774, /* GL_MAX_TEXTURE_COORDS_ARB */
@@ -4314,7 +4316,7 @@ static const unsigned reduced_enums[1236] =
        373, /* GL_ELEMENT_ARRAY_BUFFER */
         50, /* GL_ARRAY_BUFFER_BINDING */
        375, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
-      1558, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
+      1559, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
        869, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
        130, /* GL_COLOR_ARRAY_BUFFER_BINDING */
        504, /* GL_INDEX_ARRAY_BUFFER_BINDING */
@@ -4322,8 +4324,8 @@ static const unsigned reduced_enums[1236] =
        369, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
       1221, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
        410, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
-      1601, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
-      1580, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
+      1602, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
+      1581, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
       1075, /* GL_PROGRAM_INSTRUCTIONS_ARB */
        750, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
       1081, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
@@ -4349,7 +4351,7 @@ static const unsigned reduced_enums[1236] =
       1096, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
       1512, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
       1130, /* GL_READ_ONLY */
-      1609, /* GL_WRITE_ONLY */
+      1610, /* GL_WRITE_ONLY */
       1132, /* GL_READ_WRITE */
         91, /* GL_BUFFER_ACCESS */
         93, /* GL_BUFFER_MAPPED */
@@ -4410,7 +4412,7 @@ static const unsigned reduced_enums[1236] =
        803, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
       1202, /* GL_SAMPLES_PASSED */
        433, /* GL_FRAGMENT_SHADER_ARB */
-      1596, /* GL_VERTEX_SHADER_ARB */
+      1597, /* GL_VERTEX_SHADER_ARB */
       1086, /* GL_PROGRAM_OBJECT_ARB */
       1234, /* GL_SHADER_OBJECT_ARB */
        735, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */
@@ -4513,6 +4515,7 @@ static const unsigned reduced_enums[1236] =
       1217, /* GL_SCISSOR_BIT */
         25, /* GL_ALL_ATTRIB_BITS */
        850, /* GL_MULTISAMPLE_BIT */
+        26, /* GL_ALL_CLIENT_ATTRIB_BITS */
 };
 
 #define Elements(x) sizeof(x)/sizeof(*x)
index 5bd2515..3c85022 100644 (file)
@@ -128,6 +128,7 @@ static const struct {
    { OFF, "GL_3DFX_texture_compression_FXT1",  F(TDFX_texture_compression_FXT1) },
    { OFF, "GL_APPLE_client_storage",           F(APPLE_client_storage) },
    { ON,  "GL_APPLE_packed_pixels",            F(APPLE_packed_pixels) },
+   { OFF, "GL_APPLE_vertex_array_object",      F(APPLE_vertex_array_object) },
    { OFF, "GL_ATI_blend_equation_separate",    F(EXT_blend_equation_separate) },
    { OFF, "GL_ATI_texture_env_combine3",       F(ATI_texture_env_combine3)},
    { OFF, "GL_ATI_texture_mirror_once",        F(ATI_texture_mirror_once)},
@@ -213,6 +214,7 @@ _mesa_enable_sw_extensions(GLcontext *ctx)
 #if FEATURE_ARB_vertex_buffer_object
    ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
 #endif
+   ctx->Extensions.APPLE_vertex_array_object = GL_TRUE;
 #if FEATURE_ATI_fragment_shader
    ctx->Extensions.ATI_fragment_shader = GL_TRUE;
 #endif
index 2e2da7d..3da2e68 100644 (file)
@@ -961,79 +961,79 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          params[0] = FLOAT_TO_BOOLEAN(ctx->Pixel.ZoomY);
          break;
       case GL_VERTEX_ARRAY:
-         params[0] = ctx->Array.Vertex.Enabled;
+         params[0] = ctx->Array.ArrayObj->Vertex.Enabled;
          break;
       case GL_VERTEX_ARRAY_SIZE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Vertex.Size);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Vertex.Size);
          break;
       case GL_VERTEX_ARRAY_TYPE:
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.Vertex.Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->Vertex.Type);
          break;
       case GL_VERTEX_ARRAY_STRIDE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Vertex.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Vertex.Stride);
          break;
       case GL_VERTEX_ARRAY_COUNT_EXT:
          params[0] = INT_TO_BOOLEAN(0);
          break;
       case GL_NORMAL_ARRAY:
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.Normal.Enabled);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->Normal.Enabled);
          break;
       case GL_NORMAL_ARRAY_TYPE:
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.Normal.Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->Normal.Type);
          break;
       case GL_NORMAL_ARRAY_STRIDE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Normal.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Normal.Stride);
          break;
       case GL_NORMAL_ARRAY_COUNT_EXT:
          params[0] = INT_TO_BOOLEAN(0);
          break;
       case GL_COLOR_ARRAY:
-         params[0] = ctx->Array.Color.Enabled;
+         params[0] = ctx->Array.ArrayObj->Color.Enabled;
          break;
       case GL_COLOR_ARRAY_SIZE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Color.Size);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Color.Size);
          break;
       case GL_COLOR_ARRAY_TYPE:
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.Color.Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->Color.Type);
          break;
       case GL_COLOR_ARRAY_STRIDE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Color.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Color.Stride);
          break;
       case GL_COLOR_ARRAY_COUNT_EXT:
          params[0] = INT_TO_BOOLEAN(0);
          break;
       case GL_INDEX_ARRAY:
-         params[0] = ctx->Array.Index.Enabled;
+         params[0] = ctx->Array.ArrayObj->Index.Enabled;
          break;
       case GL_INDEX_ARRAY_TYPE:
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.Index.Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->Index.Type);
          break;
       case GL_INDEX_ARRAY_STRIDE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Index.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Index.Stride);
          break;
       case GL_INDEX_ARRAY_COUNT_EXT:
          params[0] = INT_TO_BOOLEAN(0);
          break;
       case GL_TEXTURE_COORD_ARRAY:
-         params[0] = ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled;
+         params[0] = ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled;
          break;
       case GL_TEXTURE_COORD_ARRAY_SIZE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Size);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Size);
          break;
       case GL_TEXTURE_COORD_ARRAY_TYPE:
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Type);
          break;
       case GL_TEXTURE_COORD_ARRAY_STRIDE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Stride);
          break;
       case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
          params[0] = INT_TO_BOOLEAN(0);
          break;
       case GL_EDGE_FLAG_ARRAY:
-         params[0] = ctx->Array.EdgeFlag.Enabled;
+         params[0] = ctx->Array.ArrayObj->EdgeFlag.Enabled;
          break;
       case GL_EDGE_FLAG_ARRAY_STRIDE:
-         params[0] = INT_TO_BOOLEAN(ctx->Array.EdgeFlag.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->EdgeFlag.Stride);
          break;
       case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
          params[0] = INT_TO_BOOLEAN(0);
@@ -1307,19 +1307,19 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_SECONDARY_COLOR_ARRAY_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetBooleanv");
-         params[0] = ctx->Array.SecondaryColor.Enabled;
+         params[0] = ctx->Array.ArrayObj->SecondaryColor.Enabled;
          break;
       case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetBooleanv");
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.SecondaryColor.Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->SecondaryColor.Type);
          break;
       case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.SecondaryColor.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->SecondaryColor.Stride);
          break;
       case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.SecondaryColor.Size);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->SecondaryColor.Size);
          break;
       case GL_CURRENT_FOG_COORDINATE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetBooleanv");
@@ -1330,15 +1330,15 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_FOG_COORDINATE_ARRAY_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetBooleanv");
-         params[0] = ctx->Array.FogCoord.Enabled;
+         params[0] = ctx->Array.ArrayObj->FogCoord.Enabled;
          break;
       case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetBooleanv");
-         params[0] = ENUM_TO_BOOLEAN(ctx->Array.FogCoord.Type);
+         params[0] = ENUM_TO_BOOLEAN(ctx->Array.ArrayObj->FogCoord.Type);
          break;
       case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.FogCoord.Stride);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->FogCoord.Stride);
          break;
       case GL_FOG_COORDINATE_SOURCE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetBooleanv");
@@ -1410,67 +1410,67 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_VERTEX_ATTRIB_ARRAY0_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[0].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[0].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY1_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[1].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[1].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY2_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[2].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[2].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY3_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[3].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[3].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY4_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[4].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[4].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY5_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[5].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[5].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY6_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[6].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[6].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY7_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[7].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[7].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY8_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[8].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[8].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY9_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[9].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[9].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY10_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[10].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[10].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY11_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[11].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[11].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY12_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[12].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[12].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY13_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[13].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[13].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY14_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[14].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[14].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY15_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
-         params[0] = ctx->Array.VertexAttrib[15].Enabled;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[15].Enabled;
          break;
       case GL_MAP1_VERTEX_ATTRIB0_4_NV:
          CHECK_EXT1(NV_vertex_program, "GetBooleanv");
@@ -1582,35 +1582,35 @@ _mesa_GetBooleanv( GLenum pname, GLboolean *params )
          break;
       case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Vertex.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Vertex.BufferObj->Name);
          break;
       case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Normal.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Normal.BufferObj->Name);
          break;
       case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Color.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Color.BufferObj->Name);
          break;
       case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.Index.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->Index.BufferObj->Name);
          break;
       case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.TexCoord[ctx->Array.ActiveTexture].BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].BufferObj->Name);
          break;
       case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.EdgeFlag.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->EdgeFlag.BufferObj->Name);
          break;
       case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.SecondaryColor.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->SecondaryColor.BufferObj->Name);
          break;
       case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
-         params[0] = INT_TO_BOOLEAN(ctx->Array.FogCoord.BufferObj->Name);
+         params[0] = INT_TO_BOOLEAN(ctx->Array.ArrayObj->FogCoord.BufferObj->Name);
          break;
       case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetBooleanv");
@@ -2779,79 +2779,79 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          params[0] = ctx->Pixel.ZoomY;
          break;
       case GL_VERTEX_ARRAY:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.Vertex.Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->Vertex.Enabled);
          break;
       case GL_VERTEX_ARRAY_SIZE:
-         params[0] = (GLfloat)(ctx->Array.Vertex.Size);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Vertex.Size);
          break;
       case GL_VERTEX_ARRAY_TYPE:
-         params[0] = ENUM_TO_FLOAT(ctx->Array.Vertex.Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->Vertex.Type);
          break;
       case GL_VERTEX_ARRAY_STRIDE:
-         params[0] = (GLfloat)(ctx->Array.Vertex.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Vertex.Stride);
          break;
       case GL_VERTEX_ARRAY_COUNT_EXT:
          params[0] = (GLfloat)(0);
          break;
       case GL_NORMAL_ARRAY:
-         params[0] = ENUM_TO_FLOAT(ctx->Array.Normal.Enabled);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->Normal.Enabled);
          break;
       case GL_NORMAL_ARRAY_TYPE:
-         params[0] = ENUM_TO_FLOAT(ctx->Array.Normal.Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->Normal.Type);
          break;
       case GL_NORMAL_ARRAY_STRIDE:
-         params[0] = (GLfloat)(ctx->Array.Normal.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Normal.Stride);
          break;
       case GL_NORMAL_ARRAY_COUNT_EXT:
          params[0] = (GLfloat)(0);
          break;
       case GL_COLOR_ARRAY:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.Color.Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->Color.Enabled);
          break;
       case GL_COLOR_ARRAY_SIZE:
-         params[0] = (GLfloat)(ctx->Array.Color.Size);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Color.Size);
          break;
       case GL_COLOR_ARRAY_TYPE:
-         params[0] = ENUM_TO_FLOAT(ctx->Array.Color.Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->Color.Type);
          break;
       case GL_COLOR_ARRAY_STRIDE:
-         params[0] = (GLfloat)(ctx->Array.Color.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Color.Stride);
          break;
       case GL_COLOR_ARRAY_COUNT_EXT:
          params[0] = (GLfloat)(0);
          break;
       case GL_INDEX_ARRAY:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.Index.Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->Index.Enabled);
          break;
       case GL_INDEX_ARRAY_TYPE:
-         params[0] = ENUM_TO_FLOAT(ctx->Array.Index.Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->Index.Type);
          break;
       case GL_INDEX_ARRAY_STRIDE:
-         params[0] = (GLfloat)(ctx->Array.Index.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Index.Stride);
          break;
       case GL_INDEX_ARRAY_COUNT_EXT:
          params[0] = (GLfloat)(0);
          break;
       case GL_TEXTURE_COORD_ARRAY:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled);
          break;
       case GL_TEXTURE_COORD_ARRAY_SIZE:
-         params[0] = (GLfloat)(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Size);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Size);
          break;
       case GL_TEXTURE_COORD_ARRAY_TYPE:
-         params[0] = ENUM_TO_FLOAT(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Type);
          break;
       case GL_TEXTURE_COORD_ARRAY_STRIDE:
-         params[0] = (GLfloat)(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Stride);
          break;
       case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
          params[0] = (GLfloat)(0);
          break;
       case GL_EDGE_FLAG_ARRAY:
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.EdgeFlag.Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->EdgeFlag.Enabled);
          break;
       case GL_EDGE_FLAG_ARRAY_STRIDE:
-         params[0] = (GLfloat)(ctx->Array.EdgeFlag.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->EdgeFlag.Stride);
          break;
       case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
          params[0] = (GLfloat)(0);
@@ -3125,19 +3125,19 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_SECONDARY_COLOR_ARRAY_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.SecondaryColor.Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->SecondaryColor.Enabled);
          break;
       case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetFloatv");
-         params[0] = ENUM_TO_FLOAT(ctx->Array.SecondaryColor.Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->SecondaryColor.Type);
          break;
       case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.SecondaryColor.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->SecondaryColor.Stride);
          break;
       case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.SecondaryColor.Size);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->SecondaryColor.Size);
          break;
       case GL_CURRENT_FOG_COORDINATE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetFloatv");
@@ -3148,15 +3148,15 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_FOG_COORDINATE_ARRAY_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.FogCoord.Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->FogCoord.Enabled);
          break;
       case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetFloatv");
-         params[0] = ENUM_TO_FLOAT(ctx->Array.FogCoord.Type);
+         params[0] = ENUM_TO_FLOAT(ctx->Array.ArrayObj->FogCoord.Type);
          break;
       case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.FogCoord.Stride);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->FogCoord.Stride);
          break;
       case GL_FOG_COORDINATE_SOURCE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetFloatv");
@@ -3228,67 +3228,67 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_VERTEX_ATTRIB_ARRAY0_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[0].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[0].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY1_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[1].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[1].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY2_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[2].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[2].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY3_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[3].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[3].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY4_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[4].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[4].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY5_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[5].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[5].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY6_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[6].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[6].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY7_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[7].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[7].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY8_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[8].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[8].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY9_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[9].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[9].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY10_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[10].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[10].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY11_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[11].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[11].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY12_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[12].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[12].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY13_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[13].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[13].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY14_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[14].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[14].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY15_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
-         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.VertexAttrib[15].Enabled);
+         params[0] = BOOLEAN_TO_FLOAT(ctx->Array.ArrayObj->VertexAttrib[15].Enabled);
          break;
       case GL_MAP1_VERTEX_ATTRIB0_4_NV:
          CHECK_EXT1(NV_vertex_program, "GetFloatv");
@@ -3400,35 +3400,35 @@ _mesa_GetFloatv( GLenum pname, GLfloat *params )
          break;
       case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.Vertex.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Vertex.BufferObj->Name);
          break;
       case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.Normal.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Normal.BufferObj->Name);
          break;
       case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.Color.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Color.BufferObj->Name);
          break;
       case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.Index.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->Index.BufferObj->Name);
          break;
       case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.TexCoord[ctx->Array.ActiveTexture].BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].BufferObj->Name);
          break;
       case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.EdgeFlag.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->EdgeFlag.BufferObj->Name);
          break;
       case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.SecondaryColor.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->SecondaryColor.BufferObj->Name);
          break;
       case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
-         params[0] = (GLfloat)(ctx->Array.FogCoord.BufferObj->Name);
+         params[0] = (GLfloat)(ctx->Array.ArrayObj->FogCoord.BufferObj->Name);
          break;
       case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetFloatv");
@@ -4597,79 +4597,79 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          params[0] = IROUND(ctx->Pixel.ZoomY);
          break;
       case GL_VERTEX_ARRAY:
-         params[0] = BOOLEAN_TO_INT(ctx->Array.Vertex.Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->Vertex.Enabled);
          break;
       case GL_VERTEX_ARRAY_SIZE:
-         params[0] = ctx->Array.Vertex.Size;
+         params[0] = ctx->Array.ArrayObj->Vertex.Size;
          break;
       case GL_VERTEX_ARRAY_TYPE:
-         params[0] = ENUM_TO_INT(ctx->Array.Vertex.Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->Vertex.Type);
          break;
       case GL_VERTEX_ARRAY_STRIDE:
-         params[0] = ctx->Array.Vertex.Stride;
+         params[0] = ctx->Array.ArrayObj->Vertex.Stride;
          break;
       case GL_VERTEX_ARRAY_COUNT_EXT:
          params[0] = 0;
          break;
       case GL_NORMAL_ARRAY:
-         params[0] = ENUM_TO_INT(ctx->Array.Normal.Enabled);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->Normal.Enabled);
          break;
       case GL_NORMAL_ARRAY_TYPE:
-         params[0] = ENUM_TO_INT(ctx->Array.Normal.Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->Normal.Type);
          break;
       case GL_NORMAL_ARRAY_STRIDE:
-         params[0] = ctx->Array.Normal.Stride;
+         params[0] = ctx->Array.ArrayObj->Normal.Stride;
          break;
       case GL_NORMAL_ARRAY_COUNT_EXT:
          params[0] = 0;
          break;
       case GL_COLOR_ARRAY:
-         params[0] = BOOLEAN_TO_INT(ctx->Array.Color.Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->Color.Enabled);
          break;
       case GL_COLOR_ARRAY_SIZE:
-         params[0] = ctx->Array.Color.Size;
+         params[0] = ctx->Array.ArrayObj->Color.Size;
          break;
       case GL_COLOR_ARRAY_TYPE:
-         params[0] = ENUM_TO_INT(ctx->Array.Color.Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->Color.Type);
          break;
       case GL_COLOR_ARRAY_STRIDE:
-         params[0] = ctx->Array.Color.Stride;
+         params[0] = ctx->Array.ArrayObj->Color.Stride;
          break;
       case GL_COLOR_ARRAY_COUNT_EXT:
          params[0] = 0;
          break;
       case GL_INDEX_ARRAY:
-         params[0] = BOOLEAN_TO_INT(ctx->Array.Index.Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->Index.Enabled);
          break;
       case GL_INDEX_ARRAY_TYPE:
-         params[0] = ENUM_TO_INT(ctx->Array.Index.Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->Index.Type);
          break;
       case GL_INDEX_ARRAY_STRIDE:
-         params[0] = ctx->Array.Index.Stride;
+         params[0] = ctx->Array.ArrayObj->Index.Stride;
          break;
       case GL_INDEX_ARRAY_COUNT_EXT:
          params[0] = 0;
          break;
       case GL_TEXTURE_COORD_ARRAY:
-         params[0] = BOOLEAN_TO_INT(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled);
          break;
       case GL_TEXTURE_COORD_ARRAY_SIZE:
-         params[0] = ctx->Array.TexCoord[ctx->Array.ActiveTexture].Size;
+         params[0] = ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Size;
          break;
       case GL_TEXTURE_COORD_ARRAY_TYPE:
-         params[0] = ENUM_TO_INT(ctx->Array.TexCoord[ctx->Array.ActiveTexture].Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Type);
          break;
       case GL_TEXTURE_COORD_ARRAY_STRIDE:
-         params[0] = ctx->Array.TexCoord[ctx->Array.ActiveTexture].Stride;
+         params[0] = ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Stride;
          break;
       case GL_TEXTURE_COORD_ARRAY_COUNT_EXT:
          params[0] = 0;
          break;
       case GL_EDGE_FLAG_ARRAY:
-         params[0] = BOOLEAN_TO_INT(ctx->Array.EdgeFlag.Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->EdgeFlag.Enabled);
          break;
       case GL_EDGE_FLAG_ARRAY_STRIDE:
-         params[0] = ctx->Array.EdgeFlag.Stride;
+         params[0] = ctx->Array.ArrayObj->EdgeFlag.Stride;
          break;
       case GL_EDGE_FLAG_ARRAY_COUNT_EXT:
          params[0] = 0;
@@ -4943,19 +4943,19 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_SECONDARY_COLOR_ARRAY_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.SecondaryColor.Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->SecondaryColor.Enabled);
          break;
       case GL_SECONDARY_COLOR_ARRAY_TYPE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetIntegerv");
-         params[0] = ENUM_TO_INT(ctx->Array.SecondaryColor.Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->SecondaryColor.Type);
          break;
       case GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetIntegerv");
-         params[0] = ctx->Array.SecondaryColor.Stride;
+         params[0] = ctx->Array.ArrayObj->SecondaryColor.Stride;
          break;
       case GL_SECONDARY_COLOR_ARRAY_SIZE_EXT:
          CHECK_EXT1(EXT_secondary_color, "GetIntegerv");
-         params[0] = ctx->Array.SecondaryColor.Size;
+         params[0] = ctx->Array.ArrayObj->SecondaryColor.Size;
          break;
       case GL_CURRENT_FOG_COORDINATE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetIntegerv");
@@ -4966,15 +4966,15 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_FOG_COORDINATE_ARRAY_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.FogCoord.Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->FogCoord.Enabled);
          break;
       case GL_FOG_COORDINATE_ARRAY_TYPE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetIntegerv");
-         params[0] = ENUM_TO_INT(ctx->Array.FogCoord.Type);
+         params[0] = ENUM_TO_INT(ctx->Array.ArrayObj->FogCoord.Type);
          break;
       case GL_FOG_COORDINATE_ARRAY_STRIDE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetIntegerv");
-         params[0] = ctx->Array.FogCoord.Stride;
+         params[0] = ctx->Array.ArrayObj->FogCoord.Stride;
          break;
       case GL_FOG_COORDINATE_SOURCE_EXT:
          CHECK_EXT1(EXT_fog_coord, "GetIntegerv");
@@ -5046,67 +5046,67 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_VERTEX_ATTRIB_ARRAY0_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[0].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[0].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY1_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[1].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[1].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY2_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[2].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[2].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY3_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[3].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[3].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY4_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[4].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[4].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY5_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[5].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[5].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY6_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[6].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[6].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY7_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[7].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[7].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY8_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[8].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[8].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY9_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[9].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[9].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY10_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[10].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[10].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY11_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[11].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[11].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY12_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[12].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[12].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY13_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[13].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[13].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY14_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[14].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[14].Enabled);
          break;
       case GL_VERTEX_ATTRIB_ARRAY15_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
-         params[0] = BOOLEAN_TO_INT(ctx->Array.VertexAttrib[15].Enabled);
+         params[0] = BOOLEAN_TO_INT(ctx->Array.ArrayObj->VertexAttrib[15].Enabled);
          break;
       case GL_MAP1_VERTEX_ATTRIB0_4_NV:
          CHECK_EXT1(NV_vertex_program, "GetIntegerv");
@@ -5218,35 +5218,35 @@ _mesa_GetIntegerv( GLenum pname, GLint *params )
          break;
       case GL_VERTEX_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.Vertex.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->Vertex.BufferObj->Name;
          break;
       case GL_NORMAL_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.Normal.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->Normal.BufferObj->Name;
          break;
       case GL_COLOR_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.Color.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->Color.BufferObj->Name;
          break;
       case GL_INDEX_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.Index.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->Index.BufferObj->Name;
          break;
       case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.TexCoord[ctx->Array.ActiveTexture].BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].BufferObj->Name;
          break;
       case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.EdgeFlag.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->EdgeFlag.BufferObj->Name;
          break;
       case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.SecondaryColor.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->SecondaryColor.BufferObj->Name;
          break;
       case GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
-         params[0] = ctx->Array.FogCoord.BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->FogCoord.BufferObj->Name;
          break;
       case GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB:
          CHECK_EXT1(ARB_vertex_buffer_object, "GetIntegerv");
index 78d5066..e6e1828 100644 (file)
@@ -463,35 +463,35 @@ StateVars = [
        ( "GL_ZOOM_Y", GLfloat, ["ctx->Pixel.ZoomY"], "", None ),
 
        # Vertex arrays
-       ( "GL_VERTEX_ARRAY", GLboolean, ["ctx->Array.Vertex.Enabled"], "", None ),
-       ( "GL_VERTEX_ARRAY_SIZE", GLint, ["ctx->Array.Vertex.Size"], "", None ),
-       ( "GL_VERTEX_ARRAY_TYPE", GLenum, ["ctx->Array.Vertex.Type"], "", None ),
-       ( "GL_VERTEX_ARRAY_STRIDE", GLint, ["ctx->Array.Vertex.Stride"], "", None ),
+       ( "GL_VERTEX_ARRAY", GLboolean, ["ctx->Array.ArrayObj->Vertex.Enabled"], "", None ),
+       ( "GL_VERTEX_ARRAY_SIZE", GLint, ["ctx->Array.ArrayObj->Vertex.Size"], "", None ),
+       ( "GL_VERTEX_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Vertex.Type"], "", None ),
+       ( "GL_VERTEX_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Vertex.Stride"], "", None ),
        ( "GL_VERTEX_ARRAY_COUNT_EXT", GLint, ["0"], "", None ),
-       ( "GL_NORMAL_ARRAY", GLenum, ["ctx->Array.Normal.Enabled"], "", None ),
-       ( "GL_NORMAL_ARRAY_TYPE", GLenum, ["ctx->Array.Normal.Type"], "", None ),
-       ( "GL_NORMAL_ARRAY_STRIDE", GLint, ["ctx->Array.Normal.Stride"], "", None ),
+       ( "GL_NORMAL_ARRAY", GLenum, ["ctx->Array.ArrayObj->Normal.Enabled"], "", None ),
+       ( "GL_NORMAL_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Normal.Type"], "", None ),
+       ( "GL_NORMAL_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Normal.Stride"], "", None ),
        ( "GL_NORMAL_ARRAY_COUNT_EXT", GLint, ["0"], "", None ),
-       ( "GL_COLOR_ARRAY", GLboolean, ["ctx->Array.Color.Enabled"], "", None ),
-       ( "GL_COLOR_ARRAY_SIZE", GLint, ["ctx->Array.Color.Size"], "", None ),
-       ( "GL_COLOR_ARRAY_TYPE", GLenum, ["ctx->Array.Color.Type"], "", None ),
-       ( "GL_COLOR_ARRAY_STRIDE", GLint, ["ctx->Array.Color.Stride"], "", None ),
+       ( "GL_COLOR_ARRAY", GLboolean, ["ctx->Array.ArrayObj->Color.Enabled"], "", None ),
+       ( "GL_COLOR_ARRAY_SIZE", GLint, ["ctx->Array.ArrayObj->Color.Size"], "", None ),
+       ( "GL_COLOR_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Color.Type"], "", None ),
+       ( "GL_COLOR_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Color.Stride"], "", None ),
        ( "GL_COLOR_ARRAY_COUNT_EXT", GLint, ["0"], "", None ),
-       ( "GL_INDEX_ARRAY", GLboolean, ["ctx->Array.Index.Enabled"], "", None ),
-       ( "GL_INDEX_ARRAY_TYPE", GLenum, ["ctx->Array.Index.Type"], "", None ),
-       ( "GL_INDEX_ARRAY_STRIDE", GLint, ["ctx->Array.Index.Stride"], "", None ),
+       ( "GL_INDEX_ARRAY", GLboolean, ["ctx->Array.ArrayObj->Index.Enabled"], "", None ),
+       ( "GL_INDEX_ARRAY_TYPE", GLenum, ["ctx->Array.ArrayObj->Index.Type"], "", None ),
+       ( "GL_INDEX_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->Index.Stride"], "", None ),
        ( "GL_INDEX_ARRAY_COUNT_EXT", GLint, ["0"], "", None ),
        ( "GL_TEXTURE_COORD_ARRAY", GLboolean,
-         ["ctx->Array.TexCoord[ctx->Array.ActiveTexture].Enabled"], "", None ),
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Enabled"], "", None ),
        ( "GL_TEXTURE_COORD_ARRAY_SIZE", GLint,
-         ["ctx->Array.TexCoord[ctx->Array.ActiveTexture].Size"], "", None ),
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Size"], "", None ),
        ( "GL_TEXTURE_COORD_ARRAY_TYPE", GLenum,
-         ["ctx->Array.TexCoord[ctx->Array.ActiveTexture].Type"], "", None ),
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Type"], "", None ),
        ( "GL_TEXTURE_COORD_ARRAY_STRIDE", GLint,
-         ["ctx->Array.TexCoord[ctx->Array.ActiveTexture].Stride"], "", None ),
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].Stride"], "", None ),
        ( "GL_TEXTURE_COORD_ARRAY_COUNT_EXT", GLint, ["0"], "", None ),
-       ( "GL_EDGE_FLAG_ARRAY", GLboolean, ["ctx->Array.EdgeFlag.Enabled"], "", None ),
-       ( "GL_EDGE_FLAG_ARRAY_STRIDE", GLint, ["ctx->Array.EdgeFlag.Stride"], "", None ),
+       ( "GL_EDGE_FLAG_ARRAY", GLboolean, ["ctx->Array.ArrayObj->EdgeFlag.Enabled"], "", None ),
+       ( "GL_EDGE_FLAG_ARRAY_STRIDE", GLint, ["ctx->Array.ArrayObj->EdgeFlag.Stride"], "", None ),
        ( "GL_EDGE_FLAG_ARRAY_COUNT_EXT", GLint, ["0"], "", None ),
 
        # GL_ARB_multitexture
@@ -641,23 +641,23 @@ StateVars = [
           "ctx->Current.Attrib[VERT_ATTRIB_COLOR1][3]"],
          "FLUSH_CURRENT(ctx, 0);", ["EXT_secondary_color"] ),
        ( "GL_SECONDARY_COLOR_ARRAY_EXT", GLboolean,
-         ["ctx->Array.SecondaryColor.Enabled"], "", ["EXT_secondary_color"] ),
+         ["ctx->Array.ArrayObj->SecondaryColor.Enabled"], "", ["EXT_secondary_color"] ),
        ( "GL_SECONDARY_COLOR_ARRAY_TYPE_EXT", GLenum,
-         ["ctx->Array.SecondaryColor.Type"], "",  ["EXT_secondary_color"] ),
+         ["ctx->Array.ArrayObj->SecondaryColor.Type"], "",  ["EXT_secondary_color"] ),
        ( "GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT", GLint,
-         ["ctx->Array.SecondaryColor.Stride"], "", ["EXT_secondary_color"] ),
+         ["ctx->Array.ArrayObj->SecondaryColor.Stride"], "", ["EXT_secondary_color"] ),
        ( "GL_SECONDARY_COLOR_ARRAY_SIZE_EXT", GLint,
-         ["ctx->Array.SecondaryColor.Size"], "", ["EXT_secondary_color"] ),
+         ["ctx->Array.ArrayObj->SecondaryColor.Size"], "", ["EXT_secondary_color"] ),
 
        # GL_EXT_fog_coord
        ( "GL_CURRENT_FOG_COORDINATE_EXT", GLfloat,
          ["ctx->Current.Attrib[VERT_ATTRIB_FOG][0]"],
          "FLUSH_CURRENT(ctx, 0);", ["EXT_fog_coord"] ),
-       ( "GL_FOG_COORDINATE_ARRAY_EXT", GLboolean, ["ctx->Array.FogCoord.Enabled"],
+       ( "GL_FOG_COORDINATE_ARRAY_EXT", GLboolean, ["ctx->Array.ArrayObj->FogCoord.Enabled"],
          "",  ["EXT_fog_coord"] ),
-       ( "GL_FOG_COORDINATE_ARRAY_TYPE_EXT", GLenum, ["ctx->Array.FogCoord.Type"],
+       ( "GL_FOG_COORDINATE_ARRAY_TYPE_EXT", GLenum, ["ctx->Array.ArrayObj->FogCoord.Type"],
          "", ["EXT_fog_coord"] ),
-       ( "GL_FOG_COORDINATE_ARRAY_STRIDE_EXT", GLint, ["ctx->Array.FogCoord.Stride"],
+       ( "GL_FOG_COORDINATE_ARRAY_STRIDE_EXT", GLint, ["ctx->Array.ArrayObj->FogCoord.Stride"],
          "", ["EXT_fog_coord"] ),
        ( "GL_FOG_COORDINATE_SOURCE_EXT", GLenum, ["ctx->Fog.FogCoordinateSource"],
          "", ["EXT_fog_coord"] ),
@@ -709,37 +709,37 @@ StateVars = [
          ["(ctx->VertexProgram.Current ? ctx->VertexProgram.Current->Base.Id : 0)"],
          "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY0_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[0].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[0].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY1_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[1].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[1].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY2_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[2].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[2].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY3_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[3].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[3].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY4_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[4].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[4].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY5_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[5].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[5].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY6_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[6].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[6].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY7_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[7].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[7].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY8_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[8].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[8].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY9_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[9].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[9].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY10_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[10].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[10].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY11_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[11].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[11].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY12_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[12].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[12].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY13_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[13].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[13].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY14_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[14].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[14].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_VERTEX_ATTRIB_ARRAY15_NV", GLboolean,
-         ["ctx->Array.VertexAttrib[15].Enabled"], "", ["NV_vertex_program"] ),
+         ["ctx->Array.ArrayObj->VertexAttrib[15].Enabled"], "", ["NV_vertex_program"] ),
        ( "GL_MAP1_VERTEX_ATTRIB0_4_NV", GLboolean,
          ["ctx->Eval.Map1Attrib[0]"], "", ["NV_vertex_program"] ),
        ( "GL_MAP1_VERTEX_ATTRIB1_4_NV", GLboolean,
@@ -808,23 +808,23 @@ StateVars = [
        ( "GL_ARRAY_BUFFER_BINDING_ARB", GLint,
          ["ctx->Array.ArrayBufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
        ( "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.Vertex.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+         ["ctx->Array.ArrayObj->Vertex.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
        ( "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.Normal.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+         ["ctx->Array.ArrayObj->Normal.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
        ( "GL_COLOR_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.Color.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+         ["ctx->Array.ArrayObj->Color.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
        ( "GL_INDEX_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.Index.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+         ["ctx->Array.ArrayObj->Index.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
        ( "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.TexCoord[ctx->Array.ActiveTexture].BufferObj->Name"],
+         ["ctx->Array.ArrayObj->TexCoord[ctx->Array.ActiveTexture].BufferObj->Name"],
          "", ["ARB_vertex_buffer_object"] ),
        ( "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.EdgeFlag.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
+         ["ctx->Array.ArrayObj->EdgeFlag.BufferObj->Name"], "", ["ARB_vertex_buffer_object"] ),
        ( "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.SecondaryColor.BufferObj->Name"],
+         ["ctx->Array.ArrayObj->SecondaryColor.BufferObj->Name"],
          "", ["ARB_vertex_buffer_object"] ),
        ( "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB", GLint,
-         ["ctx->Array.FogCoord.BufferObj->Name"],
+         ["ctx->Array.ArrayObj->FogCoord.BufferObj->Name"],
          "", ["ARB_vertex_buffer_object"] ),
        # GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB - not supported
        ( "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB", GLint,
index b6eed58..a741f83 100644 (file)
@@ -182,28 +182,28 @@ _mesa_GetPointerv( GLenum pname, GLvoid **params )
 
    switch (pname) {
       case GL_VERTEX_ARRAY_POINTER:
-         *params = (GLvoid *) ctx->Array.Vertex.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->Vertex.Ptr;
          break;
       case GL_NORMAL_ARRAY_POINTER:
-         *params = (GLvoid *) ctx->Array.Normal.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->Normal.Ptr;
          break;
       case GL_COLOR_ARRAY_POINTER:
-         *params = (GLvoid *) ctx->Array.Color.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->Color.Ptr;
          break;
       case GL_SECONDARY_COLOR_ARRAY_POINTER_EXT:
-         *params = (GLvoid *) ctx->Array.SecondaryColor.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->SecondaryColor.Ptr;
          break;
       case GL_FOG_COORDINATE_ARRAY_POINTER_EXT:
-         *params = (GLvoid *) ctx->Array.FogCoord.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->FogCoord.Ptr;
          break;
       case GL_INDEX_ARRAY_POINTER:
-         *params = (GLvoid *) ctx->Array.Index.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->Index.Ptr;
          break;
       case GL_TEXTURE_COORD_ARRAY_POINTER:
-         *params = (GLvoid *) ctx->Array.TexCoord[clientUnit].Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->TexCoord[clientUnit].Ptr;
          break;
       case GL_EDGE_FLAG_ARRAY_POINTER:
-         *params = (GLvoid *) ctx->Array.EdgeFlag.Ptr;
+         *params = (GLvoid *) ctx->Array.ArrayObj->EdgeFlag.Ptr;
          break;
       case GL_FEEDBACK_BUFFER_POINTER:
          *params = ctx->Feedback.Buffer;
index e9893dd..4ef08dd 100644 (file)
@@ -1663,11 +1663,10 @@ struct gl_client_array
 };
 
 
-/**
- * Vertex array state
- */
-struct gl_array_attrib
-{
+struct gl_array_object {
+   /** Name of the array object as received from glGenVertexArrayAPPLE. */
+   GLuint Name;
+
    /** Conventional vertex arrays */
    /*@{*/
    struct gl_client_array Vertex;
@@ -1683,11 +1682,22 @@ struct gl_array_attrib
    /** Generic arrays for vertex programs/shaders; */
    struct gl_client_array VertexAttrib[VERT_ATTRIB_MAX];
 
+   GLbitfield _Enabled;                /**< mask of _NEW_ARRAY_* values */
+};
+
+
+/**
+ * Vertex array state
+ */
+struct gl_array_attrib
+{
+   struct gl_array_object *ArrayObj;
+   struct gl_array_object *DefaultArrayObj;
+
    GLint ActiveTexture;                /**< Client Active Texture */
    GLuint LockFirst;            /**< GL_EXT_compiled_vertex_array */
    GLuint LockCount;            /**< GL_EXT_compiled_vertex_array */
 
-   GLbitfield _Enabled;                /**< mask of _NEW_ARRAY_* values */
    GLbitfield NewState;                /**< mask of _NEW_ARRAY_* values */
 
 #if FEATURE_ARB_vertex_buffer_object
@@ -2103,6 +2113,9 @@ struct gl_shared_state
    struct _mesa_HashTable *FrameBuffers;
 #endif
 
+   /** Objects associated with the GL_APPLE_vertex_array_object extension. */
+   struct _mesa_HashTable *ArrayObjects;
+
    void *DriverData;  /**< Device driver shared state */
 };
 
@@ -2460,6 +2473,7 @@ struct gl_extensions
    /* vendor extensions */
    GLboolean APPLE_client_storage;
    GLboolean APPLE_packed_pixels;
+   GLboolean APPLE_vertex_array_object;
    GLboolean ATI_texture_mirror_once;
    GLboolean ATI_texture_env_combine3;
    GLboolean ATI_fragment_shader;
index dbf0834..56b835f 100644 (file)
@@ -45,6 +45,7 @@
 #if FEATURE_ARB_vertex_buffer_object
 #include "bufferobj.h"
 #endif
+#include "arrayobj.h"
 #include "buffers.h"
 #include "clip.h"
 #include "colortab.h"
@@ -537,6 +538,12 @@ _mesa_init_exec_table(struct _glapi_table *exec)
    /* glVertexAttrib*NV functions handled in api_loopback.c */
 #endif
 
+   /* 273. GL_APPLE_vertex_array_object */
+   SET_BindVertexArrayAPPLE(exec, _mesa_BindVertexArrayAPPLE);
+   SET_DeleteVertexArraysAPPLE(exec, _mesa_DeleteVertexArraysAPPLE);
+   SET_GenVertexArraysAPPLE(exec, _mesa_GenVertexArraysAPPLE);
+   SET_IsVertexArrayAPPLE(exec, _mesa_IsVertexArrayAPPLE);
+
    /* 282. GL_NV_fragment_program */
 #if FEATURE_NV_fragment_program
    SET_ProgramNamedParameter4fNV(exec, _mesa_ProgramNamedParameter4fNV);
@@ -821,15 +828,15 @@ update_arrays( GLcontext *ctx )
 
    /* 0 */
    if (ctx->ShaderObjects._VertexShaderPresent
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) {
-      min = ctx->Array.VertexAttrib[VERT_ATTRIB_GENERIC0]._MaxElement;
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) {
+      min = ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC0]._MaxElement;
    }
    else if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_POS].Enabled) {
-      min = ctx->Array.VertexAttrib[VERT_ATTRIB_POS]._MaxElement;
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled) {
+      min = ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_POS]._MaxElement;
    }
-   else if (ctx->Array.Vertex.Enabled) {
-      min = ctx->Array.Vertex._MaxElement;
+   else if (ctx->Array.ArrayObj->Vertex.Enabled) {
+      min = ctx->Array.ArrayObj->Vertex._MaxElement;
    }
    else {
       /* can't draw anything without vertex positions! */
@@ -838,86 +845,86 @@ update_arrays( GLcontext *ctx )
 
    /* 1 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_WEIGHT].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_WEIGHT]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_WEIGHT].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_WEIGHT]._MaxElement);
    }
    /* no conventional vertex weight array */
 
    /* 2 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_NORMAL]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]._MaxElement);
    }
-   else if (ctx->Array.Normal.Enabled) {
-      min = MIN2(min, ctx->Array.Normal._MaxElement);
+   else if (ctx->Array.ArrayObj->Normal.Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->Normal._MaxElement);
    }
 
    /* 3 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR0]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]._MaxElement);
    }
-   else if (ctx->Array.Color.Enabled) {
-      min = MIN2(min, ctx->Array.Color._MaxElement);
+   else if (ctx->Array.ArrayObj->Color.Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->Color._MaxElement);
    }
 
    /* 4 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR1]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR1]._MaxElement);
    }
-   else if (ctx->Array.SecondaryColor.Enabled) {
-      min = MIN2(min, ctx->Array.SecondaryColor._MaxElement);
+   else if (ctx->Array.ArrayObj->SecondaryColor.Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->SecondaryColor._MaxElement);
    }
 
    /* 5 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_FOG].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_FOG]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_FOG].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_FOG]._MaxElement);
    }
-   else if (ctx->Array.FogCoord.Enabled) {
-      min = MIN2(min, ctx->Array.FogCoord._MaxElement);
+   else if (ctx->Array.ArrayObj->FogCoord.Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->FogCoord._MaxElement);
    }
 
    /* 6 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_COLOR_INDEX]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_COLOR_INDEX]._MaxElement);
    }
-   else if (ctx->Array.Index.Enabled) {
-      min = MIN2(min, ctx->Array.Index._MaxElement);
+   else if (ctx->Array.ArrayObj->Index.Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->Index._MaxElement);
    }
 
 
    /* 7 */
    if (ctx->VertexProgram._Enabled
-       && ctx->Array.VertexAttrib[VERT_ATTRIB_SEVEN].Enabled) {
-      min = MIN2(min, ctx->Array.VertexAttrib[VERT_ATTRIB_SEVEN]._MaxElement);
+       && ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_SEVEN].Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_SEVEN]._MaxElement);
    }
 
    /* 8..15 */
    for (i = VERT_ATTRIB_TEX0; i <= VERT_ATTRIB_TEX7; i++) {
       if (ctx->VertexProgram._Enabled
-          && ctx->Array.VertexAttrib[i].Enabled) {
-         min = MIN2(min, ctx->Array.VertexAttrib[i]._MaxElement);
+          && ctx->Array.ArrayObj->VertexAttrib[i].Enabled) {
+         min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[i]._MaxElement);
       }
       else if (i - VERT_ATTRIB_TEX0 < ctx->Const.MaxTextureCoordUnits
-               && ctx->Array.TexCoord[i - VERT_ATTRIB_TEX0].Enabled) {
-         min = MIN2(min, ctx->Array.TexCoord[i - VERT_ATTRIB_TEX0]._MaxElement);
+               && ctx->Array.ArrayObj->TexCoord[i - VERT_ATTRIB_TEX0].Enabled) {
+         min = MIN2(min, ctx->Array.ArrayObj->TexCoord[i - VERT_ATTRIB_TEX0]._MaxElement);
       }
    }
 
    /* 16..31 */
    if (ctx->ShaderObjects._VertexShaderPresent) {
       for (i = VERT_ATTRIB_GENERIC0; i < VERT_ATTRIB_MAX; i++) {
-         if (ctx->Array.VertexAttrib[i].Enabled) {
-            min = MIN2(min, ctx->Array.VertexAttrib[i]._MaxElement);
+         if (ctx->Array.ArrayObj->VertexAttrib[i].Enabled) {
+            min = MIN2(min, ctx->Array.ArrayObj->VertexAttrib[i]._MaxElement);
          }
       }
    }
 
-   if (ctx->Array.EdgeFlag.Enabled) {
-      min = MIN2(min, ctx->Array.EdgeFlag._MaxElement);
+   if (ctx->Array.ArrayObj->EdgeFlag.Enabled) {
+      min = MIN2(min, ctx->Array.ArrayObj->EdgeFlag._MaxElement);
    }
 
    /* _MaxElement is one past the last legal array element */
index 97b0214..47c13a3 100644 (file)
@@ -31,6 +31,7 @@
 #include "enums.h"
 #include "mtypes.h"
 #include "varray.h"
+#include "arrayobj.h"
 #include "dispatch.h"
 
 #ifndef GL_BOOLEAN
@@ -119,7 +120,7 @@ _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
          return;
    }
 
-   update_array(ctx, &ctx->Array.Vertex, _NEW_ARRAY_VERTEX,
+   update_array(ctx, &ctx->Array.ArrayObj->Vertex, _NEW_ARRAY_VERTEX,
                 elementSize, size, type, stride, GL_FALSE, ptr);
 
    if (ctx->Driver.VertexPointer)
@@ -164,7 +165,7 @@ _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
          return;
    }
 
-   update_array(ctx, &ctx->Array.Normal, _NEW_ARRAY_NORMAL,
+   update_array(ctx, &ctx->Array.ArrayObj->Normal, _NEW_ARRAY_NORMAL,
                 elementSize, 3, type, stride, GL_TRUE, ptr);
 
    if (ctx->Driver.NormalPointer)
@@ -222,7 +223,7 @@ _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
          return;
    }
 
-   update_array(ctx, &ctx->Array.Color, _NEW_ARRAY_COLOR0,
+   update_array(ctx, &ctx->Array.ArrayObj->Color, _NEW_ARRAY_COLOR0,
                 elementSize, size, type, stride, GL_TRUE, ptr);
 
    if (ctx->Driver.ColorPointer)
@@ -254,7 +255,7 @@ _mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
          return;
    }
 
-   update_array(ctx, &ctx->Array.FogCoord, _NEW_ARRAY_FOGCOORD,
+   update_array(ctx, &ctx->Array.ArrayObj->FogCoord, _NEW_ARRAY_FOGCOORD,
                 elementSize, 1, type, stride, GL_FALSE, ptr);
 
    if (ctx->Driver.FogCoordPointer)
@@ -295,7 +296,7 @@ _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
          return;
    }
 
-   update_array(ctx, &ctx->Array.Index, _NEW_ARRAY_INDEX,
+   update_array(ctx, &ctx->Array.ArrayObj->Index, _NEW_ARRAY_INDEX,
                 elementSize, 1, type, stride, GL_FALSE, ptr);
 
    if (ctx->Driver.IndexPointer)
@@ -354,7 +355,7 @@ _mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
          return;
    }
 
-   update_array(ctx, &ctx->Array.SecondaryColor, _NEW_ARRAY_COLOR1,
+   update_array(ctx, &ctx->Array.ArrayObj->SecondaryColor, _NEW_ARRAY_COLOR1,
                 elementSize, size, type, stride, GL_TRUE, ptr);
 
    if (ctx->Driver.SecondaryColorPointer)
@@ -403,7 +404,7 @@ _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
          return;
    }
 
-   update_array(ctx, &ctx->Array.TexCoord[unit], _NEW_ARRAY_TEXCOORD(unit),
+   update_array(ctx, &ctx->Array.ArrayObj->TexCoord[unit], _NEW_ARRAY_TEXCOORD(unit),
                 elementSize, size, type, stride, GL_FALSE, ptr);
 
    if (ctx->Driver.TexCoordPointer)
@@ -422,7 +423,7 @@ _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
       return;
    }
 
-   update_array(ctx, &ctx->Array.EdgeFlag, _NEW_ARRAY_EDGEFLAG,
+   update_array(ctx, &ctx->Array.ArrayObj->EdgeFlag, _NEW_ARRAY_EDGEFLAG,
                 sizeof(GLboolean), 1, GL_BOOLEAN, stride, GL_FALSE, ptr);
 
    if (ctx->Driver.EdgeFlagPointer)
@@ -479,7 +480,7 @@ _mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
          return;
    }
 
-   update_array(ctx, &ctx->Array.VertexAttrib[index], _NEW_ARRAY_ATTRIB(index),
+   update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index], _NEW_ARRAY_ATTRIB(index),
                 elementSize, size, type, stride, normalized, ptr);
 
    if (ctx->Driver.VertexAttribPointer)
@@ -550,7 +551,7 @@ _mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
          return;
    }
 
-   update_array(ctx, &ctx->Array.VertexAttrib[index], _NEW_ARRAY_ATTRIB(index),
+   update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index], _NEW_ARRAY_ATTRIB(index),
                 elementSize, size, type, stride, normalized, ptr);
 
    /* XXX fix
@@ -923,73 +924,8 @@ _mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
 void 
 _mesa_init_varray(GLcontext *ctx)
 {
-   GLuint i;
-
-   /* Vertex arrays */
-   ctx->Array.Vertex.Size = 4;
-   ctx->Array.Vertex.Type = GL_FLOAT;
-   ctx->Array.Vertex.Stride = 0;
-   ctx->Array.Vertex.StrideB = 0;
-   ctx->Array.Vertex.Ptr = NULL;
-   ctx->Array.Vertex.Enabled = GL_FALSE;
-   ctx->Array.Vertex.Flags = CA_CLIENT_DATA;
-   ctx->Array.Normal.Type = GL_FLOAT;
-   ctx->Array.Normal.Stride = 0;
-   ctx->Array.Normal.StrideB = 0;
-   ctx->Array.Normal.Ptr = NULL;
-   ctx->Array.Normal.Enabled = GL_FALSE;
-   ctx->Array.Normal.Flags = CA_CLIENT_DATA;
-   ctx->Array.Color.Size = 4;
-   ctx->Array.Color.Type = GL_FLOAT;
-   ctx->Array.Color.Stride = 0;
-   ctx->Array.Color.StrideB = 0;
-   ctx->Array.Color.Ptr = NULL;
-   ctx->Array.Color.Enabled = GL_FALSE;
-   ctx->Array.Color.Flags = CA_CLIENT_DATA;
-   ctx->Array.SecondaryColor.Size = 4;
-   ctx->Array.SecondaryColor.Type = GL_FLOAT;
-   ctx->Array.SecondaryColor.Stride = 0;
-   ctx->Array.SecondaryColor.StrideB = 0;
-   ctx->Array.SecondaryColor.Ptr = NULL;
-   ctx->Array.SecondaryColor.Enabled = GL_FALSE;
-   ctx->Array.SecondaryColor.Flags = CA_CLIENT_DATA;
-   ctx->Array.FogCoord.Size = 1;
-   ctx->Array.FogCoord.Type = GL_FLOAT;
-   ctx->Array.FogCoord.Stride = 0;
-   ctx->Array.FogCoord.StrideB = 0;
-   ctx->Array.FogCoord.Ptr = NULL;
-   ctx->Array.FogCoord.Enabled = GL_FALSE;
-   ctx->Array.FogCoord.Flags = CA_CLIENT_DATA;
-   ctx->Array.Index.Type = GL_FLOAT;
-   ctx->Array.Index.Stride = 0;
-   ctx->Array.Index.StrideB = 0;
-   ctx->Array.Index.Ptr = NULL;
-   ctx->Array.Index.Enabled = GL_FALSE;
-   ctx->Array.Index.Flags = CA_CLIENT_DATA;
-   for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
-      ctx->Array.TexCoord[i].Size = 4;
-      ctx->Array.TexCoord[i].Type = GL_FLOAT;
-      ctx->Array.TexCoord[i].Stride = 0;
-      ctx->Array.TexCoord[i].StrideB = 0;
-      ctx->Array.TexCoord[i].Ptr = NULL;
-      ctx->Array.TexCoord[i].Enabled = GL_FALSE;
-      ctx->Array.TexCoord[i].Flags = CA_CLIENT_DATA;
-   }
-   ctx->Array.EdgeFlag.Stride = 0;
-   ctx->Array.EdgeFlag.StrideB = 0;
-   ctx->Array.EdgeFlag.Ptr = NULL;
-   ctx->Array.EdgeFlag.Enabled = GL_FALSE;
-   ctx->Array.EdgeFlag.Flags = CA_CLIENT_DATA;
-   for (i = 0; i < VERT_ATTRIB_MAX; i++) {
-      ctx->Array.VertexAttrib[i].Size = 4;
-      ctx->Array.VertexAttrib[i].Type = GL_FLOAT;
-      ctx->Array.VertexAttrib[i].Stride = 0;
-      ctx->Array.VertexAttrib[i].StrideB = 0;
-      ctx->Array.VertexAttrib[i].Ptr = NULL;
-      ctx->Array.VertexAttrib[i].Enabled = GL_FALSE;
-      ctx->Array.VertexAttrib[i].Normalized = GL_FALSE;
-      ctx->Array.VertexAttrib[i].Flags = CA_CLIENT_DATA;
-   }
+   ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0);
+   ctx->Array.ArrayObj = ctx->Array.DefaultArrayObj;
 
    ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
 }
index 4771c69..8283033 100644 (file)
@@ -51,8 +51,8 @@ _mesa_EnableVertexAttribArrayARB(GLuint index)
    }
 
    FLUSH_VERTICES(ctx, _NEW_ARRAY);
-   ctx->Array.VertexAttrib[index].Enabled = GL_TRUE;
-   ctx->Array._Enabled |= _NEW_ARRAY_ATTRIB(index);
+   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_TRUE;
+   ctx->Array.ArrayObj->_Enabled |= _NEW_ARRAY_ATTRIB(index);
    ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
 }
 
@@ -70,8 +70,8 @@ _mesa_DisableVertexAttribArrayARB(GLuint index)
    }
 
    FLUSH_VERTICES(ctx, _NEW_ARRAY);
-   ctx->Array.VertexAttrib[index].Enabled = GL_FALSE;
-   ctx->Array._Enabled &= ~_NEW_ARRAY_ATTRIB(index);
+   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_FALSE;
+   ctx->Array.ArrayObj->_Enabled &= ~_NEW_ARRAY_ATTRIB(index);
    ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
 }
 
@@ -108,19 +108,19 @@ _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
 
    switch (pname) {
       case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Enabled;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Enabled;
          break;
       case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Size;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Size;
          break;
       case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Stride;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Stride;
          break;
       case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Type;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Type;
          break;
       case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
-         params[0] = ctx->Array.VertexAttrib[index].Normalized;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Normalized;
          break;
       case GL_CURRENT_VERTEX_ATTRIB_ARB:
          FLUSH_CURRENT(ctx, 0);
@@ -131,7 +131,7 @@ _mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
             _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribfvARB(pname)");
             return;
          }
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].BufferObj->Name;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].BufferObj->Name;
          break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribfvARB(pname)");
@@ -175,7 +175,7 @@ _mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
       return;
    }
 
-   *pointer = (GLvoid *) ctx->Array.VertexAttrib[index].Ptr;;
+   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
 }
 
 
index a485a17..758d62c 100644 (file)
@@ -371,13 +371,13 @@ _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params)
 
    switch (pname) {
       case GL_ATTRIB_ARRAY_SIZE_NV:
-         params[0] = ctx->Array.VertexAttrib[index].Size;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Size;
          break;
       case GL_ATTRIB_ARRAY_STRIDE_NV:
-         params[0] = ctx->Array.VertexAttrib[index].Stride;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Stride;
          break;
       case GL_ATTRIB_ARRAY_TYPE_NV:
-         params[0] = ctx->Array.VertexAttrib[index].Type;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Type;
          break;
       case GL_CURRENT_ATTRIB_NV:
         FLUSH_CURRENT(ctx, 0);
@@ -407,13 +407,13 @@ _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params)
 
    switch (pname) {
       case GL_ATTRIB_ARRAY_SIZE_NV:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Size;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Size;
          break;
       case GL_ATTRIB_ARRAY_STRIDE_NV:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Stride;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Stride;
          break;
       case GL_ATTRIB_ARRAY_TYPE_NV:
-         params[0] = (GLfloat) ctx->Array.VertexAttrib[index].Type;
+         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Type;
          break;
       case GL_CURRENT_ATTRIB_NV:
         FLUSH_CURRENT(ctx, 0);
@@ -443,13 +443,13 @@ _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
 
    switch (pname) {
       case GL_ATTRIB_ARRAY_SIZE_NV:
-         params[0] = ctx->Array.VertexAttrib[index].Size;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Size;
          break;
       case GL_ATTRIB_ARRAY_STRIDE_NV:
-         params[0] = ctx->Array.VertexAttrib[index].Stride;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Stride;
          break;
       case GL_ATTRIB_ARRAY_TYPE_NV:
-         params[0] = ctx->Array.VertexAttrib[index].Type;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Type;
          break;
       case GL_CURRENT_ATTRIB_NV:
         FLUSH_CURRENT(ctx, 0);
@@ -463,7 +463,7 @@ _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
             _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
             return;
          }
-         params[0] = ctx->Array.VertexAttrib[index].BufferObj->Name;
+         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].BufferObj->Name;
          break;
       default:
          _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
@@ -493,7 +493,7 @@ _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer)
       return;
    }
 
-   *pointer = (GLvoid *) ctx->Array.VertexAttrib[index].Ptr;;
+   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
 }
 
 
index fff5082..905052d 100644 (file)
@@ -7,6 +7,7 @@ MAIN_SOURCES = \
        main/api_validate.c \
        main/accum.c \
        main/attrib.c \
+       main/arrayobj.c \
        main/blend.c \
        main/bufferobj.c \
        main/buffers.c \
index 692cfd6..b947ec2 100644 (file)
@@ -884,6 +884,10 @@ __glapi_sparc_icache_flush: /* %o0 = insn_addr */
                .globl glGetQueryObjecti64vEXT ; .type glGetQueryObjecti64vEXT,#function
                .globl glGetQueryObjectui64vEXT ; .type glGetQueryObjectui64vEXT,#function
                .globl glBlitFramebufferEXT ; .type glBlitFramebufferEXT,#function
+               .globl glBindVertexArrayAPPLE ; .type glBindVertexArrayAPPLE,#function
+               .globl glDeleteVertexArraysAPPLE ; .type glDeleteVertexArraysAPPLE,#function
+               .globl glGenVertexArraysAPPLE ; .type glGenVertexArraysAPPLE,#function
+               .globl glIsVertexArrayAPPLE ; .type glIsVertexArrayAPPLE,#function
                .globl _mesa_sparc_glapi_begin ; .type _mesa_sparc_glapi_begin,#function
 _mesa_sparc_glapi_begin:
 
@@ -1706,6 +1710,10 @@ _mesa_sparc_glapi_begin:
        GL_STUB(glGetQueryObjecti64vEXT, _gloffset_GetQueryObjecti64vEXT)
        GL_STUB(glGetQueryObjectui64vEXT, _gloffset_GetQueryObjectui64vEXT)
        GL_STUB(glBlitFramebufferEXT, _gloffset_BlitFramebufferEXT)
+       GL_STUB(glBindVertexArrayAPPLE, _gloffset_BindVertexArrayAPPLE)
+       GL_STUB(glDeleteVertexArraysAPPLE, _gloffset_DeleteVertexArraysAPPLE)
+       GL_STUB(glGenVertexArraysAPPLE, _gloffset_GenVertexArraysAPPLE)
+       GL_STUB(glIsVertexArrayAPPLE, _gloffset_IsVertexArrayAPPLE)
 
                .globl _mesa_sparc_glapi_end ; .type _mesa_sparc_glapi_end,#function
 _mesa_sparc_glapi_end:
index 0fb3529..38950d6 100644 (file)
@@ -274,7 +274,7 @@ void _tnl_vb_bind_arrays( GLcontext *ctx, GLint start, GLint end)
        * arrays have priority over the conventional vertex arrays.
        */
       if (ctx->VertexProgram._Enabled
-          && ctx->Array.VertexAttrib[index].Enabled) {
+          && ctx->Array.ArrayObj->VertexAttrib[index].Enabled) {
          /* Use generic attribute array */
          _tnl_import_attrib( ctx, index, GL_FALSE, GL_TRUE );
          VB->AttribPtr[index] = &tmp->Attribs[index];
index d976d53..d0ecb08 100644 (file)
@@ -30936,6 +30936,138 @@ GL_PREFIX(BlitFramebufferEXT):
 #endif /* defined(GLX_USE_TLS) */
        .size   GL_PREFIX(BlitFramebufferEXT), .-GL_PREFIX(BlitFramebufferEXT)
 
+       .p2align        4,,15
+       .globl  GL_PREFIX(BindVertexArrayAPPLE)
+       .type   GL_PREFIX(BindVertexArrayAPPLE), @function
+GL_PREFIX(BindVertexArrayAPPLE):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6552(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       call    _x86_64_get_dispatch@PLT
+       popq    %rdi
+       movq    6552(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6552(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       call    _glapi_get_dispatch
+       popq    %rdi
+       movq    6552(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(BindVertexArrayAPPLE), .-GL_PREFIX(BindVertexArrayAPPLE)
+
+       .p2align        4,,15
+       .globl  GL_PREFIX(DeleteVertexArraysAPPLE)
+       .type   GL_PREFIX(DeleteVertexArraysAPPLE), @function
+GL_PREFIX(DeleteVertexArraysAPPLE):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6560(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rbp
+       call    _x86_64_get_dispatch@PLT
+       popq    %rbp
+       popq    %rsi
+       popq    %rdi
+       movq    6560(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6560(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rbp
+       call    _glapi_get_dispatch
+       popq    %rbp
+       popq    %rsi
+       popq    %rdi
+       movq    6560(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(DeleteVertexArraysAPPLE), .-GL_PREFIX(DeleteVertexArraysAPPLE)
+
+       .p2align        4,,15
+       .globl  GL_PREFIX(GenVertexArraysAPPLE)
+       .type   GL_PREFIX(GenVertexArraysAPPLE), @function
+GL_PREFIX(GenVertexArraysAPPLE):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6568(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rbp
+       call    _x86_64_get_dispatch@PLT
+       popq    %rbp
+       popq    %rsi
+       popq    %rdi
+       movq    6568(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6568(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       pushq   %rsi
+       pushq   %rbp
+       call    _glapi_get_dispatch
+       popq    %rbp
+       popq    %rsi
+       popq    %rdi
+       movq    6568(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(GenVertexArraysAPPLE), .-GL_PREFIX(GenVertexArraysAPPLE)
+
+       .p2align        4,,15
+       .globl  GL_PREFIX(IsVertexArrayAPPLE)
+       .type   GL_PREFIX(IsVertexArrayAPPLE), @function
+GL_PREFIX(IsVertexArrayAPPLE):
+#if defined(GLX_USE_TLS)
+       call    _x86_64_get_dispatch@PLT
+       movq    6576(%rax), %r11
+       jmp     *%r11
+#elif defined(PTHREADS)
+       pushq   %rdi
+       call    _x86_64_get_dispatch@PLT
+       popq    %rdi
+       movq    6576(%rax), %r11
+       jmp     *%r11
+#else
+       movq    _glapi_Dispatch(%rip), %rax
+       testq   %rax, %rax
+       je      1f
+       movq    6576(%rax), %r11
+       jmp     *%r11
+1:
+       pushq   %rdi
+       call    _glapi_get_dispatch
+       popq    %rdi
+       movq    6576(%rax), %r11
+       jmp     *%r11
+#endif /* defined(GLX_USE_TLS) */
+       .size   GL_PREFIX(IsVertexArrayAPPLE), .-GL_PREFIX(IsVertexArrayAPPLE)
+
        .globl GL_PREFIX(ArrayElementEXT) ; .set GL_PREFIX(ArrayElementEXT), GL_PREFIX(ArrayElement)
        .globl GL_PREFIX(BindTextureEXT) ; .set GL_PREFIX(BindTextureEXT), GL_PREFIX(BindTexture)
        .globl GL_PREFIX(DrawArraysEXT) ; .set GL_PREFIX(DrawArraysEXT), GL_PREFIX(DrawArrays)
@@ -31127,7 +31259,7 @@ GL_PREFIX(BlitFramebufferEXT):
        .long   2,4,20    /* Minimum kernel version w/TLS */
 3:     .p2align 2        /* pad out section */
 #endif /* GLX_USE_TLS */
-       
+
 #if defined (__ELF__) && defined (__linux__)
        .section .note.GNU-stack,"",%progbits
 #endif
index ed79797..3c44749 100644 (file)
@@ -960,6 +960,10 @@ GLNAME(gl_dispatch_functions_start):
        GL_STUB(GetQueryObjecti64vEXT, _gloffset_GetQueryObjecti64vEXT, GetQueryObjecti64vEXT@12)
        GL_STUB(GetQueryObjectui64vEXT, _gloffset_GetQueryObjectui64vEXT, GetQueryObjectui64vEXT@12)
        GL_STUB(BlitFramebufferEXT, _gloffset_BlitFramebufferEXT, BlitFramebufferEXT@40)
+       GL_STUB(BindVertexArrayAPPLE, _gloffset_BindVertexArrayAPPLE, BindVertexArrayAPPLE@4)
+       GL_STUB(DeleteVertexArraysAPPLE, _gloffset_DeleteVertexArraysAPPLE, DeleteVertexArraysAPPLE@8)
+       GL_STUB(GenVertexArraysAPPLE, _gloffset_GenVertexArraysAPPLE, GenVertexArraysAPPLE@8)
+       GL_STUB(IsVertexArrayAPPLE, _gloffset_IsVertexArrayAPPLE, IsVertexArrayAPPLE@4)
        GL_STUB_ALIAS(ArrayElementEXT, _gloffset_ArrayElement, ArrayElementEXT@4, ArrayElement, ArrayElement@4)
        GL_STUB_ALIAS(BindTextureEXT, _gloffset_BindTexture, BindTextureEXT@8, BindTexture, BindTexture@8)
        GL_STUB_ALIAS(DrawArraysEXT, _gloffset_DrawArrays, DrawArraysEXT@12, DrawArrays, DrawArrays@12)
@@ -1156,7 +1160,7 @@ GLNAME(gl_dispatch_functions_end):
        .long   2,4,20    /* Minimum kernel version w/TLS */
 3:     .p2align 2        /* pad out section */
 #endif /* GLX_USE_TLS */
-       
-#if defined(__ELF__) && defined(__linux__)
+
+#if defined (__ELF__) && defined (__linux__)
        .section .note.GNU-stack,"",%progbits
 #endif