1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
339d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Version:  7.6
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
639d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
27fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
28148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#include "imports.h"
2926895aa797060a38b42dfad21301f4b34b7de0d2Brian Paul#include "bufferobj.h"
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enable.h"
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h"
3312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul#include "hash.h"
34433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#include "image.h"
35d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul#include "macros.h"
36db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "varray.h"
39ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick#include "arrayobj.h"
402cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h"
41485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell
42c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
43433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to do error checking for GL_EXT_vertex_array_bgra */
44433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BGRA_OR_4  5
45433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
46433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
47433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to indicate which GL datatypes are accepted by each of the
48433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * glVertex/Color/Attrib/EtcPointer() functions.
49433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */
50433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BOOL_BIT             0x1
51433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BYTE_BIT             0x2
52433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_BYTE_BIT    0x4
53433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define SHORT_BIT            0x8
54433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_SHORT_BIT   0x10
55433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define INT_BIT              0x20
56433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_INT_BIT     0x40
57433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define HALF_BIT             0x80
58433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FLOAT_BIT            0x100
59433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define DOUBLE_BIT           0x200
600f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák#define FIXED_ES_BIT         0x400
610f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák#define FIXED_GL_BIT         0x800
626cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie#define UNSIGNED_INT_2_10_10_10_REV_BIT 0x1000
636cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie#define INT_2_10_10_10_REV_BIT 0x2000
64433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
65433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
66433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Convert GL datatype enum into a <type>_BIT value seen above */
67433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulstatic GLbitfield
68433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paultype_to_bit(const struct gl_context *ctx, GLenum type)
69433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul{
70433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   switch (type) {
71433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_BOOL:
72433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return BOOL_BIT;
73433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_BYTE:
74433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return BYTE_BIT;
75433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_BYTE:
76433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_BYTE_BIT;
77433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_SHORT:
78433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return SHORT_BIT;
79433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_SHORT:
80433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_SHORT_BIT;
81433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_INT:
82433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return INT_BIT;
83433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_INT:
84433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_INT_BIT;
85433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_HALF_FLOAT:
86433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      if (ctx->Extensions.ARB_half_float_vertex)
87433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return HALF_BIT;
88433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      else
89433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return 0x0;
90433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_FLOAT:
91433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return FLOAT_BIT;
92433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_DOUBLE:
93433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return DOUBLE_BIT;
94433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_FIXED:
9509714c09a40501d82823e42f7461d7b8d7bf11c0Jordan Justen      return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT;
966cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   case GL_UNSIGNED_INT_2_10_10_10_REV:
976cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      return UNSIGNED_INT_2_10_10_10_REV_BIT;
986cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   case GL_INT_2_10_10_10_REV:
996cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      return INT_2_10_10_10_REV_BIT;
100433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   default:
101433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return 0;
102433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
103433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul}
104433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
105433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
106c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/**
107433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * Do error checking and update state for glVertex/Color/TexCoord/...Pointer
108433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * functions.
109f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul *
110433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param func  name of calling function used for error reporting
111762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich * \param attrib  the attribute array index to update
112433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
113433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMin  min allowable size value
114433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
115f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size  components per element (1, 2, 3 or 4)
116f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
117f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride  stride between elements, in elements
118f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized  are integer types converted to floats in [-1, 1]?
119d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer  integer-valued values (will not be normalized to [-1,1])
120f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr  the address (or offset inside VBO) of the array data
121c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */
122f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void
123433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulupdate_array(struct gl_context *ctx,
124433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             const char *func,
125762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich             GLuint attrib, GLbitfield legalTypesMask,
126433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLint sizeMin, GLint sizeMax,
127433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLint size, GLenum type, GLsizei stride,
128433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLboolean normalized, GLboolean integer,
129d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul             const GLvoid *ptr)
130c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{
131762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   struct gl_client_array *array;
132433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLbitfield typeBit;
133433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLsizei elementSize;
134433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLenum format = GL_RGBA;
135433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
136792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick   /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says:
137792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *
138792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *     "Client vertex arrays - all vertex array attribute pointers must
139792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *     refer to buffer objects (section 2.9.2). The default vertex array
140792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *     object (the name zero) is also deprecated. Calling
141792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *     VertexAttribPointer when no buffer object or no vertex array object
142792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *     is bound will generate an INVALID_OPERATION error..."
143792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    *
144792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    * The check for VBOs is handled below.
145792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick    */
146792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick   if (ctx->API == API_OPENGL_CORE
147792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick       && (ctx->Array.ArrayObj == ctx->Array.DefaultArrayObj)) {
148792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no array object bound)",
149792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick                  func);
150792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick      return;
151792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick   }
152792214e8d45675b756e02a5e39bfe2ab32f7383dIan Romanick
153bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick   if (_mesa_is_gles(ctx)) {
154bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      /* Once Mesa gets support for GL_OES_vertex_half_float this mask will
155bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick       * change.  Adding support for this extension isn't quite as trivial as
156bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick       * we'd like because ES uses a different enum value for GL_HALF_FLOAT.
157bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick       */
158bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      legalTypesMask &= ~(FIXED_GL_BIT | HALF_BIT | DOUBLE_BIT);
159bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick
160bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until
161bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick       * 3.0.  The 2_10_10_10 types are added in OpenGL ES 3.0 or
162bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick       * GL_OES_vertex_type_10_10_10_2.
163bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick       */
164bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      if (ctx->Version < 30) {
165bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick         legalTypesMask &= ~(UNSIGNED_INT_BIT
166bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick                             | INT_BIT
167bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick                             | UNSIGNED_INT_2_10_10_10_REV_BIT
168bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick                             | INT_2_10_10_10_REV_BIT);
169bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      }
170946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick
171946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick      /* BGRA ordering is not supported in ES contexts.
172946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick       */
173946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick      if (sizeMax == BGRA_OR_4)
174946ddec163b9360be44e7db04ce67a2165daa3b7Ian Romanick         sizeMax = 4;
175bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick   } else {
1760f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák      legalTypesMask &= ~FIXED_ES_BIT;
177bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick
178bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      if (!ctx->Extensions.ARB_ES2_compatibility)
179bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick         legalTypesMask &= ~FIXED_GL_BIT;
180bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick
181bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick      if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev)
182bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick         legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
183bbceed268e14593a07a7cc08060ffd20f2718718Ian Romanick                             INT_2_10_10_10_REV_BIT);
1846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   }
18511dd228415d9299f3afa81525d0e588135099b4bBrian Paul
186433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   typeBit = type_to_bit(ctx, type);
187433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) {
188433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)",
189433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                  func, _mesa_lookup_enum_by_nr(type));
190433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
191433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
192433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
193433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   /* Do size parameter checking.
194433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
195433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    * must be handled specially.
196433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    */
197433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (ctx->Extensions.EXT_vertex_array_bgra &&
198433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul       sizeMax == BGRA_OR_4 &&
199433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul       size == GL_BGRA) {
20099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      GLboolean bgra_error = GL_FALSE;
20199c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie
20299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) {
20399c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie         if (type != GL_UNSIGNED_INT_2_10_10_10_REV &&
20499c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie             type != GL_INT_2_10_10_10_REV &&
20599c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie             type != GL_UNSIGNED_BYTE)
20699c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie            bgra_error = GL_TRUE;
20799c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      } else if (type != GL_UNSIGNED_BYTE)
20899c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie         bgra_error = GL_TRUE;
20999c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie
21099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      if (bgra_error) {
211433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func);
212433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return;
213433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      }
214433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      format = GL_BGRA;
215433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      size = 4;
216433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
217433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   else if (size < sizeMin || size > sizeMax || size > 4) {
218433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
219433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
220433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
221433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
2226cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
2236cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie       (type == GL_UNSIGNED_INT_2_10_10_10_REV ||
2246cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie        type == GL_INT_2_10_10_10_REV) && size != 4) {
2256cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
226e14b3573676af291669ee6ef4a295fc61a22c8d8Brian Paul      return;
2276cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   }
2286cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie
229433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   ASSERT(size <= 4);
230433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
231433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (stride < 0) {
232433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
233433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
234433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
235e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
236843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick   /* Page 29 (page 44 of the PDF) of the OpenGL 3.3 spec says:
237843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *
238843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *     "An INVALID_OPERATION error is generated under any of the following
239843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *     conditions:
240843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *
241843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *     ...
242843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *
243843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *     * any of the *Pointer commands specifying the location and
244843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *       organization of vertex array data are called while zero is bound
245843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *       to the ARRAY_BUFFER buffer object binding point (see section
246843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    *       2.9.6), and the pointer argument is not NULL."
247843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick    */
248843b876ba3e01af73ea4ca55a529911448c10b2aIan Romanick   if (ptr != NULL && ctx->Array.ArrayObj->ARBsemantics &&
249efcf5aa13f2000eb3620a99f82043001db07e6b2Brian Paul       !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {
250433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
251f549f4c4b6012178df3706b26539ca672399260fBrian Paul      return;
252e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   }
253e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
254433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   elementSize = _mesa_sizeof_type(type) * size;
255433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
256762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[attrib];
257c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Size = size;
258c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Type = type;
25976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   array->Format = format;
260c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Stride = stride;
261c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->StrideB = stride ? stride : elementSize;
262c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Normalized = normalized;
2638f84c237b360be69f9b6ac51465c729b3ada196aPaul Berry   array->Integer = integer;
264c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Ptr = (const GLubyte *) ptr;
2650077c879b57f663c038becdde37b2f6671f59150Brian Paul   array->_ElementSize = elementSize;
2660077c879b57f663c038becdde37b2f6671f59150Brian Paul
26737c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul   _mesa_reference_buffer_object(ctx, &array->BufferObj,
26837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul                                 ctx->Array.ArrayBufferObj);
26937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul
270c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   ctx->NewState |= _NEW_ARRAY;
271b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul   ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib);
272c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul}
273c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
274c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
275c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
278fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
279e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick   GLbitfield legalTypes = (ctx->API == API_OPENGLES)
280e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick      ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
281e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick      : (SHORT_BIT | INT_BIT | FLOAT_BIT |
282e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick         DOUBLE_BIT | HALF_BIT |
283e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick         UNSIGNED_INT_2_10_10_10_REV_BIT |
284e2cf14d7b273657cce364236cd041c4ca3f94a6bIan Romanick         INT_2_10_10_10_REV_BIT);
285cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2865e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
287762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS,
288433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 2, 4,
289433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE, ptr);
290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
293c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
294fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
297e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick   const GLbitfield legalTypes = (ctx->API == API_OPENGLES)
298e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick      ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
299e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick      : (BYTE_BIT | SHORT_BIT | INT_BIT |
300e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick         HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
301e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick         UNSIGNED_INT_2_10_10_10_REV_BIT |
302e5ef0cbe0e4e45df6ff74a2a40ddb83d8bc3a8ccIan Romanick         INT_2_10_10_10_REV_BIT);
303cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3045e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
305762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL,
306433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, 3,
307433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                3, type, stride, GL_TRUE, GL_FALSE, ptr);
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
310afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
311c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
312fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
313afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
314fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
31507ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick   const GLbitfield legalTypes = (ctx->API == API_OPENGLES)
31607ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick      ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT)
31707ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick      : (BYTE_BIT | UNSIGNED_BYTE_BIT |
31807ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick         SHORT_BIT | UNSIGNED_SHORT_BIT |
31907ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick         INT_BIT | UNSIGNED_INT_BIT |
32007ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick         HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
32107ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick         UNSIGNED_INT_2_10_10_10_REV_BIT |
32207ccfef8d175f6c4b408ee48f7da210975a09fb9Ian Romanick         INT_2_10_10_10_REV_BIT);
323fb8218508a9b5cfe9e14830f9590df889e5b8785Ian Romanick   const GLint sizeMin = (ctx->API == API_OPENGLES) ? 4 : 3;
324cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
325fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
326762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0,
327fb8218508a9b5cfe9e14830f9590df889e5b8785Ian Romanick                legalTypes, sizeMin, BGRA_OR_4,
328433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
332c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
333fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
334fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
335433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
336fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
337cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3385e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
339762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG,
340433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
341433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
342fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
343fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
344fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
345c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
346fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
348433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
349433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
350fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
351cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3525e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
353762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX,
354433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
355433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
359c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
361fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell			       GLsizei stride, const GLvoid *ptr)
362fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
363433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
364433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
365433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
3666cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
3676cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
3686cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
369fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
370cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
371fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
372762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1,
373433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
374433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
375fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
376fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
377fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
378c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3792edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
3802edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul                      const GLvoid *ptr)
381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
382fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
383c3e9a207d0cb650045304cac559958d275a63284Ian Romanick   GLbitfield legalTypes = (ctx->API == API_OPENGLES)
384c3e9a207d0cb650045304cac559958d275a63284Ian Romanick      ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
385c3e9a207d0cb650045304cac559958d275a63284Ian Romanick      : (SHORT_BIT | INT_BIT |
386c3e9a207d0cb650045304cac559958d275a63284Ian Romanick         HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
387c3e9a207d0cb650045304cac559958d275a63284Ian Romanick         UNSIGNED_INT_2_10_10_10_REV_BIT |
388c3e9a207d0cb650045304cac559958d275a63284Ian Romanick         INT_2_10_10_10_REV_BIT);
389a8f475d8f6b56ddec36634437d007e06b48ff1cdIan Romanick   const GLint sizeMin = (ctx->API == API_OPENGLES) ? 2 : 1;
390c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   const GLuint unit = ctx->Array.ActiveTexture;
391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
393762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit),
394a8f475d8f6b56ddec36634437d007e06b48ff1cdIan Romanick                legalTypes, sizeMin, 4,
395433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE,
396d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
400c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
401c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
403ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul   const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
404d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */
405d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
406fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
407cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
409762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG,
410433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
411ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul                1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr);
412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4151cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY
4161cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
4171cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{
4180f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák   const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT);
4191cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   GET_CURRENT_CONTEXT(ctx);
4201cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
4211cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
42211dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API != API_OPENGLES) {
42311dd228415d9299f3afa81525d0e588135099b4bBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
42411dd228415d9299f3afa81525d0e588135099b4bBrian Paul                  "glPointSizePointer(ES 1.x only)");
42511dd228415d9299f3afa81525d0e588135099b4bBrian Paul      return;
42611dd228415d9299f3afa81525d0e588135099b4bBrian Paul   }
42711dd228415d9299f3afa81525d0e588135099b4bBrian Paul
428762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE,
429433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
430433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
4311cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul}
4321cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
4331cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
434148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program
435a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
436a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array.
437a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays
438a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
439a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched.
440a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
441c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
44292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
44392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                            GLsizei stride, const GLvoid *ptr)
4442edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{
445433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT |
446433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
44729fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler   GLboolean normalized = GL_FALSE;
4482edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   GET_CURRENT_CONTEXT(ctx);
4492edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
4502edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
451d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4522edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
4532edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
4542edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
4552edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
4562edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (type == GL_UNSIGNED_BYTE && size != 4) {
4572edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
4582edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
4592edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
4602edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
461762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index),
462433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
463433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
4642edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul}
465148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
468148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program
469a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
470a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array.
471a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
472a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
473a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
474c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
47592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
47692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLboolean normalized,
47792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLsizei stride, const GLvoid *ptr)
47892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{
479433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
480433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
481433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
482433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
4836cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT | FIXED_GL_BIT |
4846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
4856cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
48692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   GET_CURRENT_CONTEXT(ctx);
48792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
48892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
48905051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
49092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
49192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      return;
49292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
49392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
494762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index),
495433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
496433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
49792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul}
498148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
49992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
50092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
501e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/**
502d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0.
503e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array.
504e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
505e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc).
506e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */
507e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY
508e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
509e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul                           GLsizei stride, const GLvoid *ptr)
510e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{
511433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
512433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
513433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT);
514d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean normalized = GL_FALSE;
515d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
516d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GET_CURRENT_CONTEXT(ctx);
517d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
518d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
519d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
520d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
521d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      return;
522d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
523d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
524762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index),
525433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
526433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, integer, ptr);
527e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul}
528e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
529e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
530e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
531c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
532d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index)
533d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
53445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   struct gl_array_object *arrayObj;
535d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
536d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
540d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
542d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
543d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
54445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   arrayObj = ctx->Array.ArrayObj;
545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
54645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib));
54745453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul
54845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   if (!arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
54945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      /* was disabled, now being enabled */
55045453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      FLUSH_VERTICES(ctx, _NEW_ARRAY);
55145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE;
55245453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->_Enabled |= VERT_BIT_GENERIC(index);
553b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
55445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   }
555d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
557d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
558d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
559d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index)
560d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
56145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   struct gl_array_object *arrayObj;
562d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
563d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
564d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
565d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
566d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
56795368f25c1793619e94d464fe94afcea0409ae26Brian Paul                  "glDisableVertexAttribArrayARB(index)");
568d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
570d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
57145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   arrayObj = ctx->Array.ArrayObj;
572d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
57345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib));
57445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul
57545453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
57645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      /* was enabled, now being disabled */
57745453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      FLUSH_VERTICES(ctx, _NEW_ARRAY);
57845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE;
57945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index);
580b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
58145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   }
582d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
583d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
584d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
585d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/**
586d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy
587d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)).  This function does
588d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
589d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */
590d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint
591f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
592d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  const char *caller)
593d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
594d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   const struct gl_client_array *array;
595d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
5965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
597d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
598d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
599d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
600d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
601762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
602d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
603762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
604d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
605d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   switch (pname) {
606d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
607d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Enabled;
608d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
609d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Size;
610d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Stride;
612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Type;
614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Normalized;
616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->BufferObj->Name;
618d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
6192c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick      if ((_mesa_is_desktop_gl(ctx)
6202c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick           && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))
6212c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick          || _mesa_is_gles3(ctx)) {
622d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return array->Integer;
623d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      }
6241d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      goto error;
6251d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB:
6262c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick      if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_instanced_arrays)
6272c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick          || _mesa_is_gles3(ctx)) {
6281d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul         return array->InstanceDivisor;
6291d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      }
6301d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      goto error;
631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   default:
6321d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      ; /* fall-through */
633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
6341d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
6351d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulerror:
6361d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
6371d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   return 0;
638d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
6415c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickstatic const GLfloat *
6425c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickget_current_attrib(struct gl_context *ctx, GLuint index, const char *function)
6435c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick{
6445c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   if (index == 0) {
6452c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick      /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES
6462c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick       * 2.0.  Note that we cannot just check for API_OPENGL_CORE here because
6472c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick       * that will erroneously allow this usage in a 3.0 forward-compatible
6482c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick       * context too.
6492c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick       */
6502c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick      if ((ctx->API != API_OPENGL_CORE || ctx->Version < 31)
6512c87030a00eb5b7034f14f6060093d4b264bc5c0Ian Romanick          && ctx->API != API_OPENGLES2) {
6525c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function);
6535c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 return NULL;
6545c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      }
6555c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   }
6565c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   else if (index >= ctx->Const.VertexProgram.MaxAttribs) {
6575c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      _mesa_error(ctx, GL_INVALID_VALUE,
6585c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick		  "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function);
6595c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      return NULL;
6605c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   }
6615c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick
662762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
663762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
6645c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   FLUSH_CURRENT(ctx, 0);
665762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)];
6665c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick}
6675c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick
668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
670d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
671d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
672d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6755c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv");
6765c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         COPY_4V(params, v);
678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname,
682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                    "glGetVertexAttribfv");
683d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
684d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
685d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6945c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv");
6955c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
696d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLdouble) v[0];
697d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLdouble) v[1];
698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLdouble) v[2];
699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLdouble) v[3];
700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname,
704d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                     "glGetVertexAttribdv");
705d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
706d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
707d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
708d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
709d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
710d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
711d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
712d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
713d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
714d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
715d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
7165c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv");
7175c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
718d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX should floats in[0,1] be scaled to full int range? */
719d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
720d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
721d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
722d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
723d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
724d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
725d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
726d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
727d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribiv");
728d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
729d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
730d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
731d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
732d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
733d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
734d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
735d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
736d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
737d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
738d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
739d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
740422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke      const GLint *v = (const GLint *)
7415c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 get_current_attrib(ctx, index, "glGetVertexAttribIiv");
7425c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
743422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke         COPY_4V(params, v);
744d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
745d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
746d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
747d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
748d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribIiv");
749d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
750d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
751d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
752d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
753d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
754d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
755d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
756d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
757d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
758d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
759d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
760d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
761422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke      const GLuint *v = (const GLuint *)
7625c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 get_current_attrib(ctx, index, "glGetVertexAttribIuiv");
7635c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
764422f3bb8ab95f00e17aa969f7a09c7ceee5f8befKenneth Graunke         COPY_4V(params, v);
765d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
766d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
767d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
768d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = get_vertex_array_attrib(ctx, index, pname,
769d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                          "glGetVertexAttribIuiv");
770d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
771d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
772d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
773d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
774d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
775d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
776d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
777d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
778d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
779d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
780d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
781d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
782d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
783d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
784d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
785d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
786d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
787d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
788d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
789d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
790762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
791d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
792762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
793d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
794d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
795d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
796d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
7971f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
7981f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       GLsizei count, const GLvoid *ptr)
7991f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
8001f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
8011f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_VertexPointer(size, type, stride, ptr);
8021f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
8031f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
8041f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
805c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8061f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
8071f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       const GLvoid *ptr)
8081f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
8091f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
8101f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_NormalPointer(type, stride, ptr);
8111f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
8121f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
8131f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
814c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8151f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
8161f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
8171f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
8181f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
8191f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_ColorPointer(size, type, stride, ptr);
8201f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
8211f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
8221f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
823c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8241f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
8251f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
8261f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
8271f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
8281f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_IndexPointer(type, stride, ptr);
8291f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
8301f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
8311f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
832c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8331f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
8341f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                         GLsizei count, const GLvoid *ptr)
8351f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
8361f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
8371f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_TexCoordPointer(size, type, stride, ptr);
8381f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
8391f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
8401f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
841c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
8421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
8431f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
8441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
8451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_EdgeFlagPointer(stride, ptr);
8461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
8471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
8481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
849c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
850fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
852fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean tflag, cflag, nflag;  /* enable/disable flags */
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint tcomps, ccomps, vcomps;   /* components per texcoord, color, vertex */
855f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLenum ctype = 0;               /* color type */
856f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
8574a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   const GLint toffset = 0;        /* always zero */
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint defstride;                /* default stride */
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint c, f;
8605e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
861cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
862cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   f = sizeof(GLfloat);
864c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
866c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
86708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (format) {
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V2F:
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 2;
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 2*f;
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V3F:
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 3*f;
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V2F:
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 2;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 2*f;
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V3F:
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 3*f;
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C3F_V3F:
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 3;  vcomps = 3;
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_N3F_V3F:
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_TRUE;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 0;
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4F_N3F_V3F:
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_TRUE;
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 4*f;
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 7*f;
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 10*f;
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_V3F:
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 2*f;
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 5*f;
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_V4F:
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 0;  vcomps = 4;
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 4*f;
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4UB_V3F:
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c+2*f;
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c+5*f;
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C3F_V3F:
945afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 3;  vcomps = 3;
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_N3F_V3F:
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_TRUE;
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
955afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 2*f;
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
958afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4F_N3F_V3F:
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 6*f;
965afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 9*f;
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 12*f;
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
968afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_C4F_N3F_V4F:
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 4;  vcomps = 4;
971afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 4*f;
973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 8*f;
974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 11*f;
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 15*f;
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
97808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
979afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
980afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (stride==0) {
983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      stride = defstride;
984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
986fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
987fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_INDEX_ARRAY );
988095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   /* XXX also disable secondary color and generic arrays? */
989afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Texcoords */
991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (tflag) {
9924a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
9934a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
994ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul                             (GLubyte *) pointer + toffset );
995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
997ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul      _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
998afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
999afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Color */
1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (cflag) {
1002fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_COLOR_ARRAY );
1003cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      _mesa_ColorPointer( ccomps, ctype, stride,
10044a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul			  (GLubyte *) pointer + coffset );
1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1007fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_COLOR_ARRAY );
1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Normals */
1012afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (nflag) {
1013fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_NORMAL_ARRAY );
10144a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset );
1015afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1016afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1017fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_NORMAL_ARRAY );
1018afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1019afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
10204a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   /* Vertices */
1021fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_EnableClientState( GL_VERTEX_ARRAY );
1022cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
1023cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			(GLubyte *) pointer + voffset );
1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1025afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1027c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
1028ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count)
1029ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
1030ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
1031cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1032ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1033ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
10344753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
1035ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
10365857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (first < 0) {
10375857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
10385857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
103922144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
10405857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (count <= 0) {
10415857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
10425857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
10435857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
10445857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount != 0) {
10455857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
10465857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
1047ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   }
1048ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
10495857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockFirst = first;
10505857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockCount = count;
10515857e988be9317810cf713478195b4ed849eea4aEric Anholt
1052ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1053ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
1054ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1055ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1056c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
1057ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void )
1058ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
1059ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
1060cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1061ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1062ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
10634753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glUnlockArrays\n");
1064ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
10655857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount == 0) {
10665857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
10675857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
10685857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
10695857e988be9317810cf713478195b4ed849eea4aEric Anholt
1070ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockFirst = 0;
1071ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockCount = 0;
1072ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1073ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
10742525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10752525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10762525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */
1077c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10787993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
10797993832c12bba578010005b344dcd3817be84a42Brian Paul                          const GLsizei *count, GLsizei primcount )
10802525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{
10812525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GET_CURRENT_CONTEXT(ctx);
10822525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GLint i;
10832525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10842525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10852525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10862525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   for (i = 0; i < primcount; i++) {
10872525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      if (count[i] > 0) {
10889bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick         CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i]));
10892525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      }
10902525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   }
10912525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul}
10922525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10932525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10943baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1095c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10963baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
10973baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      const GLsizei * count,
10983baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      GLsizei primcount, GLint modestride )
10993baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
11003baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
11013baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
11023baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
11033baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
11043baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
11053baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
11063baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
110703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
11089bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] ));
11093baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
11103baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
11113baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
11123baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
11133baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
11143baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1115c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
11163baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
11173baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLenum type, const GLvoid * const * indices,
11183baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLsizei primcount, GLint modestride )
11193baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
11203baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
11213baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
11223baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
11233baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
11243baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1125d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul   /* XXX not sure about ARB_vertex_buffer_object handling here */
1126d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul
11273baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
11283baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
112903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
11309bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] ));
11313baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
11323baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
11333baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
11343baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
11353baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1136095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/**
11377f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1
1138a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */
1139a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY
1140a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index)
1141a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{
1142a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GET_CURRENT_CONTEXT(ctx);
1143a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
11449c1b41879aab2ff7386c547a2ccce7686c018cf5Eric Anholt   if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) {
11457f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
1146a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul      return;
1147a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   }
1148a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1149d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
1150a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1151d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul   if (ctx->Array.RestartIndex != index) {
1152d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul      FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
1153d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul      ctx->Array.RestartIndex = index;
1154d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul   }
1155a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul}
1156a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1157a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1158a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/**
11591d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * See GL_ARB_instanced_arrays.
11601d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * Note that the instance divisor only applies to generic arrays, not
11611d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * the legacy vertex arrays.
11621d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul */
11631d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulvoid GLAPIENTRY
11641d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul_mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
11651d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul{
1166738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   struct gl_client_array *array;
11671d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   GET_CURRENT_CONTEXT(ctx);
1168738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
11691d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11701d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   if (!ctx->Extensions.ARB_instanced_arrays) {
11711d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()");
11721d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      return;
11731d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   }
11741d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11751d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
11761d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)",
11771d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul                  index);
11781d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      return;
11791d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   }
11801d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
1181762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
1182762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
1183738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
1184738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   if (array->InstanceDivisor != divisor) {
1185738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul      FLUSH_VERTICES(ctx, _NEW_ARRAY);
1186738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul      array->InstanceDivisor = divisor;
1187b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul      ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index));
1188738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   }
11891d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul}
11901d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11911d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11921d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11931d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul/**
1194b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another.
1195b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */
1196b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid
1197f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx,
1198b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *dst,
1199b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *src)
1200b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{
1201b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Size = src->Size;
1202b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Type = src->Type;
1203b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Format = src->Format;
1204b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Stride = src->Stride;
1205b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->StrideB = src->StrideB;
1206b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Ptr = src->Ptr;
1207b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Enabled = src->Enabled;
1208b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Normalized = src->Normalized;
1209d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   dst->Integer = src->Integer;
12101d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   dst->InstanceDivisor = src->InstanceDivisor;
1211b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_ElementSize = src->_ElementSize;
1212b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
1213b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_MaxElement = src->_MaxElement;
1214b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul}
1215b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1216b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1217b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1218b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/**
121939d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields.
122039d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
122139d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void
122239d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array)
122339d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
122439d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (index >= 0)
1225298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s[%d]: ", name, index);
122639d7524f7b176d4375e230ac60963d197be539f2Brian Paul   else
1227298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s: ", name);
12284beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul   printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n",
1229298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->Ptr, array->Type, array->Size,
1230298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_ElementSize, array->StrideB,
12314beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul	  array->BufferObj->Name, (unsigned long) array->BufferObj->Size,
1232298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_MaxElement);
123339d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
123439d7524f7b176d4375e230ac60963d197be539f2Brian Paul
123539d7524f7b176d4375e230ac60963d197be539f2Brian Paul
123639d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
123739d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info.  For debug.
123839d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
123939d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid
1240f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx)
124139d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
12426a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
124339d7524f7b176d4375e230ac60963d197be539f2Brian Paul   GLuint i;
124439d7524f7b176d4375e230ac60963d197be539f2Brian Paul
12458fe3134622eed34159ff6f72a33558a659e8d299Brian Paul   _mesa_update_array_object_max_element(ctx, arrayObj);
12468fe3134622eed34159ff6f72a33558a659e8d299Brian Paul
1247298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("Array Object %u\n", arrayObj->Name);
1248762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled)
1249762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]);
1250762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled)
1251762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]);
1252762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled)
1253762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]);
1254762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
1255762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled)
1256762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich         print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]);
1257762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++)
1258762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled)
1259762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich         print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]);
1260298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("  _MaxElement = %u\n", arrayObj->_MaxElement);
126139d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
126239d7524f7b176d4375e230ac60963d197be539f2Brian Paul
126339d7524f7b176d4375e230ac60963d197be539f2Brian Paul
126439d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
1265095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context.
1266095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */
1267c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid
1268f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx)
12696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
127086f53e6d6bd07e2bc3ffcadeb9a4418fbae06e0bMathias Fröhlich   ctx->Array.DefaultArrayObj = ctx->Driver.NewArrayObject(ctx, 0);
12711030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj,
12721030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul                                ctx->Array.DefaultArrayObj);
1273095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
127412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
127512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   ctx->Array.Objects = _mesa_NewHashTable();
127612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
127712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
127812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
127912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
128012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
128112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
128212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void
128312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData)
128412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
128512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
1286f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = (struct gl_context *) userData;
128712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_delete_array_object(ctx, arrayObj);
128812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
128912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
129012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
129112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
129212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context.
129312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
129412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid
1295f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx)
129612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
129712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
129812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_DeleteHashTable(ctx->Array.Objects);
12996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
1300