varray.c revision 09714c09a40501d82823e42f7461d7b8d7bf11c0
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/*
2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library
339d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Version:  7.6
45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
639d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
75e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a
9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"),
10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation
11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the
13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions:
145e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included
16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software.
175e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen *
18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */
25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell
27fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h"
28148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#include "imports.h"
2926895aa797060a38b42dfad21301f4b34b7de0d2Brian Paul#include "bufferobj.h"
30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h"
31afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enable.h"
32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "enums.h"
3312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul#include "hash.h"
34433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#include "image.h"
35d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul#include "macros.h"
36db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h"
375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "varray.h"
39ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick#include "arrayobj.h"
402cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h"
41485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell
42c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
43433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to do error checking for GL_EXT_vertex_array_bgra */
44433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BGRA_OR_4  5
45433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
46433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
47433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to indicate which GL datatypes are accepted by each of the
48433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * glVertex/Color/Attrib/EtcPointer() functions.
49433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */
50433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BOOL_BIT             0x1
51433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BYTE_BIT             0x2
52433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_BYTE_BIT    0x4
53433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define SHORT_BIT            0x8
54433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_SHORT_BIT   0x10
55433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define INT_BIT              0x20
56433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_INT_BIT     0x40
57433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define HALF_BIT             0x80
58433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FLOAT_BIT            0x100
59433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define DOUBLE_BIT           0x200
600f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák#define FIXED_ES_BIT         0x400
610f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák#define FIXED_GL_BIT         0x800
626cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie#define UNSIGNED_INT_2_10_10_10_REV_BIT 0x1000
636cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie#define INT_2_10_10_10_REV_BIT 0x2000
64433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
65433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
66433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Convert GL datatype enum into a <type>_BIT value seen above */
67433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulstatic GLbitfield
68433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paultype_to_bit(const struct gl_context *ctx, GLenum type)
69433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul{
70433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   switch (type) {
71433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_BOOL:
72433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return BOOL_BIT;
73433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_BYTE:
74433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return BYTE_BIT;
75433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_BYTE:
76433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_BYTE_BIT;
77433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_SHORT:
78433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return SHORT_BIT;
79433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_SHORT:
80433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_SHORT_BIT;
81433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_INT:
82433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return INT_BIT;
83433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_INT:
84433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_INT_BIT;
85433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_HALF_FLOAT:
86433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      if (ctx->Extensions.ARB_half_float_vertex)
87433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return HALF_BIT;
88433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      else
89433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return 0x0;
90433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_FLOAT:
91433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return FLOAT_BIT;
92433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_DOUBLE:
93433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return DOUBLE_BIT;
94433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_FIXED:
9509714c09a40501d82823e42f7461d7b8d7bf11c0Jordan Justen      return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT;
966cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   case GL_UNSIGNED_INT_2_10_10_10_REV:
976cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      return UNSIGNED_INT_2_10_10_10_REV_BIT;
986cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   case GL_INT_2_10_10_10_REV:
996cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie      return INT_2_10_10_10_REV_BIT;
100433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   default:
101433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return 0;
102433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
103433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul}
104433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
105433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
106c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/**
107433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * Do error checking and update state for glVertex/Color/TexCoord/...Pointer
108433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * functions.
109f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul *
110433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param func  name of calling function used for error reporting
111762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich * \param attrib  the attribute array index to update
112433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
113433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMin  min allowable size value
114433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
115f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size  components per element (1, 2, 3 or 4)
116f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
117f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride  stride between elements, in elements
118f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized  are integer types converted to floats in [-1, 1]?
119d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer  integer-valued values (will not be normalized to [-1,1])
120f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr  the address (or offset inside VBO) of the array data
121c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */
122f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void
123433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulupdate_array(struct gl_context *ctx,
124433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             const char *func,
125762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich             GLuint attrib, GLbitfield legalTypesMask,
126433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLint sizeMin, GLint sizeMax,
127433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLint size, GLenum type, GLsizei stride,
128433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLboolean normalized, GLboolean integer,
129d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul             const GLvoid *ptr)
130c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{
131762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   struct gl_client_array *array;
132433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLbitfield typeBit;
133433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLsizei elementSize;
134433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLenum format = GL_RGBA;
135433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
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);
188e14b3573676af291669ee6ef4a295fc61a22c8d8Brian Paul      return;
1896cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie   }
1906cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie
191433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   ASSERT(size <= 4);
192433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
193433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (stride < 0) {
194433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
195433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
196433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
197e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
19809639901530da7df7347428512c2bee86af1ef8eIan Romanick   if (ctx->Array.ArrayObj->ARBsemantics &&
199efcf5aa13f2000eb3620a99f82043001db07e6b2Brian Paul       !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {
200e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul      /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs.
201e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       * Generate GL_INVALID_OPERATION if that's not true.
202e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       */
203433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
204f549f4c4b6012178df3706b26539ca672399260fBrian Paul      return;
205e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   }
206e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
207433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   elementSize = _mesa_sizeof_type(type) * size;
208433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
209762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[attrib];
210c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Size = size;
211c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Type = type;
21276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   array->Format = format;
213c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Stride = stride;
214c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->StrideB = stride ? stride : elementSize;
215c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Normalized = normalized;
2168f84c237b360be69f9b6ac51465c729b3ada196aPaul Berry   array->Integer = integer;
217c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Ptr = (const GLubyte *) ptr;
2180077c879b57f663c038becdde37b2f6671f59150Brian Paul   array->_ElementSize = elementSize;
2190077c879b57f663c038becdde37b2f6671f59150Brian Paul
22037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul   _mesa_reference_buffer_object(ctx, &array->BufferObj,
22137c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul                                 ctx->Array.ArrayBufferObj);
22237c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul
223c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   ctx->NewState |= _NEW_ARRAY;
224b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul   ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib);
225c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul}
226c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
227c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
228c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
229fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
23111dd228415d9299f3afa81525d0e588135099b4bBrian Paul   GLbitfield legalTypes = (SHORT_BIT | INT_BIT | FLOAT_BIT |
2326cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            DOUBLE_BIT | HALF_BIT | FIXED_ES_BIT |
2336cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            UNSIGNED_INT_2_10_10_10_REV_BIT |
2346cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            INT_2_10_10_10_REV_BIT);
235fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
236cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2375e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
23811dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API == API_OPENGLES)
23911dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypes |= BYTE_BIT;
24011dd228415d9299f3afa81525d0e588135099b4bBrian Paul
241762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS,
242433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 2, 4,
243433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE, ptr);
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
247c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
248fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
250433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | SHORT_BIT | INT_BIT |
251433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
2526cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT |
2536cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
2546cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
255fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
256cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2575e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
258762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL,
259433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, 3,
260433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                3, type, stride, GL_TRUE, GL_FALSE, ptr);
261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
264c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
265fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
267433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
268433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
269433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
270433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
2716cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT |
2726cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
2736cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
274fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
275cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
276fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
277762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0,
278433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
279433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
283c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
284fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
285fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
286433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
287fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
290762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG,
291433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
292433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
295fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
296c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
297fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
299433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
300433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
301fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
302cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
304762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX,
305433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
306433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
310c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
312fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell			       GLsizei stride, const GLvoid *ptr)
313fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
314433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
315433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
316433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
3176cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
3186cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
3196cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
320fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
322fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
323762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1,
324433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
325433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
326fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
327fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
328fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
329c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3302edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
3312edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul                      const GLvoid *ptr)
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
33311dd228415d9299f3afa81525d0e588135099b4bBrian Paul   GLbitfield legalTypes = (SHORT_BIT | INT_BIT |
3340c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu                            HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
3356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            FIXED_ES_BIT |
3366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            UNSIGNED_INT_2_10_10_10_REV_BIT |
3376cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                            INT_2_10_10_10_REV_BIT);
338fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
339c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   const GLuint unit = ctx->Array.ActiveTexture;
340cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
34211dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API == API_OPENGLES)
34311dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypes |= BYTE_BIT;
34411dd228415d9299f3afa81525d0e588135099b4bBrian Paul
345762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit),
346433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
347433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE,
348d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
349afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
352c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
353c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
355ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul   const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
356d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */
357d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
358fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
359cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
361762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG,
362433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
363ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul                1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr);
364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3671cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY
3681cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
3691cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{
3700f1e59deacb944f1a88e55f042a3265a12f2c201Marek Olšák   const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT);
3711cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   GET_CURRENT_CONTEXT(ctx);
3721cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3731cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
37411dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API != API_OPENGLES) {
37511dd228415d9299f3afa81525d0e588135099b4bBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
37611dd228415d9299f3afa81525d0e588135099b4bBrian Paul                  "glPointSizePointer(ES 1.x only)");
37711dd228415d9299f3afa81525d0e588135099b4bBrian Paul      return;
37811dd228415d9299f3afa81525d0e588135099b4bBrian Paul   }
37911dd228415d9299f3afa81525d0e588135099b4bBrian Paul
380762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE,
381433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
382433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
3831cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul}
3841cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
3851cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
386148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program
387a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
388a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array.
389a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays
390a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
391a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched.
392a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
393c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
39492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
39592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                            GLsizei stride, const GLvoid *ptr)
3962edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{
397433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT |
398433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
39929fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler   GLboolean normalized = GL_FALSE;
4002edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   GET_CURRENT_CONTEXT(ctx);
4012edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
4022edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
403d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4042edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
4052edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
4062edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
4072edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
4082edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (type == GL_UNSIGNED_BYTE && size != 4) {
4092edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
4102edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
4112edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
4122edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
413762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index),
414433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
415433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
4162edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul}
417148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4191f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
420148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program
421a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
422a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array.
423a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
424a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
425a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
426c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
42792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
42892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLboolean normalized,
42992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLsizei stride, const GLvoid *ptr)
43092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{
431433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
432433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
433433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
434433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
4356cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  FIXED_ES_BIT | FIXED_GL_BIT |
4366cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
4376cd2d55a7bee289f20670cb97258d73911dac781Dave Airlie                                  INT_2_10_10_10_REV_BIT);
43892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   GET_CURRENT_CONTEXT(ctx);
43992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
44092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
44105051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
44292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
44392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      return;
44492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
44592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
446762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index),
447433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
448433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
44992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul}
450148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
45192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
45292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
453e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/**
454d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0.
455e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array.
456e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
457e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc).
458e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */
459e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY
460e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
461e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul                           GLsizei stride, const GLvoid *ptr)
462e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{
463433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
464433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
465433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT);
466d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean normalized = GL_FALSE;
467d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
468d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GET_CURRENT_CONTEXT(ctx);
469d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
470d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
471d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
472d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
473d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      return;
474d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
475d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
476762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index),
477433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
478433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, integer, ptr);
479e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul}
480e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
481e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
482e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
483c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
484d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index)
485d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
48645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   struct gl_array_object *arrayObj;
487d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
488d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
489d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
490d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
491d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
492d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
493d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
494d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
495d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
49645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   arrayObj = ctx->Array.ArrayObj;
497d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
49845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib));
49945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul
50045453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   if (!arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
50145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      /* was disabled, now being enabled */
50245453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      FLUSH_VERTICES(ctx, _NEW_ARRAY);
50345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE;
50445453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->_Enabled |= VERT_BIT_GENERIC(index);
505b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
50645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   }
507d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
508d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
509d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
510d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
511d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index)
512d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
51345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   struct gl_array_object *arrayObj;
514d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
515d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
516d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
517d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
518d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
51995368f25c1793619e94d464fe94afcea0409ae26Brian Paul                  "glDisableVertexAttribArrayARB(index)");
520d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
521d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
522d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
52345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   arrayObj = ctx->Array.ArrayObj;
524d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
52545453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib));
52645453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul
52745453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
52845453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      /* was enabled, now being disabled */
52945453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      FLUSH_VERTICES(ctx, _NEW_ARRAY);
53045453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE;
53145453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul      arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index);
532b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
53345453d8f69a8e7d4088c71d238228c142e3be59fBrian Paul   }
534d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
535d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
536d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/**
538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy
539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)).  This function does
540d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */
542d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint
543f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
544d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  const char *caller)
545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
546d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   const struct gl_client_array *array;
547d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
5485c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
549d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
550d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
551d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
552d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
553762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
554d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
555762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
557d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   switch (pname) {
558d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
559d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Enabled;
560d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
561d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Size;
562d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
563d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Stride;
564d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
565d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Type;
566d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
567d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Normalized;
568d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->BufferObj->Name;
570d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
571d56ad273c0ff37d790c614b2d3f04c1249b47307Kenneth Graunke      if (ctx->VersionMajor >= 3 || ctx->Extensions.EXT_gpu_shader4) {
572d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return array->Integer;
573d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      }
5741d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      goto error;
5751d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB:
5761d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      if (ctx->Extensions.ARB_instanced_arrays) {
5771d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul         return array->InstanceDivisor;
5781d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      }
5791d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      goto error;
580d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   default:
5811d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      ; /* fall-through */
582d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
5831d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
5841d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulerror:
5851d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
5861d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   return 0;
587d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
588d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
589d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
5905c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickstatic const GLfloat *
5915c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanickget_current_attrib(struct gl_context *ctx, GLuint index, const char *function)
5925c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick{
5935c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   if (index == 0) {
5945c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (ctx->API != API_OPENGLES2) {
5955c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function);
5965c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 return NULL;
5975c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      }
5985c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   }
5995c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   else if (index >= ctx->Const.VertexProgram.MaxAttribs) {
6005c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      _mesa_error(ctx, GL_INVALID_VALUE,
6015c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick		  "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function);
6025c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      return NULL;
6035c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   }
6045c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick
605762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
606762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
6075c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick   FLUSH_CURRENT(ctx, 0);
608762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)];
6095c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick}
6105c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick
611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6185c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv");
6195c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
620d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         COPY_4V(params, v);
621d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
622d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
623d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
624d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname,
625d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                    "glGetVertexAttribfv");
626d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
627d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
628d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
629d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
630d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
632d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
634d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
635d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
636d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6375c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv");
6385c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLdouble) v[0];
640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLdouble) v[1];
641d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLdouble) v[2];
642d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLdouble) v[3];
643d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
644d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
645d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
646d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname,
647d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                     "glGetVertexAttribdv");
648d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
649d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
650d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
651d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
652d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
653d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
654d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
655d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
656d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
657d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
658d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6595c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv");
6605c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
661d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX should floats in[0,1] be scaled to full int range? */
662d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
663d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
664d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
665d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
666d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
667d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
670d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribiv");
671d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
672d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
675d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
676d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
6835c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v =
6845c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 get_current_attrib(ctx, index, "glGetVertexAttribIiv");
6855c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
694d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
695d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribIiv");
696d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
697d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
704d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
705d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
706d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
707d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
7085c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      const GLfloat *v =
7095c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick	 get_current_attrib(ctx, index, "glGetVertexAttribIuiv");
7105c3f1cdbbeb4d787bad7729ccd3f10aa78d113acIan Romanick      if (v != NULL) {
711d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
712d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLuint) v[0];
713d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLuint) v[1];
714d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLuint) v[2];
715d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLuint) v[3];
716d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
717d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
718d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
719d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = get_vertex_array_attrib(ctx, index, pname,
720d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                          "glGetVertexAttribIuiv");
721d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
722d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
723d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
724d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
725d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
726d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
727d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
728d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
729d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
730d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
731d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
732d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
733d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
734d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
735d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
736d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
737d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
738d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
739d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
740d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
741762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
742d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
743762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
744d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
745d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
746d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
747d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
7481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
7491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       GLsizei count, const GLvoid *ptr)
7501f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7521f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_VertexPointer(size, type, stride, ptr);
7531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
756c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7571f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
7581f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       const GLvoid *ptr)
7591f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7601f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7611f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_NormalPointer(type, stride, ptr);
7621f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7631f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7641f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
765c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7661f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
7671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
7681f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7691f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7701f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_ColorPointer(size, type, stride, ptr);
7711f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7721f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7731f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
774c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7751f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
7761f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
7771f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7781f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7791f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_IndexPointer(type, stride, ptr);
7801f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7811f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7821f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
783c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7841f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
7851f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                         GLsizei count, const GLvoid *ptr)
7861f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7871f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7881f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_TexCoordPointer(size, type, stride, ptr);
7891f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7901f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7911f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
792c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7931f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
7941f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7951f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7961f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_EdgeFlagPointer(stride, ptr);
7971f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7981f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7991f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
800c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
801fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
803fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean tflag, cflag, nflag;  /* enable/disable flags */
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint tcomps, ccomps, vcomps;   /* components per texcoord, color, vertex */
806f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLenum ctype = 0;               /* color type */
807f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
8084a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   const GLint toffset = 0;        /* always zero */
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint defstride;                /* default stride */
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint c, f;
8115e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
812cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
813cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   f = sizeof(GLfloat);
815c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
817c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
81808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (format) {
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V2F:
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 2;
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 2*f;
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V3F:
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 3*f;
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V2F:
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 2;
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 2*f;
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V3F:
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 3*f;
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C3F_V3F:
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 3;  vcomps = 3;
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_N3F_V3F:
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_TRUE;
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 0;
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4F_N3F_V3F:
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_TRUE;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 4*f;
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 7*f;
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 10*f;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_V3F:
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 2*f;
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 5*f;
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_V4F:
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 0;  vcomps = 4;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 4*f;
885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4UB_V3F:
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c+2*f;
893afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c+5*f;
894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
895afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C3F_V3F:
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 3;  vcomps = 3;
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
899afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_N3F_V3F:
904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_TRUE;
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 2*f;
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
909afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
910afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4F_N3F_V3F:
911afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 6*f;
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 9*f;
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 12*f;
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_C4F_N3F_V4F:
920afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
921afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 4;  vcomps = 4;
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 4*f;
924afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 8*f;
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 11*f;
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 15*f;
927afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
928afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
92908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
930afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (stride==0) {
934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      stride = defstride;
935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
937fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
938fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_INDEX_ARRAY );
939095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   /* XXX also disable secondary color and generic arrays? */
940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Texcoords */
942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (tflag) {
9434a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
9444a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
945ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul                             (GLubyte *) pointer + toffset );
946afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
948ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul      _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
951afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Color */
952afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (cflag) {
953fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_COLOR_ARRAY );
954cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      _mesa_ColorPointer( ccomps, ctype, stride,
9554a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul			  (GLubyte *) pointer + coffset );
956afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
957afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
958fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_COLOR_ARRAY );
959afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
960afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Normals */
963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (nflag) {
964fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_NORMAL_ARRAY );
9654a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset );
966afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
967afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
968fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_NORMAL_ARRAY );
969afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
970afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9714a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   /* Vertices */
972fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_EnableClientState( GL_VERTEX_ARRAY );
973cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
974cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			(GLubyte *) pointer + voffset );
975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
978c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
979ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count)
980ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
981ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
982cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
983ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
984ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
9854753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
986ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
9875857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (first < 0) {
9885857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
9895857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
99022144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
9915857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (count <= 0) {
9925857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
9935857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
9945857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
9955857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount != 0) {
9965857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
9975857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
998ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   }
999ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
10005857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockFirst = first;
10015857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockCount = count;
10025857e988be9317810cf713478195b4ed849eea4aEric Anholt
1003ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1004ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
1005ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1006ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1007c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
1008ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void )
1009ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
1010ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
1011cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1012ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1013ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
10144753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glUnlockArrays\n");
1015ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
10165857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount == 0) {
10175857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
10185857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
10195857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
10205857e988be9317810cf713478195b4ed849eea4aEric Anholt
1021ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockFirst = 0;
1022ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockCount = 0;
1023ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1024ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
10252525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10262525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10272525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */
1028c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10297993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
10307993832c12bba578010005b344dcd3817be84a42Brian Paul                          const GLsizei *count, GLsizei primcount )
10312525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{
10322525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GET_CURRENT_CONTEXT(ctx);
10332525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GLint i;
10342525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10352525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10362525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10372525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   for (i = 0; i < primcount; i++) {
10382525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      if (count[i] > 0) {
10399bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick         CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i]));
10402525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      }
10412525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   }
10422525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul}
10432525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10442525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10453baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1046c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10473baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
10483baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      const GLsizei * count,
10493baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      GLsizei primcount, GLint modestride )
10503baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
10513baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
10523baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
10533baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10543baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10553baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10563baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
10573baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
105803e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
10599bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] ));
10603baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
10613baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
10623baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
10633baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10643baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10653baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1066c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10673baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
10683baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLenum type, const GLvoid * const * indices,
10693baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLsizei primcount, GLint modestride )
10703baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
10713baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
10723baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
10733baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10743baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10753baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1076d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul   /* XXX not sure about ARB_vertex_buffer_object handling here */
1077d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul
10783baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
10793baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
108003e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
10819bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] ));
10823baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
10833baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
10843baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
10853baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10863baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1087095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/**
10887f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1
1089a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */
1090a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY
1091a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index)
1092a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{
1093a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GET_CURRENT_CONTEXT(ctx);
1094a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
10957f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul   if (!ctx->Extensions.NV_primitive_restart &&
10967f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul       ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
10977f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
1098a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul      return;
1099a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   }
1100a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1101d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
1102a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1103d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul   if (ctx->Array.RestartIndex != index) {
1104d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul      FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
1105d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul      ctx->Array.RestartIndex = index;
1106d2003ee7b7b4ab39144904d38167ed1a0d7d266dBrian Paul   }
1107a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul}
1108a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1109a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1110a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/**
11111d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * See GL_ARB_instanced_arrays.
11121d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * Note that the instance divisor only applies to generic arrays, not
11131d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul * the legacy vertex arrays.
11141d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul */
11151d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paulvoid GLAPIENTRY
11161d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul_mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
11171d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul{
1118738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   struct gl_client_array *array;
11191d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   GET_CURRENT_CONTEXT(ctx);
1120738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
11211d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11221d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   if (!ctx->Extensions.ARB_instanced_arrays) {
11231d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()");
11241d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      return;
11251d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   }
11261d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11271d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
11281d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)",
11291d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul                  index);
11301d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul      return;
11311d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   }
11321d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
1133762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
1134762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich
1135738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
1136738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   if (array->InstanceDivisor != divisor) {
1137738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul      FLUSH_VERTICES(ctx, _NEW_ARRAY);
1138738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul      array->InstanceDivisor = divisor;
1139b0e048f0b955ef79e2de794172de053d27d7d8faBrian Paul      ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index));
1140738482eec91f0898749d73bd97c5e864dd36bfb8Brian Paul   }
11411d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul}
11421d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11431d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11441d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul
11451d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul/**
1146b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another.
1147b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */
1148b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid
1149f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx,
1150b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *dst,
1151b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *src)
1152b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{
1153b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Size = src->Size;
1154b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Type = src->Type;
1155b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Format = src->Format;
1156b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Stride = src->Stride;
1157b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->StrideB = src->StrideB;
1158b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Ptr = src->Ptr;
1159b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Enabled = src->Enabled;
1160b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Normalized = src->Normalized;
1161d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   dst->Integer = src->Integer;
11621d1eb9578716913f4133786b30c6e6edc69a8a0cBrian Paul   dst->InstanceDivisor = src->InstanceDivisor;
1163b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_ElementSize = src->_ElementSize;
1164b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
1165b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_MaxElement = src->_MaxElement;
1166b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul}
1167b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1168b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1169b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1170b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/**
117139d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields.
117239d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
117339d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void
117439d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array)
117539d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
117639d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (index >= 0)
1177298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s[%d]: ", name, index);
117839d7524f7b176d4375e230ac60963d197be539f2Brian Paul   else
1179298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s: ", name);
11804beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul   printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n",
1181298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->Ptr, array->Type, array->Size,
1182298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_ElementSize, array->StrideB,
11834beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul	  array->BufferObj->Name, (unsigned long) array->BufferObj->Size,
1184298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_MaxElement);
118539d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
118639d7524f7b176d4375e230ac60963d197be539f2Brian Paul
118739d7524f7b176d4375e230ac60963d197be539f2Brian Paul
118839d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
118939d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info.  For debug.
119039d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
119139d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid
1192f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx)
119339d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
11946a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
119539d7524f7b176d4375e230ac60963d197be539f2Brian Paul   GLuint i;
119639d7524f7b176d4375e230ac60963d197be539f2Brian Paul
11978fe3134622eed34159ff6f72a33558a659e8d299Brian Paul   _mesa_update_array_object_max_element(ctx, arrayObj);
11988fe3134622eed34159ff6f72a33558a659e8d299Brian Paul
1199298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("Array Object %u\n", arrayObj->Name);
1200762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled)
1201762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]);
1202762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled)
1203762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]);
1204762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled)
1205762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]);
1206762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
1207762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled)
1208762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich         print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]);
1209762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++)
1210762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich      if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled)
1211762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich         print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]);
1212298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("  _MaxElement = %u\n", arrayObj->_MaxElement);
121339d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
121439d7524f7b176d4375e230ac60963d197be539f2Brian Paul
121539d7524f7b176d4375e230ac60963d197be539f2Brian Paul
121639d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
1217095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context.
1218095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */
1219c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid
1220f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx)
12216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
122286f53e6d6bd07e2bc3ffcadeb9a4418fbae06e0bMathias Fröhlich   ctx->Array.DefaultArrayObj = ctx->Driver.NewArrayObject(ctx, 0);
12231030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj,
12241030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul                                ctx->Array.DefaultArrayObj);
1225095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
122612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
122712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   ctx->Array.Objects = _mesa_NewHashTable();
122812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
122912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
123012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
123112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
123212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
123312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
123412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void
123512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData)
123612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
123712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
1238f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = (struct gl_context *) userData;
123912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_delete_array_object(ctx, arrayObj);
124012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
124112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
124212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
124312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
124412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context.
124512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
124612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid
1247f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx)
124812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
124912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
125012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_DeleteHashTable(ctx->Array.Objects);
12516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
1252