varray.c revision d56ad273c0ff37d790c614b2d3f04c1249b47307
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:
950f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák      return ctx->API == API_OPENGL ? 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
1369946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He   if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) {
1379946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He      /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */
1380f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák      legalTypesMask &= ~FIXED_ES_BIT;
1390f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák   }
1400f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák   if (!ctx->Extensions.ARB_ES2_compatibility) {
1410f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák      legalTypesMask &= ~FIXED_GL_BIT;
14211dd228415d9299f3afa81525d0e588135099b4bBrian Paul   }
1436cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) {
1446cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
1456cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                          INT_2_10_10_10_REV_BIT);
1466cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   }
14711dd228415d9299f3afa81525d0e588135099b4bBrian Paul
148433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   typeBit = type_to_bit(ctx, type);
149433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) {
150433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)",
151433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                  func, _mesa_lookup_enum_by_nr(type));
152433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
153433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
154433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
155433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   /* Do size parameter checking.
156433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
157433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    * must be handled specially.
158433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    */
159433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (ctx->Extensions.EXT_vertex_array_bgra &&
160433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul       sizeMax == BGRA_OR_4 &&
161433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul       size == GL_BGRA) {
16299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      GLboolean bgra_error = GL_FALSE;
16399c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie
16499c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) {
16599c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie         if (type != GL_UNSIGNED_INT_2_10_10_10_REV &&
16699c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie             type != GL_INT_2_10_10_10_REV &&
16799c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie             type != GL_UNSIGNED_BYTE)
16899c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie            bgra_error = GL_TRUE;
16999c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      } else if (type != GL_UNSIGNED_BYTE)
17099c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie         bgra_error = GL_TRUE;
17199c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie
17299c1a58b3067893d4fa444cd4abcf13bb43232efDave Airlie      if (bgra_error) {
173433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func);
174433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return;
175433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      }
176433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      format = GL_BGRA;
177433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      size = 4;
178433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
179433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   else if (size < sizeMin || size > sizeMax || size > 4) {
180433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
181433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
182433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
183433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
1846cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
1856cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie       (type == GL_UNSIGNED_INT_2_10_10_10_REV ||
1866cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie        type == GL_INT_2_10_10_10_REV) && size != 4) {
1876cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
1886cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   }
1896cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie
190433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   ASSERT(size <= 4);
191433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
192433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (stride < 0) {
193433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
194433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
195433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
196e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
197e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   if (ctx->Array.ArrayObj->VBOonly &&
198efcf5aa13f2000eb3620a99f82043001db07e6b2Brian Paul       !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {
199e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul      /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs.
200e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       * Generate GL_INVALID_OPERATION if that's not true.
201e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       */
202433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
203f549f4c4b6012178df3706b26539ca672399260fBrian Paul      return;
204e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   }
205e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
206433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   elementSize = _mesa_sizeof_type(type) * size;
207433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
208762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[attrib];
209c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Size = size;
210c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Type = type;
21176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   array->Format = format;
212c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Stride = stride;
213c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->StrideB = stride ? stride : elementSize;
214c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Normalized = normalized;
2158f84c237b360be69f9b6ac51465c729b3ada196aPaul Berry   array->Integer = integer;
216c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Ptr = (const GLubyte *) ptr;
2170077c879b57f663c038becdde37b2f6671f59150Brian Paul   array->_ElementSize = elementSize;
2180077c879b57f663c038becdde37b2f6671f59150Brian Paul
21937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul   _mesa_reference_buffer_object(ctx, &array->BufferObj,
22037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul                                 ctx->Array.ArrayBufferObj);
22137c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul
222c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   ctx->NewState |= _NEW_ARRAY;
223762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ctx->Array.NewState |= VERT_BIT(attrib);
224c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul}
225c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
226c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
227c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
228fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
23011dd228415d9299f3afa81525d0e588135099b4bBrian Paul   GLbitfield legalTypes = (SHORT_BIT | INT_BIT | FLOAT_BIT |
2316cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            DOUBLE_BIT | HALF_BIT | FIXED_ES_BIT |
2326cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            UNSIGNED_INT_2_10_10_10_REV_BIT |
2336cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            INT_2_10_10_10_REV_BIT);
234fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
235cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
23711dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API == API_OPENGLES)
23811dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypes |= BYTE_BIT;
23911dd228415d9299f3afa81525d0e588135099b4bBrian Paul
240762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS,
241433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 2, 4,
242433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE, ptr);
243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
246c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
247fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
249433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | SHORT_BIT | INT_BIT |
250433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
2516cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT |
2526cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
2536cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
254fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
255cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2565e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
257762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL,
258433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, 3,
259433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                3, type, stride, GL_TRUE, GL_FALSE, ptr);
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
263c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
264fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
266433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
267433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
268433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
269433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
2706cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT |
2716cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
2726cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
273fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
274cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
275fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
276762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0,
277433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
278433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
282c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
283fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
284fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
285433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
286fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
287cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2885e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
289762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG,
290433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
291433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
292fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
295c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
296fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
298433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
299433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
300fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
301cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3025e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
303762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX,
304433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
305433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
309c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3105e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
311fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell			       GLsizei stride, const GLvoid *ptr)
312fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
313433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
314433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
315433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
3166cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
3176cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
3186cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
319fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
320cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
321fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
322762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1,
323433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
324433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
325fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
326fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
327fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
328c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3292edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
3302edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul                      const GLvoid *ptr)
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
33211dd228415d9299f3afa81525d0e588135099b4bBrian Paul   GLbitfield legalTypes = (SHORT_BIT | INT_BIT |
3330c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu                            HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
3346cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            FIXED_ES_BIT |
3356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            UNSIGNED_INT_2_10_10_10_REV_BIT |
3366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            INT_2_10_10_10_REV_BIT);
337fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
338c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   const GLuint unit = ctx->Array.ActiveTexture;
339cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
34111dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API == API_OPENGLES)
34211dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypes |= BYTE_BIT;
34311dd228415d9299f3afa81525d0e588135099b4bBrian Paul
344762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit),
345433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
346433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE,
347d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
348afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
351c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
352c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
354ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul   const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
355d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */
356d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
357fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
358cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
360762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG,
361433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
362ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul                1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr);
363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3661cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY
3671cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
3681cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{
3690f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák   const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT);
3701cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   GET_CURRENT_CONTEXT(ctx);
3711cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3721cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
37311dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API != API_OPENGLES) {
37411dd228415d9299f3afa81525d0e588135099b4bBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
37511dd228415d9299f3afa81525d0e588135099b4bBrian Paul                  "glPointSizePointer(ES 1.x only)");
37611dd228415d9299f3afa81525d0e588135099b4bBrian Paul      return;
37711dd228415d9299f3afa81525d0e588135099b4bBrian Paul   }
37811dd228415d9299f3afa81525d0e588135099b4bBrian Paul
379762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE,
380433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
381433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
3821cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul}
3831cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
3841cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
385148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program
386a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
387a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array.
388a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays
389a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
390a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched.
391a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
392c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
39392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
39492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                            GLsizei stride, const GLvoid *ptr)
3952edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{
396433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT |
397433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
39829fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler   GLboolean normalized = GL_FALSE;
3992edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   GET_CURRENT_CONTEXT(ctx);
4002edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
4012edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
402d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4032edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
4042edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
4052edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
4062edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
4072edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (type == GL_UNSIGNED_BYTE && size != 4) {
4082edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
4092edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
4102edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
4112edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
412762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index),
413433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
414433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
4152edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul}
416148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4181f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
419148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program
420a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
421a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array.
422a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
423a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
424a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
425c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
42692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
42792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLboolean normalized,
42892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLsizei stride, const GLvoid *ptr)
42992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{
430433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
431433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
432433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
433433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
4346cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT | FIXED_GL_BIT |
4356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
4366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
43792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   GET_CURRENT_CONTEXT(ctx);
43892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
43992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
44005051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
44192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
44292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      return;
44392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
44492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
445762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index),
446433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
447433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
44892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul}
449148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
45092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
45192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
452e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/**
453d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0.
454e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array.
455e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
456e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc).
457e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */
458e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY
459e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
460e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul                           GLsizei stride, const GLvoid *ptr)
461e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{
462433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
463433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
464433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT);
465d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean normalized = GL_FALSE;
466d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
467d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GET_CURRENT_CONTEXT(ctx);
468d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
469d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
470d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
471d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
472d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      return;
473d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
474d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
475762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index),
476433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
477433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, integer, ptr);
478e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul}
479e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
480e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
481e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
482c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
483d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index)
484d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
485d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
486d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
487d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
488d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
489d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
490d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
491d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
492d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
493d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
494762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
495d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
496d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   FLUSH_VERTICES(ctx, _NEW_ARRAY);
497762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE;
498104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   ctx->Array.ArrayObj->_Enabled |= VERT_BIT_GENERIC(index);
499104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   ctx->Array.NewState |= VERT_BIT_GENERIC(index);
500d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
501d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
502d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
503d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
504d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index)
505d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
506d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
507d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
508d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
509d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
510d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
51195368f25c1793619e94d464fe94afcea0409ae26Brian Paul                  "glDisableVertexAttribArrayARB(index)");
512d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
513d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
514d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
515762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
516d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
517d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   FLUSH_VERTICES(ctx, _NEW_ARRAY);
518762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE;
519104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   ctx->Array.ArrayObj->_Enabled &= ~VERT_BIT_GENERIC(index);
520104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   ctx->Array.NewState |= VERT_BIT_GENERIC(index);
521d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
522d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
523d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
524d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/**
525d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy
526d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)).  This function does
527d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
528d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */
529d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint
530f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
531d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  const char *caller)
532d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
533d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   const struct gl_client_array *array;
534d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
5355c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
536d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
540762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
542762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
543d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
544d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   switch (pname) {
545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
546d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Enabled;
547d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
548d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Size;
549d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
550d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Stride;
551d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
552d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Type;
553d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
554d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Normalized;
555d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->BufferObj->Name;
557d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
558d56ad273c0ff37d790c614b2d3f04c1249b47307Kenneth Graunke      if (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_gpu_shader4) {
559d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return array->Integer;
560d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      }
5611d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      goto error;
5621d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB:
5631d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      if (ctx->Extensions.ARB_instanced_arrays) {
5641d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul         return array->InstanceDivisor;
5651d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      }
5661d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      goto error;
567d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   default:
5681d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      ; /* fall-through */
569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
5701d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
5711d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulerror:
5721d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
5731d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   return 0;
574d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
575d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
576d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
5775c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickstatic const GLfloat *
5785c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickget_current_attrib(struct gl_context *ctx, GLuint index, const char *function)
5795c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick{
5805c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   if (index == 0) {
5815c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (ctx->API != API_OPENGLES2) {
5825c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function);
5835c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 return NULL;
5845c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      }
5855c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   }
5865c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   else if (index >= ctx->Const.VertexProgram.MaxAttribs) {
5875c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      _mesa_error(ctx, GL_INVALID_VALUE,
5885c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick		  "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function);
5895c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      return NULL;
5905c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   }
5915c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick
592762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
593762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
5945c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   FLUSH_CURRENT(ctx, 0);
595762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)];
5965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick}
5975c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick
598d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
599d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
600d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
601d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
602d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
603d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
604d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6055c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv");
6065c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
607d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         COPY_4V(params, v);
608d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
609d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
610d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname,
612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                    "glGetVertexAttribfv");
613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
618d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
619d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
620d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
621d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
622d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
623d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6245c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv");
6255c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
626d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLdouble) v[0];
627d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLdouble) v[1];
628d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLdouble) v[2];
629d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLdouble) v[3];
630d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
632d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname,
634d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                     "glGetVertexAttribdv");
635d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
636d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
637d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
638d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
641d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
642d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
643d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
644d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
645d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6465c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv");
6475c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
648d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX should floats in[0,1] be scaled to full int range? */
649d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
650d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
651d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
652d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
653d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
654d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
655d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
656d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
657d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribiv");
658d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
659d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
660d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
661d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
662d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
663d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
664d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
665d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
666d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
667d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6705c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v =
6715c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 get_current_attrib(ctx, index, "glGetVertexAttribIiv");
6725c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
675d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
676d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribIiv");
683d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
684d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
685d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
694d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6955c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v =
6965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 get_current_attrib(ctx, index, "glGetVertexAttribIuiv");
6975c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLuint) v[0];
700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLuint) v[1];
701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLuint) v[2];
702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLuint) v[3];
703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
704d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
705d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
706d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = get_vertex_array_attrib(ctx, index, pname,
707d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                          "glGetVertexAttribIuiv");
708d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
709d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
710d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
711d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
712d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
713d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
714d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
715d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
716d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
717d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
718d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
719d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
720d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
721d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
722d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
723d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
724d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
725d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
726d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
727d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
728762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
729d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
730762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
731d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
732d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
733d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
734d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
7351f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
7361f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       GLsizei count, const GLvoid *ptr)
7371f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7381f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7391f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_VertexPointer(size, type, stride, ptr);
7401f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7411f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
743c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
7451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       const GLvoid *ptr)
7461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_NormalPointer(type, stride, ptr);
7491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7501f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
752c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
7541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
7551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7561f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7571f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_ColorPointer(size, type, stride, ptr);
7581f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7591f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7601f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
761c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7621f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
7631f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
7641f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7651f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7661f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_IndexPointer(type, stride, ptr);
7671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7681f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7691f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
770c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7711f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
7721f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                         GLsizei count, const GLvoid *ptr)
7731f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7741f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7751f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_TexCoordPointer(size, type, stride, ptr);
7761f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7771f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7781f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
779c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7801f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
7811f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7821f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7831f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_EdgeFlagPointer(stride, ptr);
7841f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7851f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7861f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
787c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
788fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
790fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean tflag, cflag, nflag;  /* enable/disable flags */
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint tcomps, ccomps, vcomps;   /* components per texcoord, color, vertex */
793f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLenum ctype = 0;               /* color type */
794f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
7954a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   const GLint toffset = 0;        /* always zero */
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint defstride;                /* default stride */
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint c, f;
7985e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
799cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
800cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   f = sizeof(GLfloat);
802c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
804c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
80508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (format) {
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V2F:
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 2;
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 2*f;
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V3F:
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 3*f;
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V2F:
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 2;
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 2*f;
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V3F:
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 3*f;
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C3F_V3F:
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 3;  vcomps = 3;
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_N3F_V3F:
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_TRUE;
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 0;
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4F_N3F_V3F:
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_TRUE;
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 4*f;
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 7*f;
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 10*f;
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_V3F:
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 2*f;
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 5*f;
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_V4F:
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 0;  vcomps = 4;
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 4*f;
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4UB_V3F:
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c+2*f;
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c+5*f;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C3F_V3F:
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 3;  vcomps = 3;
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_N3F_V3F:
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_TRUE;
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 2*f;
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4F_N3F_V3F:
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 6*f;
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 9*f;
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 12*f;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_C4F_N3F_V4F:
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 4;  vcomps = 4;
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 4*f;
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 8*f;
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 11*f;
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 15*f;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
91608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (stride==0) {
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      stride = defstride;
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
924fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
925fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_INDEX_ARRAY );
926095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   /* XXX also disable secondary color and generic arrays? */
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Texcoords */
929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (tflag) {
9304a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
9314a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
932ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul                             (GLubyte *) pointer + toffset );
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
935ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul      _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Color */
939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (cflag) {
940fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_COLOR_ARRAY );
941cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      _mesa_ColorPointer( ccomps, ctype, stride,
9424a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul			  (GLubyte *) pointer + coffset );
943afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
944afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
945fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_COLOR_ARRAY );
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
948afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Normals */
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (nflag) {
951fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_NORMAL_ARRAY );
9524a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset );
953afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
954afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
955fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_NORMAL_ARRAY );
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9584a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   /* Vertices */
959fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_EnableClientState( GL_VERTEX_ARRAY );
960cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
961cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			(GLubyte *) pointer + voffset );
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
965c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
966ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count)
967ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
968ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
969cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
970ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
971ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
9724753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
973ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
9745857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (first < 0) {
9755857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
9765857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
97722144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
9785857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (count <= 0) {
9795857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
9805857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
9815857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
9825857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount != 0) {
9835857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
9845857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
985ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   }
986ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
9875857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockFirst = first;
9885857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockCount = count;
9895857e988be9317810cf713478195b4ed849eea4aEric Anholt
990ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
991104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   ctx->Array.NewState |= VERT_BIT_ALL;
992ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
993ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
994ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
995c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
996ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void )
997ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
998ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
999cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1000ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1001ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
10024753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glUnlockArrays\n");
1003ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
10045857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount == 0) {
10055857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
10065857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
10075857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
10085857e988be9317810cf713478195b4ed849eea4aEric Anholt
1009ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockFirst = 0;
1010ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockCount = 0;
1011ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1012104b81def4c09f3012e44778d104f00ff87dd4f0Mathias Fröhlich   ctx->Array.NewState |= VERT_BIT_ALL;
1013ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
10142525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10152525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10162525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */
1017c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10187993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
10197993832c12bba578010005b344dcd3817be84a42Brian Paul                          const GLsizei *count, GLsizei primcount )
10202525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{
10212525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GET_CURRENT_CONTEXT(ctx);
10222525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GLint i;
10232525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10242525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10252525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10262525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   for (i = 0; i < primcount; i++) {
10272525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      if (count[i] > 0) {
10289bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick         CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i]));
10292525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      }
10302525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   }
10312525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul}
10322525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10332525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10343baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1035c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10363baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
10373baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      const GLsizei * count,
10383baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      GLsizei primcount, GLint modestride )
10393baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
10403baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
10413baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
10423baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10433baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10443baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10453baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
10463baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
104703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
10489bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] ));
10493baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
10503baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
10513baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
10523baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10533baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10543baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1055c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10563baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
10573baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLenum type, const GLvoid * const * indices,
10583baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLsizei primcount, GLint modestride )
10593baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
10603baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
10613baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
10623baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10633baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10643baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1065d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul   /* XXX not sure about ARB_vertex_buffer_object handling here */
1066d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul
10673baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
10683baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
106903e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
10709bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] ));
10713baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
10723baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
10733baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
10743baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10753baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1076095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/**
10777f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1
1078a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */
1079a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY
1080a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index)
1081a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{
1082a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GET_CURRENT_CONTEXT(ctx);
1083a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
10847f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul   if (!ctx->Extensions.NV_primitive_restart &&
10857f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul       ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
10867f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
1087a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul      return;
1088a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   }
1089a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1090a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1091a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1092a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
1093a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1094a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   ctx->Array.RestartIndex = index;
1095a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul}
1096a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1097a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1098a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/**
10991d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * See GL_ARB_instanced_arrays.
11001d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * Note that the instance divisor only applies to generic arrays, not
11011d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * the legacy vertex arrays.
11021d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul */
11031d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulvoid GLAPIENTRY
11041d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul_mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
11051d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul{
11061d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   GET_CURRENT_CONTEXT(ctx);
11071d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
11081d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11091d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   if (!ctx->Extensions.ARB_instanced_arrays) {
11101d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()");
11111d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      return;
11121d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   }
11131d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11141d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
11151d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)",
11161d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul                  index);
11171d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      return;
11181d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   }
11191d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
1120762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
1121762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
1122762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].InstanceDivisor = divisor;
11231d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul}
11241d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11251d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11261d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11271d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul/**
1128b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another.
1129b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */
1130b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid
1131f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx,
1132b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *dst,
1133b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *src)
1134b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{
1135b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Size = src->Size;
1136b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Type = src->Type;
1137b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Format = src->Format;
1138b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Stride = src->Stride;
1139b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->StrideB = src->StrideB;
1140b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Ptr = src->Ptr;
1141b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Enabled = src->Enabled;
1142b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Normalized = src->Normalized;
1143d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   dst->Integer = src->Integer;
11441d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   dst->InstanceDivisor = src->InstanceDivisor;
1145b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_ElementSize = src->_ElementSize;
1146b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
1147b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_MaxElement = src->_MaxElement;
1148b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul}
1149b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1150b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1151b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1152b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/**
115339d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields.
115439d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
115539d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void
115639d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array)
115739d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
115839d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (index >= 0)
1159298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s[%d]: ", name, index);
116039d7524f7b176d4375e230ac60963d197be539f2Brian Paul   else
1161298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s: ", name);
11624beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul   printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n",
1163298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->Ptr, array->Type, array->Size,
1164298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_ElementSize, array->StrideB,
11654beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul	  array->BufferObj->Name, (unsigned long) array->BufferObj->Size,
1166298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_MaxElement);
116739d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
116839d7524f7b176d4375e230ac60963d197be539f2Brian Paul
116939d7524f7b176d4375e230ac60963d197be539f2Brian Paul
117039d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
117139d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info.  For debug.
117239d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
117339d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid
1174f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx)
117539d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
11766a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
117739d7524f7b176d4375e230ac60963d197be539f2Brian Paul   GLuint i;
117839d7524f7b176d4375e230ac60963d197be539f2Brian Paul
11798fe3134622eed34159ff6f72a33558a659e8d299Brian Paul   _mesa_update_array_object_max_element(ctx, arrayObj);
11808fe3134622eed34159ff6f72a33558a659e8d299Brian Paul
1181298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("Array Object %u\n", arrayObj->Name);
1182762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled)
1183762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]);
1184762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled)
1185762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]);
1186762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled)
1187762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]);
1188762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
1189762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled)
1190762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich         print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]);
1191762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++)
1192762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled)
1193762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich         print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]);
1194298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("  _MaxElement = %u\n", arrayObj->_MaxElement);
119539d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
119639d7524f7b176d4375e230ac60963d197be539f2Brian Paul
119739d7524f7b176d4375e230ac60963d197be539f2Brian Paul
119839d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
1199095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context.
1200095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */
1201c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid
1202f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx)
12036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
1204ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0);
12051030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj,
12061030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul                                ctx->Array.DefaultArrayObj);
1207095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
120812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
120912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   ctx->Array.Objects = _mesa_NewHashTable();
121012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
121112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
121212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
121312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
121412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
121512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
121612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void
121712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData)
121812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
121912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
1220f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = (struct gl_context *) userData;
122112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_delete_array_object(ctx, arrayObj);
122212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
122312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
122412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
122512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
122612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context.
122712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
122812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid
1229f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx)
123012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
123112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
123212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_DeleteHashTable(ctx->Array.Objects);
12336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
1234