varray.c revision d1184d26bb14304a6a61d7729c90a7c7f3627086
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"
34d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul#include "macros.h"
355e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h"
36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "varray.h"
37ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick#include "arrayobj.h"
382cf44390d1e819f23e1d7ceb3199276c9148c647Chia-I Wu#include "main/dispatch.h"
39485f04074151686fa24d40e3eeb83029d3d8c425Keith Whitwell
40c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
41c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul/**
4254a5ffbfa1f935c46642a9835f08983cc1fdfeedBrian Paul * Set the fields of a vertex array.
43e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul * Also do an error check for GL_ARB_vertex_array_object: check that
44e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul * all arrays reside in VBOs when using a vertex array object.
45f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul *
46f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param array  the array to update
47f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param dirtyBit  which bit to set in ctx->Array.NewState for this array
48f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param elementSize  size of each array element, in bytes
49f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param size  components per element (1, 2, 3 or 4)
50f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
5154a5ffbfa1f935c46642a9835f08983cc1fdfeedBrian Paul * \param format  either GL_RGBA or GL_BGRA
52f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param stride  stride between elements, in elements
53f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param normalized  are integer types converted to floats in [-1, 1]?
54d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * \param integer  integer-valued values (will not be normalized to [-1,1])
55f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul * \param ptr  the address (or offset inside VBO) of the array data
56c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul */
57f549f4c4b6012178df3706b26539ca672399260fBrian Paulstatic void
58f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_array(struct gl_context *ctx, struct gl_client_array *array,
59f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul             GLbitfield dirtyBit, GLsizei elementSize,
6076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul             GLint size, GLenum type, GLenum format,
61d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul             GLsizei stride, GLboolean normalized, GLboolean integer,
62d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul             const GLvoid *ptr)
63c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul{
6476d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   ASSERT(format == GL_RGBA || format == GL_BGRA);
65e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
66e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   if (ctx->Array.ArrayObj->VBOonly &&
67e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       ctx->Array.ArrayBufferObj->Name == 0) {
68e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul      /* GL_ARB_vertex_array_object requires that all arrays reside in VBOs.
69e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       * Generate GL_INVALID_OPERATION if that's not true.
70e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul       */
71e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION,
72e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul                  "glVertex/Normal/EtcPointer(non-VBO array)");
73f549f4c4b6012178df3706b26539ca672399260fBrian Paul      return;
74e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul   }
75e2b72495550980198dcc0580af8de1fe9dfd8c67Brian Paul
76c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Size = size;
77c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Type = type;
7876d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   array->Format = format;
79c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Stride = stride;
80c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->StrideB = stride ? stride : elementSize;
81c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Normalized = normalized;
82c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   array->Ptr = (const GLubyte *) ptr;
830077c879b57f663c038becdde37b2f6671f59150Brian Paul   array->_ElementSize = elementSize;
840077c879b57f663c038becdde37b2f6671f59150Brian Paul
8537c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul   _mesa_reference_buffer_object(ctx, &array->BufferObj,
8637c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul                                 ctx->Array.ArrayBufferObj);
8737c74af01ce52b603f565a6c8a9094500d5cb87aBrian Paul
88c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   ctx->NewState |= _NEW_ARRAY;
89f9d88c820414c208ab9dbb1b40901c7d520e19e5Brian Paul   ctx->Array.NewState |= dirtyBit;
90c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul}
91c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
92c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
93c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
94fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
96c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
97fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
98cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
995e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1002edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (size < 2 || size > 4) {
10108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(size)" );
102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1042edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
10508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glVertexPointer(stride)" );
106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1085e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
1104753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glVertexPointer( sz %d type %s stride %d )\n", size,
1114753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr( type ), stride);
112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1132edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   /* always need to check that <type> is legal */
1142edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SHORT:
116c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLshort);
117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INT:
119c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLint);
120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FLOAT:
122c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLfloat);
123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_DOUBLE:
125c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLdouble);
126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
127cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
128cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = size * sizeof(GLhalfARB);
129cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
130394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#if FEATURE_fixedpt
131394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul      case GL_FIXED:
132394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         elementSize = size * sizeof(GLfixed);
133394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         break;
134394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#endif
135d17485fef9b084a6812c626d9734816429f29199Brian Paul#if FEATURE_vertex_array_byte
136d17485fef9b084a6812c626d9734816429f29199Brian Paul      case GL_BYTE:
137d17485fef9b084a6812c626d9734816429f29199Brian Paul         elementSize = size * sizeof(GLbyte);
138d17485fef9b084a6812c626d9734816429f29199Brian Paul         break;
139d17485fef9b084a6812c626d9734816429f29199Brian Paul#endif
140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1412b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexPointer(type=%s)",
1422b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul                      _mesa_lookup_enum_by_nr(type));
143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1452edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
146f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->Vertex, _NEW_ARRAY_VERTEX,
147d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, GL_RGBA, stride, GL_FALSE,
148d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                GL_FALSE, ptr);
149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
152c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
153fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
155c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
156fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
157cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1585e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1592edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
16008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glNormalPointer(stride)" );
161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
1654753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glNormalPointer( type %s stride %d )\n",
1664753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr( type ), stride);
167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1682edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_BYTE:
170c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = 3 * sizeof(GLbyte);
171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SHORT:
173c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = 3 * sizeof(GLshort);
174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INT:
176c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = 3 * sizeof(GLint);
177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FLOAT:
179c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = 3 * sizeof(GLfloat);
180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_DOUBLE:
182c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = 3 * sizeof(GLdouble);
183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
184cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
185cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = 3 * sizeof(GLhalfARB);
186cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
187394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#if FEATURE_fixedpt
188394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul      case GL_FIXED:
189394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         elementSize = 3 * sizeof(GLfixed);
190394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         break;
191394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#endif
192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
1932b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glNormalPointer(type=%s)",
1942b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul                      _mesa_lookup_enum_by_nr(type));
195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1972edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
198f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->Normal, _NEW_ARRAY_NORMAL,
199d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, 3, type, GL_RGBA, stride, GL_TRUE, GL_FALSE, ptr);
200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
203c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
204fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
206c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
20776d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   GLenum format;
208fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
209cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
210fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul
2112edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (size < 3 || size > 4) {
21276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) {
21376d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glColorPointer(size)");
21476d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         return;
21576d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      }
216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
217c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
21808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glColorPointer(stride)" );
219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
2234753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glColorPointer( sz %d type %s stride %d )\n", size,
2244753d60dd070bb08d0116076bcc08025c86ce857Brian Paul                  _mesa_lookup_enum_by_nr( type ), stride);
225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
22676d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   if (size == GL_BGRA) {
22776d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      if (type != GL_UNSIGNED_BYTE) {
22876d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glColorPointer(GL_BGRA/GLubyte)");
22976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         return;
23076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      }
23176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      format = GL_BGRA;
23276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      size = 4;
23376d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   }
23476d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   else {
23576d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      format = GL_RGBA;
23676d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   }
23776d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul
2382edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_BYTE:
240c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLbyte);
241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_UNSIGNED_BYTE:
243c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLubyte);
244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SHORT:
246c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLshort);
247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_UNSIGNED_SHORT:
249c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLushort);
250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INT:
252c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLint);
253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_UNSIGNED_INT:
255c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLuint);
256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FLOAT:
258c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLfloat);
259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_DOUBLE:
261c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLdouble);
262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
263cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
264cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = size * sizeof(GLhalfARB);
265cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
266394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#if FEATURE_fixedpt
267394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul      case GL_FIXED:
268394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         elementSize = size * sizeof(GLfixed);
269394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         break;
270394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#endif
271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
2722b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glColorPointer(type=%s)",
2732b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul                      _mesa_lookup_enum_by_nr(type));
274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
2762edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
277f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->Color, _NEW_ARRAY_COLOR0,
278d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, format, stride, GL_TRUE, GL_FALSE,
279d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
283c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
284fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
285fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
286c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLint elementSize;
287fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
288cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
2895e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
2902edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
29108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glFogCoordPointer(stride)" );
292fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      return;
293fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   }
294fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
2952edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
296fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_FLOAT:
297c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLfloat);
298fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
299fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_DOUBLE:
300c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLdouble);
301fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
302cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
303cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = sizeof(GLhalfARB);
304cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
305fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      default:
30608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glFogCoordPointer(type)" );
307fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         return;
308fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   }
3092edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
310f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->FogCoord, _NEW_ARRAY_FOGCOORD,
311d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, 1, type, GL_RGBA, stride, GL_FALSE, GL_FALSE,
312d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
313fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
314fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
315fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
316c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
317fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
318afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
319c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
320fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
321cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
3225e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
3232edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
32408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glIndexPointer(stride)" );
325afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
326afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
327afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
3282edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
329afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_UNSIGNED_BYTE:
330c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLubyte);
331afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
332afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SHORT:
333c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLshort);
334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
335afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INT:
336c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLint);
337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
338afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FLOAT:
339c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLfloat);
340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_DOUBLE:
342c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = sizeof(GLdouble);
343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
34508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glIndexPointer(type)" );
346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
3482edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
349f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->Index, _NEW_ARRAY_INDEX,
350d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, 1, type, GL_RGBA, stride, GL_FALSE, GL_FALSE,
351d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
355c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
3565e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
357fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell			       GLsizei stride, const GLvoid *ptr)
358fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell{
359c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
36076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   GLenum format;
361fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   GET_CURRENT_CONTEXT(ctx);
362cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
363fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
364fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   if (size != 3 && size != 4) {
36576d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) {
36676d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(size)");
36776d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         return;
36876d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      }
369fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   }
3702edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
3712edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glSecondaryColorPointer(stride)" );
372fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      return;
373fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   }
374fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
375fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
3764753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glSecondaryColorPointer( sz %d type %s stride %d )\n",
377d09a1d8b29ae5841ae39b5c24c3f4693dd750559Brian Paul                  size, _mesa_lookup_enum_by_nr( type ), stride);
378fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
37976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   if (size == GL_BGRA) {
38076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      if (type != GL_UNSIGNED_BYTE) {
38176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glColorPointer(GL_BGRA/GLubyte)");
38276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         return;
38376d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      }
38476d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      format = GL_BGRA;
38576d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      size = 4;
38676d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   }
38776d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   else {
38876d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      format = GL_RGBA;
38976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   }
39076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul
3912edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
392fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_BYTE:
393c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLbyte);
394fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
395fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_UNSIGNED_BYTE:
396c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLubyte);
397fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
398fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_SHORT:
399c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLshort);
400fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
401fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_UNSIGNED_SHORT:
402c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLushort);
403fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
404fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_INT:
405c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLint);
406fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
407fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_UNSIGNED_INT:
408c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLuint);
409fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
410fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_FLOAT:
411c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLfloat);
412fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
413fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      case GL_DOUBLE:
414c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLdouble);
415fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         break;
416cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
417cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = size * sizeof(GLhalfARB);
418cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
419fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell      default:
4202b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glSecondaryColorPointer(type=%s)",
4212b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul                      _mesa_lookup_enum_by_nr(type));
422fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell         return;
423fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell   }
4242edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
425f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->SecondaryColor, _NEW_ARRAY_COLOR1,
426d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, format, stride, GL_TRUE, GL_FALSE,
427d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
428fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell}
429fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
430fe5d67d95f3a5fc84c5421d409a6464642aaf2cbKeith Whitwell
431c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
4322edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
4332edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul                      const GLvoid *ptr)
434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
435c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLint elementSize;
436fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
437c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   const GLuint unit = ctx->Array.ActiveTexture;
438cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4402edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (size < 1 || size > 4) {
44108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(size)" );
442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
4442edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
44508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glTexCoordPointer(stride)" );
446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (MESA_VERBOSE&(VERBOSE_VARRAY|VERBOSE_API))
4504753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glTexCoordPointer(unit %u sz %d type %s stride %d)\n",
451c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul                  unit, size, _mesa_lookup_enum_by_nr( type ), stride);
452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
4532edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   /* always need to check that <type> is legal */
4542edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_SHORT:
456c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLshort);
457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_INT:
459c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLint);
460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_FLOAT:
462c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLfloat);
463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_DOUBLE:
465c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLdouble);
466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
467cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
468cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = size * sizeof(GLhalfARB);
469cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
470394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#if FEATURE_fixedpt
471394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul      case GL_FIXED:
472394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         elementSize = size * sizeof(GLfixed);
473394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul         break;
474394c1d1c53074f82d2664f655f948f8966f46b9dBrian Paul#endif
475d17485fef9b084a6812c626d9734816429f29199Brian Paul#if FEATURE_vertex_array_byte
476d17485fef9b084a6812c626d9734816429f29199Brian Paul      case GL_BYTE:
477d17485fef9b084a6812c626d9734816429f29199Brian Paul         elementSize = size * sizeof(GLbyte);
478d17485fef9b084a6812c626d9734816429f29199Brian Paul         break;
479d17485fef9b084a6812c626d9734816429f29199Brian Paul#endif
480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
4812b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glTexCoordPointer(type=%s)",
4822b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul                      _mesa_lookup_enum_by_nr(type));
483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
4852edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
48689c8ff3382763c654ef680c522c287764d943d6cBrian Paul   ASSERT(unit < Elements(ctx->Array.ArrayObj->TexCoord));
48789c8ff3382763c654ef680c522c287764d943d6cBrian Paul
488f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->TexCoord[unit],
489f549f4c4b6012178df3706b26539ca672399260fBrian Paul                _NEW_ARRAY_TEXCOORD(unit),
490d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, GL_RGBA, stride, GL_FALSE, GL_FALSE,
491d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
495c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
496c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
498d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */
499d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
500fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
501cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
503c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
50408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glEdgeFlagPointer(stride)" );
505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
507c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul
508f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->EdgeFlag, _NEW_ARRAY_EDGEFLAG,
509f549f4c4b6012178df3706b26539ca672399260fBrian Paul                sizeof(GLboolean), 1, GL_UNSIGNED_BYTE, GL_RGBA,
510d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                stride, GL_FALSE, integer, ptr);
511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
5141cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paulvoid GLAPIENTRY
5151cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
5161cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul{
5171cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   GLsizei elementSize;
5181cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   GET_CURRENT_CONTEXT(ctx);
5191cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
5201cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
5211cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   if (stride < 0) {
5221cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glPointSizePointer(stride)" );
5231cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul      return;
5241cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   }
5251cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
5261cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   switch (type) {
5271cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul      case GL_FLOAT:
5281cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul         elementSize = sizeof(GLfloat);
5291cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul         break;
5301cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul#if FEATURE_fixedpt
5311cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul      case GL_FIXED:
5321cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul         elementSize = sizeof(GLfixed);
5331cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul         break;
5341cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul#endif
5351cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul      default:
5361cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glPointSizePointer(type)" );
5371cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul         return;
5381cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   }
5391cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
5401cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul   update_array(ctx, &ctx->Array.ArrayObj->PointSize, _NEW_ARRAY_POINT_SIZE,
541d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, 1, type, GL_RGBA, stride, GL_FALSE, GL_FALSE,
542d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
5431cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul}
5441cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
5451cf2c8a04313b80a01ef23b06993586ce62281a4Brian Paul
546148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_NV_vertex_program
547a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
548a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a vertex attribute array.
549a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO alias the conventional GL vertex arrays
550a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
551a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * The generic attribute slots at #16 and above are not touched.
552a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
553c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
55492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
55592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                            GLsizei stride, const GLvoid *ptr)
5562edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul{
55729fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler   GLboolean normalized = GL_FALSE;
558c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
5594adb190a162c5ed0684a8616331344caadba4010Maciej Cencora   GLenum format;
5602edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   GET_CURRENT_CONTEXT(ctx);
5612edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
5622edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
563d2a74d76c96957cf0294dcf40d29526621ada95eBrian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
5642edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
5652edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
5662edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
5672edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
5682edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (size < 1 || size > 4) {
5692edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size)");
5702edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
5712edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
5722edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
5732edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (stride < 0) {
5742edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(stride)");
5752edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
5762edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
5772edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
5782edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   if (type == GL_UNSIGNED_BYTE && size != 4) {
5792edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
5802edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      return;
5812edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
5822edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
5834adb190a162c5ed0684a8616331344caadba4010Maciej Cencora   if (size == GL_BGRA) {
5844adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      if (type != GL_UNSIGNED_BYTE) {
5854adb190a162c5ed0684a8616331344caadba4010Maciej Cencora         _mesa_error(ctx, GL_INVALID_VALUE,
5864adb190a162c5ed0684a8616331344caadba4010Maciej Cencora                     "glVertexAttribPointerNV(GL_BGRA/type)");
5874adb190a162c5ed0684a8616331344caadba4010Maciej Cencora         return;
5884adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      }
5894adb190a162c5ed0684a8616331344caadba4010Maciej Cencora
5904adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      format = GL_BGRA;
5914adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      size = 4;
5924adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      normalized = GL_TRUE;
5934adb190a162c5ed0684a8616331344caadba4010Maciej Cencora   }
5944adb190a162c5ed0684a8616331344caadba4010Maciej Cencora   else {
5954adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      format = GL_RGBA;
5964adb190a162c5ed0684a8616331344caadba4010Maciej Cencora   }
5974adb190a162c5ed0684a8616331344caadba4010Maciej Cencora
5982edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   /* check for valid 'type' and compute StrideB right away */
5992edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   switch (type) {
6002edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      case GL_UNSIGNED_BYTE:
60129fbf72dbf158d766d3cac3b2db16d9fcbef0d0bMarkus Amsler         normalized = GL_TRUE;
602c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLubyte);
6032edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul         break;
6042edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      case GL_SHORT:
605c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLshort);
6062edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul         break;
6072edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      case GL_FLOAT:
608c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLfloat);
6092edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul         break;
6102edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      case GL_DOUBLE:
611c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLdouble);
6122edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul         break;
6132edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul      default:
6142b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerNV(type=%s)",
6152b82bc93e2a0bfdd48147dfa5525dee732a50ea4Brian Paul                      _mesa_lookup_enum_by_nr(type));
6162edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul         return;
6172edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul   }
6182edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul
619f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index],
620f549f4c4b6012178df3706b26539ca672399260fBrian Paul                _NEW_ARRAY_ATTRIB(index),
621d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, format, stride, normalized, GL_FALSE,
622d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
6232edd1807f85a5118dcd0c20156a2d68f5c23d145Brian Paul}
624148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
6261f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
627148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#if FEATURE_ARB_vertex_program
628a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul/**
629a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Set a generic vertex attribute array.
630a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
631a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul * (position, normal, color, fog, texcoord, etc).
632a554d7c4d87902833382cb67bd8a282d5c500c6dBrian Paul */
633c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
63492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
63592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLboolean normalized,
63692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul                             GLsizei stride, const GLvoid *ptr)
63792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul{
638c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   GLsizei elementSize;
63976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   GLenum format;
64092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   GET_CURRENT_CONTEXT(ctx);
64192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
64292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
64305051037101dfa053798cf5ad91d1975fd1aa6a7Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
64492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
64592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      return;
64692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
64792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
64892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   if (size < 1 || size > 4) {
64976d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) {
65076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(size)");
65176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         return;
65276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      }
65392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
65492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
65592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   if (stride < 0) {
65692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(stride)");
65792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      return;
65892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
65992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
66076d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   if (size == GL_BGRA) {
66176d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      if (type != GL_UNSIGNED_BYTE) {
66276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE,
66376d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul                     "glVertexAttribPointerARB(GL_BGRA/type)");
66476d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul         return;
66576d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      }
6664adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      if (normalized != GL_TRUE) {
6674adb190a162c5ed0684a8616331344caadba4010Maciej Cencora         _mesa_error(ctx, GL_INVALID_VALUE,
6684adb190a162c5ed0684a8616331344caadba4010Maciej Cencora                     "glVertexAttribPointerARB(GL_BGRA/normalized)");
6694adb190a162c5ed0684a8616331344caadba4010Maciej Cencora         return;
6704adb190a162c5ed0684a8616331344caadba4010Maciej Cencora      }
6714adb190a162c5ed0684a8616331344caadba4010Maciej Cencora
67276d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      format = GL_BGRA;
67376d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      size = 4;
67476d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   }
67576d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   else {
67676d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul      format = GL_RGBA;
67776d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul   }
67876d27a6a1e94e973e5a0a4a22b80158dfecf9151Brian Paul
67992f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   /* check for valid 'type' and compute StrideB right away */
680196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul   /* NOTE: more types are supported here than in the NV extension */
68192f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   switch (type) {
682196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul      case GL_BYTE:
683c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLbyte);
684196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul         break;
68592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      case GL_UNSIGNED_BYTE:
686c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLubyte);
68792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul         break;
68892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      case GL_SHORT:
689c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLshort);
69092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul         break;
691196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul      case GL_UNSIGNED_SHORT:
692c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLushort);
693196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul         break;
694196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul      case GL_INT:
695c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLint);
696196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul         break;
697196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul      case GL_UNSIGNED_INT:
698c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLuint);
699196a90b5111b5170b9517d83e24d454363a09dd5Brian Paul         break;
70092f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      case GL_FLOAT:
701c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLfloat);
70292f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul         break;
70392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      case GL_DOUBLE:
704c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul         elementSize = size * sizeof(GLdouble);
70592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul         break;
706cfe884e2030466df673881da8e830c300dda40dbDave Airlie      case GL_HALF_FLOAT:
707cfe884e2030466df673881da8e830c300dda40dbDave Airlie         elementSize = size * sizeof(GLhalfARB);
708cfe884e2030466df673881da8e830c300dda40dbDave Airlie         break;
70948cba703fa6fdbe2ad34770d54aeafdd01493f27Brian Paul#if FEATURE_fixedpt
71048cba703fa6fdbe2ad34770d54aeafdd01493f27Brian Paul      case GL_FIXED:
71148cba703fa6fdbe2ad34770d54aeafdd01493f27Brian Paul         elementSize = size * sizeof(GLfixed);
71248cba703fa6fdbe2ad34770d54aeafdd01493f27Brian Paul         break;
71348cba703fa6fdbe2ad34770d54aeafdd01493f27Brian Paul#endif
71492f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul      default:
71592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribPointerARB(type)" );
71692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul         return;
71792f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul   }
71892f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
719f549f4c4b6012178df3706b26539ca672399260fBrian Paul   update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index],
720f549f4c4b6012178df3706b26539ca672399260fBrian Paul                _NEW_ARRAY_ATTRIB(index),
721d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, format, stride, normalized, GL_FALSE,
722d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                ptr);
72392f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul}
724148a2847a105ce9d9189ad3081091de60f803a33Brian Paul#endif
72592f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
72692f9785c727ea10ff5f8dc9770f0e8f388fcea70Brian Paul
727e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul/**
728d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul * GL_EXT_gpu_shader4 / GL 3.0.
729e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Set an integer-valued vertex attribute array.
730e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * Note that these arrays DO NOT alias the conventional GL vertex arrays
731e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul * (position, normal, color, fog, texcoord, etc).
732e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul */
733e00d07cff676422d6c58c93bbbe737d672efa761Brian Paulvoid GLAPIENTRY
734e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
735e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul                           GLsizei stride, const GLvoid *ptr)
736e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul{
737d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean normalized = GL_FALSE;
738d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLboolean integer = GL_TRUE;
739d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   const GLenum format = GL_RGBA;
740d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GLsizei elementSize;
741d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   GET_CURRENT_CONTEXT(ctx);
742d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
743d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
744d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
745d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
746d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      return;
747d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
748d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
749d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (size < 1 || size > 4) {
750d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      if (!ctx->Extensions.EXT_vertex_array_bgra || size != GL_BGRA) {
751d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(size)");
752d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return;
753d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      }
754d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
755d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
756d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   if (stride < 0) {
757d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(stride)");
758d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      return;
759d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
760d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
761d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* check for valid 'type' and compute StrideB right away */
762d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   /* NOTE: more types are supported here than in the NV extension */
763d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   switch (type) {
764d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      case GL_BYTE:
765d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         elementSize = size * sizeof(GLbyte);
766d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         break;
767d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      case GL_UNSIGNED_BYTE:
768d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         elementSize = size * sizeof(GLubyte);
769d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         break;
770d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      case GL_SHORT:
771d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         elementSize = size * sizeof(GLshort);
772d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         break;
773d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      case GL_UNSIGNED_SHORT:
774d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         elementSize = size * sizeof(GLushort);
775d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         break;
776d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      case GL_INT:
777d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         elementSize = size * sizeof(GLint);
778d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         break;
779d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      case GL_UNSIGNED_INT:
780d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         elementSize = size * sizeof(GLuint);
781d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         break;
782d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      default:
783d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glVertexAttribIPointer(type)" );
784d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return;
785d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   }
786d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul
787d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   update_array(ctx, &ctx->Array.ArrayObj->VertexAttrib[index],
788d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                _NEW_ARRAY_ATTRIB(index),
789d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                elementSize, size, type, format, stride,
790d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul                normalized, integer, ptr);
791e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul}
792e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
793e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
794e00d07cff676422d6c58c93bbbe737d672efa761Brian Paul
795c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
796d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_EnableVertexAttribArrayARB(GLuint index)
797d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
798d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
799d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
800d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
801d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
802d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
803d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
804d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
805d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
806d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
807d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
808d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
809d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   FLUSH_VERTICES(ctx, _NEW_ARRAY);
810d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_TRUE;
811d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->_Enabled |= _NEW_ARRAY_ATTRIB(index);
812d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
813d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
814d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
815d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
816d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
817d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_DisableVertexAttribArrayARB(GLuint index)
818d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
819d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
820d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
821d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
822d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
823d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE,
824d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  "glEnableVertexAttribArrayARB(index)");
825d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
826d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
827d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
828d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
829d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
830d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   FLUSH_VERTICES(ctx, _NEW_ARRAY);
831d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->VertexAttrib[index].Enabled = GL_FALSE;
832d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.ArrayObj->_Enabled &= ~_NEW_ARRAY_ATTRIB(index);
833d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ctx->Array.NewState |= _NEW_ARRAY_ATTRIB(index);
834d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
835d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
836d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
837d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/**
838d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * Return info for a vertex attribute array (no alias with legacy
839d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * vertex attributes (pos, normal, color, etc)).  This function does
840d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
841d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul */
842d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulstatic GLuint
843f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
844d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                  const char *caller)
845d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
846d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   const struct gl_client_array *array;
847d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
848d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= MAX_VERTEX_GENERIC_ATTRIBS) {
849d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
850d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
851d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
852d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
853d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
854d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
855d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[index];
856d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
857d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   switch (pname) {
858d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
859d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Enabled;
860d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
861d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Size;
862d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
863d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Stride;
864d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
865d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Type;
866d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
867d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->Normalized;
868d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
869d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return array->BufferObj->Name;
870d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
871d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      if (ctx->Extensions.EXT_gpu_shader4) {
872d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul         return array->Integer;
873d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      }
874d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul      /* fall-through */
875d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   default:
876d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
877d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return 0;
878d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
879d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
880d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
881d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
882d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
883d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
884d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
885d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
886d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
887d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
888d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
889d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
890d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
891d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribfv(index==0)");
892d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
893d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
894d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
895d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
896d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         COPY_4V(params, v);
897d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
898d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
899d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
900d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname,
901d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                    "glGetVertexAttribfv");
902d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
903d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
904d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
905d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
906d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
907d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
908d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
909d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
910d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
911d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
912d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
913d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
914d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
915d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribdv(index==0)");
916d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
917d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
918d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
919d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
920d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLdouble) v[0];
921d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLdouble) v[1];
922d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLdouble) v[2];
923d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLdouble) v[3];
924d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
925d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
926d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
927d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname,
928d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                     "glGetVertexAttribdv");
929d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
930d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
931d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
932d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
933d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
934d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
935d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
936d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
937d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
938d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
939d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
940d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
941d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
942d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribiv(index==0)");
943d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
944d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
945d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
946d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
947d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX should floats in[0,1] be scaled to full int range? */
948d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
949d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
950d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
951d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
952d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
953d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
954d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
955d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
956d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribiv");
957d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
958d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
959d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
960d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
961d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
962d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
963d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
964d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
965d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
966d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
967d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
968d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
969d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
970d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
971d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribIiv(index==0)");
972d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
973d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
974d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
975d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
976d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
977d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLint) v[0];
978d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLint) v[1];
979d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLint) v[2];
980d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLint) v[3];
981d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
982d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
983d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
984d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
985d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                                  "glGetVertexAttribIiv");
986d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
987d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
988d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
989d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
990d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul/** GL 3.0 */
991d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
992d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
993d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
994d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
995d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
996d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
997d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
998d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      if (index == 0) {
999d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         _mesa_error(ctx, GL_INVALID_OPERATION,
1000d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                     "glGetVertexAttribIuiv(index==0)");
1001d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
1002d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      else {
1003d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         const GLfloat *v = ctx->Current.Attrib[VERT_ATTRIB_GENERIC0 + index];
1004d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         FLUSH_CURRENT(ctx, 0);
1005d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         /* XXX we don't have true integer-valued vertex attribs yet */
1006d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[0] = (GLuint) v[0];
1007d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[1] = (GLuint) v[1];
1008d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[2] = (GLuint) v[2];
1009d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul         params[3] = (GLuint) v[3];
1010d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      }
1011d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
1012d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   else {
1013d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      params[0] = get_vertex_array_attrib(ctx, index, pname,
1014d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul                                          "glGetVertexAttribIuiv");
1015d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
1016d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
1017d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1018d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1019d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
1020d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
1021d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul{
1022d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   GET_CURRENT_CONTEXT(ctx);
1023d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
1024d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1025d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
1026d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
1027d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
1028d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
1029d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1030d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
1031d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
1032d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul      return;
1033d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   }
1034d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1035d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   ASSERT(index < Elements(ctx->Array.ArrayObj->VertexAttrib));
1036d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1037d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
1038d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul}
1039d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1040d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paul
1041d3f598a506d911e7cbbe561a798d284a154da3cdBrian Paulvoid GLAPIENTRY
10421f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
10431f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       GLsizei count, const GLvoid *ptr)
10441f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
10451f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
10461f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_VertexPointer(size, type, stride, ptr);
10471f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
10481f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
10491f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
1050c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10511f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
10521f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                       const GLvoid *ptr)
10531f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
10541f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
10551f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_NormalPointer(type, stride, ptr);
10561f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
10571f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
10581f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
1059c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10601f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
10611f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
10621f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
10631f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
10641f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_ColorPointer(size, type, stride, ptr);
10651f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
10661f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
10671f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
1068c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10691f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
10701f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                      const GLvoid *ptr)
10711f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
10721f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
10731f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_IndexPointer(type, stride, ptr);
10741f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
10751f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
10761f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
1077c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10781f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
10791f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul                         GLsizei count, const GLvoid *ptr)
10801f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
10811f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
10821f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_TexCoordPointer(size, type, stride, ptr);
10831f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
10841f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
10851f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
1086c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
10871f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
10881f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul{
10891f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   (void) count;
10901f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul   _mesa_EdgeFlagPointer(stride, ptr);
10911f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul}
10921f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
10931f0e213bf88500e9c2f7ca92e57392efae5e4459Brian Paul
1094c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
1095fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
1096afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{
1097fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   GET_CURRENT_CONTEXT(ctx);
1098afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLboolean tflag, cflag, nflag;  /* enable/disable flags */
1099afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint tcomps, ccomps, vcomps;   /* components per texcoord, color, vertex */
1100f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLenum ctype = 0;               /* color type */
1101f4b02d1a2675d4a0699b8995a422fbd413c32301Keith Whitwell   GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
11024a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   const GLint toffset = 0;        /* always zero */
1103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint defstride;                /* default stride */
1104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   GLint c, f;
11055e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen
1106cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1107cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell
1108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   f = sizeof(GLfloat);
1109c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
1110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1111c5b1e81de48de5d8830bf5d92ff767ad1985e46eBrian Paul   if (stride < 0) {
111208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul      _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
1113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      return;
1114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   switch (format) {
1117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V2F:
1118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
1119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 2;
1120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
1121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 2*f;
1122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_V3F:
1124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
1125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
1126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 0;
1127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 3*f;
1128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V2F:
1130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
1131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 2;
1132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
1133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
1134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
1135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 2*f;
1136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4UB_V3F:
1138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
1139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
1140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
1141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
1142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c;
1143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c + 3*f;
1144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C3F_V3F:
1146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
1147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 3;  vcomps = 3;
1148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_N3F_V3F:
1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_TRUE;
1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 0;  vcomps = 3;
1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 0;
1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 3*f;
1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 6*f;
1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_C4F_N3F_V3F:
1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_TRUE;
1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 0;  ccomps = 4;  vcomps = 3;
1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 0;
1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 4*f;
1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 7*f;
1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 10*f;
1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_V3F:
1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 2*f;
1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 5*f;
1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_V4F:
1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 0;  vcomps = 4;
1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 4*f;
1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4UB_V3F:
1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_UNSIGNED_BYTE;
1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = c+2*f;
1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = c+5*f;
1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C3F_V3F:
1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 3;  vcomps = 3;
1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
1196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_N3F_V3F:
1198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_TRUE;
1199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 0;  vcomps = 3;
1200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 2*f;
1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 5*f;
1202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 8*f;
1203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T2F_C4F_N3F_V3F:
1205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
1206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 2;  ccomps = 4;  vcomps = 3;
1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 2*f;
1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 6*f;
1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 9*f;
1211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 12*f;
1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      case GL_T4F_C4F_N3F_V4F:
1214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
1215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         tcomps = 4;  ccomps = 4;  vcomps = 4;
1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         ctype = GL_FLOAT;
1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         coffset = 4*f;
1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         noffset = 8*f;
1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         voffset = 11*f;
1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         defstride = 15*f;
1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         break;
1222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      default:
122308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul         _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
1224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg         return;
1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (stride==0) {
1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg      stride = defstride;
1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1231fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
1232fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_DisableClientState( GL_INDEX_ARRAY );
1233095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   /* XXX also disable secondary color and generic arrays? */
1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Texcoords */
1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (tflag) {
12374a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
12384a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
1239ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul                             (GLubyte *) pointer + toffset );
1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1242ab928e57b9637abd253c5114d0c90d7e3cb3f7fdBrian Paul      _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Color */
1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (cflag) {
1247fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_COLOR_ARRAY );
1248cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell      _mesa_ColorPointer( ccomps, ctype, stride,
12494a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul			  (GLubyte *) pointer + coffset );
1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1252fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_COLOR_ARRAY );
1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   /* Normals */
1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   if (nflag) {
1258fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_EnableClientState( GL_NORMAL_ARRAY );
12594a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul      _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset );
1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   else {
1262fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul      _mesa_DisableClientState( GL_NORMAL_ARRAY );
1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg   }
1264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
12654a3110fb213f419a47822eb44c5f2fcd74bb3b0dBrian Paul   /* Vertices */
1266fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul   _mesa_EnableClientState( GL_VERTEX_ARRAY );
1267cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
1268cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell			(GLubyte *) pointer + voffset );
1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg}
1270afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1271afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg
1272c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
1273ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_LockArraysEXT(GLint first, GLsizei count)
1274ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
1275ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
1276cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1277ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1278ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
12794753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
1280ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
12815857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (first < 0) {
12825857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
12835857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
128422144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes   }
12855857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (count <= 0) {
12865857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
12875857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
12885857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
12895857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount != 0) {
12905857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
12915857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
1292ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   }
1293ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
12945857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockFirst = first;
12955857e988be9317810cf713478195b4ed849eea4aEric Anholt   ctx->Array.LockCount = count;
12965857e988be9317810cf713478195b4ed849eea4aEric Anholt
1297ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1298cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Array.NewState |= _NEW_ARRAY_ALL;
1299ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
1300ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1301ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1302c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
1303ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell_mesa_UnlockArraysEXT( void )
1304ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell{
1305ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   GET_CURRENT_CONTEXT(ctx);
1306cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1307ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
1308ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   if (MESA_VERBOSE & VERBOSE_API)
13094753d60dd070bb08d0116076bcc08025c86ce857Brian Paul      _mesa_debug(ctx, "glUnlockArrays\n");
1310ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell
13115857e988be9317810cf713478195b4ed849eea4aEric Anholt   if (ctx->Array.LockCount == 0) {
13125857e988be9317810cf713478195b4ed849eea4aEric Anholt      _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
13135857e988be9317810cf713478195b4ed849eea4aEric Anholt      return;
13145857e988be9317810cf713478195b4ed849eea4aEric Anholt   }
13155857e988be9317810cf713478195b4ed849eea4aEric Anholt
1316ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockFirst = 0;
1317ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->Array.LockCount = 0;
1318ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell   ctx->NewState |= _NEW_ARRAY;
1319cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell   ctx->Array.NewState |= _NEW_ARRAY_ALL;
1320ad2ac216fa0cbebc36530bf9e5256e902710b892Keith Whitwell}
13212525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
13222525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
13232525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* GL_EXT_multi_draw_arrays */
13242525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul/* Somebody forgot to spec the first and count parameters as const! <sigh> */
1325c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
13267993832c12bba578010005b344dcd3817be84a42Brian Paul_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
13277993832c12bba578010005b344dcd3817be84a42Brian Paul                          const GLsizei *count, GLsizei primcount )
13282525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul{
13292525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GET_CURRENT_CONTEXT(ctx);
13302525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   GLint i;
13312525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
13322525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
13332525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
13342525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   for (i = 0; i < primcount; i++) {
13352525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      if (count[i] > 0) {
13369bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick         CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i]));
13372525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul      }
13382525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul   }
13392525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul}
13402525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
13412525bc7d305f6dcab3beb75535da25a488c969b0Brian Paul
13423baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1343c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
13443baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
13453baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      const GLsizei * count,
13463baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick			      GLsizei primcount, GLint modestride )
13473baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
13483baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
13493baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
13503baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
13513baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
13523baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
13533baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
13543baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
135503e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
13569bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] ));
13573baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
13583baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
13593baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
13603baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
13613baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
13623baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick/* GL_IBM_multimode_draw_arrays */
1363c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY
13643baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
13653baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLenum type, const GLvoid * const * indices,
13663baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick				GLsizei primcount, GLint modestride )
13673baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick{
13683baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GET_CURRENT_CONTEXT(ctx);
13693baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   GLint i;
13703baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
13713baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
13723baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1373d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul   /* XXX not sure about ARB_vertex_buffer_object handling here */
1374d2afb39d1997e9f2e3c64fc9fa49393e2839d8a1Brian Paul
13753baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   for ( i = 0 ; i < primcount ; i++ ) {
13763baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      if ( count[i] > 0 ) {
137703e29a5f77c13b7b888bd8443cb2752850e47d6aBrian Paul         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
13789bdfee3a470a535ebe31074651fbacf680bcea6aIan Romanick	 CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] ));
13793baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick      }
13803baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick   }
13813baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick}
13823baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
13833baefe663bb15b4fd60921155de38c12ec2758c4Ian Romanick
1384095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul/**
13857f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul * GL_NV_primitive_restart and GL 3.1
1386a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul */
1387a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paulvoid GLAPIENTRY
1388a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul_mesa_PrimitiveRestartIndex(GLuint index)
1389a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul{
1390a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   GET_CURRENT_CONTEXT(ctx);
1391a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
13927f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul   if (!ctx->Extensions.NV_primitive_restart &&
13937f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul       ctx->VersionMajor * 10 + ctx->VersionMinor < 31) {
13947f26ad80ba74b9c78a3735caee202e1868f6ff58Brian Paul      _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
1395a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul      return;
1396a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   }
1397a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1398a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1399a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1400a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
1401a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1402a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul   ctx->Array.RestartIndex = index;
1403a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul}
1404a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1405a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul
1406a40e6f220ac7e41126b9815db27d362bda719bf6Brian Paul/**
1407b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul * Copy one client vertex array to another.
1408b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul */
1409b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paulvoid
1410f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_copy_client_array(struct gl_context *ctx,
1411b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *dst,
1412b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul                        struct gl_client_array *src)
1413b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul{
1414b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Size = src->Size;
1415b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Type = src->Type;
1416b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Format = src->Format;
1417b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Stride = src->Stride;
1418b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->StrideB = src->StrideB;
1419b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Ptr = src->Ptr;
1420b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Enabled = src->Enabled;
1421b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->Normalized = src->Normalized;
1422d1184d26bb14304a6a61d7729c90a7c7f3627086Brian Paul   dst->Integer = src->Integer;
1423b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_ElementSize = src->_ElementSize;
1424b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
1425b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul   dst->_MaxElement = src->_MaxElement;
1426b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul}
1427b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1428b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1429b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul
1430b28854088bb6a6fa1a12f47056d9aee2fbdefc70Brian Paul/**
143139d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print vertex array's fields.
143239d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
143339d7524f7b176d4375e230ac60963d197be539f2Brian Paulstatic void
143439d7524f7b176d4375e230ac60963d197be539f2Brian Paulprint_array(const char *name, GLint index, const struct gl_client_array *array)
143539d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
143639d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (index >= 0)
1437298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s[%d]: ", name, index);
143839d7524f7b176d4375e230ac60963d197be539f2Brian Paul   else
1439298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg      printf("  %s: ", name);
14404beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul   printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n",
1441298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->Ptr, array->Type, array->Size,
1442298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_ElementSize, array->StrideB,
14434beea12f170cdbce75bd07549b475f59fc3cd7f9Brian Paul	  array->BufferObj->Name, (unsigned long) array->BufferObj->Size,
1444298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg	  array->_MaxElement);
144539d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
144639d7524f7b176d4375e230ac60963d197be539f2Brian Paul
144739d7524f7b176d4375e230ac60963d197be539f2Brian Paul
144839d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
144939d7524f7b176d4375e230ac60963d197be539f2Brian Paul * Print current vertex object/array info.  For debug.
145039d7524f7b176d4375e230ac60963d197be539f2Brian Paul */
145139d7524f7b176d4375e230ac60963d197be539f2Brian Paulvoid
1452f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_print_arrays(struct gl_context *ctx)
145339d7524f7b176d4375e230ac60963d197be539f2Brian Paul{
14546a2211f00077f49af42e6f087e3120abfb1be5aeBrian Paul   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
145539d7524f7b176d4375e230ac60963d197be539f2Brian Paul   GLuint i;
145639d7524f7b176d4375e230ac60963d197be539f2Brian Paul
14578fe3134622eed34159ff6f72a33558a659e8d299Brian Paul   _mesa_update_array_object_max_element(ctx, arrayObj);
14588fe3134622eed34159ff6f72a33558a659e8d299Brian Paul
1459298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("Array Object %u\n", arrayObj->Name);
146039d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (arrayObj->Vertex.Enabled)
146139d7524f7b176d4375e230ac60963d197be539f2Brian Paul      print_array("Vertex", -1, &arrayObj->Vertex);
146239d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (arrayObj->Normal.Enabled)
146339d7524f7b176d4375e230ac60963d197be539f2Brian Paul      print_array("Normal", -1, &arrayObj->Normal);
146439d7524f7b176d4375e230ac60963d197be539f2Brian Paul   if (arrayObj->Color.Enabled)
146539d7524f7b176d4375e230ac60963d197be539f2Brian Paul      print_array("Color", -1, &arrayObj->Color);
1466d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul   for (i = 0; i < Elements(arrayObj->TexCoord); i++)
146739d7524f7b176d4375e230ac60963d197be539f2Brian Paul      if (arrayObj->TexCoord[i].Enabled)
146839d7524f7b176d4375e230ac60963d197be539f2Brian Paul         print_array("TexCoord", i, &arrayObj->TexCoord[i]);
1469d30163ad4201dcd5a594694ab87be9e59db47eddBrian Paul   for (i = 0; i < Elements(arrayObj->VertexAttrib); i++)
147039d7524f7b176d4375e230ac60963d197be539f2Brian Paul      if (arrayObj->VertexAttrib[i].Enabled)
147139d7524f7b176d4375e230ac60963d197be539f2Brian Paul         print_array("Attrib", i, &arrayObj->VertexAttrib[i]);
1472298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg   printf("  _MaxElement = %u\n", arrayObj->_MaxElement);
147339d7524f7b176d4375e230ac60963d197be539f2Brian Paul}
147439d7524f7b176d4375e230ac60963d197be539f2Brian Paul
147539d7524f7b176d4375e230ac60963d197be539f2Brian Paul
147639d7524f7b176d4375e230ac60963d197be539f2Brian Paul/**
1477095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul * Initialize vertex array state for given context.
1478095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul */
1479c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid
1480f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_varray(struct gl_context *ctx)
14816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell{
1482ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   ctx->Array.DefaultArrayObj = _mesa_new_array_object(ctx, 0);
14831030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul   _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj,
14841030bf0ded2a88a5e27f7a4d393c11cfde3d3c5aBrian Paul                                ctx->Array.DefaultArrayObj);
1485095c6699f449ed4803f23e844cc0227743a9c3e1Brian Paul   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
148612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
148712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   ctx->Array.Objects = _mesa_NewHashTable();
148812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
148912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
149012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
149112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
149212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
149312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
149412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulstatic void
149512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Pauldelete_arrayobj_cb(GLuint id, void *data, void *userData)
149612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
149712cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
1498f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg   struct gl_context *ctx = (struct gl_context *) userData;
149912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_delete_array_object(ctx, arrayObj);
150012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul}
150112cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
150212cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul
150312cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul/**
150412cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul * Free vertex array state for given context.
150512cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul */
150612cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paulvoid
1507f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_free_varray_data(struct gl_context *ctx)
150812cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul{
150912cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
151012cf98f5fc5eaa4743134387ce3f8e584aa20bc4Brian Paul   _mesa_DeleteHashTable(ctx->Array.Objects);
15116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell}
1512