varray.c revision 9946f15d302d48a0bc0ab0b8a3556c184e88c7d0
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"
365e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "varray.h"
38ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick#include "arrayobj.h"
392cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h"
40485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell
41c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
42433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to do error checking for GL_EXT_vertex_array_bgra */
43433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BGRA_OR_4  5
44433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
45433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
46433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Used to indicate which GL datatypes are accepted by each of the
47433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * glVertex/Color/Attrib/EtcPointer() functions.
48433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul */
49433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BOOL_BIT             0x1
50433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define BYTE_BIT             0x2
51433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_BYTE_BIT    0x4
52433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define SHORT_BIT            0x8
53433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_SHORT_BIT   0x10
54433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define INT_BIT              0x20
55433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define UNSIGNED_INT_BIT     0x40
56433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define HALF_BIT             0x80
57433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FLOAT_BIT            0x100
58433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define DOUBLE_BIT           0x200
59433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul#define FIXED_BIT            0x400
60433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
61433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
62433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
63433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul/** Convert GL datatype enum into a <type>_BIT value seen above */
64433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulstatic GLbitfield
65433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paultype_to_bit(const struct gl_context *ctx, GLenum type)
66433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul{
67433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   switch (type) {
68433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_BOOL:
69433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return BOOL_BIT;
70433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_BYTE:
71433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return BYTE_BIT;
72433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_BYTE:
73433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_BYTE_BIT;
74433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_SHORT:
75433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return SHORT_BIT;
76433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_SHORT:
77433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_SHORT_BIT;
78433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_INT:
79433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return INT_BIT;
80433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_UNSIGNED_INT:
81433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return UNSIGNED_INT_BIT;
82433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_HALF_FLOAT:
83433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      if (ctx->Extensions.ARB_half_float_vertex)
84433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return HALF_BIT;
85433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      else
86433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return 0x0;
87433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_FLOAT:
88433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return FLOAT_BIT;
89433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_DOUBLE:
90433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return DOUBLE_BIT;
91433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   case GL_FIXED:
92433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return FIXED_BIT;
93433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   default:
94433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return 0;
95433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
96433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul}
97433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
98433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
99c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/**
100433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * Do error checking and update state for glVertex/Color/TexCoord/...Pointer
101433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * functions.
102f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul *
103433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param func  name of calling function used for error reporting
104f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param array  the array to update
105f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param dirtyBit  which bit to set in ctx->Array.NewState for this array
106433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
107433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMin  min allowable size value
108433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
109f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size  components per element (1, 2, 3 or 4)
110f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
111f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride  stride between elements, in elements
112f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized  are integer types converted to floats in [-1, 1]?
113d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer  integer-valued values (will not be normalized to [-1,1])
114f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr  the address (or offset inside VBO) of the array data
115c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */
116f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void
117433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paulupdate_array(struct gl_context *ctx,
118433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             const char *func,
119433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             struct gl_client_array *array,
120433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLbitfield dirtyBit, GLbitfield legalTypesMask,
121433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLint sizeMin, GLint sizeMax,
122433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLint size, GLenum type, GLsizei stride,
123433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul             GLboolean normalized, GLboolean integer,
124d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul             const GLvoid *ptr)
125c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{
126433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLbitfield typeBit;
127433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLsizei elementSize;
128433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   GLenum format = GL_RGBA;
129433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
1309946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He   if (ctx->API != API_OPENGLES && ctx->API != API_OPENGLES2) {
1319946f15d302d48a0bc0ab0b8a3556c184e88c7d0Shuang He      /* fixed point arrays / data is only allowed with OpenGL ES 1.x/2.0 */
13211dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypesMask &= ~FIXED_BIT;
13311dd228415d9299f3afa81525d0e588135099b4bBrian Paul   }
13411dd228415d9299f3afa81525d0e588135099b4bBrian Paul
135433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   typeBit = type_to_bit(ctx, type);
136433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) {
137433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)",
138433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                  func, _mesa_lookup_enum_by_nr(type));
139433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
140433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
141433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
142433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   /* Do size parameter checking.
143433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
144433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    * must be handled specially.
145433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul    */
146433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (ctx->Extensions.EXT_vertex_array_bgra &&
147433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul       sizeMax == BGRA_OR_4 &&
148433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul       size == GL_BGRA) {
149433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      if (type != GL_UNSIGNED_BYTE) {
150433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func);
151433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul         return;
152433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      }
153433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      format = GL_BGRA;
154433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      size = 4;
155433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
156433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   else if (size < sizeMin || size > sizeMax || size > 4) {
157433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
158433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
159433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
160433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
161433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   ASSERT(size <= 4);
162433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
163433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   if (stride < 0) {
164433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
165433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      return;
166433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   }
167e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
168e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   if (ctx->Array.ArrayObj->VBOonly &&
169e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       ctx->Array.ArrayBufferObj->Name == 0) {
170e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul      /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs.
171e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       * Generate GL_INVALID_OPERATION if that's not true.
172e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       */
173433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
174f549f4c4b6012178df3706b26539ca672399260fBrian Paul      return;
175e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   }
176e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
177433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   elementSize = _mesa_sizeof_type(type) * size;
178433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul
179c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Size = size;
180c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Type = type;
18176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   array->Format = format;
182c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Stride = stride;
183c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->StrideB = stride ? stride : elementSize;
184c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Normalized = normalized;
185c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Ptr = (const GLubyte *) ptr;
1860077c879b57f663c038becdde37b2f6671f59150Brian Paul   array->_ElementSize = elementSize;
1870077c879b57f663c038becdde37b2f6671f59150Brian Paul
18837c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul   _mesa_reference_buffer_object(ctx, &array->BufferObj,
18937c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul                                 ctx->Array.ArrayBufferObj);
19037c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul
191c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   ctx->NewState |= _NEW_ARRAY;
192f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul   ctx->Array.NewState |= dirtyBit;
193c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul}
194c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
195c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
196c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
197fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
19911dd228415d9299f3afa81525d0e588135099b4bBrian Paul   GLbitfield legalTypes = (SHORT_BIT | INT_BIT | FLOAT_BIT |
20011dd228415d9299f3afa81525d0e588135099b4bBrian Paul                            DOUBLE_BIT | HALF_BIT | FIXED_BIT);
201fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
202cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2035e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
20411dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API == API_OPENGLES)
20511dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypes |= BYTE_BIT;
20611dd228415d9299f3afa81525d0e588135099b4bBrian Paul
207433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glVertexPointer",
208433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->Vertex, _NEW_ARRAY_VERTEX,
209433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 2, 4,
210433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE, ptr);
211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
214c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
215fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
217433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | SHORT_BIT | INT_BIT |
218433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
21911dd228415d9299f3afa81525d0e588135099b4bBrian Paul                                  FIXED_BIT);
220fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
221cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
223433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glNormalPointer",
224433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->Normal, _NEW_ARRAY_NORMAL,
225433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, 3,
226433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                3, type, stride, GL_TRUE, GL_FALSE, ptr);
227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
230c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
231fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
233433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
234433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
235433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
236433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
23711dd228415d9299f3afa81525d0e588135099b4bBrian Paul                                  FIXED_BIT);
238fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
239cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
240fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
241433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glColorPointer",
242433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->Color, _NEW_ARRAY_COLOR0,
243433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
244433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
248c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
249fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
250fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
251433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
252fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
253cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2545e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
255433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glFogCoordPointer",
256433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->FogCoord, _NEW_ARRAY_FOGCOORD,
257433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
258433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
259fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
260fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
261fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
262c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
263fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
265433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
266433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
267fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
268cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2695e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
270433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glIndexPointer",
271433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->Index, _NEW_ARRAY_INDEX,
272433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
273433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
277c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
2785e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
279fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell			       GLsizei stride, const GLvoid *ptr)
280fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
281433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
282433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
283433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
284433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
285fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
286cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
287fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
288433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glSecondaryColorPointer",
289433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->SecondaryColor, _NEW_ARRAY_COLOR1,
290433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 3, BGRA_OR_4,
291433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_TRUE, GL_FALSE, ptr);
292fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
295c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
2962edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
2972edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul                      const GLvoid *ptr)
298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
29911dd228415d9299f3afa81525d0e588135099b4bBrian Paul   GLbitfield legalTypes = (SHORT_BIT | INT_BIT |
3000c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu                            HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
3010c0eda393ad5048528f2664d03046ff7f7d3a64cChia-I Wu                            FIXED_BIT);
302fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
303c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   const GLuint unit = ctx->Array.ActiveTexture;
304cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
30611dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API == API_OPENGLES)
30711dd228415d9299f3afa81525d0e588135099b4bBrian Paul      legalTypes |= BYTE_BIT;
30811dd228415d9299f3afa81525d0e588135099b4bBrian Paul
30989c8ff3382763c654ef680c522c287764d943d6cBrian Paul   ASSERT(unit < Elements(ctx->Array.ArrayObj->TexCoord));
31089c8ff3382763c654ef680c522c287764d943d6cBrian Paul
311433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glTexCoordPointer",
312433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->TexCoord[unit],
313f549f4c4b6012178df3706b26539ca672399260fBrian Paul                _NEW_ARRAY_TEXCOORD(unit),
314433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
315433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, GL_FALSE, GL_FALSE,
316d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
317afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
319afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
320c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
321c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
323ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul   const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
324d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */
325d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
326fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
327cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
328afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
329433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glEdgeFlagPointer",
330433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->EdgeFlag, _NEW_ARRAY_EDGEFLAG,
331433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
332ee1f047c8146c717fff30f1690d4ff9e69bd179fBrian Paul                1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr);
333afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3361cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY
3371cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
3381cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{
33911dd228415d9299f3afa81525d0e588135099b4bBrian Paul   const GLbitfield legalTypes = (FLOAT_BIT | FIXED_BIT);
3401cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   GET_CURRENT_CONTEXT(ctx);
3411cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3421cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
34311dd228415d9299f3afa81525d0e588135099b4bBrian Paul   if (ctx->API != API_OPENGLES) {
34411dd228415d9299f3afa81525d0e588135099b4bBrian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
34511dd228415d9299f3afa81525d0e588135099b4bBrian Paul                  "glPointSizePointer(ES 1.x only)");
34611dd228415d9299f3afa81525d0e588135099b4bBrian Paul      return;
34711dd228415d9299f3afa81525d0e588135099b4bBrian Paul   }
34811dd228415d9299f3afa81525d0e588135099b4bBrian Paul
349433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glPointSizePointer",
350433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->PointSize, _NEW_ARRAY_POINT_SIZE,
351433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 1,
352433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                1, type, stride, GL_FALSE, GL_FALSE, ptr);
3531cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul}
3541cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
3551cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
356148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program
357a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
358a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array.
359a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays
360a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
361a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched.
362a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
363c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
36492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
36592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                            GLsizei stride, const GLvoid *ptr)
3662edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{
367433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT |
368433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  FLOAT_BIT | DOUBLE_BIT);
36929fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler   GLboolean normalized = GL_FALSE;
3702edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   GET_CURRENT_CONTEXT(ctx);
3712edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
3722edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
373d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
3742edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
3752edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
3762edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
3772edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
3782edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (type == GL_UNSIGNED_BYTE && size != 4) {
3792edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
3802edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
3812edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
3822edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
383433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glVertexAttribPointerNV",
384433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->VertexAttrib[index],
385f549f4c4b6012178df3706b26539ca672399260fBrian Paul                _NEW_ARRAY_ATTRIB(index),
386433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
387433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
3882edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul}
389148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3911f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
392148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program
393a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
394a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array.
395a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
396a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
397a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
398c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
39992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
40092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLboolean normalized,
40192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLsizei stride, const GLvoid *ptr)
40292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{
403433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
404433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
405433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT |
406433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
40711dd228415d9299f3afa81525d0e588135099b4bBrian Paul                                  FIXED_BIT);
40892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   GET_CURRENT_CONTEXT(ctx);
40992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
41092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
41105051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
41292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
41392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      return;
41492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
41592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
416433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glVertexAttribPointer",
417433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->VertexAttrib[index],
418f549f4c4b6012178df3706b26539ca672399260fBrian Paul                _NEW_ARRAY_ATTRIB(index),
419433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, BGRA_OR_4,
420433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, GL_FALSE, ptr);
42192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul}
422148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
42392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
42492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
425e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/**
426d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0.
427e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array.
428e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
429e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc).
430e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */
431e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY
432e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
433e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul                           GLsizei stride, const GLvoid *ptr)
434e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{
435433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
436433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
437433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                                  INT_BIT | UNSIGNED_INT_BIT);
438d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean normalized = GL_FALSE;
439d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
440d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GET_CURRENT_CONTEXT(ctx);
441d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
442d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
443d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
444d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
445d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      return;
446d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
447d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
448433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul   update_array(ctx, "glVertexAttribIPointer",
449433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                &ctx->Array.ArrayObj->VertexAttrib[index],
450d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                _NEW_ARRAY_ATTRIB(index),
451433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                legalTypes, 1, 4,
452433e5e6defc85d8b1d6262aff990e3f5a8b37027Brian Paul                size, type, stride, normalized, integer, ptr);
453e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul}
454e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
455e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
456e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
457c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
458d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index)
459d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
460d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
461d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
462d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
463d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
464d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
465d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
466d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
467d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
468d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
469d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
470d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
471d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   FLUSH_VERTICES(ctx, _NEW_ARRAY);
472d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_TRUE;
473d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->_Enabled |= _NEW_ARRAY_ATTRIB(index);
474d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
475d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
476d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
477d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
478d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
479d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index)
480d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
481d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
482d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
483d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
484d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
485d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
486d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
487d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
488d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
489d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
490d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
491d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
492d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   FLUSH_VERTICES(ctx, _NEW_ARRAY);
493d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_FALSE;
494d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->_Enabled &= ~_NEW_ARRAY_ATTRIB(index);
495d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
496d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
497d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
498d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
499d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/**
500d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy
501d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)).  This function does
502d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
503d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */
504d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint
505f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
506d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  const char *caller)
507d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
508d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   const struct gl_client_array *array;
509d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
510d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= MAX_VERTEX_GENERIC_ATTRIBS) {
511d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
512d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
513d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
514d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
515d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
516d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
517d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[index];
518d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
519d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   switch (pname) {
520d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
521d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Enabled;
522d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
523d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Size;
524d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
525d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Stride;
526d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
527d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Type;
528d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
529d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Normalized;
530d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
531d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->BufferObj->Name;
532d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
533d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      if (ctx->Extensions.EXT_gpu_shader4) {
534d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return array->Integer;
535d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      }
536d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      /* fall-through */
537d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   default:
538d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
539d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
540d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
541d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
542d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
543d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
544d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
545d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
546d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
547d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
548d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
549d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
550d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
551d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
552d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
553d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribfv(index==0)");
554d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
555d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
556d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
557d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
558d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         COPY_4V(params, v);
559d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
560d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
561d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
562d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname,
563d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                    "glGetVertexAttribfv");
564d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
565d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
566d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
567d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
568d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
569d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
570d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
571d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
572d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
573d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
574d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
575d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
576d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
577d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribdv(index==0)");
578d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
579d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
580d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
581d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
582d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLdouble) v[0];
583d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLdouble) v[1];
584d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLdouble) v[2];
585d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLdouble) v[3];
586d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
587d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
588d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
589d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname,
590d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                     "glGetVertexAttribdv");
591d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
592d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
593d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
594d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
595d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
596d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
597d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
598d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
599d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
600d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
601d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
602d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
603d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
604d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribiv(index==0)");
605d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
606d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
607d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
608d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
609d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX should floats in[0,1] be scaled to full int range? */
610d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
611d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
612d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
613d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
614d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
615d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
616d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
617d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
618d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribiv");
619d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
620d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
621d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
622d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
623d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
624d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
625d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
626d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
627d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
628d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
629d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
630d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
631d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
632d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
633d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribIiv(index==0)");
634d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
635d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
636d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
637d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
638d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
639d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
640d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
641d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
642d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
643d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
644d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
645d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
646d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
647d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribIiv");
648d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
649d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
650d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
651d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
652d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
653d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
654d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
655d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
656d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
657d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
658d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
659d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
660d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
661d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
662d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribIuiv(index==0)");
663d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
664d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
665d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
666d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
667d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
668d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLuint) v[0];
669d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLuint) v[1];
670d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLuint) v[2];
671d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLuint) v[3];
672d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
673d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
674d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
675d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = get_vertex_array_attrib(ctx, index, pname,
676d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                          "glGetVertexAttribIuiv");
677d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
678d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
679d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
680d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
681d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
682d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
683d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
684d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
685d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
686d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
687d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
688d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
689d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
690d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
691d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
692d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
693d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
694d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
695d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
696d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
697d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
698d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
699d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
700d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
701d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
702d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
703d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
7041f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
7051f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       GLsizei count, const GLvoid *ptr)
7061f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7071f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7081f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_VertexPointer(size, type, stride, ptr);
7091f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7101f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7111f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
712c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7131f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
7141f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       const GLvoid *ptr)
7151f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7161f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7171f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_NormalPointer(type, stride, ptr);
7181f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7191f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7201f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
721c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7221f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
7231f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
7241f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7251f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7261f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_ColorPointer(size, type, stride, ptr);
7271f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7281f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7291f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
730c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7311f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
7321f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
7331f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7341f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7351f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_IndexPointer(type, stride, ptr);
7361f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7371f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7381f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
739c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7401f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
7411f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                         GLsizei count, const GLvoid *ptr)
7421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7431f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_TexCoordPointer(size, type, stride, ptr);
7451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
748c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
7491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
7501f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
7511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
7521f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_EdgeFlagPointer(stride, ptr);
7531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
7541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
7551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
756c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
757fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
759fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean tflag, cflag, nflag;  /* enable/disable flags */
761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint tcomps, ccomps, vcomps;   /* components per texcoord, color, vertex */
762f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLenum ctype = 0;               /* color type */
763f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
7644a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   const GLint toffset = 0;        /* always zero */
765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint defstride;                /* default stride */
766afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint c, f;
7675e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
768cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
769cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   f = sizeof(GLfloat);
771c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
773c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
77408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
776afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
777afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (format) {
779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V2F:
780afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 2;
782afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
783afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 2*f;
784afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V3F:
786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 3*f;
790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V2F:
792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
793afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 2;
794afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
795afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 2*f;
798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V3F:
800afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
801afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
804afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
805afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 3*f;
806afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
807afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C3F_V3F:
808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 3;  vcomps = 3;
810afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
811afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
812afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
813afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
814afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
815afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_N3F_V3F:
816afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_TRUE;
817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 0;
819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4F_N3F_V3F:
823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_TRUE;
824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 4*f;
828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 7*f;
829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 10*f;
830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_V3F:
832afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
833afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
834afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 2*f;
835afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 5*f;
836afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
837afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_V4F:
838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
839afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 0;  vcomps = 4;
840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 4*f;
841afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
842afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
843afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4UB_V3F:
844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
846afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c+2*f;
849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c+5*f;
850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C3F_V3F:
852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 3;  vcomps = 3;
854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_N3F_V3F:
860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_TRUE;
861afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
862afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 2*f;
863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
864afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
865afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4F_N3F_V3F:
867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
869afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
870afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
871afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 6*f;
872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 9*f;
873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 12*f;
874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_C4F_N3F_V4F:
876afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 4;  vcomps = 4;
878afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 4*f;
880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 8*f;
881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 11*f;
882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 15*f;
883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
88508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (stride==0) {
890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      stride = defstride;
891afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
893fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
894fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_INDEX_ARRAY );
895095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   /* XXX also disable secondary color and generic arrays? */
896afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Texcoords */
898afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (tflag) {
8994a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
9004a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
901ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul                             (GLubyte *) pointer + toffset );
902afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
903afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
904ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul      _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Color */
908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (cflag) {
909fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_COLOR_ARRAY );
910cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      _mesa_ColorPointer( ccomps, ctype, stride,
9114a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul			  (GLubyte *) pointer + coffset );
912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
913afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
914fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_COLOR_ARRAY );
915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
916afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
917afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
918afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Normals */
919afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (nflag) {
920fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_NORMAL_ARRAY );
9214a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset );
922afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
923afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
924fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_NORMAL_ARRAY );
925afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
926afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
9274a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   /* Vertices */
928fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_EnableClientState( GL_VERTEX_ARRAY );
929cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
930cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			(GLubyte *) pointer + voffset );
931afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
932afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
933afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
934c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
935ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count)
936ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
937ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
938cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
939ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
940ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
9414753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
942ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
9435857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (first < 0) {
9445857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
9455857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
94622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
9475857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (count <= 0) {
9485857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
9495857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
9505857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
9515857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount != 0) {
9525857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
9535857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
954ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   }
955ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
9565857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockFirst = first;
9575857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockCount = count;
9585857e988be9317810cf713478195b4ed849eea4aEric Anholt
959ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
960cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Array.NewState |= _NEW_ARRAY_ALL;
961ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
962ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
963ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
964c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
965ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void )
966ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
967ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
968cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
969ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
970ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
9714753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glUnlockArrays\n");
972ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
9735857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount == 0) {
9745857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
9755857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
9765857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
9775857e988be9317810cf713478195b4ed849eea4aEric Anholt
978ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockFirst = 0;
979ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockCount = 0;
980ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
981cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Array.NewState |= _NEW_ARRAY_ALL;
982ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
9832525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
9842525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
9852525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */
986c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
9877993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
9887993832c12bba578010005b344dcd3817be84a42Brian Paul                          const GLsizei *count, GLsizei primcount )
9892525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{
9902525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GET_CURRENT_CONTEXT(ctx);
9912525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GLint i;
9922525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
9932525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
9942525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
9952525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   for (i = 0; i < primcount; i++) {
9962525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      if (count[i] > 0) {
9979bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick         CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i]));
9982525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      }
9992525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   }
10002525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul}
10012525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10022525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
10033baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1004c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10053baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
10063baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      const GLsizei * count,
10073baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      GLsizei primcount, GLint modestride )
10083baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
10093baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
10103baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
10113baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10123baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10133baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10143baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
10153baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
101603e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
10179bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] ));
10183baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
10193baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
10203baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
10213baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10223baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10233baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1024c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10253baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
10263baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLenum type, const GLvoid * const * indices,
10273baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLsizei primcount, GLint modestride )
10283baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
10293baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
10303baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
10313baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10323baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
10333baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1034d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul   /* XXX not sure about ARB_vertex_buffer_object handling here */
1035d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul
10363baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
10373baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
103803e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
10399bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] ));
10403baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
10413baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
10423baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
10433baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
10443baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1045095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/**
10467f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1
1047a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */
1048a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY
1049a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index)
1050a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{
1051a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GET_CURRENT_CONTEXT(ctx);
1052a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
10537f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul   if (!ctx->Extensions.NV_primitive_restart &&
10547f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul       ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
10557f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
1056a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul      return;
1057a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   }
1058a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1059a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1060a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1061a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
1062a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1063a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   ctx->Array.RestartIndex = index;
1064a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul}
1065a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1066a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1067a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/**
1068b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another.
1069b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */
1070b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid
1071f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx,
1072b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *dst,
1073b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *src)
1074b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{
1075b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Size = src->Size;
1076b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Type = src->Type;
1077b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Format = src->Format;
1078b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Stride = src->Stride;
1079b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->StrideB = src->StrideB;
1080b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Ptr = src->Ptr;
1081b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Enabled = src->Enabled;
1082b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Normalized = src->Normalized;
1083d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   dst->Integer = src->Integer;
1084b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_ElementSize = src->_ElementSize;
1085b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
1086b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_MaxElement = src->_MaxElement;
1087b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul}
1088b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1089b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1090b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1091b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/**
109239d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields.
109339d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
109439d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void
109539d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array)
109639d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
109739d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (index >= 0)
1098298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s[%d]: ", name, index);
109939d7524f7b176d4375e230ac60963d197be539f2Brian Paul   else
1100298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s: ", name);
11014beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul   printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n",
1102298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->Ptr, array->Type, array->Size,
1103298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_ElementSize, array->StrideB,
11044beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul	  array->BufferObj->Name, (unsigned long) array->BufferObj->Size,
1105298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_MaxElement);
110639d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
110739d7524f7b176d4375e230ac60963d197be539f2Brian Paul
110839d7524f7b176d4375e230ac60963d197be539f2Brian Paul
110939d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
111039d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info.  For debug.
111139d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
111239d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid
1113f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx)
111439d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
11156a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
111639d7524f7b176d4375e230ac60963d197be539f2Brian Paul   GLuint i;
111739d7524f7b176d4375e230ac60963d197be539f2Brian Paul
11188fe3134622eed34159ff6f72a33558a659e8d299Brian Paul   _mesa_update_array_object_max_element(ctx, arrayObj);
11198fe3134622eed34159ff6f72a33558a659e8d299Brian Paul
1120298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("Array Object %u\n", arrayObj->Name);
112139d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (arrayObj->Vertex.Enabled)
112239d7524f7b176d4375e230ac60963d197be539f2Brian Paul      print_array("Vertex", -1, &arrayObj->Vertex);
112339d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (arrayObj->Normal.Enabled)
112439d7524f7b176d4375e230ac60963d197be539f2Brian Paul      print_array("Normal", -1, &arrayObj->Normal);
112539d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (arrayObj->Color.Enabled)
112639d7524f7b176d4375e230ac60963d197be539f2Brian Paul      print_array("Color", -1, &arrayObj->Color);
1127d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul   for (i = 0; i < Elements(arrayObj->TexCoord); i++)
112839d7524f7b176d4375e230ac60963d197be539f2Brian Paul      if (arrayObj->TexCoord[i].Enabled)
112939d7524f7b176d4375e230ac60963d197be539f2Brian Paul         print_array("TexCoord", i, &arrayObj->TexCoord[i]);
1130d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul   for (i = 0; i < Elements(arrayObj->VertexAttrib); i++)
113139d7524f7b176d4375e230ac60963d197be539f2Brian Paul      if (arrayObj->VertexAttrib[i].Enabled)
113239d7524f7b176d4375e230ac60963d197be539f2Brian Paul         print_array("Attrib", i, &arrayObj->VertexAttrib[i]);
1133298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("  _MaxElement = %u\n", arrayObj->_MaxElement);
113439d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
113539d7524f7b176d4375e230ac60963d197be539f2Brian Paul
113639d7524f7b176d4375e230ac60963d197be539f2Brian Paul
113739d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
1138095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context.
1139095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */
1140c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid
1141f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx)
11426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
1143ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0);
11441030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj,
11451030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul                                ctx->Array.DefaultArrayObj);
1146095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
114712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
114812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   ctx->Array.Objects = _mesa_NewHashTable();
114912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
115012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
115112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
115212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
115312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
115412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
115512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void
115612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData)
115712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
115812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
1159f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = (struct gl_context *) userData;
116012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_delete_array_object(ctx, arrayObj);
116112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
116212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
116312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
116412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
116512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context.
116612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
116712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid
1168f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx)
116912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
117012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
117112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_DeleteHashTable(ctx->Array.Objects);
11726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
1173