1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version:  7.6
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"),
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense,
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions:
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h"
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "bufferobj.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enable.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "hash.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "varray.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "arrayobj.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/dispatch.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Used to do error checking for GL_EXT_vertex_array_bgra */
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BGRA_OR_4  5
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Used to indicate which GL datatypes are accepted by each of the
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glVertex/Color/Attrib/EtcPointer() functions.
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BOOL_BIT             0x1
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define BYTE_BIT             0x2
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_BYTE_BIT    0x4
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SHORT_BIT            0x8
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_SHORT_BIT   0x10
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INT_BIT              0x20
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_INT_BIT     0x40
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define HALF_BIT             0x80
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FLOAT_BIT            0x100
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define DOUBLE_BIT           0x200
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FIXED_ES_BIT         0x400
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define FIXED_GL_BIT         0x800
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define UNSIGNED_INT_2_10_10_10_REV_BIT 0x1000
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define INT_2_10_10_10_REV_BIT 0x2000
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Convert GL datatype enum into a <type>_BIT value seen above */
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLbitfield
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtype_to_bit(const struct gl_context *ctx, GLenum type)
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (type) {
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BOOL:
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BOOL_BIT;
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_BYTE:
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return BYTE_BIT;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_BYTE:
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return UNSIGNED_BYTE_BIT;
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_SHORT:
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return SHORT_BIT;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_SHORT:
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return UNSIGNED_SHORT_BIT;
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INT:
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return INT_BIT;
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT:
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return UNSIGNED_INT_BIT;
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_HALF_FLOAT:
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Extensions.ARB_half_float_vertex)
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return HALF_BIT;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return 0x0;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FLOAT:
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FLOAT_BIT;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_DOUBLE:
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return DOUBLE_BIT;
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_FIXED:
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_UNSIGNED_INT_2_10_10_10_REV:
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return UNSIGNED_INT_2_10_10_10_REV_BIT;
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_INT_2_10_10_10_REV:
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return INT_2_10_10_10_REV_BIT;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do error checking and update state for glVertex/Color/TexCoord/...Pointer
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * functions.
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param func  name of calling function used for error reporting
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param attrib  the attribute array index to update
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param sizeMin  min allowable size value
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param size  components per element (1, 2, 3 or 4)
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param stride  stride between elements, in elements
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param normalized  are integer types converted to floats in [-1, 1]?
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param integer  integer-valued values (will not be normalized to [-1,1])
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ptr  the address (or offset inside VBO) of the array data
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgupdate_array(struct gl_context *ctx,
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             const char *func,
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLuint attrib, GLbitfield legalTypesMask,
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLint sizeMin, GLint sizeMax,
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLint size, GLenum type, GLsizei stride,
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             GLboolean normalized, GLboolean integer,
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             const GLvoid *ptr)
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_client_array *array;
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield typeBit;
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLsizei elementSize;
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum format = GL_RGBA;
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says:
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "Client vertex arrays - all vertex array attribute pointers must
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     refer to buffer objects (section 2.9.2). The default vertex array
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     object (the name zero) is also deprecated. Calling
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     VertexAttribPointer when no buffer object or no vertex array object
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     is bound will generate an INVALID_OPERATION error..."
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * The check for VBOs is handled below.
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->API == API_OPENGL_CORE
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       && (ctx->Array.ArrayObj == ctx->Array.DefaultArrayObj)) {
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no array object bound)",
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  func);
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (_mesa_is_gles(ctx)) {
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Once Mesa gets support for GL_OES_vertex_half_float this mask will
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * change.  Adding support for this extension isn't quite as trivial as
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * we'd like because ES uses a different enum value for GL_HALF_FLOAT.
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legalTypesMask &= ~(FIXED_GL_BIT | HALF_BIT | DOUBLE_BIT);
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * 3.0.  The 2_10_10_10 types are added in OpenGL ES 3.0 or
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * GL_OES_vertex_type_10_10_10_2.
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Version < 30) {
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         legalTypesMask &= ~(UNSIGNED_INT_BIT
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             | INT_BIT
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             | UNSIGNED_INT_2_10_10_10_REV_BIT
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             | INT_2_10_10_10_REV_BIT);
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* BGRA ordering is not supported in ES contexts.
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (sizeMax == BGRA_OR_4)
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         sizeMax = 4;
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      legalTypesMask &= ~FIXED_ES_BIT;
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_ES2_compatibility)
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         legalTypesMask &= ~FIXED_GL_BIT;
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev)
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             INT_2_10_10_10_REV_BIT);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   typeBit = type_to_bit(ctx, type);
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) {
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)",
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  func, _mesa_lookup_enum_by_nr(type));
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Do size parameter checking.
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * must be handled specially.
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.EXT_vertex_array_bgra &&
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       sizeMax == BGRA_OR_4 &&
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       size == GL_BGRA) {
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLboolean bgra_error = GL_FALSE;
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (type != GL_UNSIGNED_INT_2_10_10_10_REV &&
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             type != GL_INT_2_10_10_10_REV &&
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org             type != GL_UNSIGNED_BYTE)
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            bgra_error = GL_TRUE;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (type != GL_UNSIGNED_BYTE)
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bgra_error = GL_TRUE;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (bgra_error) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error(ctx, GL_INVALID_VALUE, "%s(GL_BGRA/GLubyte)", func);
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      format = GL_BGRA;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      size = 4;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (size < sizeMin || size > sizeMax || size > 4) {
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       (type == GL_UNSIGNED_INT_2_10_10_10_REV ||
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        type == GL_INT_2_10_10_10_REV) && size != 4) {
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(size <= 4);
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stride < 0) {
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Page 29 (page 44 of the PDF) of the OpenGL 3.3 spec says:
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     "An INVALID_OPERATION error is generated under any of the following
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     conditions:
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     ...
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *     * any of the *Pointer commands specifying the location and
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *       organization of vertex array data are called while zero is bound
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *       to the ARRAY_BUFFER buffer object binding point (see section
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *       2.9.6), and the pointer argument is not NULL."
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ptr != NULL && ctx->Array.ArrayObj->ARBsemantics &&
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !_mesa_is_bufferobj(ctx->Array.ArrayBufferObj)) {
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   elementSize = _mesa_sizeof_type(type) * size;
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array = &ctx->Array.ArrayObj->VertexAttrib[attrib];
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Size = size;
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Type = type;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Format = format;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Stride = stride;
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->StrideB = stride ? stride : elementSize;
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Normalized = normalized;
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Integer = integer;
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->Ptr = (const GLubyte *) ptr;
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array->_ElementSize = elementSize;
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_reference_buffer_object(ctx, &array->BufferObj,
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                 ctx->Array.ArrayBufferObj);
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->NewState |= _NEW_ARRAY;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.ArrayObj->NewArrays |= VERT_BIT(attrib);
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield legalTypes = (ctx->API == API_OPENGLES)
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      : (SHORT_BIT | INT_BIT | FLOAT_BIT |
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         DOUBLE_BIT | HALF_BIT |
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         UNSIGNED_INT_2_10_10_10_REV_BIT |
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         INT_2_10_10_10_REV_BIT);
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glVertexPointer", VERT_ATTRIB_POS,
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 2, 4,
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, GL_FALSE, GL_FALSE, ptr);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (ctx->API == API_OPENGLES)
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      : (BYTE_BIT | SHORT_BIT | INT_BIT |
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         UNSIGNED_INT_2_10_10_10_REV_BIT |
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         INT_2_10_10_10_REV_BIT);
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glNormalPointer", VERT_ATTRIB_NORMAL,
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 3, 3,
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                3, type, stride, GL_TRUE, GL_FALSE, ptr);
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (ctx->API == API_OPENGLES)
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT)
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      : (BYTE_BIT | UNSIGNED_BYTE_BIT |
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         SHORT_BIT | UNSIGNED_SHORT_BIT |
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         INT_BIT | UNSIGNED_INT_BIT |
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         UNSIGNED_INT_2_10_10_10_REV_BIT |
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         INT_2_10_10_10_REV_BIT);
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint sizeMin = (ctx->API == API_OPENGLES) ? 4 : 3;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glColorPointer", VERT_ATTRIB_COLOR0,
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, sizeMin, BGRA_OR_4,
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, GL_TRUE, GL_FALSE, ptr);
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_FogCoordPointerEXT(GLenum type, GLsizei stride, const GLvoid *ptr)
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glFogCoordPointer", VERT_ATTRIB_FOG,
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, 1,
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                1, type, stride, GL_FALSE, GL_FALSE, ptr);
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  FLOAT_BIT | DOUBLE_BIT);
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glIndexPointer", VERT_ATTRIB_COLOR_INDEX,
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, 1,
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                1, type, stride, GL_FALSE, GL_FALSE, ptr);
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_SecondaryColorPointerEXT(GLint size, GLenum type,
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       GLsizei stride, const GLvoid *ptr)
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  INT_BIT | UNSIGNED_INT_BIT |
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  INT_2_10_10_10_REV_BIT);
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glSecondaryColorPointer", VERT_ATTRIB_COLOR1,
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 3, BGRA_OR_4,
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, GL_TRUE, GL_FALSE, ptr);
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const GLvoid *ptr)
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLbitfield legalTypes = (ctx->API == API_OPENGLES)
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      : (SHORT_BIT | INT_BIT |
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         UNSIGNED_INT_2_10_10_10_REV_BIT |
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         INT_2_10_10_10_REV_BIT);
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint sizeMin = (ctx->API == API_OPENGLES) ? 2 : 1;
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLuint unit = ctx->Array.ActiveTexture;
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glTexCoordPointer", VERT_ATTRIB_TEX(unit),
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, sizeMin, 4,
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, GL_FALSE, GL_FALSE,
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                ptr);
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* see table 2.4 edits in GL_EXT_gpu_shader4 spec: */
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean integer = GL_TRUE;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glEdgeFlagPointer", VERT_ATTRIB_EDGEFLAG,
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, 1,
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                1, GL_UNSIGNED_BYTE, stride, GL_FALSE, integer, ptr);
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PointSizePointer(GLenum type, GLsizei stride, const GLvoid *ptr)
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->API != API_OPENGLES) {
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION,
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glPointSizePointer(ES 1.x only)");
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glPointSizePointer", VERT_ATTRIB_POINT_SIZE,
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, 1,
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                1, type, stride, GL_FALSE, GL_FALSE, ptr);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_NV_vertex_program
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set a vertex attribute array.
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that these arrays DO alias the conventional GL vertex arrays
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (position, normal, color, fog, texcoord, etc).
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The generic attribute slots at #16 and above are not touched.
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribPointerNV(GLuint index, GLint size, GLenum type,
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                            GLsizei stride, const GLvoid *ptr)
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT |
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  FLOAT_BIT | DOUBLE_BIT);
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean normalized = GL_FALSE;
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(index)");
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (type == GL_UNSIGNED_BYTE && size != 4) {
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerNV(size!=4)");
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glVertexAttribPointerNV", VERT_ATTRIB_GENERIC(index),
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, BGRA_OR_4,
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, normalized, GL_FALSE, ptr);
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ARB_vertex_program
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set a generic vertex attribute array.
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that these arrays DO NOT alias the conventional GL vertex arrays
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (position, normal, color, fog, texcoord, etc).
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribPointerARB(GLuint index, GLint size, GLenum type,
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLboolean normalized,
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             GLsizei stride, const GLvoid *ptr)
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  INT_BIT | UNSIGNED_INT_BIT |
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  FIXED_ES_BIT | FIXED_GL_BIT |
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  UNSIGNED_INT_2_10_10_10_REV_BIT |
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  INT_2_10_10_10_REV_BIT);
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(index)");
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glVertexAttribPointer", VERT_ATTRIB_GENERIC(index),
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, BGRA_OR_4,
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, normalized, GL_FALSE, ptr);
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_EXT_gpu_shader4 / GL 3.0.
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set an integer-valued vertex attribute array.
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that these arrays DO NOT alias the conventional GL vertex arrays
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (position, normal, color, fog, texcoord, etc).
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                           GLsizei stride, const GLvoid *ptr)
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  SHORT_BIT | UNSIGNED_SHORT_BIT |
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                  INT_BIT | UNSIGNED_INT_BIT);
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean normalized = GL_FALSE;
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLboolean integer = GL_TRUE;
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   update_array(ctx, "glVertexAttribIPointer", VERT_ATTRIB_GENERIC(index),
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                legalTypes, 1, 4,
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                size, type, stride, normalized, integer, ptr);
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EnableVertexAttribArrayARB(GLuint index)
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_array_object *arrayObj;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glEnableVertexAttribArrayARB(index)");
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   arrayObj = ctx->Array.ArrayObj;
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib));
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* was disabled, now being enabled */
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_ARRAY);
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_TRUE;
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayObj->_Enabled |= VERT_BIT_GENERIC(index);
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_DisableVertexAttribArrayARB(GLuint index)
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_array_object *arrayObj;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  "glDisableVertexAttribArrayARB(index)");
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   arrayObj = ctx->Array.ArrayObj;
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(arrayObj->VertexAttrib));
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled) {
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* was enabled, now being disabled */
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_ARRAY);
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Enabled = GL_FALSE;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayObj->_Enabled &= ~VERT_BIT_GENERIC(index);
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      arrayObj->NewArrays |= VERT_BIT_GENERIC(index);
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return info for a vertex attribute array (no alias with legacy
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex attributes (pos, normal, color, etc)).  This function does
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_vertex_array_attrib(struct gl_context *ctx, GLuint index, GLenum pname,
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  const char *caller)
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct gl_client_array *array;
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return 0;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (pname) {
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return array->Enabled;
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return array->Size;
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return array->Stride;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return array->Type;
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return array->Normalized;
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return array->BufferObj->Name;
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((_mesa_is_desktop_gl(ctx)
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || _mesa_is_gles3(ctx)) {
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return array->Integer;
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB:
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((_mesa_is_desktop_gl(ctx) && ctx->Extensions.ARB_instanced_arrays)
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          || _mesa_is_gles3(ctx)) {
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return array->InstanceDivisor;
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      goto error;
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ; /* fall-through */
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror:
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return 0;
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLfloat *
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_current_attrib(struct gl_context *ctx, GLuint index, const char *function)
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index == 0) {
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* In OpenGL 3.1 attribute 0 becomes non-magic, just like in OpenGL ES
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * 2.0.  Note that we cannot just check for API_OPENGL_CORE here because
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * that will erroneously allow this usage in a 3.0 forward-compatible
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * context too.
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ((ctx->API != API_OPENGL_CORE || ctx->Version < 31)
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          && ctx->API != API_OPENGLES2) {
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function);
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return NULL;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (index >= ctx->Const.VertexProgram.MaxAttribs) {
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE,
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org		  "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function);
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   FLUSH_CURRENT(ctx, 0);
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)];
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribfvARB(GLuint index, GLenum pname, GLfloat *params)
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv");
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (v != NULL) {
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         COPY_4V(params, v);
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      params[0] = (GLfloat) get_vertex_array_attrib(ctx, index, pname,
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                    "glGetVertexAttribfv");
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribdvARB(GLuint index, GLenum pname, GLdouble *params)
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv");
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (v != NULL) {
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[0] = (GLdouble) v[0];
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[1] = (GLdouble) v[1];
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[2] = (GLdouble) v[2];
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[3] = (GLdouble) v[3];
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      params[0] = (GLdouble) get_vertex_array_attrib(ctx, index, pname,
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                     "glGetVertexAttribdv");
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribivARB(GLuint index, GLenum pname, GLint *params)
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv");
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (v != NULL) {
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         /* XXX should floats in[0,1] be scaled to full int range? */
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[0] = (GLint) v[0];
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[1] = (GLint) v[1];
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[2] = (GLint) v[2];
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         params[3] = (GLint) v[3];
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  "glGetVertexAttribiv");
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** GL 3.0 */
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLint *v = (const GLint *)
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 get_current_attrib(ctx, index, "glGetVertexAttribIiv");
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (v != NULL) {
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         COPY_4V(params, v);
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      params[0] = (GLint) get_vertex_array_attrib(ctx, index, pname,
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                                  "glGetVertexAttribIiv");
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** GL 3.0 */
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const GLuint *v = (const GLuint *)
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 get_current_attrib(ctx, index, "glGetVertexAttribIuiv");
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (v != NULL) {
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         COPY_4V(params, v);
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      params[0] = get_vertex_array_attrib(ctx, index, pname,
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                          "glGetVertexAttribIuiv");
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribPointervARB(GLuint index, GLenum pname, GLvoid **pointer)
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       GLsizei count, const GLvoid *ptr)
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) count;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_VertexPointer(size, type, stride, ptr);
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                       const GLvoid *ptr)
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) count;
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_NormalPointer(type, stride, ptr);
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const GLvoid *ptr)
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) count;
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_ColorPointer(size, type, stride, ptr);
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                      const GLvoid *ptr)
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) count;
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_IndexPointer(type, stride, ptr);
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                         GLsizei count, const GLvoid *ptr)
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) count;
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_TexCoordPointer(size, type, stride, ptr);
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   (void) count;
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_EdgeFlagPointer(stride, ptr);
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLboolean tflag, cflag, nflag;  /* enable/disable flags */
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint tcomps, ccomps, vcomps;   /* components per texcoord, color, vertex */
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLenum ctype = 0;               /* color type */
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint coffset = 0, noffset = 0, voffset;/* color, normal, vertex offsets */
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const GLint toffset = 0;        /* always zero */
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint defstride;                /* default stride */
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint c, f;
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   f = sizeof(GLfloat);
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stride < 0) {
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch (format) {
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_V2F:
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 0;  vcomps = 2;
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 0;
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 2*f;
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_V3F:
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_FALSE;
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 0;  vcomps = 3;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 0;
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 3*f;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_C4UB_V2F:
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 4;  vcomps = 2;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_UNSIGNED_BYTE;
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 0;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = c;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = c + 2*f;
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_C4UB_V3F:
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 4;  vcomps = 3;
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_UNSIGNED_BYTE;
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 0;
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = c;
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = c + 3*f;
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_C3F_V3F:
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_FALSE;
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 3;  vcomps = 3;
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_FLOAT;
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 0;
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 3*f;
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 6*f;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_N3F_V3F:
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_FALSE;  nflag = GL_TRUE;
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 0;  vcomps = 3;
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         noffset = 0;
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 3*f;
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 6*f;
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_C4F_N3F_V3F:
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_FALSE;  cflag = GL_TRUE;  nflag = GL_TRUE;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 0;  ccomps = 4;  vcomps = 3;
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_FLOAT;
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 0;
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         noffset = 4*f;
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 7*f;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 10*f;
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T2F_V3F:
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 2;  ccomps = 0;  vcomps = 3;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 2*f;
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 5*f;
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T4F_V4F:
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_FALSE;
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 4;  ccomps = 0;  vcomps = 4;
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 4*f;
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 8*f;
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T2F_C4UB_V3F:
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 2;  ccomps = 4;  vcomps = 3;
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_UNSIGNED_BYTE;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 2*f;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = c+2*f;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = c+5*f;
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T2F_C3F_V3F:
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_FALSE;
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 2;  ccomps = 3;  vcomps = 3;
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_FLOAT;
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 2*f;
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 5*f;
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 8*f;
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T2F_N3F_V3F:
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_FALSE;  nflag = GL_TRUE;
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 2;  ccomps = 0;  vcomps = 3;
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         noffset = 2*f;
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 5*f;
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 8*f;
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T2F_C4F_N3F_V3F:
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 2;  ccomps = 4;  vcomps = 3;
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_FLOAT;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 2*f;
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         noffset = 6*f;
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 9*f;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 12*f;
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case GL_T4F_C4F_N3F_V4F:
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tflag = GL_TRUE;  cflag = GL_TRUE;  nflag = GL_TRUE;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         tcomps = 4;  ccomps = 4;  vcomps = 4;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctype = GL_FLOAT;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         coffset = 4*f;
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         noffset = 8*f;
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         voffset = 11*f;
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         defstride = 15*f;
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return;
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (stride==0) {
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      stride = defstride;
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_DisableClientState( GL_INDEX_ARRAY );
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX also disable secondary color and generic arrays? */
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Texcoords */
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (tflag) {
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_TexCoordPointer( tcomps, GL_FLOAT, stride,
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                             (GLubyte *) pointer + toffset );
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Color */
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cflag) {
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_EnableClientState( GL_COLOR_ARRAY );
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_ColorPointer( ccomps, ctype, stride,
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			  (GLubyte *) pointer + coffset );
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_DisableClientState( GL_COLOR_ARRAY );
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Normals */
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (nflag) {
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_EnableClientState( GL_NORMAL_ARRAY );
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + noffset );
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_DisableClientState( GL_NORMAL_ARRAY );
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Vertices */
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_EnableClientState( GL_VERTEX_ARRAY );
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_VertexPointer( vcomps, GL_FLOAT, stride,
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			(GLubyte *) pointer + voffset );
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_LockArraysEXT(GLint first, GLsizei count)
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (first < 0) {
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (count <= 0) {
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Array.LockCount != 0) {
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.LockFirst = first;
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.LockCount = count;
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->NewState |= _NEW_ARRAY;
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_UnlockArraysEXT( void )
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (MESA_VERBOSE & VERBOSE_API)
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_debug(ctx, "glUnlockArrays\n");
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Array.LockCount == 0) {
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.LockFirst = 0;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.LockCount = 0;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->NewState |= _NEW_ARRAY;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_EXT_multi_draw_arrays */
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiDrawArraysEXT( GLenum mode, const GLint *first,
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                          const GLsizei *count, GLsizei primcount )
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < primcount; i++) {
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (count[i] > 0) {
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         CALL_DrawArrays(ctx->Exec, (mode, first[i], count[i]));
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_IBM_multimode_draw_arrays */
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiModeDrawArraysIBM( const GLenum * mode, const GLint * first,
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      const GLsizei * count,
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			      GLsizei primcount, GLint modestride )
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ( i = 0 ; i < primcount ; i++ ) {
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( count[i] > 0 ) {
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_DrawArrays(ctx->Exec, ( m, first[i], count[i] ));
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* GL_IBM_multimode_draw_arrays */
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_MultiModeDrawElementsIBM( const GLenum * mode, const GLsizei * count,
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLenum type, const GLvoid * const * indices,
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				GLsizei primcount, GLint modestride )
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLint i;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* XXX not sure about ARB_vertex_buffer_object handling here */
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for ( i = 0 ; i < primcount ; i++ ) {
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if ( count[i] > 0 ) {
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         GLenum m = *((GLenum *) ((GLubyte *) mode + i * modestride));
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 CALL_DrawElements(ctx->Exec, ( m, count[i], type, indices[i] ));
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_NV_primitive_restart and GL 3.1
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_PrimitiveRestartIndex(GLuint index)
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) {
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->Array.RestartIndex != index) {
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_TRANSFORM);
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Array.RestartIndex = index;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See GL_ARB_instanced_arrays.
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that the instance divisor only applies to generic arrays, not
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the legacy vertex arrays.
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_client_array *array;
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GET_CURRENT_CONTEXT(ctx);
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT_OUTSIDE_BEGIN_END(ctx);
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ctx->Extensions.ARB_instanced_arrays) {
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()");
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= ctx->Const.VertexProgram.MaxAttribs) {
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      _mesa_error(ctx, GL_INVALID_ENUM, "glVertexAttribDivisor(index = %u)",
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  index);
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return;
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ASSERT(VERT_ATTRIB_GENERIC(index) < Elements(ctx->Array.ArrayObj->VertexAttrib));
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (array->InstanceDivisor != divisor) {
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FLUSH_VERTICES(ctx, _NEW_ARRAY);
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      array->InstanceDivisor = divisor;
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->Array.ArrayObj->NewArrays |= VERT_BIT(VERT_ATTRIB_GENERIC(index));
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy one client vertex array to another.
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_copy_client_array(struct gl_context *ctx,
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        struct gl_client_array *dst,
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        struct gl_client_array *src)
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Size = src->Size;
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Type = src->Type;
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Format = src->Format;
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Stride = src->Stride;
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->StrideB = src->StrideB;
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Ptr = src->Ptr;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Enabled = src->Enabled;
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Normalized = src->Normalized;
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Integer = src->Integer;
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->InstanceDivisor = src->InstanceDivisor;
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->_ElementSize = src->_ElementSize;
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->_MaxElement = src->_MaxElement;
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print vertex array's fields.
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgprint_array(const char *name, GLint index, const struct gl_client_array *array)
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (index >= 0)
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("  %s[%d]: ", name, index);
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("  %s: ", name);
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("Ptr=%p, Type=0x%x, Size=%d, ElemSize=%u, Stride=%d, Buffer=%u(Size %lu), MaxElem=%u\n",
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  array->Ptr, array->Type, array->Size,
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  array->_ElementSize, array->StrideB,
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  array->BufferObj->Name, (unsigned long) array->BufferObj->Size,
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  array->_MaxElement);
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Print current vertex object/array info.  For debug.
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_print_arrays(struct gl_context *ctx)
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_array_object *arrayObj = ctx->Array.ArrayObj;
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_update_array_object_max_element(ctx, arrayObj);
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("Array Object %u\n", arrayObj->Name);
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (arrayObj->VertexAttrib[VERT_ATTRIB_POS].Enabled)
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_array("Vertex", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_POS]);
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled)
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_array("Normal", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_NORMAL]);
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled)
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      print_array("Color", -1, &arrayObj->VertexAttrib[VERT_ATTRIB_COLOR0]);
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++)
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)].Enabled)
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         print_array("TexCoord", i, &arrayObj->VertexAttrib[VERT_ATTRIB_TEX(i)]);
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < VERT_ATTRIB_GENERIC_MAX; i++)
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)].Enabled)
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         print_array("Attrib", i, &arrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(i)]);
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   printf("  _MaxElement = %u\n", arrayObj->_MaxElement);
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize vertex array state for given context.
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_varray(struct gl_context *ctx)
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.DefaultArrayObj = ctx->Driver.NewArrayObject(ctx, 0);
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_reference_array_object(ctx, &ctx->Array.ArrayObj,
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                ctx->Array.DefaultArrayObj);
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->Array.Objects = _mesa_NewHashTable();
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Callback for deleting an array object.  Called by _mesa_HashDeleteAll().
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgdelete_arrayobj_cb(GLuint id, void *data, void *userData)
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_array_object *arrayObj = (struct gl_array_object *) data;
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct gl_context *ctx = (struct gl_context *) userData;
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_delete_array_object(ctx, arrayObj);
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free vertex array state for given context.
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_free_varray_data(struct gl_context *ctx)
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_HashDeleteAll(ctx->Array.Objects, delete_arrayobj_cb, ctx);
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   _mesa_DeleteHashTable(ctx->Array.Objects);
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1300