xref: /aosp_15_r20/external/mesa3d/src/mesa/main/varray.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Mesa 3-D graphics library
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
5*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
6*61046927SAndroid Build Coastguard Worker  *
7*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
8*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
9*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
10*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
12*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
13*61046927SAndroid Build Coastguard Worker  *
14*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice shall be included
15*61046927SAndroid Build Coastguard Worker  * in all copies or substantial portions of the Software.
16*61046927SAndroid Build Coastguard Worker  *
17*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18*61046927SAndroid Build Coastguard Worker  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21*61046927SAndroid Build Coastguard Worker  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22*61046927SAndroid Build Coastguard Worker  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23*61046927SAndroid Build Coastguard Worker  * OTHER DEALINGS IN THE SOFTWARE.
24*61046927SAndroid Build Coastguard Worker  */
25*61046927SAndroid Build Coastguard Worker 
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #include <stdio.h>
28*61046927SAndroid Build Coastguard Worker #include <inttypes.h>  /* for PRId64 macro */
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include "util/glheader.h"
31*61046927SAndroid Build Coastguard Worker 
32*61046927SAndroid Build Coastguard Worker #include "bufferobj.h"
33*61046927SAndroid Build Coastguard Worker #include "context.h"
34*61046927SAndroid Build Coastguard Worker #include "enable.h"
35*61046927SAndroid Build Coastguard Worker #include "enums.h"
36*61046927SAndroid Build Coastguard Worker #include "glformats.h"
37*61046927SAndroid Build Coastguard Worker #include "hash.h"
38*61046927SAndroid Build Coastguard Worker #include "image.h"
39*61046927SAndroid Build Coastguard Worker #include "macros.h"
40*61046927SAndroid Build Coastguard Worker #include "mtypes.h"
41*61046927SAndroid Build Coastguard Worker #include "varray.h"
42*61046927SAndroid Build Coastguard Worker #include "arrayobj.h"
43*61046927SAndroid Build Coastguard Worker #include "get.h"
44*61046927SAndroid Build Coastguard Worker #include "main/dispatch.h"
45*61046927SAndroid Build Coastguard Worker #include "api_exec_decl.h"
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_atom.h"
48*61046927SAndroid Build Coastguard Worker #include "state_tracker/st_util.h"
49*61046927SAndroid Build Coastguard Worker 
50*61046927SAndroid Build Coastguard Worker /* The values are multiplied by the component count to get the attrib size.
51*61046927SAndroid Build Coastguard Worker  * Indexed by PERF_HASH_GL_TYPE(GLenum).
52*61046927SAndroid Build Coastguard Worker  * Generated by src/util/tools/find_hash_func.c.
53*61046927SAndroid Build Coastguard Worker  */
54*61046927SAndroid Build Coastguard Worker const uint8_t _mesa_vertex_type_bytes[16] = {
55*61046927SAndroid Build Coastguard Worker    /* These elements are listed out of order. */
56*61046927SAndroid Build Coastguard Worker    [/* 7*/ PERF_HASH_GL_VERTEX_TYPE(GL_BYTE)] = 1,
57*61046927SAndroid Build Coastguard Worker    [/* 8*/ PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_BYTE)] = 1,
58*61046927SAndroid Build Coastguard Worker    [/* 5*/ PERF_HASH_GL_VERTEX_TYPE(GL_INT_2_10_10_10_REV)] = 1, /* count is 4 */
59*61046927SAndroid Build Coastguard Worker    [/* 0*/ PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_INT_2_10_10_10_REV)] = 1, /* count is 4 */
60*61046927SAndroid Build Coastguard Worker    [/* 9*/ PERF_HASH_GL_VERTEX_TYPE(GL_SHORT)] = 2,
61*61046927SAndroid Build Coastguard Worker    [/*10*/ PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_SHORT)] = 2,
62*61046927SAndroid Build Coastguard Worker    [/* 2*/ PERF_HASH_GL_VERTEX_TYPE(GL_HALF_FLOAT_ARB)] = 2,
63*61046927SAndroid Build Coastguard Worker    [/* 4*/ PERF_HASH_GL_VERTEX_TYPE(GL_HALF_FLOAT_OES)] = 2,
64*61046927SAndroid Build Coastguard Worker    [/*11*/ PERF_HASH_GL_VERTEX_TYPE(GL_INT)] = 4,
65*61046927SAndroid Build Coastguard Worker    [/*12*/ PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_INT)] = 4,
66*61046927SAndroid Build Coastguard Worker    [/*13*/ PERF_HASH_GL_VERTEX_TYPE(GL_FLOAT)] = 4,
67*61046927SAndroid Build Coastguard Worker    [/* 3*/ PERF_HASH_GL_VERTEX_TYPE(GL_FIXED)] = 4,
68*61046927SAndroid Build Coastguard Worker    [/* 1*/ PERF_HASH_GL_VERTEX_TYPE(GL_DOUBLE)] = 8,
69*61046927SAndroid Build Coastguard Worker    [/* 6*/ PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_INT64_ARB)] = 8,
70*61046927SAndroid Build Coastguard Worker };
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker static inline void
compile_check_uniqueness_of_gl_vertex_type(unsigned x)73*61046927SAndroid Build Coastguard Worker compile_check_uniqueness_of_gl_vertex_type(unsigned x)
74*61046927SAndroid Build Coastguard Worker {
75*61046927SAndroid Build Coastguard Worker    /* This switch has the same purpose as static_assert.
76*61046927SAndroid Build Coastguard Worker     * It should fail compilation if any case is not unique.
77*61046927SAndroid Build Coastguard Worker     */
78*61046927SAndroid Build Coastguard Worker    switch (x) {
79*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_BYTE):
80*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_BYTE):
81*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_INT_2_10_10_10_REV):
82*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_INT_2_10_10_10_REV):
83*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_SHORT):
84*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_SHORT):
85*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_HALF_FLOAT_ARB):
86*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_HALF_FLOAT_OES):
87*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_INT):
88*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_INT):
89*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_FLOAT):
90*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_FIXED):
91*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_DOUBLE):
92*61046927SAndroid Build Coastguard Worker    case PERF_HASH_GL_VERTEX_TYPE(GL_UNSIGNED_INT64_ARB):
93*61046927SAndroid Build Coastguard Worker       break;
94*61046927SAndroid Build Coastguard Worker    }
95*61046927SAndroid Build Coastguard Worker }
96*61046927SAndroid Build Coastguard Worker 
97*61046927SAndroid Build Coastguard Worker /** Used to do error checking for GL_EXT_vertex_array_bgra */
98*61046927SAndroid Build Coastguard Worker #define BGRA_OR_4  5
99*61046927SAndroid Build Coastguard Worker 
100*61046927SAndroid Build Coastguard Worker 
101*61046927SAndroid Build Coastguard Worker /** Used to indicate which GL datatypes are accepted by each of the
102*61046927SAndroid Build Coastguard Worker  * glVertex/Color/Attrib/EtcPointer() functions.
103*61046927SAndroid Build Coastguard Worker  */
104*61046927SAndroid Build Coastguard Worker #define BOOL_BIT                          (1 << 0)
105*61046927SAndroid Build Coastguard Worker #define BYTE_BIT                          (1 << 1)
106*61046927SAndroid Build Coastguard Worker #define UNSIGNED_BYTE_BIT                 (1 << 2)
107*61046927SAndroid Build Coastguard Worker #define SHORT_BIT                         (1 << 3)
108*61046927SAndroid Build Coastguard Worker #define UNSIGNED_SHORT_BIT                (1 << 4)
109*61046927SAndroid Build Coastguard Worker #define INT_BIT                           (1 << 5)
110*61046927SAndroid Build Coastguard Worker #define UNSIGNED_INT_BIT                  (1 << 6)
111*61046927SAndroid Build Coastguard Worker #define HALF_BIT                          (1 << 7)
112*61046927SAndroid Build Coastguard Worker #define FLOAT_BIT                         (1 << 8)
113*61046927SAndroid Build Coastguard Worker #define DOUBLE_BIT                        (1 << 9)
114*61046927SAndroid Build Coastguard Worker #define FIXED_ES_BIT                      (1 << 10)
115*61046927SAndroid Build Coastguard Worker #define FIXED_GL_BIT                      (1 << 11)
116*61046927SAndroid Build Coastguard Worker #define UNSIGNED_INT_2_10_10_10_REV_BIT   (1 << 12)
117*61046927SAndroid Build Coastguard Worker #define INT_2_10_10_10_REV_BIT            (1 << 13)
118*61046927SAndroid Build Coastguard Worker #define UNSIGNED_INT_10F_11F_11F_REV_BIT  (1 << 14)
119*61046927SAndroid Build Coastguard Worker #define UNSIGNED_INT64_BIT                (1 << 15)
120*61046927SAndroid Build Coastguard Worker #define ALL_TYPE_BITS                    ((1 << 16) - 1)
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker #define ATTRIB_FORMAT_TYPES_MASK (BYTE_BIT | UNSIGNED_BYTE_BIT | \
123*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT | \
124*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT | \
125*61046927SAndroid Build Coastguard Worker                                   HALF_BIT | FLOAT_BIT | DOUBLE_BIT | \
126*61046927SAndroid Build Coastguard Worker                                   FIXED_GL_BIT | \
127*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_2_10_10_10_REV_BIT | \
128*61046927SAndroid Build Coastguard Worker                                   INT_2_10_10_10_REV_BIT | \
129*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_10F_11F_11F_REV_BIT)
130*61046927SAndroid Build Coastguard Worker 
131*61046927SAndroid Build Coastguard Worker #define ATTRIB_IFORMAT_TYPES_MASK (BYTE_BIT | UNSIGNED_BYTE_BIT | \
132*61046927SAndroid Build Coastguard Worker                                    SHORT_BIT | UNSIGNED_SHORT_BIT | \
133*61046927SAndroid Build Coastguard Worker                                    INT_BIT | UNSIGNED_INT_BIT)
134*61046927SAndroid Build Coastguard Worker 
135*61046927SAndroid Build Coastguard Worker #define ATTRIB_LFORMAT_TYPES_MASK (DOUBLE_BIT | UNSIGNED_INT64_BIT)
136*61046927SAndroid Build Coastguard Worker 
137*61046927SAndroid Build Coastguard Worker 
138*61046927SAndroid Build Coastguard Worker /** Convert GL datatype enum into a <type>_BIT value seen above */
139*61046927SAndroid Build Coastguard Worker static GLbitfield
type_to_bit(const struct gl_context * ctx,GLenum type)140*61046927SAndroid Build Coastguard Worker type_to_bit(const struct gl_context *ctx, GLenum type)
141*61046927SAndroid Build Coastguard Worker {
142*61046927SAndroid Build Coastguard Worker    switch (type) {
143*61046927SAndroid Build Coastguard Worker    case GL_BOOL:
144*61046927SAndroid Build Coastguard Worker       return BOOL_BIT;
145*61046927SAndroid Build Coastguard Worker    case GL_BYTE:
146*61046927SAndroid Build Coastguard Worker       return BYTE_BIT;
147*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_BYTE:
148*61046927SAndroid Build Coastguard Worker       return UNSIGNED_BYTE_BIT;
149*61046927SAndroid Build Coastguard Worker    case GL_SHORT:
150*61046927SAndroid Build Coastguard Worker       return SHORT_BIT;
151*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_SHORT:
152*61046927SAndroid Build Coastguard Worker       return UNSIGNED_SHORT_BIT;
153*61046927SAndroid Build Coastguard Worker    case GL_INT:
154*61046927SAndroid Build Coastguard Worker       return INT_BIT;
155*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_INT:
156*61046927SAndroid Build Coastguard Worker       return UNSIGNED_INT_BIT;
157*61046927SAndroid Build Coastguard Worker    case GL_HALF_FLOAT:
158*61046927SAndroid Build Coastguard Worker    case GL_HALF_FLOAT_OES:
159*61046927SAndroid Build Coastguard Worker       if (ctx->Extensions.ARB_half_float_vertex)
160*61046927SAndroid Build Coastguard Worker          return HALF_BIT;
161*61046927SAndroid Build Coastguard Worker       else
162*61046927SAndroid Build Coastguard Worker          return 0x0;
163*61046927SAndroid Build Coastguard Worker    case GL_FLOAT:
164*61046927SAndroid Build Coastguard Worker       return FLOAT_BIT;
165*61046927SAndroid Build Coastguard Worker    case GL_DOUBLE:
166*61046927SAndroid Build Coastguard Worker       return DOUBLE_BIT;
167*61046927SAndroid Build Coastguard Worker    case GL_FIXED:
168*61046927SAndroid Build Coastguard Worker       return _mesa_is_desktop_gl(ctx) ? FIXED_GL_BIT : FIXED_ES_BIT;
169*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_INT_2_10_10_10_REV:
170*61046927SAndroid Build Coastguard Worker       return UNSIGNED_INT_2_10_10_10_REV_BIT;
171*61046927SAndroid Build Coastguard Worker    case GL_INT_2_10_10_10_REV:
172*61046927SAndroid Build Coastguard Worker       return INT_2_10_10_10_REV_BIT;
173*61046927SAndroid Build Coastguard Worker    case GL_UNSIGNED_INT_10F_11F_11F_REV:
174*61046927SAndroid Build Coastguard Worker       return UNSIGNED_INT_10F_11F_11F_REV_BIT;
175*61046927SAndroid Build Coastguard Worker    default:
176*61046927SAndroid Build Coastguard Worker       return 0;
177*61046927SAndroid Build Coastguard Worker    }
178*61046927SAndroid Build Coastguard Worker }
179*61046927SAndroid Build Coastguard Worker 
180*61046927SAndroid Build Coastguard Worker 
181*61046927SAndroid Build Coastguard Worker /**
182*61046927SAndroid Build Coastguard Worker  * Depending on the position and generic0 attributes enable flags select
183*61046927SAndroid Build Coastguard Worker  * the one that is used for both attributes.
184*61046927SAndroid Build Coastguard Worker  * The generic0 attribute takes precedence.
185*61046927SAndroid Build Coastguard Worker  */
186*61046927SAndroid Build Coastguard Worker static inline void
update_attribute_map_mode(const struct gl_context * ctx,struct gl_vertex_array_object * vao)187*61046927SAndroid Build Coastguard Worker update_attribute_map_mode(const struct gl_context *ctx,
188*61046927SAndroid Build Coastguard Worker                           struct gl_vertex_array_object *vao)
189*61046927SAndroid Build Coastguard Worker {
190*61046927SAndroid Build Coastguard Worker    /*
191*61046927SAndroid Build Coastguard Worker     * There is no need to change the mapping away from the
192*61046927SAndroid Build Coastguard Worker     * identity mapping if we are not in compat mode.
193*61046927SAndroid Build Coastguard Worker     */
194*61046927SAndroid Build Coastguard Worker    if (ctx->API != API_OPENGL_COMPAT)
195*61046927SAndroid Build Coastguard Worker       return;
196*61046927SAndroid Build Coastguard Worker    /* The generic0 attribute superseeds the position attribute */
197*61046927SAndroid Build Coastguard Worker    const GLbitfield enabled = vao->Enabled;
198*61046927SAndroid Build Coastguard Worker    if (enabled & VERT_BIT_GENERIC0)
199*61046927SAndroid Build Coastguard Worker       vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_GENERIC0;
200*61046927SAndroid Build Coastguard Worker    else if (enabled & VERT_BIT_POS)
201*61046927SAndroid Build Coastguard Worker       vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_POSITION;
202*61046927SAndroid Build Coastguard Worker    else
203*61046927SAndroid Build Coastguard Worker       vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_IDENTITY;
204*61046927SAndroid Build Coastguard Worker }
205*61046927SAndroid Build Coastguard Worker 
206*61046927SAndroid Build Coastguard Worker 
207*61046927SAndroid Build Coastguard Worker /**
208*61046927SAndroid Build Coastguard Worker  * Sets the BufferBindingIndex field for the vertex attribute given by
209*61046927SAndroid Build Coastguard Worker  * attribIndex.
210*61046927SAndroid Build Coastguard Worker  */
211*61046927SAndroid Build Coastguard Worker void
_mesa_vertex_attrib_binding(struct gl_context * ctx,struct gl_vertex_array_object * vao,gl_vert_attrib attribIndex,GLuint bindingIndex)212*61046927SAndroid Build Coastguard Worker _mesa_vertex_attrib_binding(struct gl_context *ctx,
213*61046927SAndroid Build Coastguard Worker                             struct gl_vertex_array_object *vao,
214*61046927SAndroid Build Coastguard Worker                             gl_vert_attrib attribIndex,
215*61046927SAndroid Build Coastguard Worker                             GLuint bindingIndex)
216*61046927SAndroid Build Coastguard Worker {
217*61046927SAndroid Build Coastguard Worker    struct gl_array_attributes *array = &vao->VertexAttrib[attribIndex];
218*61046927SAndroid Build Coastguard Worker    assert(!vao->SharedAndImmutable);
219*61046927SAndroid Build Coastguard Worker 
220*61046927SAndroid Build Coastguard Worker    if (array->BufferBindingIndex != bindingIndex) {
221*61046927SAndroid Build Coastguard Worker       const GLbitfield array_bit = VERT_BIT(attribIndex);
222*61046927SAndroid Build Coastguard Worker 
223*61046927SAndroid Build Coastguard Worker       if (vao->BufferBinding[bindingIndex].BufferObj)
224*61046927SAndroid Build Coastguard Worker          vao->VertexAttribBufferMask |= array_bit;
225*61046927SAndroid Build Coastguard Worker       else
226*61046927SAndroid Build Coastguard Worker          vao->VertexAttribBufferMask &= ~array_bit;
227*61046927SAndroid Build Coastguard Worker 
228*61046927SAndroid Build Coastguard Worker       if (vao->BufferBinding[bindingIndex].InstanceDivisor)
229*61046927SAndroid Build Coastguard Worker          vao->NonZeroDivisorMask |= array_bit;
230*61046927SAndroid Build Coastguard Worker       else
231*61046927SAndroid Build Coastguard Worker          vao->NonZeroDivisorMask &= ~array_bit;
232*61046927SAndroid Build Coastguard Worker 
233*61046927SAndroid Build Coastguard Worker       vao->BufferBinding[array->BufferBindingIndex]._BoundArrays &= ~array_bit;
234*61046927SAndroid Build Coastguard Worker       vao->BufferBinding[bindingIndex]._BoundArrays |= array_bit;
235*61046927SAndroid Build Coastguard Worker 
236*61046927SAndroid Build Coastguard Worker       array->BufferBindingIndex = bindingIndex;
237*61046927SAndroid Build Coastguard Worker 
238*61046927SAndroid Build Coastguard Worker       if (vao->Enabled & array_bit) {
239*61046927SAndroid Build Coastguard Worker          ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
240*61046927SAndroid Build Coastguard Worker          ctx->Array.NewVertexElements = true;
241*61046927SAndroid Build Coastguard Worker       }
242*61046927SAndroid Build Coastguard Worker 
243*61046927SAndroid Build Coastguard Worker       vao->NonDefaultStateMask |= array_bit | BITFIELD_BIT(bindingIndex);
244*61046927SAndroid Build Coastguard Worker 
245*61046927SAndroid Build Coastguard Worker       if (attribIndex != bindingIndex)
246*61046927SAndroid Build Coastguard Worker          vao->NonIdentityBufferAttribMapping |= array_bit;
247*61046927SAndroid Build Coastguard Worker       else
248*61046927SAndroid Build Coastguard Worker          vao->NonIdentityBufferAttribMapping &= ~array_bit;
249*61046927SAndroid Build Coastguard Worker    }
250*61046927SAndroid Build Coastguard Worker }
251*61046927SAndroid Build Coastguard Worker 
252*61046927SAndroid Build Coastguard Worker 
253*61046927SAndroid Build Coastguard Worker /**
254*61046927SAndroid Build Coastguard Worker  * Binds a buffer object to the vertex buffer binding point given by index,
255*61046927SAndroid Build Coastguard Worker  * and sets the Offset and Stride fields.
256*61046927SAndroid Build Coastguard Worker  */
257*61046927SAndroid Build Coastguard Worker void
_mesa_bind_vertex_buffer(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint index,struct gl_buffer_object * vbo,GLintptr offset,GLsizei stride,bool offset_is_int32,bool take_vbo_ownership)258*61046927SAndroid Build Coastguard Worker _mesa_bind_vertex_buffer(struct gl_context *ctx,
259*61046927SAndroid Build Coastguard Worker                          struct gl_vertex_array_object *vao,
260*61046927SAndroid Build Coastguard Worker                          GLuint index,
261*61046927SAndroid Build Coastguard Worker                          struct gl_buffer_object *vbo,
262*61046927SAndroid Build Coastguard Worker                          GLintptr offset, GLsizei stride,
263*61046927SAndroid Build Coastguard Worker                          bool offset_is_int32, bool take_vbo_ownership)
264*61046927SAndroid Build Coastguard Worker {
265*61046927SAndroid Build Coastguard Worker    assert(index < ARRAY_SIZE(vao->BufferBinding));
266*61046927SAndroid Build Coastguard Worker    assert(!vao->SharedAndImmutable);
267*61046927SAndroid Build Coastguard Worker    struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[index];
268*61046927SAndroid Build Coastguard Worker 
269*61046927SAndroid Build Coastguard Worker    if (ctx->Const.VertexBufferOffsetIsInt32 && (int)offset < 0 &&
270*61046927SAndroid Build Coastguard Worker        !offset_is_int32 && vbo) {
271*61046927SAndroid Build Coastguard Worker       /* The offset will be interpreted as a signed int, so make sure
272*61046927SAndroid Build Coastguard Worker        * the user supplied offset is not negative (driver limitation).
273*61046927SAndroid Build Coastguard Worker        */
274*61046927SAndroid Build Coastguard Worker       _mesa_warning(ctx, "Received negative int32 vertex buffer offset. "
275*61046927SAndroid Build Coastguard Worker 			 "(driver limitation)\n");
276*61046927SAndroid Build Coastguard Worker 
277*61046927SAndroid Build Coastguard Worker       /* We can't disable this binding, so use a non-negative offset value
278*61046927SAndroid Build Coastguard Worker        * instead.
279*61046927SAndroid Build Coastguard Worker        */
280*61046927SAndroid Build Coastguard Worker       offset = 0;
281*61046927SAndroid Build Coastguard Worker    }
282*61046927SAndroid Build Coastguard Worker 
283*61046927SAndroid Build Coastguard Worker    if (binding->BufferObj != vbo ||
284*61046927SAndroid Build Coastguard Worker        binding->Offset != offset ||
285*61046927SAndroid Build Coastguard Worker        binding->Stride != stride) {
286*61046927SAndroid Build Coastguard Worker       bool stride_changed = binding->Stride != stride;
287*61046927SAndroid Build Coastguard Worker 
288*61046927SAndroid Build Coastguard Worker       if (take_vbo_ownership) {
289*61046927SAndroid Build Coastguard Worker          _mesa_reference_buffer_object(ctx, &binding->BufferObj, NULL);
290*61046927SAndroid Build Coastguard Worker          binding->BufferObj = vbo;
291*61046927SAndroid Build Coastguard Worker       } else {
292*61046927SAndroid Build Coastguard Worker          _mesa_reference_buffer_object(ctx, &binding->BufferObj, vbo);
293*61046927SAndroid Build Coastguard Worker       }
294*61046927SAndroid Build Coastguard Worker 
295*61046927SAndroid Build Coastguard Worker       binding->Offset = offset;
296*61046927SAndroid Build Coastguard Worker       binding->Stride = stride;
297*61046927SAndroid Build Coastguard Worker 
298*61046927SAndroid Build Coastguard Worker       if (!vbo) {
299*61046927SAndroid Build Coastguard Worker          vao->VertexAttribBufferMask &= ~binding->_BoundArrays;
300*61046927SAndroid Build Coastguard Worker       } else {
301*61046927SAndroid Build Coastguard Worker          vao->VertexAttribBufferMask |= binding->_BoundArrays;
302*61046927SAndroid Build Coastguard Worker          vbo->UsageHistory |= USAGE_ARRAY_BUFFER;
303*61046927SAndroid Build Coastguard Worker       }
304*61046927SAndroid Build Coastguard Worker 
305*61046927SAndroid Build Coastguard Worker       if (vao->Enabled & binding->_BoundArrays) {
306*61046927SAndroid Build Coastguard Worker          ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
307*61046927SAndroid Build Coastguard Worker          /* The slow path merges vertex buffers, which affects vertex elements.
308*61046927SAndroid Build Coastguard Worker           * Stride changes also require new vertex elements.
309*61046927SAndroid Build Coastguard Worker           */
310*61046927SAndroid Build Coastguard Worker          if (!ctx->Const.UseVAOFastPath || stride_changed)
311*61046927SAndroid Build Coastguard Worker             ctx->Array.NewVertexElements = true;
312*61046927SAndroid Build Coastguard Worker       }
313*61046927SAndroid Build Coastguard Worker 
314*61046927SAndroid Build Coastguard Worker       vao->NonDefaultStateMask |= BITFIELD_BIT(index);
315*61046927SAndroid Build Coastguard Worker    } else {
316*61046927SAndroid Build Coastguard Worker       /* Since this function owns the vbo reference, it must release it if it
317*61046927SAndroid Build Coastguard Worker        * doesn't use it.
318*61046927SAndroid Build Coastguard Worker        */
319*61046927SAndroid Build Coastguard Worker       if (take_vbo_ownership)
320*61046927SAndroid Build Coastguard Worker          _mesa_reference_buffer_object(ctx, &vbo, NULL);
321*61046927SAndroid Build Coastguard Worker    }
322*61046927SAndroid Build Coastguard Worker }
323*61046927SAndroid Build Coastguard Worker 
324*61046927SAndroid Build Coastguard Worker 
325*61046927SAndroid Build Coastguard Worker /**
326*61046927SAndroid Build Coastguard Worker  * Sets the InstanceDivisor field in the vertex buffer binding point
327*61046927SAndroid Build Coastguard Worker  * given by bindingIndex.
328*61046927SAndroid Build Coastguard Worker  */
329*61046927SAndroid Build Coastguard Worker static void
vertex_binding_divisor(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint bindingIndex,GLuint divisor)330*61046927SAndroid Build Coastguard Worker vertex_binding_divisor(struct gl_context *ctx,
331*61046927SAndroid Build Coastguard Worker                        struct gl_vertex_array_object *vao,
332*61046927SAndroid Build Coastguard Worker                        GLuint bindingIndex,
333*61046927SAndroid Build Coastguard Worker                        GLuint divisor)
334*61046927SAndroid Build Coastguard Worker {
335*61046927SAndroid Build Coastguard Worker    struct gl_vertex_buffer_binding *binding =
336*61046927SAndroid Build Coastguard Worker       &vao->BufferBinding[bindingIndex];
337*61046927SAndroid Build Coastguard Worker    assert(!vao->SharedAndImmutable);
338*61046927SAndroid Build Coastguard Worker 
339*61046927SAndroid Build Coastguard Worker    if (binding->InstanceDivisor != divisor) {
340*61046927SAndroid Build Coastguard Worker       binding->InstanceDivisor = divisor;
341*61046927SAndroid Build Coastguard Worker 
342*61046927SAndroid Build Coastguard Worker       if (divisor)
343*61046927SAndroid Build Coastguard Worker          vao->NonZeroDivisorMask |= binding->_BoundArrays;
344*61046927SAndroid Build Coastguard Worker       else
345*61046927SAndroid Build Coastguard Worker          vao->NonZeroDivisorMask &= ~binding->_BoundArrays;
346*61046927SAndroid Build Coastguard Worker 
347*61046927SAndroid Build Coastguard Worker       if (vao->Enabled & binding->_BoundArrays) {
348*61046927SAndroid Build Coastguard Worker          ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
349*61046927SAndroid Build Coastguard Worker          ctx->Array.NewVertexElements = true;
350*61046927SAndroid Build Coastguard Worker       }
351*61046927SAndroid Build Coastguard Worker 
352*61046927SAndroid Build Coastguard Worker       vao->NonDefaultStateMask |= BITFIELD_BIT(bindingIndex);
353*61046927SAndroid Build Coastguard Worker    }
354*61046927SAndroid Build Coastguard Worker }
355*61046927SAndroid Build Coastguard Worker 
356*61046927SAndroid Build Coastguard Worker /* vertex_formats[(gltype & 0x3f) | (double << 5)][integer*2 + normalized][size - 1] */
357*61046927SAndroid Build Coastguard Worker static const uint8_t vertex_formats[][4][4] = {
358*61046927SAndroid Build Coastguard Worker    { /* GL_BYTE */
359*61046927SAndroid Build Coastguard Worker       {
360*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_SSCALED,
361*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8_SSCALED,
362*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8_SSCALED,
363*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8A8_SSCALED
364*61046927SAndroid Build Coastguard Worker       },
365*61046927SAndroid Build Coastguard Worker       {
366*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_SNORM,
367*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8_SNORM,
368*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8_SNORM,
369*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8A8_SNORM
370*61046927SAndroid Build Coastguard Worker       },
371*61046927SAndroid Build Coastguard Worker       {
372*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_SINT,
373*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8_SINT,
374*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8_SINT,
375*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8A8_SINT
376*61046927SAndroid Build Coastguard Worker       },
377*61046927SAndroid Build Coastguard Worker    },
378*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_BYTE */
379*61046927SAndroid Build Coastguard Worker       {
380*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_USCALED,
381*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8_USCALED,
382*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8_USCALED,
383*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8A8_USCALED
384*61046927SAndroid Build Coastguard Worker       },
385*61046927SAndroid Build Coastguard Worker       {
386*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_UNORM,
387*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8_UNORM,
388*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8_UNORM,
389*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8A8_UNORM
390*61046927SAndroid Build Coastguard Worker       },
391*61046927SAndroid Build Coastguard Worker       {
392*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8_UINT,
393*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8_UINT,
394*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8_UINT,
395*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R8G8B8A8_UINT
396*61046927SAndroid Build Coastguard Worker       },
397*61046927SAndroid Build Coastguard Worker    },
398*61046927SAndroid Build Coastguard Worker    { /* GL_SHORT */
399*61046927SAndroid Build Coastguard Worker       {
400*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_SSCALED,
401*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_SSCALED,
402*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_SSCALED,
403*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_SSCALED
404*61046927SAndroid Build Coastguard Worker       },
405*61046927SAndroid Build Coastguard Worker       {
406*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_SNORM,
407*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_SNORM,
408*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_SNORM,
409*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_SNORM
410*61046927SAndroid Build Coastguard Worker       },
411*61046927SAndroid Build Coastguard Worker       {
412*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_SINT,
413*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_SINT,
414*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_SINT,
415*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_SINT
416*61046927SAndroid Build Coastguard Worker       },
417*61046927SAndroid Build Coastguard Worker    },
418*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_SHORT */
419*61046927SAndroid Build Coastguard Worker       {
420*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_USCALED,
421*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_USCALED,
422*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_USCALED,
423*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_USCALED
424*61046927SAndroid Build Coastguard Worker       },
425*61046927SAndroid Build Coastguard Worker       {
426*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_UNORM,
427*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_UNORM,
428*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_UNORM,
429*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_UNORM
430*61046927SAndroid Build Coastguard Worker       },
431*61046927SAndroid Build Coastguard Worker       {
432*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_UINT,
433*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_UINT,
434*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_UINT,
435*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_UINT
436*61046927SAndroid Build Coastguard Worker       },
437*61046927SAndroid Build Coastguard Worker    },
438*61046927SAndroid Build Coastguard Worker    { /* GL_INT */
439*61046927SAndroid Build Coastguard Worker       {
440*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_SSCALED,
441*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_SSCALED,
442*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_SSCALED,
443*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_SSCALED
444*61046927SAndroid Build Coastguard Worker       },
445*61046927SAndroid Build Coastguard Worker       {
446*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_SNORM,
447*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_SNORM,
448*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_SNORM,
449*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_SNORM
450*61046927SAndroid Build Coastguard Worker       },
451*61046927SAndroid Build Coastguard Worker       {
452*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_SINT,
453*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_SINT,
454*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_SINT,
455*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_SINT
456*61046927SAndroid Build Coastguard Worker       },
457*61046927SAndroid Build Coastguard Worker    },
458*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_INT */
459*61046927SAndroid Build Coastguard Worker       {
460*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_USCALED,
461*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_USCALED,
462*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_USCALED,
463*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_USCALED
464*61046927SAndroid Build Coastguard Worker       },
465*61046927SAndroid Build Coastguard Worker       {
466*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_UNORM,
467*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_UNORM,
468*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_UNORM,
469*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_UNORM
470*61046927SAndroid Build Coastguard Worker       },
471*61046927SAndroid Build Coastguard Worker       {
472*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_UINT,
473*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_UINT,
474*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_UINT,
475*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_UINT
476*61046927SAndroid Build Coastguard Worker       },
477*61046927SAndroid Build Coastguard Worker    },
478*61046927SAndroid Build Coastguard Worker    { /* GL_FLOAT */
479*61046927SAndroid Build Coastguard Worker       {
480*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
481*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FLOAT,
482*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_FLOAT,
483*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_FLOAT
484*61046927SAndroid Build Coastguard Worker       },
485*61046927SAndroid Build Coastguard Worker       {
486*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FLOAT,
487*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FLOAT,
488*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_FLOAT,
489*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_FLOAT
490*61046927SAndroid Build Coastguard Worker       },
491*61046927SAndroid Build Coastguard Worker    },
492*61046927SAndroid Build Coastguard Worker    {{0}}, /* GL_2_BYTES */
493*61046927SAndroid Build Coastguard Worker    {{0}}, /* GL_3_BYTES */
494*61046927SAndroid Build Coastguard Worker    {{0}}, /* GL_4_BYTES */
495*61046927SAndroid Build Coastguard Worker    { /* GL_DOUBLE */
496*61046927SAndroid Build Coastguard Worker       {
497*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64_FLOAT,
498*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64G64_FLOAT,
499*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64G64B64_FLOAT,
500*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64G64B64A64_FLOAT
501*61046927SAndroid Build Coastguard Worker       },
502*61046927SAndroid Build Coastguard Worker       {
503*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64_FLOAT,
504*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64G64_FLOAT,
505*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64G64B64_FLOAT,
506*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R64G64B64A64_FLOAT
507*61046927SAndroid Build Coastguard Worker       },
508*61046927SAndroid Build Coastguard Worker    },
509*61046927SAndroid Build Coastguard Worker    { /* GL_HALF_FLOAT */
510*61046927SAndroid Build Coastguard Worker       {
511*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_FLOAT,
512*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_FLOAT,
513*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_FLOAT,
514*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_FLOAT
515*61046927SAndroid Build Coastguard Worker       },
516*61046927SAndroid Build Coastguard Worker       {
517*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_FLOAT,
518*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_FLOAT,
519*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_FLOAT,
520*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_FLOAT
521*61046927SAndroid Build Coastguard Worker       },
522*61046927SAndroid Build Coastguard Worker    },
523*61046927SAndroid Build Coastguard Worker    { /* GL_FIXED */
524*61046927SAndroid Build Coastguard Worker       {
525*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FIXED,
526*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FIXED,
527*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_FIXED,
528*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_FIXED
529*61046927SAndroid Build Coastguard Worker       },
530*61046927SAndroid Build Coastguard Worker       {
531*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32_FIXED,
532*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32_FIXED,
533*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32_FIXED,
534*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R32G32B32A32_FIXED
535*61046927SAndroid Build Coastguard Worker       },
536*61046927SAndroid Build Coastguard Worker    },
537*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (13) */
538*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (14) */
539*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (15) */
540*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (16) */
541*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (17) */
542*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (18) */
543*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (19) */
544*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (20) */
545*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (21) */
546*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (22) */
547*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (23) */
548*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (24) */
549*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (25) */
550*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (26) */
551*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (27) */
552*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (28) */
553*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (29) */
554*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (30) */
555*61046927SAndroid Build Coastguard Worker    { /* GL_INT_2_10_10_10_REV */
556*61046927SAndroid Build Coastguard Worker       {
557*61046927SAndroid Build Coastguard Worker          0,
558*61046927SAndroid Build Coastguard Worker          0,
559*61046927SAndroid Build Coastguard Worker          0,
560*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R10G10B10A2_SSCALED
561*61046927SAndroid Build Coastguard Worker       },
562*61046927SAndroid Build Coastguard Worker       {
563*61046927SAndroid Build Coastguard Worker          0,
564*61046927SAndroid Build Coastguard Worker          0,
565*61046927SAndroid Build Coastguard Worker          0,
566*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R10G10B10A2_SNORM
567*61046927SAndroid Build Coastguard Worker       },
568*61046927SAndroid Build Coastguard Worker    },
569*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (32) */
570*61046927SAndroid Build Coastguard Worker    { /* GL_HALF_FLOAT_OES */
571*61046927SAndroid Build Coastguard Worker       {
572*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_FLOAT,
573*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_FLOAT,
574*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_FLOAT,
575*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_FLOAT
576*61046927SAndroid Build Coastguard Worker       },
577*61046927SAndroid Build Coastguard Worker       {
578*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16_FLOAT,
579*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16_FLOAT,
580*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16_FLOAT,
581*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R16G16B16A16_FLOAT
582*61046927SAndroid Build Coastguard Worker       },
583*61046927SAndroid Build Coastguard Worker    },
584*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (34) */
585*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (35) */
586*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (36) */
587*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (37) */
588*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (38) */
589*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (39) */
590*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_INT_2_10_10_10_REV */
591*61046927SAndroid Build Coastguard Worker       {
592*61046927SAndroid Build Coastguard Worker          0,
593*61046927SAndroid Build Coastguard Worker          0,
594*61046927SAndroid Build Coastguard Worker          0,
595*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R10G10B10A2_USCALED
596*61046927SAndroid Build Coastguard Worker       },
597*61046927SAndroid Build Coastguard Worker       {
598*61046927SAndroid Build Coastguard Worker          0,
599*61046927SAndroid Build Coastguard Worker          0,
600*61046927SAndroid Build Coastguard Worker          0,
601*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R10G10B10A2_UNORM
602*61046927SAndroid Build Coastguard Worker       },
603*61046927SAndroid Build Coastguard Worker    },
604*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (41) */
605*61046927SAndroid Build Coastguard Worker    { /* GL_DOUBLE | (doubles << 5) (real double) */
606*61046927SAndroid Build Coastguard Worker      {
607*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64_UINT,
608*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64G64_UINT,
609*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64G64B64_UINT,
610*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64G64B64A64_UINT,
611*61046927SAndroid Build Coastguard Worker      },
612*61046927SAndroid Build Coastguard Worker    },
613*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (43) */
614*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (44) */
615*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (45) */
616*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (46) */
617*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_INT64_ARB | (doubles << 5) (doubles is always true) */
618*61046927SAndroid Build Coastguard Worker      {0},
619*61046927SAndroid Build Coastguard Worker      {0},
620*61046927SAndroid Build Coastguard Worker      {
621*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64_UINT,
622*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64G64_UINT,
623*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64G64B64_UINT,
624*61046927SAndroid Build Coastguard Worker         PIPE_FORMAT_R64G64B64A64_UINT,
625*61046927SAndroid Build Coastguard Worker      },
626*61046927SAndroid Build Coastguard Worker    },
627*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (48) */
628*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (49) */
629*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (50) */
630*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (51) */
631*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (52) */
632*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (53) */
633*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (54) */
634*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (55) */
635*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (56) */
636*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (57) */
637*61046927SAndroid Build Coastguard Worker    {{0}}, /* unused (58) */
638*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_INT_10F_11F_11F_REV */
639*61046927SAndroid Build Coastguard Worker       {
640*61046927SAndroid Build Coastguard Worker          0,
641*61046927SAndroid Build Coastguard Worker          0,
642*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R11G11B10_FLOAT,
643*61046927SAndroid Build Coastguard Worker          0
644*61046927SAndroid Build Coastguard Worker       },
645*61046927SAndroid Build Coastguard Worker       {
646*61046927SAndroid Build Coastguard Worker          0,
647*61046927SAndroid Build Coastguard Worker          0,
648*61046927SAndroid Build Coastguard Worker          PIPE_FORMAT_R11G11B10_FLOAT,
649*61046927SAndroid Build Coastguard Worker          0
650*61046927SAndroid Build Coastguard Worker       },
651*61046927SAndroid Build Coastguard Worker    },
652*61046927SAndroid Build Coastguard Worker };
653*61046927SAndroid Build Coastguard Worker 
654*61046927SAndroid Build Coastguard Worker /* bgra_vertex_formats[type & 0x3][normalized] */
655*61046927SAndroid Build Coastguard Worker static const uint8_t bgra_vertex_formats[4][2] = {
656*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_INT_2_10_10_10_REV */
657*61046927SAndroid Build Coastguard Worker       PIPE_FORMAT_B10G10R10A2_USCALED,
658*61046927SAndroid Build Coastguard Worker       PIPE_FORMAT_B10G10R10A2_UNORM
659*61046927SAndroid Build Coastguard Worker    },
660*61046927SAndroid Build Coastguard Worker    { /* GL_UNSIGNED_BYTE */
661*61046927SAndroid Build Coastguard Worker       0,
662*61046927SAndroid Build Coastguard Worker       PIPE_FORMAT_B8G8R8A8_UNORM
663*61046927SAndroid Build Coastguard Worker    },
664*61046927SAndroid Build Coastguard Worker    {0}, /* unused (2) */
665*61046927SAndroid Build Coastguard Worker    { /* GL_INT_2_10_10_10_REV */
666*61046927SAndroid Build Coastguard Worker       PIPE_FORMAT_B10G10R10A2_SSCALED,
667*61046927SAndroid Build Coastguard Worker       PIPE_FORMAT_B10G10R10A2_SNORM
668*61046927SAndroid Build Coastguard Worker    }
669*61046927SAndroid Build Coastguard Worker };
670*61046927SAndroid Build Coastguard Worker 
671*61046927SAndroid Build Coastguard Worker /**
672*61046927SAndroid Build Coastguard Worker  * Return a PIPE_FORMAT_x for the given GL datatype and size.
673*61046927SAndroid Build Coastguard Worker  */
674*61046927SAndroid Build Coastguard Worker static enum pipe_format
vertex_format_to_pipe_format(GLubyte size,GLenum16 type,GLenum16 format,bool normalized,bool integer,bool doubles)675*61046927SAndroid Build Coastguard Worker vertex_format_to_pipe_format(GLubyte size, GLenum16 type, GLenum16 format,
676*61046927SAndroid Build Coastguard Worker                              bool normalized, bool integer, bool doubles)
677*61046927SAndroid Build Coastguard Worker {
678*61046927SAndroid Build Coastguard Worker    assert(size >= 1 && size <= 4);
679*61046927SAndroid Build Coastguard Worker    assert(format == GL_RGBA || format == GL_BGRA);
680*61046927SAndroid Build Coastguard Worker 
681*61046927SAndroid Build Coastguard Worker    if (format == GL_BGRA) {
682*61046927SAndroid Build Coastguard Worker       assert(size == 4 && !integer);
683*61046927SAndroid Build Coastguard Worker       assert(type == GL_UNSIGNED_BYTE ||
684*61046927SAndroid Build Coastguard Worker              type == GL_INT_2_10_10_10_REV ||
685*61046927SAndroid Build Coastguard Worker              type == GL_UNSIGNED_INT_2_10_10_10_REV);
686*61046927SAndroid Build Coastguard Worker 
687*61046927SAndroid Build Coastguard Worker       enum pipe_format pipe_format =
688*61046927SAndroid Build Coastguard Worker          bgra_vertex_formats[type & 0x3][normalized];
689*61046927SAndroid Build Coastguard Worker       assert(pipe_format);
690*61046927SAndroid Build Coastguard Worker       return pipe_format;
691*61046927SAndroid Build Coastguard Worker    }
692*61046927SAndroid Build Coastguard Worker 
693*61046927SAndroid Build Coastguard Worker    unsigned index = integer*2 + normalized;
694*61046927SAndroid Build Coastguard Worker    assert(index <= 2);
695*61046927SAndroid Build Coastguard Worker    assert((type >= GL_BYTE && type <= GL_FIXED) ||
696*61046927SAndroid Build Coastguard Worker           type == GL_HALF_FLOAT_OES ||
697*61046927SAndroid Build Coastguard Worker           type == GL_INT_2_10_10_10_REV ||
698*61046927SAndroid Build Coastguard Worker           type == GL_UNSIGNED_INT_2_10_10_10_REV ||
699*61046927SAndroid Build Coastguard Worker           type == GL_UNSIGNED_INT_10F_11F_11F_REV ||
700*61046927SAndroid Build Coastguard Worker           (type == GL_UNSIGNED_INT64_ARB && doubles));
701*61046927SAndroid Build Coastguard Worker 
702*61046927SAndroid Build Coastguard Worker    enum pipe_format pipe_format =
703*61046927SAndroid Build Coastguard Worker       vertex_formats[(type & 0x3f) | ((int)doubles << 5)][index][size-1];
704*61046927SAndroid Build Coastguard Worker    assert(pipe_format);
705*61046927SAndroid Build Coastguard Worker    return pipe_format;
706*61046927SAndroid Build Coastguard Worker }
707*61046927SAndroid Build Coastguard Worker 
708*61046927SAndroid Build Coastguard Worker static void
set_vertex_format_user(union gl_vertex_format_user * vertex_format,GLubyte size,GLenum16 type,GLenum16 format,GLboolean normalized,GLboolean integer,GLboolean doubles)709*61046927SAndroid Build Coastguard Worker set_vertex_format_user(union gl_vertex_format_user *vertex_format,
710*61046927SAndroid Build Coastguard Worker                        GLubyte size, GLenum16 type, GLenum16 format,
711*61046927SAndroid Build Coastguard Worker                        GLboolean normalized, GLboolean integer,
712*61046927SAndroid Build Coastguard Worker                        GLboolean doubles)
713*61046927SAndroid Build Coastguard Worker {
714*61046927SAndroid Build Coastguard Worker    assert(size <= 4);
715*61046927SAndroid Build Coastguard Worker    vertex_format->Type = type;
716*61046927SAndroid Build Coastguard Worker    vertex_format->Bgra = format == GL_BGRA;
717*61046927SAndroid Build Coastguard Worker    vertex_format->Size = size;
718*61046927SAndroid Build Coastguard Worker    vertex_format->Normalized = normalized;
719*61046927SAndroid Build Coastguard Worker    vertex_format->Integer = integer;
720*61046927SAndroid Build Coastguard Worker    vertex_format->Doubles = doubles;
721*61046927SAndroid Build Coastguard Worker }
722*61046927SAndroid Build Coastguard Worker 
723*61046927SAndroid Build Coastguard Worker static void
recompute_vertex_format_fields(struct gl_vertex_format * vertex_format,GLubyte size,GLenum16 type,GLenum16 format,GLboolean normalized,GLboolean integer,GLboolean doubles)724*61046927SAndroid Build Coastguard Worker recompute_vertex_format_fields(struct gl_vertex_format *vertex_format,
725*61046927SAndroid Build Coastguard Worker                                GLubyte size, GLenum16 type, GLenum16 format,
726*61046927SAndroid Build Coastguard Worker                                GLboolean normalized, GLboolean integer,
727*61046927SAndroid Build Coastguard Worker                                GLboolean doubles)
728*61046927SAndroid Build Coastguard Worker {
729*61046927SAndroid Build Coastguard Worker    vertex_format->_ElementSize = _mesa_bytes_per_vertex_attrib(size, type);
730*61046927SAndroid Build Coastguard Worker    assert(vertex_format->_ElementSize <= 4*sizeof(double));
731*61046927SAndroid Build Coastguard Worker    vertex_format->_PipeFormat =
732*61046927SAndroid Build Coastguard Worker       vertex_format_to_pipe_format(size, type, format, normalized, integer,
733*61046927SAndroid Build Coastguard Worker                                    doubles);
734*61046927SAndroid Build Coastguard Worker    /* pipe_vertex_element::src_format has only 8 bits, assuming a signed enum */
735*61046927SAndroid Build Coastguard Worker    assert(vertex_format->_PipeFormat <= 255);
736*61046927SAndroid Build Coastguard Worker }
737*61046927SAndroid Build Coastguard Worker 
738*61046927SAndroid Build Coastguard Worker void
_mesa_set_vertex_format(struct gl_vertex_format * vertex_format,GLubyte size,GLenum16 type,GLenum16 format,GLboolean normalized,GLboolean integer,GLboolean doubles)739*61046927SAndroid Build Coastguard Worker _mesa_set_vertex_format(struct gl_vertex_format *vertex_format,
740*61046927SAndroid Build Coastguard Worker                         GLubyte size, GLenum16 type, GLenum16 format,
741*61046927SAndroid Build Coastguard Worker                         GLboolean normalized, GLboolean integer,
742*61046927SAndroid Build Coastguard Worker                         GLboolean doubles)
743*61046927SAndroid Build Coastguard Worker {
744*61046927SAndroid Build Coastguard Worker    set_vertex_format_user(&vertex_format->User, size, type, format,
745*61046927SAndroid Build Coastguard Worker                           normalized, integer, doubles);
746*61046927SAndroid Build Coastguard Worker    recompute_vertex_format_fields(vertex_format, size, type, format,
747*61046927SAndroid Build Coastguard Worker                                   normalized, integer, doubles);
748*61046927SAndroid Build Coastguard Worker }
749*61046927SAndroid Build Coastguard Worker 
750*61046927SAndroid Build Coastguard Worker 
751*61046927SAndroid Build Coastguard Worker /**
752*61046927SAndroid Build Coastguard Worker  * Examine the API profile and extensions to determine which types are legal
753*61046927SAndroid Build Coastguard Worker  * for vertex arrays.  This is called once from update_array_format().
754*61046927SAndroid Build Coastguard Worker  */
755*61046927SAndroid Build Coastguard Worker static GLbitfield
get_legal_types_mask(const struct gl_context * ctx)756*61046927SAndroid Build Coastguard Worker get_legal_types_mask(const struct gl_context *ctx)
757*61046927SAndroid Build Coastguard Worker {
758*61046927SAndroid Build Coastguard Worker    GLbitfield legalTypesMask = ALL_TYPE_BITS;
759*61046927SAndroid Build Coastguard Worker 
760*61046927SAndroid Build Coastguard Worker    if (_mesa_is_gles(ctx)) {
761*61046927SAndroid Build Coastguard Worker       legalTypesMask &= ~(FIXED_GL_BIT |
762*61046927SAndroid Build Coastguard Worker                           DOUBLE_BIT |
763*61046927SAndroid Build Coastguard Worker                           UNSIGNED_INT_10F_11F_11F_REV_BIT |
764*61046927SAndroid Build Coastguard Worker                           UNSIGNED_INT64_BIT);
765*61046927SAndroid Build Coastguard Worker 
766*61046927SAndroid Build Coastguard Worker       /* GL_INT and GL_UNSIGNED_INT data is not allowed in OpenGL ES until
767*61046927SAndroid Build Coastguard Worker        * 3.0.  The 2_10_10_10 types are added in OpenGL ES 3.0 or
768*61046927SAndroid Build Coastguard Worker        * GL_OES_vertex_type_10_10_10_2.  GL_HALF_FLOAT data is not allowed
769*61046927SAndroid Build Coastguard Worker        * until 3.0 or with the GL_OES_vertex_half float extension, which isn't
770*61046927SAndroid Build Coastguard Worker        * quite as trivial as we'd like because it uses a different enum value
771*61046927SAndroid Build Coastguard Worker        * for GL_HALF_FLOAT_OES.
772*61046927SAndroid Build Coastguard Worker        */
773*61046927SAndroid Build Coastguard Worker       if (ctx->Version < 30) {
774*61046927SAndroid Build Coastguard Worker          legalTypesMask &= ~(UNSIGNED_INT_BIT |
775*61046927SAndroid Build Coastguard Worker                              INT_BIT |
776*61046927SAndroid Build Coastguard Worker                              UNSIGNED_INT_2_10_10_10_REV_BIT |
777*61046927SAndroid Build Coastguard Worker                              INT_2_10_10_10_REV_BIT);
778*61046927SAndroid Build Coastguard Worker 
779*61046927SAndroid Build Coastguard Worker          if (!_mesa_has_OES_vertex_half_float(ctx))
780*61046927SAndroid Build Coastguard Worker             legalTypesMask &= ~HALF_BIT;
781*61046927SAndroid Build Coastguard Worker       }
782*61046927SAndroid Build Coastguard Worker    }
783*61046927SAndroid Build Coastguard Worker    else {
784*61046927SAndroid Build Coastguard Worker       legalTypesMask &= ~FIXED_ES_BIT;
785*61046927SAndroid Build Coastguard Worker 
786*61046927SAndroid Build Coastguard Worker       if (!ctx->Extensions.ARB_ES2_compatibility)
787*61046927SAndroid Build Coastguard Worker          legalTypesMask &= ~FIXED_GL_BIT;
788*61046927SAndroid Build Coastguard Worker 
789*61046927SAndroid Build Coastguard Worker       if (!ctx->Extensions.ARB_vertex_type_2_10_10_10_rev)
790*61046927SAndroid Build Coastguard Worker          legalTypesMask &= ~(UNSIGNED_INT_2_10_10_10_REV_BIT |
791*61046927SAndroid Build Coastguard Worker                              INT_2_10_10_10_REV_BIT);
792*61046927SAndroid Build Coastguard Worker 
793*61046927SAndroid Build Coastguard Worker       if (!ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev)
794*61046927SAndroid Build Coastguard Worker          legalTypesMask &= ~UNSIGNED_INT_10F_11F_11F_REV_BIT;
795*61046927SAndroid Build Coastguard Worker 
796*61046927SAndroid Build Coastguard Worker       if (!ctx->Extensions.ARB_bindless_texture)
797*61046927SAndroid Build Coastguard Worker          legalTypesMask &= ~UNSIGNED_INT64_BIT;
798*61046927SAndroid Build Coastguard Worker    }
799*61046927SAndroid Build Coastguard Worker 
800*61046927SAndroid Build Coastguard Worker    return legalTypesMask;
801*61046927SAndroid Build Coastguard Worker }
802*61046927SAndroid Build Coastguard Worker 
803*61046927SAndroid Build Coastguard Worker static GLenum
get_array_format(const struct gl_context * ctx,GLint sizeMax,GLint * size)804*61046927SAndroid Build Coastguard Worker get_array_format(const struct gl_context *ctx, GLint sizeMax, GLint *size)
805*61046927SAndroid Build Coastguard Worker {
806*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
807*61046927SAndroid Build Coastguard Worker 
808*61046927SAndroid Build Coastguard Worker    /* Do size parameter checking.
809*61046927SAndroid Build Coastguard Worker     * If sizeMax = BGRA_OR_4 it means that size = GL_BGRA is legal and
810*61046927SAndroid Build Coastguard Worker     * must be handled specially.
811*61046927SAndroid Build Coastguard Worker     */
812*61046927SAndroid Build Coastguard Worker    if (ctx->Extensions.EXT_vertex_array_bgra && sizeMax == BGRA_OR_4 &&
813*61046927SAndroid Build Coastguard Worker        *size == GL_BGRA) {
814*61046927SAndroid Build Coastguard Worker       format = GL_BGRA;
815*61046927SAndroid Build Coastguard Worker       *size = 4;
816*61046927SAndroid Build Coastguard Worker    }
817*61046927SAndroid Build Coastguard Worker 
818*61046927SAndroid Build Coastguard Worker    return format;
819*61046927SAndroid Build Coastguard Worker }
820*61046927SAndroid Build Coastguard Worker 
821*61046927SAndroid Build Coastguard Worker 
822*61046927SAndroid Build Coastguard Worker /**
823*61046927SAndroid Build Coastguard Worker  * \param attrib         The index of the attribute array
824*61046927SAndroid Build Coastguard Worker  * \param size           Components per element (1, 2, 3 or 4)
825*61046927SAndroid Build Coastguard Worker  * \param type           Datatype of each component (GL_FLOAT, GL_INT, etc)
826*61046927SAndroid Build Coastguard Worker  * \param format         Either GL_RGBA or GL_BGRA.
827*61046927SAndroid Build Coastguard Worker  * \param normalized     Whether integer types are converted to floats in [-1, 1]
828*61046927SAndroid Build Coastguard Worker  * \param integer        Integer-valued values (will not be normalized to [-1, 1])
829*61046927SAndroid Build Coastguard Worker  * \param doubles        Double values not reduced to floats
830*61046927SAndroid Build Coastguard Worker  * \param relativeOffset Offset of the first element relative to the binding
831*61046927SAndroid Build Coastguard Worker  *                       offset.
832*61046927SAndroid Build Coastguard Worker  */
833*61046927SAndroid Build Coastguard Worker void
_mesa_update_array_format(struct gl_context * ctx,struct gl_vertex_array_object * vao,gl_vert_attrib attrib,GLint size,GLenum type,GLenum format,GLboolean normalized,GLboolean integer,GLboolean doubles,GLuint relativeOffset)834*61046927SAndroid Build Coastguard Worker _mesa_update_array_format(struct gl_context *ctx,
835*61046927SAndroid Build Coastguard Worker                           struct gl_vertex_array_object *vao,
836*61046927SAndroid Build Coastguard Worker                           gl_vert_attrib attrib, GLint size, GLenum type,
837*61046927SAndroid Build Coastguard Worker                           GLenum format, GLboolean normalized,
838*61046927SAndroid Build Coastguard Worker                           GLboolean integer, GLboolean doubles,
839*61046927SAndroid Build Coastguard Worker                           GLuint relativeOffset)
840*61046927SAndroid Build Coastguard Worker {
841*61046927SAndroid Build Coastguard Worker    struct gl_array_attributes *const array = &vao->VertexAttrib[attrib];
842*61046927SAndroid Build Coastguard Worker    union gl_vertex_format_user new_format;
843*61046927SAndroid Build Coastguard Worker 
844*61046927SAndroid Build Coastguard Worker    assert(!vao->SharedAndImmutable);
845*61046927SAndroid Build Coastguard Worker    assert(size <= 4);
846*61046927SAndroid Build Coastguard Worker 
847*61046927SAndroid Build Coastguard Worker    set_vertex_format_user(&new_format, size, type, format,
848*61046927SAndroid Build Coastguard Worker                           normalized, integer, doubles);
849*61046927SAndroid Build Coastguard Worker 
850*61046927SAndroid Build Coastguard Worker    if (array->RelativeOffset == relativeOffset &&
851*61046927SAndroid Build Coastguard Worker        array->Format.User.All == new_format.All)
852*61046927SAndroid Build Coastguard Worker       return;
853*61046927SAndroid Build Coastguard Worker 
854*61046927SAndroid Build Coastguard Worker    array->RelativeOffset = relativeOffset;
855*61046927SAndroid Build Coastguard Worker    array->Format.User = new_format;
856*61046927SAndroid Build Coastguard Worker    recompute_vertex_format_fields(&array->Format, size, type, format,
857*61046927SAndroid Build Coastguard Worker                                   normalized, integer, doubles);
858*61046927SAndroid Build Coastguard Worker 
859*61046927SAndroid Build Coastguard Worker    if (vao->Enabled & VERT_BIT(attrib)) {
860*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
861*61046927SAndroid Build Coastguard Worker       ctx->Array.NewVertexElements = true;
862*61046927SAndroid Build Coastguard Worker    }
863*61046927SAndroid Build Coastguard Worker 
864*61046927SAndroid Build Coastguard Worker    vao->NonDefaultStateMask |= BITFIELD_BIT(attrib);
865*61046927SAndroid Build Coastguard Worker }
866*61046927SAndroid Build Coastguard Worker 
867*61046927SAndroid Build Coastguard Worker /**
868*61046927SAndroid Build Coastguard Worker  * Does error checking of the format in an attrib array.
869*61046927SAndroid Build Coastguard Worker  *
870*61046927SAndroid Build Coastguard Worker  * Called by *Pointer() and VertexAttrib*Format().
871*61046927SAndroid Build Coastguard Worker  *
872*61046927SAndroid Build Coastguard Worker  * \param func         Name of calling function used for error reporting
873*61046927SAndroid Build Coastguard Worker  * \param attrib       The index of the attribute array
874*61046927SAndroid Build Coastguard Worker  * \param legalTypes   Bitmask of *_BIT above indicating legal datatypes
875*61046927SAndroid Build Coastguard Worker  * \param sizeMin      Min allowable size value
876*61046927SAndroid Build Coastguard Worker  * \param sizeMax      Max allowable size value (may also be BGRA_OR_4)
877*61046927SAndroid Build Coastguard Worker  * \param size         Components per element (1, 2, 3 or 4)
878*61046927SAndroid Build Coastguard Worker  * \param type         Datatype of each component (GL_FLOAT, GL_INT, etc)
879*61046927SAndroid Build Coastguard Worker  * \param normalized   Whether integer types are converted to floats in [-1, 1]
880*61046927SAndroid Build Coastguard Worker  * \param integer      Integer-valued values (will not be normalized to [-1, 1])
881*61046927SAndroid Build Coastguard Worker  * \param doubles      Double values not reduced to floats
882*61046927SAndroid Build Coastguard Worker  * \param relativeOffset Offset of the first element relative to the binding offset.
883*61046927SAndroid Build Coastguard Worker  * \return bool True if validation is successful, False otherwise.
884*61046927SAndroid Build Coastguard Worker  */
885*61046927SAndroid Build Coastguard Worker static bool
validate_array_format(struct gl_context * ctx,const char * func,struct gl_vertex_array_object * vao,GLuint attrib,GLbitfield legalTypesMask,GLint sizeMin,GLint sizeMax,GLint size,GLenum type,bool normalized,bool integer,bool doubles,GLuint relativeOffset,GLenum format)886*61046927SAndroid Build Coastguard Worker validate_array_format(struct gl_context *ctx, const char *func,
887*61046927SAndroid Build Coastguard Worker                       struct gl_vertex_array_object *vao,
888*61046927SAndroid Build Coastguard Worker                       GLuint attrib, GLbitfield legalTypesMask,
889*61046927SAndroid Build Coastguard Worker                       GLint sizeMin, GLint sizeMax,
890*61046927SAndroid Build Coastguard Worker                       GLint size, GLenum type, bool normalized,
891*61046927SAndroid Build Coastguard Worker                       bool integer, bool doubles,
892*61046927SAndroid Build Coastguard Worker                       GLuint relativeOffset, GLenum format)
893*61046927SAndroid Build Coastguard Worker {
894*61046927SAndroid Build Coastguard Worker    GLbitfield typeBit;
895*61046927SAndroid Build Coastguard Worker 
896*61046927SAndroid Build Coastguard Worker    /* at most, one of these bools can be true */
897*61046927SAndroid Build Coastguard Worker    assert((int) normalized + (int) integer + (int) doubles <= 1);
898*61046927SAndroid Build Coastguard Worker 
899*61046927SAndroid Build Coastguard Worker    if (ctx->Array.LegalTypesMask == 0 || ctx->Array.LegalTypesMaskAPI != ctx->API) {
900*61046927SAndroid Build Coastguard Worker       /* Compute the LegalTypesMask only once, unless the context API has
901*61046927SAndroid Build Coastguard Worker        * changed, in which case we want to compute it again.  We can't do this
902*61046927SAndroid Build Coastguard Worker        * in _mesa_init_varrays() below because extensions are not yet enabled
903*61046927SAndroid Build Coastguard Worker        * at that point.
904*61046927SAndroid Build Coastguard Worker        */
905*61046927SAndroid Build Coastguard Worker       ctx->Array.LegalTypesMask = get_legal_types_mask(ctx);
906*61046927SAndroid Build Coastguard Worker       ctx->Array.LegalTypesMaskAPI = ctx->API;
907*61046927SAndroid Build Coastguard Worker    }
908*61046927SAndroid Build Coastguard Worker 
909*61046927SAndroid Build Coastguard Worker    legalTypesMask &= ctx->Array.LegalTypesMask;
910*61046927SAndroid Build Coastguard Worker 
911*61046927SAndroid Build Coastguard Worker    if (_mesa_is_gles(ctx) && sizeMax == BGRA_OR_4) {
912*61046927SAndroid Build Coastguard Worker       /* BGRA ordering is not supported in ES contexts.
913*61046927SAndroid Build Coastguard Worker        */
914*61046927SAndroid Build Coastguard Worker       sizeMax = 4;
915*61046927SAndroid Build Coastguard Worker    }
916*61046927SAndroid Build Coastguard Worker 
917*61046927SAndroid Build Coastguard Worker    typeBit = type_to_bit(ctx, type);
918*61046927SAndroid Build Coastguard Worker    if (typeBit == 0x0 || (typeBit & legalTypesMask) == 0x0) {
919*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "%s(type = %s)",
920*61046927SAndroid Build Coastguard Worker                   func, _mesa_enum_to_string(type));
921*61046927SAndroid Build Coastguard Worker       return false;
922*61046927SAndroid Build Coastguard Worker    }
923*61046927SAndroid Build Coastguard Worker 
924*61046927SAndroid Build Coastguard Worker    if (format == GL_BGRA) {
925*61046927SAndroid Build Coastguard Worker       /* Page 298 of the PDF of the OpenGL 4.3 (Core Profile) spec says:
926*61046927SAndroid Build Coastguard Worker        *
927*61046927SAndroid Build Coastguard Worker        * "An INVALID_OPERATION error is generated under any of the following
928*61046927SAndroid Build Coastguard Worker        *  conditions:
929*61046927SAndroid Build Coastguard Worker        *    ...
930*61046927SAndroid Build Coastguard Worker        *    • size is BGRA and type is not UNSIGNED_BYTE, INT_2_10_10_10_REV
931*61046927SAndroid Build Coastguard Worker        *      or UNSIGNED_INT_2_10_10_10_REV;
932*61046927SAndroid Build Coastguard Worker        *    ...
933*61046927SAndroid Build Coastguard Worker        *    • size is BGRA and normalized is FALSE;"
934*61046927SAndroid Build Coastguard Worker        */
935*61046927SAndroid Build Coastguard Worker       bool bgra_error = false;
936*61046927SAndroid Build Coastguard Worker 
937*61046927SAndroid Build Coastguard Worker       if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev) {
938*61046927SAndroid Build Coastguard Worker          if (type != GL_UNSIGNED_INT_2_10_10_10_REV &&
939*61046927SAndroid Build Coastguard Worker              type != GL_INT_2_10_10_10_REV &&
940*61046927SAndroid Build Coastguard Worker              type != GL_UNSIGNED_BYTE)
941*61046927SAndroid Build Coastguard Worker             bgra_error = true;
942*61046927SAndroid Build Coastguard Worker       } else if (type != GL_UNSIGNED_BYTE)
943*61046927SAndroid Build Coastguard Worker          bgra_error = true;
944*61046927SAndroid Build Coastguard Worker 
945*61046927SAndroid Build Coastguard Worker       if (bgra_error) {
946*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=GL_BGRA and type=%s)",
947*61046927SAndroid Build Coastguard Worker                      func, _mesa_enum_to_string(type));
948*61046927SAndroid Build Coastguard Worker          return false;
949*61046927SAndroid Build Coastguard Worker       }
950*61046927SAndroid Build Coastguard Worker 
951*61046927SAndroid Build Coastguard Worker       if (!normalized) {
952*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION,
953*61046927SAndroid Build Coastguard Worker                      "%s(size=GL_BGRA and normalized=GL_FALSE)", func);
954*61046927SAndroid Build Coastguard Worker          return false;
955*61046927SAndroid Build Coastguard Worker       }
956*61046927SAndroid Build Coastguard Worker    }
957*61046927SAndroid Build Coastguard Worker    else if (size < sizeMin || size > sizeMax || size > 4) {
958*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "%s(size=%d)", func, size);
959*61046927SAndroid Build Coastguard Worker       return false;
960*61046927SAndroid Build Coastguard Worker    }
961*61046927SAndroid Build Coastguard Worker 
962*61046927SAndroid Build Coastguard Worker    if (ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
963*61046927SAndroid Build Coastguard Worker        (type == GL_UNSIGNED_INT_2_10_10_10_REV ||
964*61046927SAndroid Build Coastguard Worker         type == GL_INT_2_10_10_10_REV) && size != 4) {
965*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
966*61046927SAndroid Build Coastguard Worker       return false;
967*61046927SAndroid Build Coastguard Worker    }
968*61046927SAndroid Build Coastguard Worker 
969*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding_spec says:
970*61046927SAndroid Build Coastguard Worker     *
971*61046927SAndroid Build Coastguard Worker     *   An INVALID_VALUE error is generated if <relativeoffset> is larger than
972*61046927SAndroid Build Coastguard Worker     *   the value of MAX_VERTEX_ATTRIB_RELATIVE_OFFSET.
973*61046927SAndroid Build Coastguard Worker     */
974*61046927SAndroid Build Coastguard Worker    if (relativeOffset > ctx->Const.MaxVertexAttribRelativeOffset) {
975*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
976*61046927SAndroid Build Coastguard Worker                   "%s(relativeOffset=%d > "
977*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET)",
978*61046927SAndroid Build Coastguard Worker                   func, relativeOffset);
979*61046927SAndroid Build Coastguard Worker       return false;
980*61046927SAndroid Build Coastguard Worker    }
981*61046927SAndroid Build Coastguard Worker 
982*61046927SAndroid Build Coastguard Worker    if (ctx->Extensions.ARB_vertex_type_10f_11f_11f_rev &&
983*61046927SAndroid Build Coastguard Worker          type == GL_UNSIGNED_INT_10F_11F_11F_REV && size != 3) {
984*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "%s(size=%d)", func, size);
985*61046927SAndroid Build Coastguard Worker       return false;
986*61046927SAndroid Build Coastguard Worker    }
987*61046927SAndroid Build Coastguard Worker 
988*61046927SAndroid Build Coastguard Worker    return true;
989*61046927SAndroid Build Coastguard Worker }
990*61046927SAndroid Build Coastguard Worker 
991*61046927SAndroid Build Coastguard Worker /**
992*61046927SAndroid Build Coastguard Worker  * Do error checking for glVertex/Color/TexCoord/...Pointer functions.
993*61046927SAndroid Build Coastguard Worker  *
994*61046927SAndroid Build Coastguard Worker  * \param func  name of calling function used for error reporting
995*61046927SAndroid Build Coastguard Worker  * \param vao the vao to update
996*61046927SAndroid Build Coastguard Worker  * \param obj the bound buffer object
997*61046927SAndroid Build Coastguard Worker  * \param attrib  the attribute array index to update
998*61046927SAndroid Build Coastguard Worker  * \param legalTypes  bitmask of *_BIT above indicating legal datatypes
999*61046927SAndroid Build Coastguard Worker  * \param sizeMin  min allowable size value
1000*61046927SAndroid Build Coastguard Worker  * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
1001*61046927SAndroid Build Coastguard Worker  * \param size  components per element (1, 2, 3 or 4)
1002*61046927SAndroid Build Coastguard Worker  * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
1003*61046927SAndroid Build Coastguard Worker  * \param stride  stride between elements, in elements
1004*61046927SAndroid Build Coastguard Worker  * \param normalized  are integer types converted to floats in [-1, 1]?
1005*61046927SAndroid Build Coastguard Worker  * \param integer  integer-valued values (will not be normalized to [-1,1])
1006*61046927SAndroid Build Coastguard Worker  * \param doubles  Double values not reduced to floats
1007*61046927SAndroid Build Coastguard Worker  * \param ptr  the address (or offset inside VBO) of the array data
1008*61046927SAndroid Build Coastguard Worker  */
1009*61046927SAndroid Build Coastguard Worker static void
validate_array(struct gl_context * ctx,const char * func,struct gl_vertex_array_object * vao,struct gl_buffer_object * obj,GLuint attrib,GLbitfield legalTypesMask,GLint sizeMin,GLint sizeMax,GLint size,GLenum type,GLsizei stride,GLboolean normalized,GLboolean integer,GLboolean doubles,const GLvoid * ptr)1010*61046927SAndroid Build Coastguard Worker validate_array(struct gl_context *ctx, const char *func,
1011*61046927SAndroid Build Coastguard Worker                struct gl_vertex_array_object *vao,
1012*61046927SAndroid Build Coastguard Worker                struct gl_buffer_object *obj,
1013*61046927SAndroid Build Coastguard Worker                GLuint attrib, GLbitfield legalTypesMask,
1014*61046927SAndroid Build Coastguard Worker                GLint sizeMin, GLint sizeMax,
1015*61046927SAndroid Build Coastguard Worker                GLint size, GLenum type, GLsizei stride,
1016*61046927SAndroid Build Coastguard Worker                GLboolean normalized, GLboolean integer, GLboolean doubles,
1017*61046927SAndroid Build Coastguard Worker                const GLvoid *ptr)
1018*61046927SAndroid Build Coastguard Worker {
1019*61046927SAndroid Build Coastguard Worker    /* Page 407 (page 423 of the PDF) of the OpenGL 3.0 spec says:
1020*61046927SAndroid Build Coastguard Worker     *
1021*61046927SAndroid Build Coastguard Worker     *     "Client vertex arrays - all vertex array attribute pointers must
1022*61046927SAndroid Build Coastguard Worker     *     refer to buffer objects (section 2.9.2). The default vertex array
1023*61046927SAndroid Build Coastguard Worker     *     object (the name zero) is also deprecated. Calling
1024*61046927SAndroid Build Coastguard Worker     *     VertexAttribPointer when no buffer object or no vertex array object
1025*61046927SAndroid Build Coastguard Worker     *     is bound will generate an INVALID_OPERATION error..."
1026*61046927SAndroid Build Coastguard Worker     *
1027*61046927SAndroid Build Coastguard Worker     * The check for VBOs is handled below.
1028*61046927SAndroid Build Coastguard Worker     */
1029*61046927SAndroid Build Coastguard Worker    if (_mesa_is_desktop_gl_core(ctx) && (vao == ctx->Array.DefaultVAO)) {
1030*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "%s(no array object bound)",
1031*61046927SAndroid Build Coastguard Worker                   func);
1032*61046927SAndroid Build Coastguard Worker       return;
1033*61046927SAndroid Build Coastguard Worker    }
1034*61046927SAndroid Build Coastguard Worker 
1035*61046927SAndroid Build Coastguard Worker    if (stride < 0) {
1036*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "%s(stride=%d)", func, stride );
1037*61046927SAndroid Build Coastguard Worker       return;
1038*61046927SAndroid Build Coastguard Worker    }
1039*61046927SAndroid Build Coastguard Worker 
1040*61046927SAndroid Build Coastguard Worker    if (_mesa_is_desktop_gl(ctx) && ctx->Version >= 44 &&
1041*61046927SAndroid Build Coastguard Worker        stride > ctx->Const.MaxVertexAttribStride) {
1042*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "%s(stride=%d > "
1043*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_STRIDE)", func, stride);
1044*61046927SAndroid Build Coastguard Worker       return;
1045*61046927SAndroid Build Coastguard Worker    }
1046*61046927SAndroid Build Coastguard Worker 
1047*61046927SAndroid Build Coastguard Worker    /* Page 29 (page 44 of the PDF) of the OpenGL 3.3 spec says:
1048*61046927SAndroid Build Coastguard Worker     *
1049*61046927SAndroid Build Coastguard Worker     *     "An INVALID_OPERATION error is generated under any of the following
1050*61046927SAndroid Build Coastguard Worker     *     conditions:
1051*61046927SAndroid Build Coastguard Worker     *
1052*61046927SAndroid Build Coastguard Worker     *     ...
1053*61046927SAndroid Build Coastguard Worker     *
1054*61046927SAndroid Build Coastguard Worker     *     * any of the *Pointer commands specifying the location and
1055*61046927SAndroid Build Coastguard Worker     *       organization of vertex array data are called while zero is bound
1056*61046927SAndroid Build Coastguard Worker     *       to the ARRAY_BUFFER buffer object binding point (see section
1057*61046927SAndroid Build Coastguard Worker     *       2.9.6), and the pointer argument is not NULL."
1058*61046927SAndroid Build Coastguard Worker     */
1059*61046927SAndroid Build Coastguard Worker    if (ptr != NULL && vao != ctx->Array.DefaultVAO &&
1060*61046927SAndroid Build Coastguard Worker        !obj) {
1061*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-VBO array)", func);
1062*61046927SAndroid Build Coastguard Worker       return;
1063*61046927SAndroid Build Coastguard Worker    }
1064*61046927SAndroid Build Coastguard Worker }
1065*61046927SAndroid Build Coastguard Worker 
1066*61046927SAndroid Build Coastguard Worker 
1067*61046927SAndroid Build Coastguard Worker static bool
validate_array_and_format(struct gl_context * ctx,const char * func,struct gl_vertex_array_object * vao,struct gl_buffer_object * obj,GLuint attrib,GLbitfield legalTypes,GLint sizeMin,GLint sizeMax,GLint size,GLenum type,GLsizei stride,GLboolean normalized,GLboolean integer,GLboolean doubles,GLenum format,const GLvoid * ptr)1068*61046927SAndroid Build Coastguard Worker validate_array_and_format(struct gl_context *ctx, const char *func,
1069*61046927SAndroid Build Coastguard Worker                           struct gl_vertex_array_object *vao,
1070*61046927SAndroid Build Coastguard Worker                           struct gl_buffer_object *obj,
1071*61046927SAndroid Build Coastguard Worker                           GLuint attrib, GLbitfield legalTypes,
1072*61046927SAndroid Build Coastguard Worker                           GLint sizeMin, GLint sizeMax,
1073*61046927SAndroid Build Coastguard Worker                           GLint size, GLenum type, GLsizei stride,
1074*61046927SAndroid Build Coastguard Worker                           GLboolean normalized, GLboolean integer,
1075*61046927SAndroid Build Coastguard Worker                           GLboolean doubles, GLenum format, const GLvoid *ptr)
1076*61046927SAndroid Build Coastguard Worker {
1077*61046927SAndroid Build Coastguard Worker    validate_array(ctx, func, vao, obj, attrib, legalTypes, sizeMin, sizeMax,
1078*61046927SAndroid Build Coastguard Worker                   size, type, stride, normalized, integer, doubles, ptr);
1079*61046927SAndroid Build Coastguard Worker 
1080*61046927SAndroid Build Coastguard Worker    return validate_array_format(ctx, func, vao, attrib, legalTypes, sizeMin,
1081*61046927SAndroid Build Coastguard Worker                                 sizeMax, size, type, normalized, integer,
1082*61046927SAndroid Build Coastguard Worker                                 doubles, 0, format);
1083*61046927SAndroid Build Coastguard Worker }
1084*61046927SAndroid Build Coastguard Worker 
1085*61046927SAndroid Build Coastguard Worker 
1086*61046927SAndroid Build Coastguard Worker /**
1087*61046927SAndroid Build Coastguard Worker  * Update state for glVertex/Color/TexCoord/...Pointer functions.
1088*61046927SAndroid Build Coastguard Worker  *
1089*61046927SAndroid Build Coastguard Worker  * \param vao the vao to update
1090*61046927SAndroid Build Coastguard Worker  * \param obj the bound buffer object
1091*61046927SAndroid Build Coastguard Worker  * \param attrib  the attribute array index to update
1092*61046927SAndroid Build Coastguard Worker  * \param format  Either GL_RGBA or GL_BGRA.
1093*61046927SAndroid Build Coastguard Worker  * \param sizeMax  max allowable size value (may also be BGRA_OR_4)
1094*61046927SAndroid Build Coastguard Worker  * \param size  components per element (1, 2, 3 or 4)
1095*61046927SAndroid Build Coastguard Worker  * \param type  datatype of each component (GL_FLOAT, GL_INT, etc)
1096*61046927SAndroid Build Coastguard Worker  * \param stride  stride between elements, in elements
1097*61046927SAndroid Build Coastguard Worker  * \param normalized  are integer types converted to floats in [-1, 1]?
1098*61046927SAndroid Build Coastguard Worker  * \param integer  integer-valued values (will not be normalized to [-1,1])
1099*61046927SAndroid Build Coastguard Worker  * \param doubles  Double values not reduced to floats
1100*61046927SAndroid Build Coastguard Worker  * \param ptr  the address (or offset inside VBO) of the array data
1101*61046927SAndroid Build Coastguard Worker  */
1102*61046927SAndroid Build Coastguard Worker static void
update_array(struct gl_context * ctx,struct gl_vertex_array_object * vao,struct gl_buffer_object * obj,GLuint attrib,GLenum format,GLint sizeMax,GLint size,GLenum type,GLsizei stride,GLboolean normalized,GLboolean integer,GLboolean doubles,const GLvoid * ptr)1103*61046927SAndroid Build Coastguard Worker update_array(struct gl_context *ctx,
1104*61046927SAndroid Build Coastguard Worker              struct gl_vertex_array_object *vao,
1105*61046927SAndroid Build Coastguard Worker              struct gl_buffer_object *obj,
1106*61046927SAndroid Build Coastguard Worker              GLuint attrib, GLenum format,
1107*61046927SAndroid Build Coastguard Worker              GLint sizeMax,
1108*61046927SAndroid Build Coastguard Worker              GLint size, GLenum type, GLsizei stride,
1109*61046927SAndroid Build Coastguard Worker              GLboolean normalized, GLboolean integer, GLboolean doubles,
1110*61046927SAndroid Build Coastguard Worker              const GLvoid *ptr)
1111*61046927SAndroid Build Coastguard Worker {
1112*61046927SAndroid Build Coastguard Worker    _mesa_update_array_format(ctx, vao, attrib, size, type, format,
1113*61046927SAndroid Build Coastguard Worker                              normalized, integer, doubles, 0);
1114*61046927SAndroid Build Coastguard Worker 
1115*61046927SAndroid Build Coastguard Worker    /* Reset the vertex attrib binding */
1116*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, vao, attrib, attrib);
1117*61046927SAndroid Build Coastguard Worker 
1118*61046927SAndroid Build Coastguard Worker    /* The Stride and Ptr fields are not set by update_array_format() */
1119*61046927SAndroid Build Coastguard Worker    struct gl_array_attributes *array = &vao->VertexAttrib[attrib];
1120*61046927SAndroid Build Coastguard Worker    if ((array->Stride != stride) || (array->Ptr != ptr)) {
1121*61046927SAndroid Build Coastguard Worker       array->Stride = stride;
1122*61046927SAndroid Build Coastguard Worker       array->Ptr = ptr;
1123*61046927SAndroid Build Coastguard Worker 
1124*61046927SAndroid Build Coastguard Worker       if (vao->Enabled & VERT_BIT(attrib)) {
1125*61046927SAndroid Build Coastguard Worker          ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
1126*61046927SAndroid Build Coastguard Worker          /* The slow path merges vertex buffers, which affects vertex
1127*61046927SAndroid Build Coastguard Worker           * elements.
1128*61046927SAndroid Build Coastguard Worker           */
1129*61046927SAndroid Build Coastguard Worker          if (!ctx->Const.UseVAOFastPath)
1130*61046927SAndroid Build Coastguard Worker             ctx->Array.NewVertexElements = true;
1131*61046927SAndroid Build Coastguard Worker       }
1132*61046927SAndroid Build Coastguard Worker 
1133*61046927SAndroid Build Coastguard Worker       vao->NonDefaultStateMask |= BITFIELD_BIT(attrib);
1134*61046927SAndroid Build Coastguard Worker    }
1135*61046927SAndroid Build Coastguard Worker 
1136*61046927SAndroid Build Coastguard Worker    /* Update the vertex buffer binding */
1137*61046927SAndroid Build Coastguard Worker    GLsizei effectiveStride = stride != 0 ?
1138*61046927SAndroid Build Coastguard Worker       stride : array->Format._ElementSize;
1139*61046927SAndroid Build Coastguard Worker    _mesa_bind_vertex_buffer(ctx, vao, attrib,
1140*61046927SAndroid Build Coastguard Worker                             obj, (GLintptr) ptr,
1141*61046927SAndroid Build Coastguard Worker                             effectiveStride, false, false);
1142*61046927SAndroid Build Coastguard Worker }
1143*61046927SAndroid Build Coastguard Worker 
1144*61046927SAndroid Build Coastguard Worker 
1145*61046927SAndroid Build Coastguard Worker /* Helper function for all EXT_direct_state_access glVertexArray* functions */
1146*61046927SAndroid Build Coastguard Worker static bool
_lookup_vao_and_vbo_dsa(struct gl_context * ctx,GLuint vaobj,GLuint buffer,GLintptr offset,struct gl_vertex_array_object ** vao,struct gl_buffer_object ** vbo,const char * caller)1147*61046927SAndroid Build Coastguard Worker _lookup_vao_and_vbo_dsa(struct gl_context *ctx,
1148*61046927SAndroid Build Coastguard Worker                         GLuint vaobj, GLuint buffer,
1149*61046927SAndroid Build Coastguard Worker                         GLintptr offset,
1150*61046927SAndroid Build Coastguard Worker                         struct gl_vertex_array_object** vao,
1151*61046927SAndroid Build Coastguard Worker                         struct gl_buffer_object** vbo,
1152*61046927SAndroid Build Coastguard Worker                         const char* caller)
1153*61046927SAndroid Build Coastguard Worker {
1154*61046927SAndroid Build Coastguard Worker    *vao = _mesa_lookup_vao_err(ctx, vaobj, true, caller);
1155*61046927SAndroid Build Coastguard Worker    if (!(*vao))
1156*61046927SAndroid Build Coastguard Worker       return false;
1157*61046927SAndroid Build Coastguard Worker 
1158*61046927SAndroid Build Coastguard Worker    if (buffer != 0) {
1159*61046927SAndroid Build Coastguard Worker       *vbo = _mesa_lookup_bufferobj(ctx, buffer);
1160*61046927SAndroid Build Coastguard Worker       if (!_mesa_handle_bind_buffer_gen(ctx, buffer, vbo, caller, false))
1161*61046927SAndroid Build Coastguard Worker          return false;
1162*61046927SAndroid Build Coastguard Worker 
1163*61046927SAndroid Build Coastguard Worker       if (offset < 0) {
1164*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_VALUE,
1165*61046927SAndroid Build Coastguard Worker                      "%s(negative offset with non-0 buffer)", caller);
1166*61046927SAndroid Build Coastguard Worker          return false;
1167*61046927SAndroid Build Coastguard Worker       }
1168*61046927SAndroid Build Coastguard Worker    } else {
1169*61046927SAndroid Build Coastguard Worker       *vbo = NULL;
1170*61046927SAndroid Build Coastguard Worker    }
1171*61046927SAndroid Build Coastguard Worker 
1172*61046927SAndroid Build Coastguard Worker    return true;
1173*61046927SAndroid Build Coastguard Worker }
1174*61046927SAndroid Build Coastguard Worker 
1175*61046927SAndroid Build Coastguard Worker static bool
error_check_vertex_pointer(struct gl_context * ctx,const char * caller,struct gl_vertex_array_object * vao,struct gl_buffer_object * vbo,GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1176*61046927SAndroid Build Coastguard Worker error_check_vertex_pointer(struct gl_context *ctx, const char *caller,
1177*61046927SAndroid Build Coastguard Worker                            struct gl_vertex_array_object *vao,
1178*61046927SAndroid Build Coastguard Worker                            struct gl_buffer_object *vbo, GLint size,
1179*61046927SAndroid Build Coastguard Worker                            GLenum type, GLsizei stride, const GLvoid *ptr)
1180*61046927SAndroid Build Coastguard Worker {
1181*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1182*61046927SAndroid Build Coastguard Worker    GLbitfield legalTypes = _mesa_is_gles1(ctx)
1183*61046927SAndroid Build Coastguard Worker       ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
1184*61046927SAndroid Build Coastguard Worker       : (SHORT_BIT | INT_BIT | FLOAT_BIT |
1185*61046927SAndroid Build Coastguard Worker          DOUBLE_BIT | HALF_BIT |
1186*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1187*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1188*61046927SAndroid Build Coastguard Worker 
1189*61046927SAndroid Build Coastguard Worker    return validate_array_and_format(ctx, caller, vao, vbo,
1190*61046927SAndroid Build Coastguard Worker                                     VERT_ATTRIB_POS, legalTypes, 2, 4, size,
1191*61046927SAndroid Build Coastguard Worker                                     type, stride, GL_FALSE, GL_FALSE, GL_FALSE,
1192*61046927SAndroid Build Coastguard Worker                                     format, ptr);
1193*61046927SAndroid Build Coastguard Worker }
1194*61046927SAndroid Build Coastguard Worker 
1195*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexPointer_no_error(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1196*61046927SAndroid Build Coastguard Worker _mesa_VertexPointer_no_error(GLint size, GLenum type, GLsizei stride,
1197*61046927SAndroid Build Coastguard Worker                              const GLvoid *ptr)
1198*61046927SAndroid Build Coastguard Worker {
1199*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1200*61046927SAndroid Build Coastguard Worker 
1201*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1202*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_POS, GL_RGBA, 4, size, type, stride,
1203*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1204*61046927SAndroid Build Coastguard Worker }
1205*61046927SAndroid Build Coastguard Worker 
1206*61046927SAndroid Build Coastguard Worker 
1207*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexPointer(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1208*61046927SAndroid Build Coastguard Worker _mesa_VertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
1209*61046927SAndroid Build Coastguard Worker {
1210*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1211*61046927SAndroid Build Coastguard Worker 
1212*61046927SAndroid Build Coastguard Worker    if (!error_check_vertex_pointer(ctx, "glVertexPointer", ctx->Array.VAO,
1213*61046927SAndroid Build Coastguard Worker                                    ctx->Array.ArrayBufferObj, size, type,
1214*61046927SAndroid Build Coastguard Worker                                    stride, ptr))
1215*61046927SAndroid Build Coastguard Worker       return;
1216*61046927SAndroid Build Coastguard Worker 
1217*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1218*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_POS, GL_RGBA, 4, size, type, stride,
1219*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1220*61046927SAndroid Build Coastguard Worker }
1221*61046927SAndroid Build Coastguard Worker 
1222*61046927SAndroid Build Coastguard Worker 
1223*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexOffsetEXT(GLuint vaobj,GLuint buffer,GLint size,GLenum type,GLsizei stride,GLintptr offset)1224*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexOffsetEXT(GLuint vaobj, GLuint buffer, GLint size,
1225*61046927SAndroid Build Coastguard Worker                                  GLenum type, GLsizei stride, GLintptr offset)
1226*61046927SAndroid Build Coastguard Worker {
1227*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1228*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1229*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1230*61046927SAndroid Build Coastguard Worker 
1231*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1232*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1233*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayVertexOffsetEXT"))
1234*61046927SAndroid Build Coastguard Worker       return;
1235*61046927SAndroid Build Coastguard Worker 
1236*61046927SAndroid Build Coastguard Worker    if (!error_check_vertex_pointer(ctx, "glVertexArrayVertexOffsetEXT", vao,
1237*61046927SAndroid Build Coastguard Worker                                    vbo, size, type, stride, (void*)offset))
1238*61046927SAndroid Build Coastguard Worker       return;
1239*61046927SAndroid Build Coastguard Worker 
1240*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1241*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_POS, GL_RGBA, 4, size, type, stride,
1242*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, (void*) offset);
1243*61046927SAndroid Build Coastguard Worker }
1244*61046927SAndroid Build Coastguard Worker 
1245*61046927SAndroid Build Coastguard Worker 
1246*61046927SAndroid Build Coastguard Worker static bool
error_check_normal_pointer(struct gl_context * ctx,const char * caller,struct gl_vertex_array_object * vao,struct gl_buffer_object * vbo,GLenum type,GLsizei stride,const GLvoid * ptr)1247*61046927SAndroid Build Coastguard Worker error_check_normal_pointer(struct gl_context *ctx, const char *caller,
1248*61046927SAndroid Build Coastguard Worker                            struct gl_vertex_array_object *vao,
1249*61046927SAndroid Build Coastguard Worker                            struct gl_buffer_object *vbo, GLenum type,
1250*61046927SAndroid Build Coastguard Worker                            GLsizei stride, const GLvoid *ptr)
1251*61046927SAndroid Build Coastguard Worker {
1252*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1253*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = _mesa_is_gles1(ctx)
1254*61046927SAndroid Build Coastguard Worker       ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
1255*61046927SAndroid Build Coastguard Worker       : (BYTE_BIT | SHORT_BIT | INT_BIT |
1256*61046927SAndroid Build Coastguard Worker          HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1257*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1258*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1259*61046927SAndroid Build Coastguard Worker 
1260*61046927SAndroid Build Coastguard Worker    return validate_array_and_format(ctx, caller, vao, vbo,
1261*61046927SAndroid Build Coastguard Worker                                     VERT_ATTRIB_NORMAL, legalTypes, 3, 3, 3,
1262*61046927SAndroid Build Coastguard Worker                                     type, stride, GL_TRUE, GL_FALSE,
1263*61046927SAndroid Build Coastguard Worker                                     GL_FALSE, format, ptr);
1264*61046927SAndroid Build Coastguard Worker }
1265*61046927SAndroid Build Coastguard Worker 
1266*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_NormalPointer_no_error(GLenum type,GLsizei stride,const GLvoid * ptr)1267*61046927SAndroid Build Coastguard Worker _mesa_NormalPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr )
1268*61046927SAndroid Build Coastguard Worker {
1269*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1270*61046927SAndroid Build Coastguard Worker 
1271*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1272*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_NORMAL, GL_RGBA, 3, 3, type, stride, GL_TRUE,
1273*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, ptr);
1274*61046927SAndroid Build Coastguard Worker }
1275*61046927SAndroid Build Coastguard Worker 
1276*61046927SAndroid Build Coastguard Worker 
1277*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_NormalPointer(GLenum type,GLsizei stride,const GLvoid * ptr)1278*61046927SAndroid Build Coastguard Worker _mesa_NormalPointer(GLenum type, GLsizei stride, const GLvoid *ptr )
1279*61046927SAndroid Build Coastguard Worker {
1280*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1281*61046927SAndroid Build Coastguard Worker 
1282*61046927SAndroid Build Coastguard Worker    if (!error_check_normal_pointer(ctx, "glNormalPointer", ctx->Array.VAO,
1283*61046927SAndroid Build Coastguard Worker                                    ctx->Array.ArrayBufferObj, type, stride,
1284*61046927SAndroid Build Coastguard Worker                                    ptr))
1285*61046927SAndroid Build Coastguard Worker        return;
1286*61046927SAndroid Build Coastguard Worker 
1287*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1288*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_NORMAL, GL_RGBA, 3, 3, type, stride, GL_TRUE,
1289*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, ptr);
1290*61046927SAndroid Build Coastguard Worker }
1291*61046927SAndroid Build Coastguard Worker 
1292*61046927SAndroid Build Coastguard Worker 
1293*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayNormalOffsetEXT(GLuint vaobj,GLuint buffer,GLenum type,GLsizei stride,GLintptr offset)1294*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayNormalOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type,
1295*61046927SAndroid Build Coastguard Worker                                  GLsizei stride, GLintptr offset)
1296*61046927SAndroid Build Coastguard Worker {
1297*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1298*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1299*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1300*61046927SAndroid Build Coastguard Worker 
1301*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1302*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1303*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayNormalOffsetEXT"))
1304*61046927SAndroid Build Coastguard Worker       return;
1305*61046927SAndroid Build Coastguard Worker 
1306*61046927SAndroid Build Coastguard Worker    if (!error_check_normal_pointer(ctx, "glVertexArrayNormalOffsetEXT",
1307*61046927SAndroid Build Coastguard Worker                                    vao, vbo, type, stride, (void*)offset))
1308*61046927SAndroid Build Coastguard Worker        return;
1309*61046927SAndroid Build Coastguard Worker 
1310*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1311*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_NORMAL, GL_RGBA, 3, 3, type, stride, GL_TRUE,
1312*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, (void*) offset);
1313*61046927SAndroid Build Coastguard Worker }
1314*61046927SAndroid Build Coastguard Worker 
1315*61046927SAndroid Build Coastguard Worker 
1316*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_ColorPointer_no_error(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1317*61046927SAndroid Build Coastguard Worker _mesa_ColorPointer_no_error(GLint size, GLenum type, GLsizei stride,
1318*61046927SAndroid Build Coastguard Worker                             const GLvoid *ptr)
1319*61046927SAndroid Build Coastguard Worker {
1320*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1321*61046927SAndroid Build Coastguard Worker 
1322*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1323*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1324*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR0, format, BGRA_OR_4, size,
1325*61046927SAndroid Build Coastguard Worker                 type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr);
1326*61046927SAndroid Build Coastguard Worker }
1327*61046927SAndroid Build Coastguard Worker 
1328*61046927SAndroid Build Coastguard Worker 
1329*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_ColorPointer(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1330*61046927SAndroid Build Coastguard Worker _mesa_ColorPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *ptr)
1331*61046927SAndroid Build Coastguard Worker {
1332*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1333*61046927SAndroid Build Coastguard Worker    const GLint sizeMin = _mesa_is_gles1(ctx) ? 4 : 3;
1334*61046927SAndroid Build Coastguard Worker 
1335*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1336*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = _mesa_is_gles1(ctx)
1337*61046927SAndroid Build Coastguard Worker       ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT)
1338*61046927SAndroid Build Coastguard Worker       : (BYTE_BIT | UNSIGNED_BYTE_BIT |
1339*61046927SAndroid Build Coastguard Worker          SHORT_BIT | UNSIGNED_SHORT_BIT |
1340*61046927SAndroid Build Coastguard Worker          INT_BIT | UNSIGNED_INT_BIT |
1341*61046927SAndroid Build Coastguard Worker          HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1342*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1343*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1344*61046927SAndroid Build Coastguard Worker 
1345*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glColorPointer",
1346*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1347*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_COLOR0, legalTypes, sizeMin,
1348*61046927SAndroid Build Coastguard Worker                                   BGRA_OR_4, size, type, stride, GL_TRUE,
1349*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, format, ptr))
1350*61046927SAndroid Build Coastguard Worker       return;
1351*61046927SAndroid Build Coastguard Worker 
1352*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1353*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR0, format, BGRA_OR_4, size,
1354*61046927SAndroid Build Coastguard Worker                 type, stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr);
1355*61046927SAndroid Build Coastguard Worker }
1356*61046927SAndroid Build Coastguard Worker 
1357*61046927SAndroid Build Coastguard Worker 
1358*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayColorOffsetEXT(GLuint vaobj,GLuint buffer,GLint size,GLenum type,GLsizei stride,GLintptr offset)1359*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size,
1360*61046927SAndroid Build Coastguard Worker                                 GLenum type, GLsizei stride, GLintptr offset)
1361*61046927SAndroid Build Coastguard Worker {
1362*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1363*61046927SAndroid Build Coastguard Worker    const GLint sizeMin = _mesa_is_gles1(ctx) ? 4 : 3;
1364*61046927SAndroid Build Coastguard Worker 
1365*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1366*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = _mesa_is_gles1(ctx)
1367*61046927SAndroid Build Coastguard Worker       ? (UNSIGNED_BYTE_BIT | HALF_BIT | FLOAT_BIT | FIXED_ES_BIT)
1368*61046927SAndroid Build Coastguard Worker       : (BYTE_BIT | UNSIGNED_BYTE_BIT |
1369*61046927SAndroid Build Coastguard Worker          SHORT_BIT | UNSIGNED_SHORT_BIT |
1370*61046927SAndroid Build Coastguard Worker          INT_BIT | UNSIGNED_INT_BIT |
1371*61046927SAndroid Build Coastguard Worker          HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1372*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1373*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1374*61046927SAndroid Build Coastguard Worker 
1375*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1376*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1377*61046927SAndroid Build Coastguard Worker 
1378*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1379*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1380*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayColorOffsetEXT"))
1381*61046927SAndroid Build Coastguard Worker       return;
1382*61046927SAndroid Build Coastguard Worker 
1383*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayColorOffsetEXT",
1384*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1385*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_COLOR0, legalTypes, sizeMin,
1386*61046927SAndroid Build Coastguard Worker                                   BGRA_OR_4, size, type, stride, GL_TRUE,
1387*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, format, (void*) offset))
1388*61046927SAndroid Build Coastguard Worker       return;
1389*61046927SAndroid Build Coastguard Worker 
1390*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1391*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR0, format, BGRA_OR_4, size,
1392*61046927SAndroid Build Coastguard Worker                 type, stride, GL_TRUE, GL_FALSE, GL_FALSE, (void*) offset);
1393*61046927SAndroid Build Coastguard Worker }
1394*61046927SAndroid Build Coastguard Worker 
1395*61046927SAndroid Build Coastguard Worker 
1396*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_FogCoordPointer_no_error(GLenum type,GLsizei stride,const GLvoid * ptr)1397*61046927SAndroid Build Coastguard Worker _mesa_FogCoordPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr)
1398*61046927SAndroid Build Coastguard Worker {
1399*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1400*61046927SAndroid Build Coastguard Worker 
1401*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1402*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_FOG, GL_RGBA, 1, 1, type, stride, GL_FALSE,
1403*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, ptr);
1404*61046927SAndroid Build Coastguard Worker }
1405*61046927SAndroid Build Coastguard Worker 
1406*61046927SAndroid Build Coastguard Worker 
1407*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_FogCoordPointer(GLenum type,GLsizei stride,const GLvoid * ptr)1408*61046927SAndroid Build Coastguard Worker _mesa_FogCoordPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
1409*61046927SAndroid Build Coastguard Worker {
1410*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1411*61046927SAndroid Build Coastguard Worker 
1412*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1413*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
1414*61046927SAndroid Build Coastguard Worker 
1415*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glFogCoordPointer",
1416*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1417*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_FOG, legalTypes, 1, 1, 1,
1418*61046927SAndroid Build Coastguard Worker                                   type, stride, GL_FALSE, GL_FALSE,
1419*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, format, ptr))
1420*61046927SAndroid Build Coastguard Worker       return;
1421*61046927SAndroid Build Coastguard Worker 
1422*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1423*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_FOG, format, 1, 1, type, stride, GL_FALSE,
1424*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, ptr);
1425*61046927SAndroid Build Coastguard Worker }
1426*61046927SAndroid Build Coastguard Worker 
1427*61046927SAndroid Build Coastguard Worker 
1428*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayFogCoordOffsetEXT(GLuint vaobj,GLuint buffer,GLenum type,GLsizei stride,GLintptr offset)1429*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayFogCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type,
1430*61046927SAndroid Build Coastguard Worker                                    GLsizei stride, GLintptr offset)
1431*61046927SAndroid Build Coastguard Worker {
1432*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1433*61046927SAndroid Build Coastguard Worker 
1434*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1435*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (HALF_BIT | FLOAT_BIT | DOUBLE_BIT);
1436*61046927SAndroid Build Coastguard Worker 
1437*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1438*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1439*61046927SAndroid Build Coastguard Worker 
1440*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1441*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1442*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayFogCoordOffsetEXT"))
1443*61046927SAndroid Build Coastguard Worker       return;
1444*61046927SAndroid Build Coastguard Worker 
1445*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayFogCoordOffsetEXT",
1446*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1447*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_FOG, legalTypes, 1, 1, 1,
1448*61046927SAndroid Build Coastguard Worker                                   type, stride, GL_FALSE, GL_FALSE,
1449*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, format, (void*) offset))
1450*61046927SAndroid Build Coastguard Worker       return;
1451*61046927SAndroid Build Coastguard Worker 
1452*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1453*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_FOG, format, 1, 1, type, stride, GL_FALSE,
1454*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, (void*) offset);
1455*61046927SAndroid Build Coastguard Worker }
1456*61046927SAndroid Build Coastguard Worker 
1457*61046927SAndroid Build Coastguard Worker 
1458*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_IndexPointer_no_error(GLenum type,GLsizei stride,const GLvoid * ptr)1459*61046927SAndroid Build Coastguard Worker _mesa_IndexPointer_no_error(GLenum type, GLsizei stride, const GLvoid *ptr)
1460*61046927SAndroid Build Coastguard Worker {
1461*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1462*61046927SAndroid Build Coastguard Worker 
1463*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1464*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR_INDEX, GL_RGBA, 1, 1, type, stride,
1465*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1466*61046927SAndroid Build Coastguard Worker }
1467*61046927SAndroid Build Coastguard Worker 
1468*61046927SAndroid Build Coastguard Worker 
1469*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_IndexPointer(GLenum type,GLsizei stride,const GLvoid * ptr)1470*61046927SAndroid Build Coastguard Worker _mesa_IndexPointer(GLenum type, GLsizei stride, const GLvoid *ptr)
1471*61046927SAndroid Build Coastguard Worker {
1472*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1473*61046927SAndroid Build Coastguard Worker 
1474*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1475*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
1476*61046927SAndroid Build Coastguard Worker                                      FLOAT_BIT | DOUBLE_BIT);
1477*61046927SAndroid Build Coastguard Worker 
1478*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glIndexPointer",
1479*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1480*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_COLOR_INDEX,
1481*61046927SAndroid Build Coastguard Worker                                   legalTypes, 1, 1, 1, type, stride,
1482*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_FALSE, format, ptr))
1483*61046927SAndroid Build Coastguard Worker       return;
1484*61046927SAndroid Build Coastguard Worker 
1485*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1486*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR_INDEX, format, 1, 1, type, stride,
1487*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1488*61046927SAndroid Build Coastguard Worker }
1489*61046927SAndroid Build Coastguard Worker 
1490*61046927SAndroid Build Coastguard Worker 
1491*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayIndexOffsetEXT(GLuint vaobj,GLuint buffer,GLenum type,GLsizei stride,GLintptr offset)1492*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayIndexOffsetEXT(GLuint vaobj, GLuint buffer, GLenum type,
1493*61046927SAndroid Build Coastguard Worker                                 GLsizei stride, GLintptr offset)
1494*61046927SAndroid Build Coastguard Worker {
1495*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1496*61046927SAndroid Build Coastguard Worker 
1497*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1498*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (UNSIGNED_BYTE_BIT | SHORT_BIT | INT_BIT |
1499*61046927SAndroid Build Coastguard Worker                                      FLOAT_BIT | DOUBLE_BIT);
1500*61046927SAndroid Build Coastguard Worker 
1501*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1502*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1503*61046927SAndroid Build Coastguard Worker 
1504*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1505*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1506*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayIndexOffsetEXT"))
1507*61046927SAndroid Build Coastguard Worker       return;
1508*61046927SAndroid Build Coastguard Worker 
1509*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayIndexOffsetEXT",
1510*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1511*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_COLOR_INDEX,
1512*61046927SAndroid Build Coastguard Worker                                   legalTypes, 1, 1, 1, type, stride,
1513*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_FALSE, format, (void*) offset))
1514*61046927SAndroid Build Coastguard Worker       return;
1515*61046927SAndroid Build Coastguard Worker 
1516*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1517*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR_INDEX, format, 1, 1, type, stride,
1518*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, (void*) offset);
1519*61046927SAndroid Build Coastguard Worker }
1520*61046927SAndroid Build Coastguard Worker 
1521*61046927SAndroid Build Coastguard Worker 
1522*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SecondaryColorPointer_no_error(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1523*61046927SAndroid Build Coastguard Worker _mesa_SecondaryColorPointer_no_error(GLint size, GLenum type,
1524*61046927SAndroid Build Coastguard Worker                                      GLsizei stride, const GLvoid *ptr)
1525*61046927SAndroid Build Coastguard Worker {
1526*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1527*61046927SAndroid Build Coastguard Worker 
1528*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1529*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1530*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR1, format, BGRA_OR_4, size, type,
1531*61046927SAndroid Build Coastguard Worker                 stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr);
1532*61046927SAndroid Build Coastguard Worker }
1533*61046927SAndroid Build Coastguard Worker 
1534*61046927SAndroid Build Coastguard Worker 
1535*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_SecondaryColorPointer(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1536*61046927SAndroid Build Coastguard Worker _mesa_SecondaryColorPointer(GLint size, GLenum type,
1537*61046927SAndroid Build Coastguard Worker 			       GLsizei stride, const GLvoid *ptr)
1538*61046927SAndroid Build Coastguard Worker {
1539*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1540*61046927SAndroid Build Coastguard Worker 
1541*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1542*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
1543*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT |
1544*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT |
1545*61046927SAndroid Build Coastguard Worker                                   HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1546*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_2_10_10_10_REV_BIT |
1547*61046927SAndroid Build Coastguard Worker                                   INT_2_10_10_10_REV_BIT);
1548*61046927SAndroid Build Coastguard Worker 
1549*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glSecondaryColorPointer",
1550*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1551*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_COLOR1, legalTypes, 3,
1552*61046927SAndroid Build Coastguard Worker                                   BGRA_OR_4, size, type, stride,
1553*61046927SAndroid Build Coastguard Worker                                   GL_TRUE, GL_FALSE, GL_FALSE, format, ptr))
1554*61046927SAndroid Build Coastguard Worker       return;
1555*61046927SAndroid Build Coastguard Worker 
1556*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1557*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR1, format, BGRA_OR_4, size, type,
1558*61046927SAndroid Build Coastguard Worker                 stride, GL_TRUE, GL_FALSE, GL_FALSE, ptr);
1559*61046927SAndroid Build Coastguard Worker }
1560*61046927SAndroid Build Coastguard Worker 
1561*61046927SAndroid Build Coastguard Worker 
1562*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArraySecondaryColorOffsetEXT(GLuint vaobj,GLuint buffer,GLint size,GLenum type,GLsizei stride,GLintptr offset)1563*61046927SAndroid Build Coastguard Worker _mesa_VertexArraySecondaryColorOffsetEXT(GLuint vaobj, GLuint buffer, GLint size,
1564*61046927SAndroid Build Coastguard Worker                                          GLenum type, GLsizei stride, GLintptr offset)
1565*61046927SAndroid Build Coastguard Worker {
1566*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1567*61046927SAndroid Build Coastguard Worker 
1568*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1569*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
1570*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT |
1571*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT |
1572*61046927SAndroid Build Coastguard Worker                                   HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1573*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_2_10_10_10_REV_BIT |
1574*61046927SAndroid Build Coastguard Worker                                   INT_2_10_10_10_REV_BIT);
1575*61046927SAndroid Build Coastguard Worker 
1576*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1577*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1578*61046927SAndroid Build Coastguard Worker 
1579*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1580*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1581*61046927SAndroid Build Coastguard Worker                                 "glVertexArraySecondaryColorOffsetEXT"))
1582*61046927SAndroid Build Coastguard Worker       return;
1583*61046927SAndroid Build Coastguard Worker 
1584*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArraySecondaryColorOffsetEXT",
1585*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1586*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_COLOR1, legalTypes, 3,
1587*61046927SAndroid Build Coastguard Worker                                   BGRA_OR_4, size, type, stride,
1588*61046927SAndroid Build Coastguard Worker                                   GL_TRUE, GL_FALSE, GL_FALSE, format, (void*) offset))
1589*61046927SAndroid Build Coastguard Worker       return;
1590*61046927SAndroid Build Coastguard Worker 
1591*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1592*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_COLOR1, format, BGRA_OR_4, size, type,
1593*61046927SAndroid Build Coastguard Worker                 stride, GL_TRUE, GL_FALSE, GL_FALSE, (void*) offset);
1594*61046927SAndroid Build Coastguard Worker }
1595*61046927SAndroid Build Coastguard Worker 
1596*61046927SAndroid Build Coastguard Worker 
1597*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexCoordPointer_no_error(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1598*61046927SAndroid Build Coastguard Worker _mesa_TexCoordPointer_no_error(GLint size, GLenum type, GLsizei stride,
1599*61046927SAndroid Build Coastguard Worker                                const GLvoid *ptr)
1600*61046927SAndroid Build Coastguard Worker {
1601*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1602*61046927SAndroid Build Coastguard Worker    const GLuint unit = ctx->Array.ActiveTexture;
1603*61046927SAndroid Build Coastguard Worker 
1604*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1605*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_TEX(unit), GL_RGBA, 4, size, type,
1606*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1607*61046927SAndroid Build Coastguard Worker }
1608*61046927SAndroid Build Coastguard Worker 
1609*61046927SAndroid Build Coastguard Worker 
1610*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexCoordPointer(GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1611*61046927SAndroid Build Coastguard Worker _mesa_TexCoordPointer(GLint size, GLenum type, GLsizei stride,
1612*61046927SAndroid Build Coastguard Worker                       const GLvoid *ptr)
1613*61046927SAndroid Build Coastguard Worker {
1614*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1615*61046927SAndroid Build Coastguard Worker    const GLint sizeMin = _mesa_is_gles1(ctx) ? 2 : 1;
1616*61046927SAndroid Build Coastguard Worker    const GLuint unit = ctx->Array.ActiveTexture;
1617*61046927SAndroid Build Coastguard Worker 
1618*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1619*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = _mesa_is_gles1(ctx)
1620*61046927SAndroid Build Coastguard Worker       ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
1621*61046927SAndroid Build Coastguard Worker       : (SHORT_BIT | INT_BIT |
1622*61046927SAndroid Build Coastguard Worker          HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1623*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1624*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1625*61046927SAndroid Build Coastguard Worker 
1626*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glTexCoordPointer",
1627*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1628*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_TEX(unit), legalTypes,
1629*61046927SAndroid Build Coastguard Worker                                   sizeMin, 4, size, type, stride,
1630*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_FALSE, format, ptr))
1631*61046927SAndroid Build Coastguard Worker       return;
1632*61046927SAndroid Build Coastguard Worker 
1633*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1634*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_TEX(unit), format, 4, size, type,
1635*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1636*61046927SAndroid Build Coastguard Worker }
1637*61046927SAndroid Build Coastguard Worker 
1638*61046927SAndroid Build Coastguard Worker 
1639*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayTexCoordOffsetEXT(GLuint vaobj,GLuint buffer,GLint size,GLenum type,GLsizei stride,GLintptr offset)1640*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLint size,
1641*61046927SAndroid Build Coastguard Worker                                    GLenum type, GLsizei stride, GLintptr offset)
1642*61046927SAndroid Build Coastguard Worker {
1643*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1644*61046927SAndroid Build Coastguard Worker    const GLint sizeMin = _mesa_is_gles1(ctx) ? 2 : 1;
1645*61046927SAndroid Build Coastguard Worker    const GLuint unit = ctx->Array.ActiveTexture;
1646*61046927SAndroid Build Coastguard Worker 
1647*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1648*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = _mesa_is_gles1(ctx)
1649*61046927SAndroid Build Coastguard Worker       ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
1650*61046927SAndroid Build Coastguard Worker       : (SHORT_BIT | INT_BIT |
1651*61046927SAndroid Build Coastguard Worker          HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1652*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1653*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1654*61046927SAndroid Build Coastguard Worker 
1655*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1656*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1657*61046927SAndroid Build Coastguard Worker 
1658*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1659*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1660*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayTexCoordOffsetEXT"))
1661*61046927SAndroid Build Coastguard Worker       return;
1662*61046927SAndroid Build Coastguard Worker 
1663*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayTexCoordOffsetEXT",
1664*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1665*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_TEX(unit), legalTypes,
1666*61046927SAndroid Build Coastguard Worker                                   sizeMin, 4, size, type, stride,
1667*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_FALSE, format, (void*) offset))
1668*61046927SAndroid Build Coastguard Worker       return;
1669*61046927SAndroid Build Coastguard Worker 
1670*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1671*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_TEX(unit), format, 4, size, type,
1672*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_FALSE, (void*) offset);
1673*61046927SAndroid Build Coastguard Worker }
1674*61046927SAndroid Build Coastguard Worker 
1675*61046927SAndroid Build Coastguard Worker 
1676*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayMultiTexCoordOffsetEXT(GLuint vaobj,GLuint buffer,GLenum texunit,GLint size,GLenum type,GLsizei stride,GLintptr offset)1677*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayMultiTexCoordOffsetEXT(GLuint vaobj, GLuint buffer, GLenum texunit,
1678*61046927SAndroid Build Coastguard Worker                                         GLint size, GLenum type, GLsizei stride,
1679*61046927SAndroid Build Coastguard Worker                                         GLintptr offset)
1680*61046927SAndroid Build Coastguard Worker {
1681*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1682*61046927SAndroid Build Coastguard Worker    const GLint sizeMin = _mesa_is_gles1(ctx) ? 2 : 1;
1683*61046927SAndroid Build Coastguard Worker    const GLuint unit = texunit - GL_TEXTURE0;
1684*61046927SAndroid Build Coastguard Worker 
1685*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1686*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = _mesa_is_gles1(ctx)
1687*61046927SAndroid Build Coastguard Worker       ? (BYTE_BIT | SHORT_BIT | FLOAT_BIT | FIXED_ES_BIT)
1688*61046927SAndroid Build Coastguard Worker       : (SHORT_BIT | INT_BIT |
1689*61046927SAndroid Build Coastguard Worker          HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1690*61046927SAndroid Build Coastguard Worker          UNSIGNED_INT_2_10_10_10_REV_BIT |
1691*61046927SAndroid Build Coastguard Worker          INT_2_10_10_10_REV_BIT);
1692*61046927SAndroid Build Coastguard Worker 
1693*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1694*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1695*61046927SAndroid Build Coastguard Worker 
1696*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1697*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1698*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayMultiTexCoordOffsetEXT"))
1699*61046927SAndroid Build Coastguard Worker       return;
1700*61046927SAndroid Build Coastguard Worker 
1701*61046927SAndroid Build Coastguard Worker    if (unit >= ctx->Const.MaxCombinedTextureImageUnits) {
1702*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexArrayMultiTexCoordOffsetEXT(texunit=%d)",
1703*61046927SAndroid Build Coastguard Worker          texunit);
1704*61046927SAndroid Build Coastguard Worker       return;
1705*61046927SAndroid Build Coastguard Worker    }
1706*61046927SAndroid Build Coastguard Worker 
1707*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayMultiTexCoordOffsetEXT",
1708*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1709*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_TEX(unit), legalTypes,
1710*61046927SAndroid Build Coastguard Worker                                   sizeMin, 4, size, type, stride,
1711*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_FALSE, format, (void*) offset))
1712*61046927SAndroid Build Coastguard Worker       return;
1713*61046927SAndroid Build Coastguard Worker 
1714*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1715*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_TEX(unit), format, 4, size, type,
1716*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_FALSE, (void*) offset);
1717*61046927SAndroid Build Coastguard Worker }
1718*61046927SAndroid Build Coastguard Worker 
1719*61046927SAndroid Build Coastguard Worker 
1720*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EdgeFlagPointer_no_error(GLsizei stride,const GLvoid * ptr)1721*61046927SAndroid Build Coastguard Worker _mesa_EdgeFlagPointer_no_error(GLsizei stride, const GLvoid *ptr)
1722*61046927SAndroid Build Coastguard Worker {
1723*61046927SAndroid Build Coastguard Worker    /* this is the same type that glEdgeFlag uses */
1724*61046927SAndroid Build Coastguard Worker    const GLboolean integer = GL_FALSE;
1725*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1726*61046927SAndroid Build Coastguard Worker 
1727*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1728*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_EDGEFLAG, GL_RGBA, 1, 1, GL_UNSIGNED_BYTE,
1729*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, integer, GL_FALSE, ptr);
1730*61046927SAndroid Build Coastguard Worker }
1731*61046927SAndroid Build Coastguard Worker 
1732*61046927SAndroid Build Coastguard Worker 
1733*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EdgeFlagPointer(GLsizei stride,const GLvoid * ptr)1734*61046927SAndroid Build Coastguard Worker _mesa_EdgeFlagPointer(GLsizei stride, const GLvoid *ptr)
1735*61046927SAndroid Build Coastguard Worker {
1736*61046927SAndroid Build Coastguard Worker    /* this is the same type that glEdgeFlag uses */
1737*61046927SAndroid Build Coastguard Worker    const GLboolean integer = GL_FALSE;
1738*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1739*61046927SAndroid Build Coastguard Worker 
1740*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1741*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
1742*61046927SAndroid Build Coastguard Worker 
1743*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glEdgeFlagPointer",
1744*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1745*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_EDGEFLAG, legalTypes,
1746*61046927SAndroid Build Coastguard Worker                                   1, 1, 1, GL_UNSIGNED_BYTE, stride,
1747*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, integer, GL_FALSE, format, ptr))
1748*61046927SAndroid Build Coastguard Worker       return;
1749*61046927SAndroid Build Coastguard Worker 
1750*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1751*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_EDGEFLAG, format, 1, 1, GL_UNSIGNED_BYTE,
1752*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, integer, GL_FALSE, ptr);
1753*61046927SAndroid Build Coastguard Worker }
1754*61046927SAndroid Build Coastguard Worker 
1755*61046927SAndroid Build Coastguard Worker 
1756*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayEdgeFlagOffsetEXT(GLuint vaobj,GLuint buffer,GLsizei stride,GLintptr offset)1757*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayEdgeFlagOffsetEXT(GLuint vaobj, GLuint buffer, GLsizei stride,
1758*61046927SAndroid Build Coastguard Worker                                    GLintptr offset)
1759*61046927SAndroid Build Coastguard Worker {
1760*61046927SAndroid Build Coastguard Worker    /* this is the same type that glEdgeFlag uses */
1761*61046927SAndroid Build Coastguard Worker    const GLboolean integer = GL_FALSE;
1762*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1763*61046927SAndroid Build Coastguard Worker 
1764*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1765*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = UNSIGNED_BYTE_BIT;
1766*61046927SAndroid Build Coastguard Worker 
1767*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1768*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1769*61046927SAndroid Build Coastguard Worker 
1770*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1771*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1772*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayEdgeFlagOffsetEXT"))
1773*61046927SAndroid Build Coastguard Worker       return;
1774*61046927SAndroid Build Coastguard Worker 
1775*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayEdgeFlagOffsetEXT",
1776*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1777*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_EDGEFLAG, legalTypes,
1778*61046927SAndroid Build Coastguard Worker                                   1, 1, 1, GL_UNSIGNED_BYTE, stride,
1779*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, integer, GL_FALSE, format, (void*) offset))
1780*61046927SAndroid Build Coastguard Worker       return;
1781*61046927SAndroid Build Coastguard Worker 
1782*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1783*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_EDGEFLAG, format, 1, 1, GL_UNSIGNED_BYTE,
1784*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, integer, GL_FALSE, (void*) offset);
1785*61046927SAndroid Build Coastguard Worker }
1786*61046927SAndroid Build Coastguard Worker 
1787*61046927SAndroid Build Coastguard Worker 
1788*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PointSizePointerOES_no_error(GLenum type,GLsizei stride,const GLvoid * ptr)1789*61046927SAndroid Build Coastguard Worker _mesa_PointSizePointerOES_no_error(GLenum type, GLsizei stride,
1790*61046927SAndroid Build Coastguard Worker                                    const GLvoid *ptr)
1791*61046927SAndroid Build Coastguard Worker {
1792*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1793*61046927SAndroid Build Coastguard Worker 
1794*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1795*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_POINT_SIZE, GL_RGBA, 1, 1, type, stride,
1796*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1797*61046927SAndroid Build Coastguard Worker }
1798*61046927SAndroid Build Coastguard Worker 
1799*61046927SAndroid Build Coastguard Worker 
1800*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PointSizePointerOES(GLenum type,GLsizei stride,const GLvoid * ptr)1801*61046927SAndroid Build Coastguard Worker _mesa_PointSizePointerOES(GLenum type, GLsizei stride, const GLvoid *ptr)
1802*61046927SAndroid Build Coastguard Worker {
1803*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1804*61046927SAndroid Build Coastguard Worker 
1805*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1806*61046927SAndroid Build Coastguard Worker    if (ctx->API != API_OPENGLES) {
1807*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
1808*61046927SAndroid Build Coastguard Worker                   "glPointSizePointer(ES 1.x only)");
1809*61046927SAndroid Build Coastguard Worker       return;
1810*61046927SAndroid Build Coastguard Worker    }
1811*61046927SAndroid Build Coastguard Worker 
1812*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (FLOAT_BIT | FIXED_ES_BIT);
1813*61046927SAndroid Build Coastguard Worker 
1814*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glPointSizePointer",
1815*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1816*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_POINT_SIZE, legalTypes,
1817*61046927SAndroid Build Coastguard Worker                                   1, 1, 1, type, stride, GL_FALSE, GL_FALSE,
1818*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, format, ptr))
1819*61046927SAndroid Build Coastguard Worker       return;
1820*61046927SAndroid Build Coastguard Worker 
1821*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1822*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_POINT_SIZE, format, 1, 1, type, stride,
1823*61046927SAndroid Build Coastguard Worker                 GL_FALSE, GL_FALSE, GL_FALSE, ptr);
1824*61046927SAndroid Build Coastguard Worker }
1825*61046927SAndroid Build Coastguard Worker 
1826*61046927SAndroid Build Coastguard Worker 
1827*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribPointer_no_error(GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const GLvoid * ptr)1828*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribPointer_no_error(GLuint index, GLint size, GLenum type,
1829*61046927SAndroid Build Coastguard Worker                                    GLboolean normalized,
1830*61046927SAndroid Build Coastguard Worker                                    GLsizei stride, const GLvoid *ptr)
1831*61046927SAndroid Build Coastguard Worker {
1832*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1833*61046927SAndroid Build Coastguard Worker 
1834*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1835*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1836*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, BGRA_OR_4,
1837*61046927SAndroid Build Coastguard Worker                 size, type, stride, normalized, GL_FALSE, GL_FALSE, ptr);
1838*61046927SAndroid Build Coastguard Worker }
1839*61046927SAndroid Build Coastguard Worker 
1840*61046927SAndroid Build Coastguard Worker 
1841*61046927SAndroid Build Coastguard Worker /**
1842*61046927SAndroid Build Coastguard Worker  * Set a generic vertex attribute array.
1843*61046927SAndroid Build Coastguard Worker  * Note that these arrays DO NOT alias the conventional GL vertex arrays
1844*61046927SAndroid Build Coastguard Worker  * (position, normal, color, fog, texcoord, etc).
1845*61046927SAndroid Build Coastguard Worker  */
1846*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribPointer(GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,const GLvoid * ptr)1847*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribPointer(GLuint index, GLint size, GLenum type,
1848*61046927SAndroid Build Coastguard Worker                              GLboolean normalized,
1849*61046927SAndroid Build Coastguard Worker                              GLsizei stride, const GLvoid *ptr)
1850*61046927SAndroid Build Coastguard Worker {
1851*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1852*61046927SAndroid Build Coastguard Worker 
1853*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1854*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
1855*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribPointerARB(idx)");
1856*61046927SAndroid Build Coastguard Worker       return;
1857*61046927SAndroid Build Coastguard Worker    }
1858*61046927SAndroid Build Coastguard Worker 
1859*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
1860*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT |
1861*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT |
1862*61046927SAndroid Build Coastguard Worker                                   HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1863*61046927SAndroid Build Coastguard Worker                                   FIXED_ES_BIT | FIXED_GL_BIT |
1864*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_2_10_10_10_REV_BIT |
1865*61046927SAndroid Build Coastguard Worker                                   INT_2_10_10_10_REV_BIT |
1866*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_10F_11F_11F_REV_BIT);
1867*61046927SAndroid Build Coastguard Worker 
1868*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexAttribPointer",
1869*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1870*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_GENERIC(index), legalTypes,
1871*61046927SAndroid Build Coastguard Worker                                   1, BGRA_OR_4, size, type, stride,
1872*61046927SAndroid Build Coastguard Worker                                   normalized, GL_FALSE, GL_FALSE, format, ptr))
1873*61046927SAndroid Build Coastguard Worker       return;
1874*61046927SAndroid Build Coastguard Worker 
1875*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1876*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, BGRA_OR_4,
1877*61046927SAndroid Build Coastguard Worker                 size, type, stride, normalized, GL_FALSE, GL_FALSE, ptr);
1878*61046927SAndroid Build Coastguard Worker }
1879*61046927SAndroid Build Coastguard Worker 
1880*61046927SAndroid Build Coastguard Worker 
1881*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribOffsetEXT(GLuint vaobj,GLuint buffer,GLuint index,GLint size,GLenum type,GLboolean normalized,GLsizei stride,GLintptr offset)1882*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size,
1883*61046927SAndroid Build Coastguard Worker                                        GLenum type, GLboolean normalized,
1884*61046927SAndroid Build Coastguard Worker                                        GLsizei stride, GLintptr offset)
1885*61046927SAndroid Build Coastguard Worker {
1886*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1887*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, BGRA_OR_4, &size);
1888*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1889*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1890*61046927SAndroid Build Coastguard Worker 
1891*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1892*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1893*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayVertexAttribOffsetEXT"))
1894*61046927SAndroid Build Coastguard Worker       return;
1895*61046927SAndroid Build Coastguard Worker 
1896*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
1897*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexArrayVertexAttribOffsetEXT(idx)");
1898*61046927SAndroid Build Coastguard Worker       return;
1899*61046927SAndroid Build Coastguard Worker    }
1900*61046927SAndroid Build Coastguard Worker 
1901*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
1902*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT |
1903*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT |
1904*61046927SAndroid Build Coastguard Worker                                   HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
1905*61046927SAndroid Build Coastguard Worker                                   FIXED_ES_BIT | FIXED_GL_BIT |
1906*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_2_10_10_10_REV_BIT |
1907*61046927SAndroid Build Coastguard Worker                                   INT_2_10_10_10_REV_BIT |
1908*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_10F_11F_11F_REV_BIT);
1909*61046927SAndroid Build Coastguard Worker 
1910*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayVertexAttribOffsetEXT",
1911*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1912*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_GENERIC(index), legalTypes,
1913*61046927SAndroid Build Coastguard Worker                                   1, BGRA_OR_4, size, type, stride,
1914*61046927SAndroid Build Coastguard Worker                                   normalized, GL_FALSE, GL_FALSE, format, (void*) offset))
1915*61046927SAndroid Build Coastguard Worker       return;
1916*61046927SAndroid Build Coastguard Worker 
1917*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1918*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, BGRA_OR_4,
1919*61046927SAndroid Build Coastguard Worker                 size, type, stride, normalized, GL_FALSE, GL_FALSE, (void*) offset);
1920*61046927SAndroid Build Coastguard Worker }
1921*61046927SAndroid Build Coastguard Worker 
1922*61046927SAndroid Build Coastguard Worker 
1923*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribLOffsetEXT(GLuint vaobj,GLuint buffer,GLuint index,GLint size,GLenum type,GLsizei stride,GLintptr offset)1924*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribLOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size,
1925*61046927SAndroid Build Coastguard Worker                                         GLenum type, GLsizei stride, GLintptr offset)
1926*61046927SAndroid Build Coastguard Worker {
1927*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1928*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1929*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
1930*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
1931*61046927SAndroid Build Coastguard Worker 
1932*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
1933*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
1934*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayVertexAttribLOffsetEXT"))
1935*61046927SAndroid Build Coastguard Worker       return;
1936*61046927SAndroid Build Coastguard Worker 
1937*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
1938*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexArrayVertexAttribLOffsetEXT(idx)");
1939*61046927SAndroid Build Coastguard Worker       return;
1940*61046927SAndroid Build Coastguard Worker    }
1941*61046927SAndroid Build Coastguard Worker 
1942*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = ATTRIB_LFORMAT_TYPES_MASK;
1943*61046927SAndroid Build Coastguard Worker 
1944*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayVertexAttribLOffsetEXT",
1945*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
1946*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_GENERIC(index), legalTypes,
1947*61046927SAndroid Build Coastguard Worker                                   1, 4, size, type, stride,
1948*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_TRUE, format, (void*) offset))
1949*61046927SAndroid Build Coastguard Worker       return;
1950*61046927SAndroid Build Coastguard Worker 
1951*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
1952*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, 4,
1953*61046927SAndroid Build Coastguard Worker                 size, type, stride, GL_FALSE, GL_FALSE, GL_TRUE, (void*) offset);
1954*61046927SAndroid Build Coastguard Worker }
1955*61046927SAndroid Build Coastguard Worker 
1956*61046927SAndroid Build Coastguard Worker 
1957*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribIPointer_no_error(GLuint index,GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1958*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribIPointer_no_error(GLuint index, GLint size, GLenum type,
1959*61046927SAndroid Build Coastguard Worker                                     GLsizei stride, const GLvoid *ptr)
1960*61046927SAndroid Build Coastguard Worker {
1961*61046927SAndroid Build Coastguard Worker    const GLboolean normalized = GL_FALSE;
1962*61046927SAndroid Build Coastguard Worker    const GLboolean integer = GL_TRUE;
1963*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1964*61046927SAndroid Build Coastguard Worker 
1965*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1966*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), GL_RGBA, 4,  size, type,
1967*61046927SAndroid Build Coastguard Worker                 stride, normalized, integer, GL_FALSE, ptr);
1968*61046927SAndroid Build Coastguard Worker }
1969*61046927SAndroid Build Coastguard Worker 
1970*61046927SAndroid Build Coastguard Worker 
1971*61046927SAndroid Build Coastguard Worker /**
1972*61046927SAndroid Build Coastguard Worker  * GL_EXT_gpu_shader4 / GL 3.0.
1973*61046927SAndroid Build Coastguard Worker  * Set an integer-valued vertex attribute array.
1974*61046927SAndroid Build Coastguard Worker  * Note that these arrays DO NOT alias the conventional GL vertex arrays
1975*61046927SAndroid Build Coastguard Worker  * (position, normal, color, fog, texcoord, etc).
1976*61046927SAndroid Build Coastguard Worker  */
1977*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribIPointer(GLuint index,GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)1978*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribIPointer(GLuint index, GLint size, GLenum type,
1979*61046927SAndroid Build Coastguard Worker                            GLsizei stride, const GLvoid *ptr)
1980*61046927SAndroid Build Coastguard Worker {
1981*61046927SAndroid Build Coastguard Worker    const GLboolean normalized = GL_FALSE;
1982*61046927SAndroid Build Coastguard Worker    const GLboolean integer = GL_TRUE;
1983*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
1984*61046927SAndroid Build Coastguard Worker 
1985*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
1986*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
1987*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribIPointer(index)");
1988*61046927SAndroid Build Coastguard Worker       return;
1989*61046927SAndroid Build Coastguard Worker    }
1990*61046927SAndroid Build Coastguard Worker 
1991*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
1992*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT |
1993*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT);
1994*61046927SAndroid Build Coastguard Worker 
1995*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexAttribIPointer",
1996*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
1997*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_GENERIC(index), legalTypes,
1998*61046927SAndroid Build Coastguard Worker                                   1, 4, size, type, stride,
1999*61046927SAndroid Build Coastguard Worker                                   normalized, integer, GL_FALSE, format, ptr))
2000*61046927SAndroid Build Coastguard Worker       return;
2001*61046927SAndroid Build Coastguard Worker 
2002*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
2003*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, 4,  size, type,
2004*61046927SAndroid Build Coastguard Worker                 stride, normalized, integer, GL_FALSE, ptr);
2005*61046927SAndroid Build Coastguard Worker }
2006*61046927SAndroid Build Coastguard Worker 
2007*61046927SAndroid Build Coastguard Worker 
2008*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribLPointer_no_error(GLuint index,GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)2009*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribLPointer_no_error(GLuint index, GLint size, GLenum type,
2010*61046927SAndroid Build Coastguard Worker                                     GLsizei stride, const GLvoid *ptr)
2011*61046927SAndroid Build Coastguard Worker {
2012*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2013*61046927SAndroid Build Coastguard Worker 
2014*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
2015*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), GL_RGBA, 4, size, type,
2016*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_TRUE, ptr);
2017*61046927SAndroid Build Coastguard Worker }
2018*61046927SAndroid Build Coastguard Worker 
2019*61046927SAndroid Build Coastguard Worker 
2020*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribIOffsetEXT(GLuint vaobj,GLuint buffer,GLuint index,GLint size,GLenum type,GLsizei stride,GLintptr offset)2021*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribIOffsetEXT(GLuint vaobj, GLuint buffer, GLuint index, GLint size,
2022*61046927SAndroid Build Coastguard Worker                                         GLenum type, GLsizei stride, GLintptr offset)
2023*61046927SAndroid Build Coastguard Worker {
2024*61046927SAndroid Build Coastguard Worker    const GLboolean normalized = GL_FALSE;
2025*61046927SAndroid Build Coastguard Worker    const GLboolean integer = GL_TRUE;
2026*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2027*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
2028*61046927SAndroid Build Coastguard Worker 
2029*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
2030*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object* vbo;
2031*61046927SAndroid Build Coastguard Worker 
2032*61046927SAndroid Build Coastguard Worker    if (!_lookup_vao_and_vbo_dsa(ctx, vaobj, buffer, offset,
2033*61046927SAndroid Build Coastguard Worker                                 &vao, &vbo,
2034*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayVertexAttribIOffsetEXT"))
2035*61046927SAndroid Build Coastguard Worker       return;
2036*61046927SAndroid Build Coastguard Worker 
2037*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2038*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexArrayVertexAttribIOffsetEXT(index)");
2039*61046927SAndroid Build Coastguard Worker       return;
2040*61046927SAndroid Build Coastguard Worker    }
2041*61046927SAndroid Build Coastguard Worker 
2042*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (BYTE_BIT | UNSIGNED_BYTE_BIT |
2043*61046927SAndroid Build Coastguard Worker                                   SHORT_BIT | UNSIGNED_SHORT_BIT |
2044*61046927SAndroid Build Coastguard Worker                                   INT_BIT | UNSIGNED_INT_BIT);
2045*61046927SAndroid Build Coastguard Worker 
2046*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexArrayVertexAttribIOffsetEXT",
2047*61046927SAndroid Build Coastguard Worker                                   vao, vbo,
2048*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_GENERIC(index), legalTypes,
2049*61046927SAndroid Build Coastguard Worker                                   1, 4, size, type, stride,
2050*61046927SAndroid Build Coastguard Worker                                   normalized, integer, GL_FALSE, format, (void*) offset))
2051*61046927SAndroid Build Coastguard Worker       return;
2052*61046927SAndroid Build Coastguard Worker 
2053*61046927SAndroid Build Coastguard Worker    update_array(ctx, vao, vbo,
2054*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, 4,  size, type,
2055*61046927SAndroid Build Coastguard Worker                 stride, normalized, integer, GL_FALSE, (void*) offset);
2056*61046927SAndroid Build Coastguard Worker }
2057*61046927SAndroid Build Coastguard Worker 
2058*61046927SAndroid Build Coastguard Worker 
2059*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribLPointer(GLuint index,GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)2060*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribLPointer(GLuint index, GLint size, GLenum type,
2061*61046927SAndroid Build Coastguard Worker                            GLsizei stride, const GLvoid *ptr)
2062*61046927SAndroid Build Coastguard Worker {
2063*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2064*61046927SAndroid Build Coastguard Worker 
2065*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
2066*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2067*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glVertexAttribLPointer(index)");
2068*61046927SAndroid Build Coastguard Worker       return;
2069*61046927SAndroid Build Coastguard Worker    }
2070*61046927SAndroid Build Coastguard Worker 
2071*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = ATTRIB_LFORMAT_TYPES_MASK;
2072*61046927SAndroid Build Coastguard Worker 
2073*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glVertexAttribLPointer",
2074*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
2075*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_GENERIC(index), legalTypes,
2076*61046927SAndroid Build Coastguard Worker                                   1, 4, size, type, stride,
2077*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_TRUE, format, ptr))
2078*61046927SAndroid Build Coastguard Worker       return;
2079*61046927SAndroid Build Coastguard Worker 
2080*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
2081*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_GENERIC(index), format, 4, size, type,
2082*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_TRUE, ptr);
2083*61046927SAndroid Build Coastguard Worker }
2084*61046927SAndroid Build Coastguard Worker 
2085*61046927SAndroid Build Coastguard Worker /**
2086*61046927SAndroid Build Coastguard Worker  * Set the per-vertex edge flag enablement according to the "enable"
2087*61046927SAndroid Build Coastguard Worker  * parameter. If "enable" is false, the zero-stride edge flag attribute value
2088*61046927SAndroid Build Coastguard Worker  * will be used instead.
2089*61046927SAndroid Build Coastguard Worker  *
2090*61046927SAndroid Build Coastguard Worker  * This is used by VAOs, glBegin/End and display lists.
2091*61046927SAndroid Build Coastguard Worker  */
2092*61046927SAndroid Build Coastguard Worker void
_mesa_update_edgeflag_state_explicit(struct gl_context * ctx,bool per_vertex_enable)2093*61046927SAndroid Build Coastguard Worker _mesa_update_edgeflag_state_explicit(struct gl_context *ctx,
2094*61046927SAndroid Build Coastguard Worker                                      bool per_vertex_enable)
2095*61046927SAndroid Build Coastguard Worker {
2096*61046927SAndroid Build Coastguard Worker    if (ctx->API != API_OPENGL_COMPAT)
2097*61046927SAndroid Build Coastguard Worker       return;
2098*61046927SAndroid Build Coastguard Worker 
2099*61046927SAndroid Build Coastguard Worker    /* Edge flags take effect only if the polygon mode is not FILL, and they
2100*61046927SAndroid Build Coastguard Worker     * determine whether a line or point is drawn with that polygon mode.
2101*61046927SAndroid Build Coastguard Worker     */
2102*61046927SAndroid Build Coastguard Worker    bool edgeflags_have_effect = ctx->Polygon.FrontMode != GL_FILL ||
2103*61046927SAndroid Build Coastguard Worker                                 ctx->Polygon.BackMode != GL_FILL;
2104*61046927SAndroid Build Coastguard Worker    per_vertex_enable &= edgeflags_have_effect;
2105*61046927SAndroid Build Coastguard Worker 
2106*61046927SAndroid Build Coastguard Worker    if (per_vertex_enable != ctx->Array._PerVertexEdgeFlagsEnabled) {
2107*61046927SAndroid Build Coastguard Worker       ctx->Array._PerVertexEdgeFlagsEnabled = per_vertex_enable;
2108*61046927SAndroid Build Coastguard Worker 
2109*61046927SAndroid Build Coastguard Worker       struct gl_program *vp = ctx->VertexProgram._Current;
2110*61046927SAndroid Build Coastguard Worker       if (vp) {
2111*61046927SAndroid Build Coastguard Worker          ctx->NewDriverState |= ST_NEW_VS_STATE |
2112*61046927SAndroid Build Coastguard Worker                                 ST_NEW_VERTEX_ARRAYS;
2113*61046927SAndroid Build Coastguard Worker          ctx->Array.NewVertexElements = true;
2114*61046927SAndroid Build Coastguard Worker       }
2115*61046927SAndroid Build Coastguard Worker    }
2116*61046927SAndroid Build Coastguard Worker 
2117*61046927SAndroid Build Coastguard Worker    /* If there are no per-vertex edge flags and the zero-stride edge flag is
2118*61046927SAndroid Build Coastguard Worker     * false, all front and back points and lines generated by polygon mode
2119*61046927SAndroid Build Coastguard Worker     * are not drawn.
2120*61046927SAndroid Build Coastguard Worker     */
2121*61046927SAndroid Build Coastguard Worker    bool polygon_mode_always_culls = edgeflags_have_effect &&
2122*61046927SAndroid Build Coastguard Worker                                     !ctx->Array._PerVertexEdgeFlagsEnabled &&
2123*61046927SAndroid Build Coastguard Worker                                     !ctx->Current.Attrib[VERT_ATTRIB_EDGEFLAG][0];
2124*61046927SAndroid Build Coastguard Worker    if (polygon_mode_always_culls != ctx->Array._PolygonModeAlwaysCulls) {
2125*61046927SAndroid Build Coastguard Worker       ctx->Array._PolygonModeAlwaysCulls = polygon_mode_always_culls;
2126*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_RASTERIZER;
2127*61046927SAndroid Build Coastguard Worker    }
2128*61046927SAndroid Build Coastguard Worker }
2129*61046927SAndroid Build Coastguard Worker 
2130*61046927SAndroid Build Coastguard Worker /**
2131*61046927SAndroid Build Coastguard Worker  * Set the edge flag state using the current VAO and the zero-stride
2132*61046927SAndroid Build Coastguard Worker  * edge flag attribute value if per-vertex edge flags are disabled.
2133*61046927SAndroid Build Coastguard Worker  */
2134*61046927SAndroid Build Coastguard Worker void
_mesa_update_edgeflag_state_vao(struct gl_context * ctx)2135*61046927SAndroid Build Coastguard Worker _mesa_update_edgeflag_state_vao(struct gl_context *ctx)
2136*61046927SAndroid Build Coastguard Worker {
2137*61046927SAndroid Build Coastguard Worker    _mesa_update_edgeflag_state_explicit(ctx,
2138*61046927SAndroid Build Coastguard Worker                                         ctx->Array._DrawVAO->Enabled &
2139*61046927SAndroid Build Coastguard Worker                                         VERT_BIT_EDGEFLAG);
2140*61046927SAndroid Build Coastguard Worker }
2141*61046927SAndroid Build Coastguard Worker 
2142*61046927SAndroid Build Coastguard Worker void
_mesa_enable_vertex_array_attribs(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLbitfield attrib_bits)2143*61046927SAndroid Build Coastguard Worker _mesa_enable_vertex_array_attribs(struct gl_context *ctx,
2144*61046927SAndroid Build Coastguard Worker                                   struct gl_vertex_array_object *vao,
2145*61046927SAndroid Build Coastguard Worker                                   GLbitfield attrib_bits)
2146*61046927SAndroid Build Coastguard Worker {
2147*61046927SAndroid Build Coastguard Worker    assert(!vao->SharedAndImmutable);
2148*61046927SAndroid Build Coastguard Worker 
2149*61046927SAndroid Build Coastguard Worker    /* Only work on bits that are disabled */
2150*61046927SAndroid Build Coastguard Worker    attrib_bits &= ~vao->Enabled;
2151*61046927SAndroid Build Coastguard Worker    if (attrib_bits) {
2152*61046927SAndroid Build Coastguard Worker       /* was disabled, now being enabled */
2153*61046927SAndroid Build Coastguard Worker       vao->Enabled |= attrib_bits;
2154*61046927SAndroid Build Coastguard Worker       vao->NonDefaultStateMask |= attrib_bits;
2155*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
2156*61046927SAndroid Build Coastguard Worker       ctx->Array.NewVertexElements = true;
2157*61046927SAndroid Build Coastguard Worker 
2158*61046927SAndroid Build Coastguard Worker       /* Update the map mode if needed */
2159*61046927SAndroid Build Coastguard Worker       if (attrib_bits & (VERT_BIT_POS|VERT_BIT_GENERIC0))
2160*61046927SAndroid Build Coastguard Worker          update_attribute_map_mode(ctx, vao);
2161*61046927SAndroid Build Coastguard Worker 
2162*61046927SAndroid Build Coastguard Worker       if (attrib_bits & VERT_BIT_EDGEFLAG)
2163*61046927SAndroid Build Coastguard Worker          _mesa_update_edgeflag_state_vao(ctx);
2164*61046927SAndroid Build Coastguard Worker 
2165*61046927SAndroid Build Coastguard Worker       vao->_EnabledWithMapMode =
2166*61046927SAndroid Build Coastguard Worker          _mesa_vao_enable_to_vp_inputs(vao->_AttributeMapMode, vao->Enabled);
2167*61046927SAndroid Build Coastguard Worker    }
2168*61046927SAndroid Build Coastguard Worker }
2169*61046927SAndroid Build Coastguard Worker 
2170*61046927SAndroid Build Coastguard Worker static void
enable_vertex_array_attrib(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint index,const char * func)2171*61046927SAndroid Build Coastguard Worker enable_vertex_array_attrib(struct gl_context *ctx,
2172*61046927SAndroid Build Coastguard Worker                            struct gl_vertex_array_object *vao,
2173*61046927SAndroid Build Coastguard Worker                            GLuint index,
2174*61046927SAndroid Build Coastguard Worker                            const char *func)
2175*61046927SAndroid Build Coastguard Worker {
2176*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2177*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "%s(index)", func);
2178*61046927SAndroid Build Coastguard Worker       return;
2179*61046927SAndroid Build Coastguard Worker    }
2180*61046927SAndroid Build Coastguard Worker 
2181*61046927SAndroid Build Coastguard Worker    _mesa_enable_vertex_array_attrib(ctx, vao, VERT_ATTRIB_GENERIC(index));
2182*61046927SAndroid Build Coastguard Worker }
2183*61046927SAndroid Build Coastguard Worker 
2184*61046927SAndroid Build Coastguard Worker 
2185*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableVertexAttribArray(GLuint index)2186*61046927SAndroid Build Coastguard Worker _mesa_EnableVertexAttribArray(GLuint index)
2187*61046927SAndroid Build Coastguard Worker {
2188*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2189*61046927SAndroid Build Coastguard Worker    enable_vertex_array_attrib(ctx, ctx->Array.VAO, index,
2190*61046927SAndroid Build Coastguard Worker                               "glEnableVertexAttribArray");
2191*61046927SAndroid Build Coastguard Worker }
2192*61046927SAndroid Build Coastguard Worker 
2193*61046927SAndroid Build Coastguard Worker 
2194*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableVertexAttribArray_no_error(GLuint index)2195*61046927SAndroid Build Coastguard Worker _mesa_EnableVertexAttribArray_no_error(GLuint index)
2196*61046927SAndroid Build Coastguard Worker {
2197*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2198*61046927SAndroid Build Coastguard Worker    _mesa_enable_vertex_array_attrib(ctx, ctx->Array.VAO,
2199*61046927SAndroid Build Coastguard Worker                                     VERT_ATTRIB_GENERIC(index));
2200*61046927SAndroid Build Coastguard Worker }
2201*61046927SAndroid Build Coastguard Worker 
2202*61046927SAndroid Build Coastguard Worker 
2203*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableVertexArrayAttrib(GLuint vaobj,GLuint index)2204*61046927SAndroid Build Coastguard Worker _mesa_EnableVertexArrayAttrib(GLuint vaobj, GLuint index)
2205*61046927SAndroid Build Coastguard Worker {
2206*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2207*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
2208*61046927SAndroid Build Coastguard Worker 
2209*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2210*61046927SAndroid Build Coastguard Worker     *
2211*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by EnableVertexArrayAttrib
2212*61046927SAndroid Build Coastguard Worker     *    and DisableVertexArrayAttrib if <vaobj> is not
2213*61046927SAndroid Build Coastguard Worker     *    [compatibility profile: zero or] the name of an existing vertex
2214*61046927SAndroid Build Coastguard Worker     *    array object."
2215*61046927SAndroid Build Coastguard Worker     */
2216*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glEnableVertexArrayAttrib");
2217*61046927SAndroid Build Coastguard Worker    if (!vao)
2218*61046927SAndroid Build Coastguard Worker       return;
2219*61046927SAndroid Build Coastguard Worker 
2220*61046927SAndroid Build Coastguard Worker    enable_vertex_array_attrib(ctx, vao, index, "glEnableVertexArrayAttrib");
2221*61046927SAndroid Build Coastguard Worker }
2222*61046927SAndroid Build Coastguard Worker 
2223*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableVertexArrayAttribEXT(GLuint vaobj,GLuint index)2224*61046927SAndroid Build Coastguard Worker _mesa_EnableVertexArrayAttribEXT(GLuint vaobj, GLuint index)
2225*61046927SAndroid Build Coastguard Worker {
2226*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2227*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao = _mesa_lookup_vao_err(ctx, vaobj,
2228*61046927SAndroid Build Coastguard Worker                                                              true,
2229*61046927SAndroid Build Coastguard Worker                                                              "glEnableVertexArrayAttribEXT");
2230*61046927SAndroid Build Coastguard Worker    if (!vao)
2231*61046927SAndroid Build Coastguard Worker       return;
2232*61046927SAndroid Build Coastguard Worker 
2233*61046927SAndroid Build Coastguard Worker    enable_vertex_array_attrib(ctx, vao, index, "glEnableVertexArrayAttribEXT");
2234*61046927SAndroid Build Coastguard Worker }
2235*61046927SAndroid Build Coastguard Worker 
2236*61046927SAndroid Build Coastguard Worker 
2237*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EnableVertexArrayAttrib_no_error(GLuint vaobj,GLuint index)2238*61046927SAndroid Build Coastguard Worker _mesa_EnableVertexArrayAttrib_no_error(GLuint vaobj, GLuint index)
2239*61046927SAndroid Build Coastguard Worker {
2240*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2241*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
2242*61046927SAndroid Build Coastguard Worker    _mesa_enable_vertex_array_attrib(ctx, vao, VERT_ATTRIB_GENERIC(index));
2243*61046927SAndroid Build Coastguard Worker }
2244*61046927SAndroid Build Coastguard Worker 
2245*61046927SAndroid Build Coastguard Worker 
2246*61046927SAndroid Build Coastguard Worker void
_mesa_disable_vertex_array_attribs(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLbitfield attrib_bits)2247*61046927SAndroid Build Coastguard Worker _mesa_disable_vertex_array_attribs(struct gl_context *ctx,
2248*61046927SAndroid Build Coastguard Worker                                    struct gl_vertex_array_object *vao,
2249*61046927SAndroid Build Coastguard Worker                                    GLbitfield attrib_bits)
2250*61046927SAndroid Build Coastguard Worker {
2251*61046927SAndroid Build Coastguard Worker    assert(!vao->SharedAndImmutable);
2252*61046927SAndroid Build Coastguard Worker 
2253*61046927SAndroid Build Coastguard Worker    /* Only work on bits that are enabled */
2254*61046927SAndroid Build Coastguard Worker    attrib_bits &= vao->Enabled;
2255*61046927SAndroid Build Coastguard Worker    if (attrib_bits) {
2256*61046927SAndroid Build Coastguard Worker       /* was enabled, now being disabled */
2257*61046927SAndroid Build Coastguard Worker       vao->Enabled &= ~attrib_bits;
2258*61046927SAndroid Build Coastguard Worker       ctx->NewDriverState |= ST_NEW_VERTEX_ARRAYS;
2259*61046927SAndroid Build Coastguard Worker       ctx->Array.NewVertexElements = true;
2260*61046927SAndroid Build Coastguard Worker 
2261*61046927SAndroid Build Coastguard Worker       /* Update the map mode if needed */
2262*61046927SAndroid Build Coastguard Worker       if (attrib_bits & (VERT_BIT_POS|VERT_BIT_GENERIC0))
2263*61046927SAndroid Build Coastguard Worker          update_attribute_map_mode(ctx, vao);
2264*61046927SAndroid Build Coastguard Worker 
2265*61046927SAndroid Build Coastguard Worker       if (attrib_bits & VERT_BIT_EDGEFLAG)
2266*61046927SAndroid Build Coastguard Worker          _mesa_update_edgeflag_state_vao(ctx);
2267*61046927SAndroid Build Coastguard Worker 
2268*61046927SAndroid Build Coastguard Worker       vao->_EnabledWithMapMode =
2269*61046927SAndroid Build Coastguard Worker          _mesa_vao_enable_to_vp_inputs(vao->_AttributeMapMode, vao->Enabled);
2270*61046927SAndroid Build Coastguard Worker    }
2271*61046927SAndroid Build Coastguard Worker }
2272*61046927SAndroid Build Coastguard Worker 
2273*61046927SAndroid Build Coastguard Worker 
2274*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableVertexAttribArray(GLuint index)2275*61046927SAndroid Build Coastguard Worker _mesa_DisableVertexAttribArray(GLuint index)
2276*61046927SAndroid Build Coastguard Worker {
2277*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2278*61046927SAndroid Build Coastguard Worker 
2279*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2280*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glDisableVertexAttribArray(index)");
2281*61046927SAndroid Build Coastguard Worker       return;
2282*61046927SAndroid Build Coastguard Worker    }
2283*61046927SAndroid Build Coastguard Worker 
2284*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
2285*61046927SAndroid Build Coastguard Worker    _mesa_disable_vertex_array_attrib(ctx, ctx->Array.VAO, attrib);
2286*61046927SAndroid Build Coastguard Worker }
2287*61046927SAndroid Build Coastguard Worker 
2288*61046927SAndroid Build Coastguard Worker 
2289*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableVertexAttribArray_no_error(GLuint index)2290*61046927SAndroid Build Coastguard Worker _mesa_DisableVertexAttribArray_no_error(GLuint index)
2291*61046927SAndroid Build Coastguard Worker {
2292*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2293*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
2294*61046927SAndroid Build Coastguard Worker    _mesa_disable_vertex_array_attrib(ctx, ctx->Array.VAO, attrib);
2295*61046927SAndroid Build Coastguard Worker }
2296*61046927SAndroid Build Coastguard Worker 
2297*61046927SAndroid Build Coastguard Worker 
2298*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableVertexArrayAttrib(GLuint vaobj,GLuint index)2299*61046927SAndroid Build Coastguard Worker _mesa_DisableVertexArrayAttrib(GLuint vaobj, GLuint index)
2300*61046927SAndroid Build Coastguard Worker {
2301*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2302*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
2303*61046927SAndroid Build Coastguard Worker 
2304*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2305*61046927SAndroid Build Coastguard Worker     *
2306*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by EnableVertexArrayAttrib
2307*61046927SAndroid Build Coastguard Worker     *    and DisableVertexArrayAttrib if <vaobj> is not
2308*61046927SAndroid Build Coastguard Worker     *    [compatibility profile: zero or] the name of an existing vertex
2309*61046927SAndroid Build Coastguard Worker     *    array object."
2310*61046927SAndroid Build Coastguard Worker     */
2311*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glDisableVertexArrayAttrib");
2312*61046927SAndroid Build Coastguard Worker    if (!vao)
2313*61046927SAndroid Build Coastguard Worker       return;
2314*61046927SAndroid Build Coastguard Worker 
2315*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2316*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glDisableVertexArrayAttrib(index)");
2317*61046927SAndroid Build Coastguard Worker       return;
2318*61046927SAndroid Build Coastguard Worker    }
2319*61046927SAndroid Build Coastguard Worker 
2320*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
2321*61046927SAndroid Build Coastguard Worker    _mesa_disable_vertex_array_attrib(ctx, vao, attrib);
2322*61046927SAndroid Build Coastguard Worker }
2323*61046927SAndroid Build Coastguard Worker 
2324*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableVertexArrayAttribEXT(GLuint vaobj,GLuint index)2325*61046927SAndroid Build Coastguard Worker _mesa_DisableVertexArrayAttribEXT(GLuint vaobj, GLuint index)
2326*61046927SAndroid Build Coastguard Worker {
2327*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2328*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao = _mesa_lookup_vao_err(ctx, vaobj,
2329*61046927SAndroid Build Coastguard Worker                                                              true,
2330*61046927SAndroid Build Coastguard Worker                                                              "glEnableVertexArrayAttribEXT");
2331*61046927SAndroid Build Coastguard Worker    if (!vao)
2332*61046927SAndroid Build Coastguard Worker       return;
2333*61046927SAndroid Build Coastguard Worker 
2334*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2335*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glDisableVertexArrayAttrib(index)");
2336*61046927SAndroid Build Coastguard Worker       return;
2337*61046927SAndroid Build Coastguard Worker    }
2338*61046927SAndroid Build Coastguard Worker 
2339*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
2340*61046927SAndroid Build Coastguard Worker    _mesa_disable_vertex_array_attrib(ctx, vao, attrib);
2341*61046927SAndroid Build Coastguard Worker }
2342*61046927SAndroid Build Coastguard Worker 
2343*61046927SAndroid Build Coastguard Worker 
2344*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_DisableVertexArrayAttrib_no_error(GLuint vaobj,GLuint index)2345*61046927SAndroid Build Coastguard Worker _mesa_DisableVertexArrayAttrib_no_error(GLuint vaobj, GLuint index)
2346*61046927SAndroid Build Coastguard Worker {
2347*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2348*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
2349*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib attrib = VERT_ATTRIB_GENERIC(index);
2350*61046927SAndroid Build Coastguard Worker    _mesa_disable_vertex_array_attrib(ctx, vao, attrib);
2351*61046927SAndroid Build Coastguard Worker }
2352*61046927SAndroid Build Coastguard Worker 
2353*61046927SAndroid Build Coastguard Worker 
2354*61046927SAndroid Build Coastguard Worker /**
2355*61046927SAndroid Build Coastguard Worker  * Return info for a vertex attribute array (no alias with legacy
2356*61046927SAndroid Build Coastguard Worker  * vertex attributes (pos, normal, color, etc)).  This function does
2357*61046927SAndroid Build Coastguard Worker  * not handle the 4-element GL_CURRENT_VERTEX_ATTRIB_ARB query.
2358*61046927SAndroid Build Coastguard Worker  */
2359*61046927SAndroid Build Coastguard Worker static GLuint
get_vertex_array_attrib(struct gl_context * ctx,const struct gl_vertex_array_object * vao,GLuint index,GLenum pname,const char * caller)2360*61046927SAndroid Build Coastguard Worker get_vertex_array_attrib(struct gl_context *ctx,
2361*61046927SAndroid Build Coastguard Worker                         const struct gl_vertex_array_object *vao,
2362*61046927SAndroid Build Coastguard Worker                         GLuint index, GLenum pname,
2363*61046927SAndroid Build Coastguard Worker                         const char *caller)
2364*61046927SAndroid Build Coastguard Worker {
2365*61046927SAndroid Build Coastguard Worker    const struct gl_array_attributes *array;
2366*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *buf;
2367*61046927SAndroid Build Coastguard Worker 
2368*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2369*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "%s(index=%u)", caller, index);
2370*61046927SAndroid Build Coastguard Worker       return 0;
2371*61046927SAndroid Build Coastguard Worker    }
2372*61046927SAndroid Build Coastguard Worker 
2373*61046927SAndroid Build Coastguard Worker    assert(VERT_ATTRIB_GENERIC(index) < ARRAY_SIZE(vao->VertexAttrib));
2374*61046927SAndroid Build Coastguard Worker 
2375*61046927SAndroid Build Coastguard Worker    array = &vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
2376*61046927SAndroid Build Coastguard Worker 
2377*61046927SAndroid Build Coastguard Worker    switch (pname) {
2378*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB:
2379*61046927SAndroid Build Coastguard Worker       return !!(vao->Enabled & VERT_BIT_GENERIC(index));
2380*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB:
2381*61046927SAndroid Build Coastguard Worker       return array->Format.User.Bgra ? GL_BGRA : array->Format.User.Size;
2382*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB:
2383*61046927SAndroid Build Coastguard Worker       return array->Stride;
2384*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB:
2385*61046927SAndroid Build Coastguard Worker       return array->Format.User.Type;
2386*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB:
2387*61046927SAndroid Build Coastguard Worker       return array->Format.User.Normalized;
2388*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
2389*61046927SAndroid Build Coastguard Worker       buf = vao->BufferBinding[array->BufferBindingIndex].BufferObj;
2390*61046927SAndroid Build Coastguard Worker       return buf ? buf->Name : 0;
2391*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_INTEGER:
2392*61046927SAndroid Build Coastguard Worker       if ((_mesa_is_desktop_gl(ctx)
2393*61046927SAndroid Build Coastguard Worker            && (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))
2394*61046927SAndroid Build Coastguard Worker           || _mesa_is_gles3(ctx)) {
2395*61046927SAndroid Build Coastguard Worker          return array->Format.User.Integer;
2396*61046927SAndroid Build Coastguard Worker       }
2397*61046927SAndroid Build Coastguard Worker       goto error;
2398*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_LONG:
2399*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl(ctx)) {
2400*61046927SAndroid Build Coastguard Worker          return array->Format.User.Doubles;
2401*61046927SAndroid Build Coastguard Worker       }
2402*61046927SAndroid Build Coastguard Worker       goto error;
2403*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB:
2404*61046927SAndroid Build Coastguard Worker       if (_mesa_has_ARB_instanced_arrays(ctx) ||
2405*61046927SAndroid Build Coastguard Worker           _mesa_has_EXT_instanced_arrays(ctx)) {
2406*61046927SAndroid Build Coastguard Worker          return vao->BufferBinding[array->BufferBindingIndex].InstanceDivisor;
2407*61046927SAndroid Build Coastguard Worker       }
2408*61046927SAndroid Build Coastguard Worker       goto error;
2409*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_BINDING:
2410*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles31(ctx)) {
2411*61046927SAndroid Build Coastguard Worker          return array->BufferBindingIndex - VERT_ATTRIB_GENERIC0;
2412*61046927SAndroid Build Coastguard Worker       }
2413*61046927SAndroid Build Coastguard Worker       goto error;
2414*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_ATTRIB_RELATIVE_OFFSET:
2415*61046927SAndroid Build Coastguard Worker       if (_mesa_is_desktop_gl(ctx) || _mesa_is_gles31(ctx)) {
2416*61046927SAndroid Build Coastguard Worker          return array->RelativeOffset;
2417*61046927SAndroid Build Coastguard Worker       }
2418*61046927SAndroid Build Coastguard Worker       goto error;
2419*61046927SAndroid Build Coastguard Worker    default:
2420*61046927SAndroid Build Coastguard Worker       ; /* fall-through */
2421*61046927SAndroid Build Coastguard Worker    }
2422*61046927SAndroid Build Coastguard Worker 
2423*61046927SAndroid Build Coastguard Worker error:
2424*61046927SAndroid Build Coastguard Worker    _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=0x%x)", caller, pname);
2425*61046927SAndroid Build Coastguard Worker    return 0;
2426*61046927SAndroid Build Coastguard Worker }
2427*61046927SAndroid Build Coastguard Worker 
2428*61046927SAndroid Build Coastguard Worker 
2429*61046927SAndroid Build Coastguard Worker static const GLfloat *
get_current_attrib(struct gl_context * ctx,GLuint index,const char * function)2430*61046927SAndroid Build Coastguard Worker get_current_attrib(struct gl_context *ctx, GLuint index, const char *function)
2431*61046927SAndroid Build Coastguard Worker {
2432*61046927SAndroid Build Coastguard Worker    if (index == 0) {
2433*61046927SAndroid Build Coastguard Worker       if (_mesa_attr_zero_aliases_vertex(ctx)) {
2434*61046927SAndroid Build Coastguard Worker 	 _mesa_error(ctx, GL_INVALID_OPERATION, "%s(index==0)", function);
2435*61046927SAndroid Build Coastguard Worker 	 return NULL;
2436*61046927SAndroid Build Coastguard Worker       }
2437*61046927SAndroid Build Coastguard Worker    }
2438*61046927SAndroid Build Coastguard Worker    else if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2439*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
2440*61046927SAndroid Build Coastguard Worker 		  "%s(index>=GL_MAX_VERTEX_ATTRIBS)", function);
2441*61046927SAndroid Build Coastguard Worker       return NULL;
2442*61046927SAndroid Build Coastguard Worker    }
2443*61046927SAndroid Build Coastguard Worker 
2444*61046927SAndroid Build Coastguard Worker    assert(VERT_ATTRIB_GENERIC(index) <
2445*61046927SAndroid Build Coastguard Worker           ARRAY_SIZE(ctx->Array.VAO->VertexAttrib));
2446*61046927SAndroid Build Coastguard Worker 
2447*61046927SAndroid Build Coastguard Worker    FLUSH_CURRENT(ctx, 0);
2448*61046927SAndroid Build Coastguard Worker    return ctx->Current.Attrib[VERT_ATTRIB_GENERIC(index)];
2449*61046927SAndroid Build Coastguard Worker }
2450*61046927SAndroid Build Coastguard Worker 
2451*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribfv(GLuint index,GLenum pname,GLfloat * params)2452*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribfv(GLuint index, GLenum pname, GLfloat *params)
2453*61046927SAndroid Build Coastguard Worker {
2454*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2455*61046927SAndroid Build Coastguard Worker 
2456*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2457*61046927SAndroid Build Coastguard Worker       const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribfv");
2458*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2459*61046927SAndroid Build Coastguard Worker          COPY_4V(params, v);
2460*61046927SAndroid Build Coastguard Worker       }
2461*61046927SAndroid Build Coastguard Worker    }
2462*61046927SAndroid Build Coastguard Worker    else {
2463*61046927SAndroid Build Coastguard Worker       params[0] = (GLfloat) get_vertex_array_attrib(ctx, ctx->Array.VAO,
2464*61046927SAndroid Build Coastguard Worker                                                     index, pname,
2465*61046927SAndroid Build Coastguard Worker                                                     "glGetVertexAttribfv");
2466*61046927SAndroid Build Coastguard Worker    }
2467*61046927SAndroid Build Coastguard Worker }
2468*61046927SAndroid Build Coastguard Worker 
2469*61046927SAndroid Build Coastguard Worker 
2470*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribdv(GLuint index,GLenum pname,GLdouble * params)2471*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribdv(GLuint index, GLenum pname, GLdouble *params)
2472*61046927SAndroid Build Coastguard Worker {
2473*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2474*61046927SAndroid Build Coastguard Worker 
2475*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2476*61046927SAndroid Build Coastguard Worker       const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribdv");
2477*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2478*61046927SAndroid Build Coastguard Worker          params[0] = (GLdouble) v[0];
2479*61046927SAndroid Build Coastguard Worker          params[1] = (GLdouble) v[1];
2480*61046927SAndroid Build Coastguard Worker          params[2] = (GLdouble) v[2];
2481*61046927SAndroid Build Coastguard Worker          params[3] = (GLdouble) v[3];
2482*61046927SAndroid Build Coastguard Worker       }
2483*61046927SAndroid Build Coastguard Worker    }
2484*61046927SAndroid Build Coastguard Worker    else {
2485*61046927SAndroid Build Coastguard Worker       params[0] = (GLdouble) get_vertex_array_attrib(ctx, ctx->Array.VAO,
2486*61046927SAndroid Build Coastguard Worker                                                      index, pname,
2487*61046927SAndroid Build Coastguard Worker                                                      "glGetVertexAttribdv");
2488*61046927SAndroid Build Coastguard Worker    }
2489*61046927SAndroid Build Coastguard Worker }
2490*61046927SAndroid Build Coastguard Worker 
2491*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribLdv(GLuint index,GLenum pname,GLdouble * params)2492*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribLdv(GLuint index, GLenum pname, GLdouble *params)
2493*61046927SAndroid Build Coastguard Worker {
2494*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2495*61046927SAndroid Build Coastguard Worker 
2496*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2497*61046927SAndroid Build Coastguard Worker       const GLdouble *v =
2498*61046927SAndroid Build Coastguard Worker          (const GLdouble *)get_current_attrib(ctx, index,
2499*61046927SAndroid Build Coastguard Worker                                               "glGetVertexAttribLdv");
2500*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2501*61046927SAndroid Build Coastguard Worker          params[0] = v[0];
2502*61046927SAndroid Build Coastguard Worker          params[1] = v[1];
2503*61046927SAndroid Build Coastguard Worker          params[2] = v[2];
2504*61046927SAndroid Build Coastguard Worker          params[3] = v[3];
2505*61046927SAndroid Build Coastguard Worker       }
2506*61046927SAndroid Build Coastguard Worker    }
2507*61046927SAndroid Build Coastguard Worker    else {
2508*61046927SAndroid Build Coastguard Worker       params[0] = (GLdouble) get_vertex_array_attrib(ctx, ctx->Array.VAO,
2509*61046927SAndroid Build Coastguard Worker                                                      index, pname,
2510*61046927SAndroid Build Coastguard Worker                                                      "glGetVertexAttribLdv");
2511*61046927SAndroid Build Coastguard Worker    }
2512*61046927SAndroid Build Coastguard Worker }
2513*61046927SAndroid Build Coastguard Worker 
2514*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribiv(GLuint index,GLenum pname,GLint * params)2515*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribiv(GLuint index, GLenum pname, GLint *params)
2516*61046927SAndroid Build Coastguard Worker {
2517*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2518*61046927SAndroid Build Coastguard Worker 
2519*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2520*61046927SAndroid Build Coastguard Worker       const GLfloat *v = get_current_attrib(ctx, index, "glGetVertexAttribiv");
2521*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2522*61046927SAndroid Build Coastguard Worker          /* XXX should floats in[0,1] be scaled to full int range? */
2523*61046927SAndroid Build Coastguard Worker          params[0] = (GLint) v[0];
2524*61046927SAndroid Build Coastguard Worker          params[1] = (GLint) v[1];
2525*61046927SAndroid Build Coastguard Worker          params[2] = (GLint) v[2];
2526*61046927SAndroid Build Coastguard Worker          params[3] = (GLint) v[3];
2527*61046927SAndroid Build Coastguard Worker       }
2528*61046927SAndroid Build Coastguard Worker    }
2529*61046927SAndroid Build Coastguard Worker    else {
2530*61046927SAndroid Build Coastguard Worker       params[0] = (GLint) get_vertex_array_attrib(ctx, ctx->Array.VAO,
2531*61046927SAndroid Build Coastguard Worker                                                   index, pname,
2532*61046927SAndroid Build Coastguard Worker                                                   "glGetVertexAttribiv");
2533*61046927SAndroid Build Coastguard Worker    }
2534*61046927SAndroid Build Coastguard Worker }
2535*61046927SAndroid Build Coastguard Worker 
2536*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribLui64vARB(GLuint index,GLenum pname,GLuint64EXT * params)2537*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribLui64vARB(GLuint index, GLenum pname, GLuint64EXT *params)
2538*61046927SAndroid Build Coastguard Worker {
2539*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2540*61046927SAndroid Build Coastguard Worker 
2541*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2542*61046927SAndroid Build Coastguard Worker       const GLuint64 *v =
2543*61046927SAndroid Build Coastguard Worker          (const GLuint64 *)get_current_attrib(ctx, index,
2544*61046927SAndroid Build Coastguard Worker                                               "glGetVertexAttribLui64vARB");
2545*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2546*61046927SAndroid Build Coastguard Worker          params[0] = v[0];
2547*61046927SAndroid Build Coastguard Worker          params[1] = v[1];
2548*61046927SAndroid Build Coastguard Worker          params[2] = v[2];
2549*61046927SAndroid Build Coastguard Worker          params[3] = v[3];
2550*61046927SAndroid Build Coastguard Worker       }
2551*61046927SAndroid Build Coastguard Worker    }
2552*61046927SAndroid Build Coastguard Worker    else {
2553*61046927SAndroid Build Coastguard Worker       params[0] = (GLuint64) get_vertex_array_attrib(ctx, ctx->Array.VAO,
2554*61046927SAndroid Build Coastguard Worker                                                      index, pname,
2555*61046927SAndroid Build Coastguard Worker                                                      "glGetVertexAttribLui64vARB");
2556*61046927SAndroid Build Coastguard Worker    }
2557*61046927SAndroid Build Coastguard Worker }
2558*61046927SAndroid Build Coastguard Worker 
2559*61046927SAndroid Build Coastguard Worker 
2560*61046927SAndroid Build Coastguard Worker /** GL 3.0 */
2561*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribIiv(GLuint index,GLenum pname,GLint * params)2562*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribIiv(GLuint index, GLenum pname, GLint *params)
2563*61046927SAndroid Build Coastguard Worker {
2564*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2565*61046927SAndroid Build Coastguard Worker 
2566*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2567*61046927SAndroid Build Coastguard Worker       const GLint *v = (const GLint *)
2568*61046927SAndroid Build Coastguard Worker 	 get_current_attrib(ctx, index, "glGetVertexAttribIiv");
2569*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2570*61046927SAndroid Build Coastguard Worker          COPY_4V(params, v);
2571*61046927SAndroid Build Coastguard Worker       }
2572*61046927SAndroid Build Coastguard Worker    }
2573*61046927SAndroid Build Coastguard Worker    else {
2574*61046927SAndroid Build Coastguard Worker       params[0] = (GLint) get_vertex_array_attrib(ctx, ctx->Array.VAO,
2575*61046927SAndroid Build Coastguard Worker                                                   index, pname,
2576*61046927SAndroid Build Coastguard Worker                                                   "glGetVertexAttribIiv");
2577*61046927SAndroid Build Coastguard Worker    }
2578*61046927SAndroid Build Coastguard Worker }
2579*61046927SAndroid Build Coastguard Worker 
2580*61046927SAndroid Build Coastguard Worker 
2581*61046927SAndroid Build Coastguard Worker /** GL 3.0 */
2582*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribIuiv(GLuint index,GLenum pname,GLuint * params)2583*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribIuiv(GLuint index, GLenum pname, GLuint *params)
2584*61046927SAndroid Build Coastguard Worker {
2585*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2586*61046927SAndroid Build Coastguard Worker 
2587*61046927SAndroid Build Coastguard Worker    if (pname == GL_CURRENT_VERTEX_ATTRIB_ARB) {
2588*61046927SAndroid Build Coastguard Worker       const GLuint *v = (const GLuint *)
2589*61046927SAndroid Build Coastguard Worker 	 get_current_attrib(ctx, index, "glGetVertexAttribIuiv");
2590*61046927SAndroid Build Coastguard Worker       if (v != NULL) {
2591*61046927SAndroid Build Coastguard Worker          COPY_4V(params, v);
2592*61046927SAndroid Build Coastguard Worker       }
2593*61046927SAndroid Build Coastguard Worker    }
2594*61046927SAndroid Build Coastguard Worker    else {
2595*61046927SAndroid Build Coastguard Worker       params[0] = get_vertex_array_attrib(ctx, ctx->Array.VAO,
2596*61046927SAndroid Build Coastguard Worker                                           index, pname,
2597*61046927SAndroid Build Coastguard Worker                                           "glGetVertexAttribIuiv");
2598*61046927SAndroid Build Coastguard Worker    }
2599*61046927SAndroid Build Coastguard Worker }
2600*61046927SAndroid Build Coastguard Worker 
2601*61046927SAndroid Build Coastguard Worker 
2602*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexAttribPointerv(GLuint index,GLenum pname,GLvoid ** pointer)2603*61046927SAndroid Build Coastguard Worker _mesa_GetVertexAttribPointerv(GLuint index, GLenum pname, GLvoid **pointer)
2604*61046927SAndroid Build Coastguard Worker {
2605*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2606*61046927SAndroid Build Coastguard Worker 
2607*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
2608*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerARB(index)");
2609*61046927SAndroid Build Coastguard Worker       return;
2610*61046927SAndroid Build Coastguard Worker    }
2611*61046927SAndroid Build Coastguard Worker 
2612*61046927SAndroid Build Coastguard Worker    if (pname != GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB) {
2613*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerARB(pname)");
2614*61046927SAndroid Build Coastguard Worker       return;
2615*61046927SAndroid Build Coastguard Worker    }
2616*61046927SAndroid Build Coastguard Worker 
2617*61046927SAndroid Build Coastguard Worker    assert(VERT_ATTRIB_GENERIC(index) <
2618*61046927SAndroid Build Coastguard Worker           ARRAY_SIZE(ctx->Array.VAO->VertexAttrib));
2619*61046927SAndroid Build Coastguard Worker 
2620*61046927SAndroid Build Coastguard Worker    *pointer = (GLvoid *)
2621*61046927SAndroid Build Coastguard Worker       ctx->Array.VAO->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
2622*61046927SAndroid Build Coastguard Worker }
2623*61046927SAndroid Build Coastguard Worker 
2624*61046927SAndroid Build Coastguard Worker 
2625*61046927SAndroid Build Coastguard Worker /** ARB_direct_state_access */
2626*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexArrayIndexediv(GLuint vaobj,GLuint index,GLenum pname,GLint * params)2627*61046927SAndroid Build Coastguard Worker _mesa_GetVertexArrayIndexediv(GLuint vaobj, GLuint index,
2628*61046927SAndroid Build Coastguard Worker                               GLenum pname, GLint *params)
2629*61046927SAndroid Build Coastguard Worker {
2630*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2631*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
2632*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *buf;
2633*61046927SAndroid Build Coastguard Worker 
2634*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2635*61046927SAndroid Build Coastguard Worker     *
2636*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if <vaobj> is not
2637*61046927SAndroid Build Coastguard Worker     *     [compatibility profile: zero or] the name of an existing
2638*61046927SAndroid Build Coastguard Worker     *     vertex array object."
2639*61046927SAndroid Build Coastguard Worker     */
2640*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glGetVertexArrayIndexediv");
2641*61046927SAndroid Build Coastguard Worker    if (!vao)
2642*61046927SAndroid Build Coastguard Worker       return;
2643*61046927SAndroid Build Coastguard Worker 
2644*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2645*61046927SAndroid Build Coastguard Worker     *
2646*61046927SAndroid Build Coastguard Worker     *    "For GetVertexArrayIndexediv, <pname> must be one of
2647*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_SIZE,
2648*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE,
2649*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_INTEGER,
2650*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_ARRAY_LONG, VERTEX_ATTRIB_ARRAY_DIVISOR, or
2651*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_RELATIVE_OFFSET."
2652*61046927SAndroid Build Coastguard Worker     *
2653*61046927SAndroid Build Coastguard Worker     * and:
2654*61046927SAndroid Build Coastguard Worker     *
2655*61046927SAndroid Build Coastguard Worker     *    "Add GetVertexArrayIndexediv in 'Get Command' for
2656*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
2657*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_BINDING,
2658*61046927SAndroid Build Coastguard Worker     *     VERTEX_ATTRIB_RELATIVE_OFFSET,
2659*61046927SAndroid Build Coastguard Worker     *     VERTEX_BINDING_OFFSET, and
2660*61046927SAndroid Build Coastguard Worker     *     VERTEX_BINDING_STRIDE states"
2661*61046927SAndroid Build Coastguard Worker     *
2662*61046927SAndroid Build Coastguard Worker     * The only parameter name common to both lists is
2663*61046927SAndroid Build Coastguard Worker     * VERTEX_ATTRIB_RELATIVE_OFFSET.  Also note that VERTEX_BINDING_BUFFER
2664*61046927SAndroid Build Coastguard Worker     * and VERTEX_BINDING_DIVISOR are missing from both lists.  It seems
2665*61046927SAndroid Build Coastguard Worker     * pretty clear however that the intent is that it should be possible
2666*61046927SAndroid Build Coastguard Worker     * to query all vertex attrib and binding states that can be set with
2667*61046927SAndroid Build Coastguard Worker     * a DSA function.
2668*61046927SAndroid Build Coastguard Worker     */
2669*61046927SAndroid Build Coastguard Worker    switch (pname) {
2670*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_BINDING_OFFSET:
2671*61046927SAndroid Build Coastguard Worker       params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].Offset;
2672*61046927SAndroid Build Coastguard Worker       break;
2673*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_BINDING_STRIDE:
2674*61046927SAndroid Build Coastguard Worker       params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].Stride;
2675*61046927SAndroid Build Coastguard Worker       break;
2676*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_BINDING_DIVISOR:
2677*61046927SAndroid Build Coastguard Worker       params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].InstanceDivisor;
2678*61046927SAndroid Build Coastguard Worker       break;
2679*61046927SAndroid Build Coastguard Worker    case GL_VERTEX_BINDING_BUFFER:
2680*61046927SAndroid Build Coastguard Worker       buf = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].BufferObj;
2681*61046927SAndroid Build Coastguard Worker       params[0] = buf ? buf->Name : 0;
2682*61046927SAndroid Build Coastguard Worker       break;
2683*61046927SAndroid Build Coastguard Worker    default:
2684*61046927SAndroid Build Coastguard Worker       params[0] = get_vertex_array_attrib(ctx, vao, index, pname,
2685*61046927SAndroid Build Coastguard Worker                                           "glGetVertexArrayIndexediv");
2686*61046927SAndroid Build Coastguard Worker       break;
2687*61046927SAndroid Build Coastguard Worker    }
2688*61046927SAndroid Build Coastguard Worker }
2689*61046927SAndroid Build Coastguard Worker 
2690*61046927SAndroid Build Coastguard Worker 
2691*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexArrayIndexed64iv(GLuint vaobj,GLuint index,GLenum pname,GLint64 * params)2692*61046927SAndroid Build Coastguard Worker _mesa_GetVertexArrayIndexed64iv(GLuint vaobj, GLuint index,
2693*61046927SAndroid Build Coastguard Worker                                 GLenum pname, GLint64 *params)
2694*61046927SAndroid Build Coastguard Worker {
2695*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2696*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
2697*61046927SAndroid Build Coastguard Worker 
2698*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2699*61046927SAndroid Build Coastguard Worker     *
2700*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if <vaobj> is not
2701*61046927SAndroid Build Coastguard Worker     *     [compatibility profile: zero or] the name of an existing
2702*61046927SAndroid Build Coastguard Worker     *     vertex array object."
2703*61046927SAndroid Build Coastguard Worker     */
2704*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glGetVertexArrayIndexed64iv");
2705*61046927SAndroid Build Coastguard Worker    if (!vao)
2706*61046927SAndroid Build Coastguard Worker       return;
2707*61046927SAndroid Build Coastguard Worker 
2708*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2709*61046927SAndroid Build Coastguard Worker     *
2710*61046927SAndroid Build Coastguard Worker     *    "For GetVertexArrayIndexed64iv, <pname> must be
2711*61046927SAndroid Build Coastguard Worker     *     VERTEX_BINDING_OFFSET."
2712*61046927SAndroid Build Coastguard Worker     *
2713*61046927SAndroid Build Coastguard Worker     * and:
2714*61046927SAndroid Build Coastguard Worker     *
2715*61046927SAndroid Build Coastguard Worker     *    "An INVALID_ENUM error is generated if <pname> is not one of
2716*61046927SAndroid Build Coastguard Worker     *     the valid values listed above for the corresponding command."
2717*61046927SAndroid Build Coastguard Worker     */
2718*61046927SAndroid Build Coastguard Worker    if (pname != GL_VERTEX_BINDING_OFFSET) {
2719*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexArrayIndexed64iv("
2720*61046927SAndroid Build Coastguard Worker                   "pname != GL_VERTEX_BINDING_OFFSET)");
2721*61046927SAndroid Build Coastguard Worker       return;
2722*61046927SAndroid Build Coastguard Worker    }
2723*61046927SAndroid Build Coastguard Worker 
2724*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
2725*61046927SAndroid Build Coastguard Worker     *
2726*61046927SAndroid Build Coastguard Worker     *    "An INVALID_VALUE error is generated if <index> is greater than
2727*61046927SAndroid Build Coastguard Worker     *     or equal to the value of MAX_VERTEX_ATTRIBS."
2728*61046927SAndroid Build Coastguard Worker     *
2729*61046927SAndroid Build Coastguard Worker     * Since the index refers to a buffer binding in this case, the intended
2730*61046927SAndroid Build Coastguard Worker     * limit must be MAX_VERTEX_ATTRIB_BINDINGS.  Both limits are currently
2731*61046927SAndroid Build Coastguard Worker     * required to be the same, so in practice this doesn't matter.
2732*61046927SAndroid Build Coastguard Worker     */
2733*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.MaxVertexAttribBindings) {
2734*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexArrayIndexed64iv(index"
2735*61046927SAndroid Build Coastguard Worker                   "%d >= the value of GL_MAX_VERTEX_ATTRIB_BINDINGS (%d))",
2736*61046927SAndroid Build Coastguard Worker                   index, ctx->Const.MaxVertexAttribBindings);
2737*61046927SAndroid Build Coastguard Worker       return;
2738*61046927SAndroid Build Coastguard Worker    }
2739*61046927SAndroid Build Coastguard Worker 
2740*61046927SAndroid Build Coastguard Worker    params[0] = vao->BufferBinding[VERT_ATTRIB_GENERIC(index)].Offset;
2741*61046927SAndroid Build Coastguard Worker }
2742*61046927SAndroid Build Coastguard Worker 
2743*61046927SAndroid Build Coastguard Worker 
2744*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexPointerEXT(GLint size,GLenum type,GLsizei stride,GLsizei count,const GLvoid * ptr)2745*61046927SAndroid Build Coastguard Worker _mesa_VertexPointerEXT(GLint size, GLenum type, GLsizei stride,
2746*61046927SAndroid Build Coastguard Worker                        GLsizei count, const GLvoid *ptr)
2747*61046927SAndroid Build Coastguard Worker {
2748*61046927SAndroid Build Coastguard Worker    (void) count;
2749*61046927SAndroid Build Coastguard Worker    _mesa_VertexPointer(size, type, stride, ptr);
2750*61046927SAndroid Build Coastguard Worker }
2751*61046927SAndroid Build Coastguard Worker 
2752*61046927SAndroid Build Coastguard Worker 
2753*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_NormalPointerEXT(GLenum type,GLsizei stride,GLsizei count,const GLvoid * ptr)2754*61046927SAndroid Build Coastguard Worker _mesa_NormalPointerEXT(GLenum type, GLsizei stride, GLsizei count,
2755*61046927SAndroid Build Coastguard Worker                        const GLvoid *ptr)
2756*61046927SAndroid Build Coastguard Worker {
2757*61046927SAndroid Build Coastguard Worker    (void) count;
2758*61046927SAndroid Build Coastguard Worker    _mesa_NormalPointer(type, stride, ptr);
2759*61046927SAndroid Build Coastguard Worker }
2760*61046927SAndroid Build Coastguard Worker 
2761*61046927SAndroid Build Coastguard Worker 
2762*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_ColorPointerEXT(GLint size,GLenum type,GLsizei stride,GLsizei count,const GLvoid * ptr)2763*61046927SAndroid Build Coastguard Worker _mesa_ColorPointerEXT(GLint size, GLenum type, GLsizei stride, GLsizei count,
2764*61046927SAndroid Build Coastguard Worker                       const GLvoid *ptr)
2765*61046927SAndroid Build Coastguard Worker {
2766*61046927SAndroid Build Coastguard Worker    (void) count;
2767*61046927SAndroid Build Coastguard Worker    _mesa_ColorPointer(size, type, stride, ptr);
2768*61046927SAndroid Build Coastguard Worker }
2769*61046927SAndroid Build Coastguard Worker 
2770*61046927SAndroid Build Coastguard Worker 
2771*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_IndexPointerEXT(GLenum type,GLsizei stride,GLsizei count,const GLvoid * ptr)2772*61046927SAndroid Build Coastguard Worker _mesa_IndexPointerEXT(GLenum type, GLsizei stride, GLsizei count,
2773*61046927SAndroid Build Coastguard Worker                       const GLvoid *ptr)
2774*61046927SAndroid Build Coastguard Worker {
2775*61046927SAndroid Build Coastguard Worker    (void) count;
2776*61046927SAndroid Build Coastguard Worker    _mesa_IndexPointer(type, stride, ptr);
2777*61046927SAndroid Build Coastguard Worker }
2778*61046927SAndroid Build Coastguard Worker 
2779*61046927SAndroid Build Coastguard Worker 
2780*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_TexCoordPointerEXT(GLint size,GLenum type,GLsizei stride,GLsizei count,const GLvoid * ptr)2781*61046927SAndroid Build Coastguard Worker _mesa_TexCoordPointerEXT(GLint size, GLenum type, GLsizei stride,
2782*61046927SAndroid Build Coastguard Worker                          GLsizei count, const GLvoid *ptr)
2783*61046927SAndroid Build Coastguard Worker {
2784*61046927SAndroid Build Coastguard Worker    (void) count;
2785*61046927SAndroid Build Coastguard Worker    _mesa_TexCoordPointer(size, type, stride, ptr);
2786*61046927SAndroid Build Coastguard Worker }
2787*61046927SAndroid Build Coastguard Worker 
2788*61046927SAndroid Build Coastguard Worker 
2789*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_MultiTexCoordPointerEXT(GLenum texunit,GLint size,GLenum type,GLsizei stride,const GLvoid * ptr)2790*61046927SAndroid Build Coastguard Worker _mesa_MultiTexCoordPointerEXT(GLenum texunit, GLint size, GLenum type,
2791*61046927SAndroid Build Coastguard Worker                               GLsizei stride, const GLvoid *ptr)
2792*61046927SAndroid Build Coastguard Worker {
2793*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2794*61046927SAndroid Build Coastguard Worker    const GLint sizeMin = 1;
2795*61046927SAndroid Build Coastguard Worker    const GLuint unit = texunit - GL_TEXTURE0;
2796*61046927SAndroid Build Coastguard Worker 
2797*61046927SAndroid Build Coastguard Worker    GLenum format = GL_RGBA;
2798*61046927SAndroid Build Coastguard Worker    const GLbitfield legalTypes = (SHORT_BIT | INT_BIT |
2799*61046927SAndroid Build Coastguard Worker                                   HALF_BIT | FLOAT_BIT | DOUBLE_BIT |
2800*61046927SAndroid Build Coastguard Worker                                   UNSIGNED_INT_2_10_10_10_REV_BIT |
2801*61046927SAndroid Build Coastguard Worker                                   INT_2_10_10_10_REV_BIT);
2802*61046927SAndroid Build Coastguard Worker 
2803*61046927SAndroid Build Coastguard Worker    if (!validate_array_and_format(ctx, "glMultiTexCoordPointerEXT",
2804*61046927SAndroid Build Coastguard Worker                                   ctx->Array.VAO, ctx->Array.ArrayBufferObj,
2805*61046927SAndroid Build Coastguard Worker                                   VERT_ATTRIB_TEX(unit), legalTypes,
2806*61046927SAndroid Build Coastguard Worker                                   sizeMin, 4, size, type, stride,
2807*61046927SAndroid Build Coastguard Worker                                   GL_FALSE, GL_FALSE, GL_FALSE, format, ptr))
2808*61046927SAndroid Build Coastguard Worker       return;
2809*61046927SAndroid Build Coastguard Worker 
2810*61046927SAndroid Build Coastguard Worker    update_array(ctx, ctx->Array.VAO, ctx->Array.ArrayBufferObj,
2811*61046927SAndroid Build Coastguard Worker                 VERT_ATTRIB_TEX(unit), format, 4, size, type,
2812*61046927SAndroid Build Coastguard Worker                 stride, GL_FALSE, GL_FALSE, GL_FALSE, ptr);
2813*61046927SAndroid Build Coastguard Worker }
2814*61046927SAndroid Build Coastguard Worker 
2815*61046927SAndroid Build Coastguard Worker 
2816*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_EdgeFlagPointerEXT(GLsizei stride,GLsizei count,const GLboolean * ptr)2817*61046927SAndroid Build Coastguard Worker _mesa_EdgeFlagPointerEXT(GLsizei stride, GLsizei count, const GLboolean *ptr)
2818*61046927SAndroid Build Coastguard Worker {
2819*61046927SAndroid Build Coastguard Worker    (void) count;
2820*61046927SAndroid Build Coastguard Worker    _mesa_EdgeFlagPointer(stride, ptr);
2821*61046927SAndroid Build Coastguard Worker }
2822*61046927SAndroid Build Coastguard Worker 
2823*61046927SAndroid Build Coastguard Worker 
2824*61046927SAndroid Build Coastguard Worker bool
_mesa_get_interleaved_layout(GLenum format,struct gl_interleaved_layout * layout)2825*61046927SAndroid Build Coastguard Worker _mesa_get_interleaved_layout(GLenum format,
2826*61046927SAndroid Build Coastguard Worker                              struct gl_interleaved_layout *layout)
2827*61046927SAndroid Build Coastguard Worker {
2828*61046927SAndroid Build Coastguard Worker    int f = sizeof(GLfloat);
2829*61046927SAndroid Build Coastguard Worker    int c = f * ((4 * sizeof(GLubyte) + (f - 1)) / f);
2830*61046927SAndroid Build Coastguard Worker 
2831*61046927SAndroid Build Coastguard Worker    memset(layout, 0, sizeof(*layout));
2832*61046927SAndroid Build Coastguard Worker 
2833*61046927SAndroid Build Coastguard Worker    switch (format) {
2834*61046927SAndroid Build Coastguard Worker       case GL_V2F:
2835*61046927SAndroid Build Coastguard Worker          layout->vcomps = 2;
2836*61046927SAndroid Build Coastguard Worker          layout->defstride = 2 * f;
2837*61046927SAndroid Build Coastguard Worker          break;
2838*61046927SAndroid Build Coastguard Worker       case GL_V3F:
2839*61046927SAndroid Build Coastguard Worker          layout->vcomps = 3;
2840*61046927SAndroid Build Coastguard Worker          layout->defstride = 3 * f;
2841*61046927SAndroid Build Coastguard Worker          break;
2842*61046927SAndroid Build Coastguard Worker       case GL_C4UB_V2F:
2843*61046927SAndroid Build Coastguard Worker          layout->cflag = true;
2844*61046927SAndroid Build Coastguard Worker          layout->ccomps = 4;  layout->vcomps = 2;
2845*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_UNSIGNED_BYTE;
2846*61046927SAndroid Build Coastguard Worker          layout->voffset = c;
2847*61046927SAndroid Build Coastguard Worker          layout->defstride = c + 2 * f;
2848*61046927SAndroid Build Coastguard Worker          break;
2849*61046927SAndroid Build Coastguard Worker       case GL_C4UB_V3F:
2850*61046927SAndroid Build Coastguard Worker          layout->cflag = true;
2851*61046927SAndroid Build Coastguard Worker          layout->ccomps = 4;  layout->vcomps = 3;
2852*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_UNSIGNED_BYTE;
2853*61046927SAndroid Build Coastguard Worker          layout->voffset = c;
2854*61046927SAndroid Build Coastguard Worker          layout->defstride = c + 3 * f;
2855*61046927SAndroid Build Coastguard Worker          break;
2856*61046927SAndroid Build Coastguard Worker       case GL_C3F_V3F:
2857*61046927SAndroid Build Coastguard Worker          layout->cflag = true;
2858*61046927SAndroid Build Coastguard Worker          layout->ccomps = 3;  layout->vcomps = 3;
2859*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_FLOAT;
2860*61046927SAndroid Build Coastguard Worker          layout->voffset = 3 * f;
2861*61046927SAndroid Build Coastguard Worker          layout->defstride = 6 * f;
2862*61046927SAndroid Build Coastguard Worker          break;
2863*61046927SAndroid Build Coastguard Worker       case GL_N3F_V3F:
2864*61046927SAndroid Build Coastguard Worker          layout->nflag = true;
2865*61046927SAndroid Build Coastguard Worker          layout->vcomps = 3;
2866*61046927SAndroid Build Coastguard Worker          layout->voffset = 3 * f;
2867*61046927SAndroid Build Coastguard Worker          layout->defstride = 6 * f;
2868*61046927SAndroid Build Coastguard Worker          break;
2869*61046927SAndroid Build Coastguard Worker       case GL_C4F_N3F_V3F:
2870*61046927SAndroid Build Coastguard Worker          layout->cflag = true;  layout->nflag = true;
2871*61046927SAndroid Build Coastguard Worker          layout->ccomps = 4;  layout->vcomps = 3;
2872*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_FLOAT;
2873*61046927SAndroid Build Coastguard Worker          layout->noffset = 4 * f;
2874*61046927SAndroid Build Coastguard Worker          layout->voffset = 7 * f;
2875*61046927SAndroid Build Coastguard Worker          layout->defstride = 10 * f;
2876*61046927SAndroid Build Coastguard Worker          break;
2877*61046927SAndroid Build Coastguard Worker       case GL_T2F_V3F:
2878*61046927SAndroid Build Coastguard Worker          layout->tflag = true;
2879*61046927SAndroid Build Coastguard Worker          layout->tcomps = 2;  layout->vcomps = 3;
2880*61046927SAndroid Build Coastguard Worker          layout->voffset = 2 * f;
2881*61046927SAndroid Build Coastguard Worker          layout->defstride = 5 * f;
2882*61046927SAndroid Build Coastguard Worker          break;
2883*61046927SAndroid Build Coastguard Worker       case GL_T4F_V4F:
2884*61046927SAndroid Build Coastguard Worker          layout->tflag = true;
2885*61046927SAndroid Build Coastguard Worker          layout->tcomps = 4;  layout->vcomps = 4;
2886*61046927SAndroid Build Coastguard Worker          layout->voffset = 4 * f;
2887*61046927SAndroid Build Coastguard Worker          layout->defstride = 8 * f;
2888*61046927SAndroid Build Coastguard Worker          break;
2889*61046927SAndroid Build Coastguard Worker       case GL_T2F_C4UB_V3F:
2890*61046927SAndroid Build Coastguard Worker          layout->tflag = true;  layout->cflag = true;
2891*61046927SAndroid Build Coastguard Worker          layout->tcomps = 2;  layout->ccomps = 4;  layout->vcomps = 3;
2892*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_UNSIGNED_BYTE;
2893*61046927SAndroid Build Coastguard Worker          layout->coffset = 2 * f;
2894*61046927SAndroid Build Coastguard Worker          layout->voffset = c + 2 * f;
2895*61046927SAndroid Build Coastguard Worker          layout->defstride = c + 5 * f;
2896*61046927SAndroid Build Coastguard Worker          break;
2897*61046927SAndroid Build Coastguard Worker       case GL_T2F_C3F_V3F:
2898*61046927SAndroid Build Coastguard Worker          layout->tflag = true;  layout->cflag = true;
2899*61046927SAndroid Build Coastguard Worker          layout->tcomps = 2;  layout->ccomps = 3;  layout->vcomps = 3;
2900*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_FLOAT;
2901*61046927SAndroid Build Coastguard Worker          layout->coffset = 2 * f;
2902*61046927SAndroid Build Coastguard Worker          layout->voffset = 5 * f;
2903*61046927SAndroid Build Coastguard Worker          layout->defstride = 8 * f;
2904*61046927SAndroid Build Coastguard Worker          break;
2905*61046927SAndroid Build Coastguard Worker       case GL_T2F_N3F_V3F:
2906*61046927SAndroid Build Coastguard Worker          layout->tflag = true;    layout->nflag = true;
2907*61046927SAndroid Build Coastguard Worker          layout->tcomps = 2;  layout->vcomps = 3;
2908*61046927SAndroid Build Coastguard Worker          layout->noffset = 2 * f;
2909*61046927SAndroid Build Coastguard Worker          layout->voffset = 5 * f;
2910*61046927SAndroid Build Coastguard Worker          layout->defstride = 8 * f;
2911*61046927SAndroid Build Coastguard Worker          break;
2912*61046927SAndroid Build Coastguard Worker       case GL_T2F_C4F_N3F_V3F:
2913*61046927SAndroid Build Coastguard Worker          layout->tflag = true;  layout->cflag = true;  layout->nflag = true;
2914*61046927SAndroid Build Coastguard Worker          layout->tcomps = 2;  layout->ccomps = 4;  layout->vcomps = 3;
2915*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_FLOAT;
2916*61046927SAndroid Build Coastguard Worker          layout->coffset = 2 * f;
2917*61046927SAndroid Build Coastguard Worker          layout->noffset = 6 * f;
2918*61046927SAndroid Build Coastguard Worker          layout->voffset = 9 * f;
2919*61046927SAndroid Build Coastguard Worker          layout->defstride = 12 * f;
2920*61046927SAndroid Build Coastguard Worker          break;
2921*61046927SAndroid Build Coastguard Worker       case GL_T4F_C4F_N3F_V4F:
2922*61046927SAndroid Build Coastguard Worker          layout->tflag = true;  layout->cflag = true;  layout->nflag = true;
2923*61046927SAndroid Build Coastguard Worker          layout->tcomps = 4;  layout->ccomps = 4;  layout->vcomps = 4;
2924*61046927SAndroid Build Coastguard Worker          layout->ctype = GL_FLOAT;
2925*61046927SAndroid Build Coastguard Worker          layout->coffset = 4 * f;
2926*61046927SAndroid Build Coastguard Worker          layout->noffset = 8 * f;
2927*61046927SAndroid Build Coastguard Worker          layout->voffset = 11 * f;
2928*61046927SAndroid Build Coastguard Worker          layout->defstride = 15 * f;
2929*61046927SAndroid Build Coastguard Worker          break;
2930*61046927SAndroid Build Coastguard Worker       default:
2931*61046927SAndroid Build Coastguard Worker          return false;
2932*61046927SAndroid Build Coastguard Worker    }
2933*61046927SAndroid Build Coastguard Worker    return true;
2934*61046927SAndroid Build Coastguard Worker }
2935*61046927SAndroid Build Coastguard Worker 
2936*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_InterleavedArrays(GLenum format,GLsizei stride,const GLvoid * pointer)2937*61046927SAndroid Build Coastguard Worker _mesa_InterleavedArrays(GLenum format, GLsizei stride, const GLvoid *pointer)
2938*61046927SAndroid Build Coastguard Worker {
2939*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
2940*61046927SAndroid Build Coastguard Worker    struct gl_interleaved_layout layout;
2941*61046927SAndroid Build Coastguard Worker 
2942*61046927SAndroid Build Coastguard Worker    if (stride < 0) {
2943*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glInterleavedArrays(stride)" );
2944*61046927SAndroid Build Coastguard Worker       return;
2945*61046927SAndroid Build Coastguard Worker    }
2946*61046927SAndroid Build Coastguard Worker 
2947*61046927SAndroid Build Coastguard Worker    if (!_mesa_get_interleaved_layout(format, &layout)) {
2948*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_ENUM, "glInterleavedArrays(format)" );
2949*61046927SAndroid Build Coastguard Worker       return;
2950*61046927SAndroid Build Coastguard Worker    }
2951*61046927SAndroid Build Coastguard Worker 
2952*61046927SAndroid Build Coastguard Worker    if (stride==0) {
2953*61046927SAndroid Build Coastguard Worker       stride = layout.defstride;
2954*61046927SAndroid Build Coastguard Worker    }
2955*61046927SAndroid Build Coastguard Worker 
2956*61046927SAndroid Build Coastguard Worker    _mesa_DisableClientState( GL_EDGE_FLAG_ARRAY );
2957*61046927SAndroid Build Coastguard Worker    _mesa_DisableClientState( GL_INDEX_ARRAY );
2958*61046927SAndroid Build Coastguard Worker    /* XXX also disable secondary color and generic arrays? */
2959*61046927SAndroid Build Coastguard Worker 
2960*61046927SAndroid Build Coastguard Worker    /* Texcoords */
2961*61046927SAndroid Build Coastguard Worker    if (layout.tflag) {
2962*61046927SAndroid Build Coastguard Worker       _mesa_EnableClientState( GL_TEXTURE_COORD_ARRAY );
2963*61046927SAndroid Build Coastguard Worker       _mesa_TexCoordPointer( layout.tcomps, GL_FLOAT, stride,
2964*61046927SAndroid Build Coastguard Worker                              (GLubyte *) pointer + layout.toffset );
2965*61046927SAndroid Build Coastguard Worker    }
2966*61046927SAndroid Build Coastguard Worker    else {
2967*61046927SAndroid Build Coastguard Worker       _mesa_DisableClientState( GL_TEXTURE_COORD_ARRAY );
2968*61046927SAndroid Build Coastguard Worker    }
2969*61046927SAndroid Build Coastguard Worker 
2970*61046927SAndroid Build Coastguard Worker    /* Color */
2971*61046927SAndroid Build Coastguard Worker    if (layout.cflag) {
2972*61046927SAndroid Build Coastguard Worker       _mesa_EnableClientState( GL_COLOR_ARRAY );
2973*61046927SAndroid Build Coastguard Worker       _mesa_ColorPointer( layout.ccomps, layout.ctype, stride,
2974*61046927SAndroid Build Coastguard Worker 			  (GLubyte *) pointer + layout.coffset );
2975*61046927SAndroid Build Coastguard Worker    }
2976*61046927SAndroid Build Coastguard Worker    else {
2977*61046927SAndroid Build Coastguard Worker       _mesa_DisableClientState( GL_COLOR_ARRAY );
2978*61046927SAndroid Build Coastguard Worker    }
2979*61046927SAndroid Build Coastguard Worker 
2980*61046927SAndroid Build Coastguard Worker 
2981*61046927SAndroid Build Coastguard Worker    /* Normals */
2982*61046927SAndroid Build Coastguard Worker    if (layout.nflag) {
2983*61046927SAndroid Build Coastguard Worker       _mesa_EnableClientState( GL_NORMAL_ARRAY );
2984*61046927SAndroid Build Coastguard Worker       _mesa_NormalPointer( GL_FLOAT, stride, (GLubyte *) pointer + layout.noffset );
2985*61046927SAndroid Build Coastguard Worker    }
2986*61046927SAndroid Build Coastguard Worker    else {
2987*61046927SAndroid Build Coastguard Worker       _mesa_DisableClientState( GL_NORMAL_ARRAY );
2988*61046927SAndroid Build Coastguard Worker    }
2989*61046927SAndroid Build Coastguard Worker 
2990*61046927SAndroid Build Coastguard Worker    /* Vertices */
2991*61046927SAndroid Build Coastguard Worker    _mesa_EnableClientState( GL_VERTEX_ARRAY );
2992*61046927SAndroid Build Coastguard Worker    _mesa_VertexPointer( layout.vcomps, GL_FLOAT, stride,
2993*61046927SAndroid Build Coastguard Worker 			(GLubyte *) pointer + layout.voffset );
2994*61046927SAndroid Build Coastguard Worker }
2995*61046927SAndroid Build Coastguard Worker 
2996*61046927SAndroid Build Coastguard Worker 
2997*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_LockArraysEXT(GLint first,GLsizei count)2998*61046927SAndroid Build Coastguard Worker _mesa_LockArraysEXT(GLint first, GLsizei count)
2999*61046927SAndroid Build Coastguard Worker {
3000*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3001*61046927SAndroid Build Coastguard Worker 
3002*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
3003*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glLockArrays %d %d\n", first, count);
3004*61046927SAndroid Build Coastguard Worker 
3005*61046927SAndroid Build Coastguard Worker    if (first < 0) {
3006*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(first)" );
3007*61046927SAndroid Build Coastguard Worker       return;
3008*61046927SAndroid Build Coastguard Worker    }
3009*61046927SAndroid Build Coastguard Worker    if (count <= 0) {
3010*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_VALUE, "glLockArraysEXT(count)" );
3011*61046927SAndroid Build Coastguard Worker       return;
3012*61046927SAndroid Build Coastguard Worker    }
3013*61046927SAndroid Build Coastguard Worker    if (ctx->Array.LockCount != 0) {
3014*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_OPERATION, "glLockArraysEXT(reentry)" );
3015*61046927SAndroid Build Coastguard Worker       return;
3016*61046927SAndroid Build Coastguard Worker    }
3017*61046927SAndroid Build Coastguard Worker 
3018*61046927SAndroid Build Coastguard Worker    ctx->Array.LockFirst = first;
3019*61046927SAndroid Build Coastguard Worker    ctx->Array.LockCount = count;
3020*61046927SAndroid Build Coastguard Worker }
3021*61046927SAndroid Build Coastguard Worker 
3022*61046927SAndroid Build Coastguard Worker 
3023*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_UnlockArraysEXT(void)3024*61046927SAndroid Build Coastguard Worker _mesa_UnlockArraysEXT( void )
3025*61046927SAndroid Build Coastguard Worker {
3026*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3027*61046927SAndroid Build Coastguard Worker 
3028*61046927SAndroid Build Coastguard Worker    if (MESA_VERBOSE & VERBOSE_API)
3029*61046927SAndroid Build Coastguard Worker       _mesa_debug(ctx, "glUnlockArrays\n");
3030*61046927SAndroid Build Coastguard Worker 
3031*61046927SAndroid Build Coastguard Worker    if (ctx->Array.LockCount == 0) {
3032*61046927SAndroid Build Coastguard Worker       _mesa_error( ctx, GL_INVALID_OPERATION, "glUnlockArraysEXT(reexit)" );
3033*61046927SAndroid Build Coastguard Worker       return;
3034*61046927SAndroid Build Coastguard Worker    }
3035*61046927SAndroid Build Coastguard Worker 
3036*61046927SAndroid Build Coastguard Worker    ctx->Array.LockFirst = 0;
3037*61046927SAndroid Build Coastguard Worker    ctx->Array.LockCount = 0;
3038*61046927SAndroid Build Coastguard Worker }
3039*61046927SAndroid Build Coastguard Worker 
3040*61046927SAndroid Build Coastguard Worker 
3041*61046927SAndroid Build Coastguard Worker static void
primitive_restart_index(struct gl_context * ctx,GLuint index)3042*61046927SAndroid Build Coastguard Worker primitive_restart_index(struct gl_context *ctx, GLuint index)
3043*61046927SAndroid Build Coastguard Worker {
3044*61046927SAndroid Build Coastguard Worker    ctx->Array.RestartIndex = index;
3045*61046927SAndroid Build Coastguard Worker    _mesa_update_derived_primitive_restart_state(ctx);
3046*61046927SAndroid Build Coastguard Worker }
3047*61046927SAndroid Build Coastguard Worker 
3048*61046927SAndroid Build Coastguard Worker 
3049*61046927SAndroid Build Coastguard Worker /**
3050*61046927SAndroid Build Coastguard Worker  * GL_NV_primitive_restart and GL 3.1
3051*61046927SAndroid Build Coastguard Worker  */
3052*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PrimitiveRestartIndex_no_error(GLuint index)3053*61046927SAndroid Build Coastguard Worker _mesa_PrimitiveRestartIndex_no_error(GLuint index)
3054*61046927SAndroid Build Coastguard Worker {
3055*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3056*61046927SAndroid Build Coastguard Worker    primitive_restart_index(ctx, index);
3057*61046927SAndroid Build Coastguard Worker }
3058*61046927SAndroid Build Coastguard Worker 
3059*61046927SAndroid Build Coastguard Worker 
3060*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_PrimitiveRestartIndex(GLuint index)3061*61046927SAndroid Build Coastguard Worker _mesa_PrimitiveRestartIndex(GLuint index)
3062*61046927SAndroid Build Coastguard Worker {
3063*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3064*61046927SAndroid Build Coastguard Worker 
3065*61046927SAndroid Build Coastguard Worker    if (!ctx->Extensions.NV_primitive_restart && ctx->Version < 31) {
3066*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glPrimitiveRestartIndexNV()");
3067*61046927SAndroid Build Coastguard Worker       return;
3068*61046927SAndroid Build Coastguard Worker    }
3069*61046927SAndroid Build Coastguard Worker 
3070*61046927SAndroid Build Coastguard Worker    primitive_restart_index(ctx, index);
3071*61046927SAndroid Build Coastguard Worker }
3072*61046927SAndroid Build Coastguard Worker 
3073*61046927SAndroid Build Coastguard Worker 
3074*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribDivisor_no_error(GLuint index,GLuint divisor)3075*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribDivisor_no_error(GLuint index, GLuint divisor)
3076*61046927SAndroid Build Coastguard Worker {
3077*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3078*61046927SAndroid Build Coastguard Worker 
3079*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib genericIndex = VERT_ATTRIB_GENERIC(index);
3080*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object * const vao = ctx->Array.VAO;
3081*61046927SAndroid Build Coastguard Worker 
3082*61046927SAndroid Build Coastguard Worker    assert(genericIndex < ARRAY_SIZE(vao->VertexAttrib));
3083*61046927SAndroid Build Coastguard Worker 
3084*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3085*61046927SAndroid Build Coastguard Worker     *
3086*61046927SAndroid Build Coastguard Worker     *    "The command
3087*61046927SAndroid Build Coastguard Worker     *
3088*61046927SAndroid Build Coastguard Worker     *       void VertexAttribDivisor(uint index, uint divisor);
3089*61046927SAndroid Build Coastguard Worker     *
3090*61046927SAndroid Build Coastguard Worker     *     is equivalent to (assuming no errors are generated):
3091*61046927SAndroid Build Coastguard Worker     *
3092*61046927SAndroid Build Coastguard Worker     *       VertexAttribBinding(index, index);
3093*61046927SAndroid Build Coastguard Worker     *       VertexBindingDivisor(index, divisor);"
3094*61046927SAndroid Build Coastguard Worker     */
3095*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, vao, genericIndex, genericIndex);
3096*61046927SAndroid Build Coastguard Worker    vertex_binding_divisor(ctx, vao, genericIndex, divisor);
3097*61046927SAndroid Build Coastguard Worker }
3098*61046927SAndroid Build Coastguard Worker 
3099*61046927SAndroid Build Coastguard Worker 
3100*61046927SAndroid Build Coastguard Worker /**
3101*61046927SAndroid Build Coastguard Worker  * See GL_ARB_instanced_arrays.
3102*61046927SAndroid Build Coastguard Worker  * Note that the instance divisor only applies to generic arrays, not
3103*61046927SAndroid Build Coastguard Worker  * the legacy vertex arrays.
3104*61046927SAndroid Build Coastguard Worker  */
3105*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribDivisor(GLuint index,GLuint divisor)3106*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribDivisor(GLuint index, GLuint divisor)
3107*61046927SAndroid Build Coastguard Worker {
3108*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3109*61046927SAndroid Build Coastguard Worker 
3110*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib genericIndex = VERT_ATTRIB_GENERIC(index);
3111*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object * const vao = ctx->Array.VAO;
3112*61046927SAndroid Build Coastguard Worker 
3113*61046927SAndroid Build Coastguard Worker    if (!ctx->Extensions.ARB_instanced_arrays) {
3114*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexAttribDivisor()");
3115*61046927SAndroid Build Coastguard Worker       return;
3116*61046927SAndroid Build Coastguard Worker    }
3117*61046927SAndroid Build Coastguard Worker 
3118*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
3119*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3120*61046927SAndroid Build Coastguard Worker                   "glVertexAttribDivisor(index = %u)", index);
3121*61046927SAndroid Build Coastguard Worker       return;
3122*61046927SAndroid Build Coastguard Worker    }
3123*61046927SAndroid Build Coastguard Worker 
3124*61046927SAndroid Build Coastguard Worker    assert(genericIndex < ARRAY_SIZE(vao->VertexAttrib));
3125*61046927SAndroid Build Coastguard Worker 
3126*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3127*61046927SAndroid Build Coastguard Worker     *
3128*61046927SAndroid Build Coastguard Worker     *    "The command
3129*61046927SAndroid Build Coastguard Worker     *
3130*61046927SAndroid Build Coastguard Worker     *       void VertexAttribDivisor(uint index, uint divisor);
3131*61046927SAndroid Build Coastguard Worker     *
3132*61046927SAndroid Build Coastguard Worker     *     is equivalent to (assuming no errors are generated):
3133*61046927SAndroid Build Coastguard Worker     *
3134*61046927SAndroid Build Coastguard Worker     *       VertexAttribBinding(index, index);
3135*61046927SAndroid Build Coastguard Worker     *       VertexBindingDivisor(index, divisor);"
3136*61046927SAndroid Build Coastguard Worker     */
3137*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, vao, genericIndex, genericIndex);
3138*61046927SAndroid Build Coastguard Worker    vertex_binding_divisor(ctx, vao, genericIndex, divisor);
3139*61046927SAndroid Build Coastguard Worker }
3140*61046927SAndroid Build Coastguard Worker 
3141*61046927SAndroid Build Coastguard Worker 
3142*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribDivisorEXT(GLuint vaobj,GLuint index,GLuint divisor)3143*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribDivisorEXT(GLuint vaobj, GLuint index, GLuint divisor)
3144*61046927SAndroid Build Coastguard Worker {
3145*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3146*61046927SAndroid Build Coastguard Worker 
3147*61046927SAndroid Build Coastguard Worker    const gl_vert_attrib genericIndex = VERT_ATTRIB_GENERIC(index);
3148*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object * vao;
3149*61046927SAndroid Build Coastguard Worker    /* The ARB_instanced_arrays spec says:
3150*61046927SAndroid Build Coastguard Worker     *
3151*61046927SAndroid Build Coastguard Worker     *     "The vertex array object named by vaobj must
3152*61046927SAndroid Build Coastguard Worker     *     be generated by GenVertexArrays (and not since deleted);
3153*61046927SAndroid Build Coastguard Worker     *     otherwise an INVALID_OPERATION error is generated."
3154*61046927SAndroid Build Coastguard Worker     */
3155*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj,
3156*61046927SAndroid Build Coastguard Worker                               false,
3157*61046927SAndroid Build Coastguard Worker                               "glVertexArrayVertexAttribDivisorEXT");
3158*61046927SAndroid Build Coastguard Worker    if (!vao)
3159*61046927SAndroid Build Coastguard Worker       return;
3160*61046927SAndroid Build Coastguard Worker 
3161*61046927SAndroid Build Coastguard Worker    if (!ctx->Extensions.ARB_instanced_arrays) {
3162*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "glVertexArrayVertexAttribDivisorEXT()");
3163*61046927SAndroid Build Coastguard Worker       return;
3164*61046927SAndroid Build Coastguard Worker    }
3165*61046927SAndroid Build Coastguard Worker 
3166*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
3167*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3168*61046927SAndroid Build Coastguard Worker                   "glVertexArrayVertexAttribDivisorEXT(index = %u)", index);
3169*61046927SAndroid Build Coastguard Worker       return;
3170*61046927SAndroid Build Coastguard Worker    }
3171*61046927SAndroid Build Coastguard Worker 
3172*61046927SAndroid Build Coastguard Worker    assert(genericIndex < ARRAY_SIZE(vao->VertexAttrib));
3173*61046927SAndroid Build Coastguard Worker 
3174*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3175*61046927SAndroid Build Coastguard Worker     *
3176*61046927SAndroid Build Coastguard Worker     *    "The command
3177*61046927SAndroid Build Coastguard Worker     *
3178*61046927SAndroid Build Coastguard Worker     *       void VertexAttribDivisor(uint index, uint divisor);
3179*61046927SAndroid Build Coastguard Worker     *
3180*61046927SAndroid Build Coastguard Worker     *     is equivalent to (assuming no errors are generated):
3181*61046927SAndroid Build Coastguard Worker     *
3182*61046927SAndroid Build Coastguard Worker     *       VertexAttribBinding(index, index);
3183*61046927SAndroid Build Coastguard Worker     *       VertexBindingDivisor(index, divisor);"
3184*61046927SAndroid Build Coastguard Worker     */
3185*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, vao, genericIndex, genericIndex);
3186*61046927SAndroid Build Coastguard Worker    vertex_binding_divisor(ctx, vao, genericIndex, divisor);
3187*61046927SAndroid Build Coastguard Worker }
3188*61046927SAndroid Build Coastguard Worker 
3189*61046927SAndroid Build Coastguard Worker 
3190*61046927SAndroid Build Coastguard Worker 
3191*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
vertex_array_vertex_buffer(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride,bool no_error,const char * func)3192*61046927SAndroid Build Coastguard Worker vertex_array_vertex_buffer(struct gl_context *ctx,
3193*61046927SAndroid Build Coastguard Worker                            struct gl_vertex_array_object *vao,
3194*61046927SAndroid Build Coastguard Worker                            GLuint bindingIndex, GLuint buffer, GLintptr offset,
3195*61046927SAndroid Build Coastguard Worker                            GLsizei stride, bool no_error, const char *func)
3196*61046927SAndroid Build Coastguard Worker {
3197*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *vbo;
3198*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *current_buf =
3199*61046927SAndroid Build Coastguard Worker       vao->BufferBinding[VERT_ATTRIB_GENERIC(bindingIndex)].BufferObj;
3200*61046927SAndroid Build Coastguard Worker 
3201*61046927SAndroid Build Coastguard Worker    if (current_buf && buffer == current_buf->Name) {
3202*61046927SAndroid Build Coastguard Worker       vbo = current_buf;
3203*61046927SAndroid Build Coastguard Worker    } else if (buffer != 0) {
3204*61046927SAndroid Build Coastguard Worker       vbo = _mesa_lookup_bufferobj(ctx, buffer);
3205*61046927SAndroid Build Coastguard Worker 
3206*61046927SAndroid Build Coastguard Worker       if (!no_error && !vbo && _mesa_is_gles31(ctx)) {
3207*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION, "%s(non-gen name)", func);
3208*61046927SAndroid Build Coastguard Worker          return;
3209*61046927SAndroid Build Coastguard Worker       }
3210*61046927SAndroid Build Coastguard Worker       /* From the GL_ARB_vertex_attrib_array spec:
3211*61046927SAndroid Build Coastguard Worker        *
3212*61046927SAndroid Build Coastguard Worker        *   "[Core profile only:]
3213*61046927SAndroid Build Coastguard Worker        *    An INVALID_OPERATION error is generated if buffer is not zero or a
3214*61046927SAndroid Build Coastguard Worker        *    name returned from a previous call to GenBuffers, or if such a name
3215*61046927SAndroid Build Coastguard Worker        *    has since been deleted with DeleteBuffers.
3216*61046927SAndroid Build Coastguard Worker        *
3217*61046927SAndroid Build Coastguard Worker        * Otherwise, we fall back to the same compat profile behavior as other
3218*61046927SAndroid Build Coastguard Worker        * object references (automatically gen it).
3219*61046927SAndroid Build Coastguard Worker        */
3220*61046927SAndroid Build Coastguard Worker       if (!_mesa_handle_bind_buffer_gen(ctx, buffer, &vbo, func, no_error))
3221*61046927SAndroid Build Coastguard Worker          return;
3222*61046927SAndroid Build Coastguard Worker    } else {
3223*61046927SAndroid Build Coastguard Worker       /* The ARB_vertex_attrib_binding spec says:
3224*61046927SAndroid Build Coastguard Worker        *
3225*61046927SAndroid Build Coastguard Worker        *    "If <buffer> is zero, any buffer object attached to this
3226*61046927SAndroid Build Coastguard Worker        *     bindpoint is detached."
3227*61046927SAndroid Build Coastguard Worker        */
3228*61046927SAndroid Build Coastguard Worker       vbo = NULL;
3229*61046927SAndroid Build Coastguard Worker    }
3230*61046927SAndroid Build Coastguard Worker 
3231*61046927SAndroid Build Coastguard Worker    _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex),
3232*61046927SAndroid Build Coastguard Worker                             vbo, offset, stride, false, false);
3233*61046927SAndroid Build Coastguard Worker }
3234*61046927SAndroid Build Coastguard Worker 
3235*61046927SAndroid Build Coastguard Worker 
3236*61046927SAndroid Build Coastguard Worker /**
3237*61046927SAndroid Build Coastguard Worker  * GL_ARB_vertex_attrib_binding
3238*61046927SAndroid Build Coastguard Worker  */
3239*61046927SAndroid Build Coastguard Worker static void
vertex_array_vertex_buffer_err(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride,const char * func)3240*61046927SAndroid Build Coastguard Worker vertex_array_vertex_buffer_err(struct gl_context *ctx,
3241*61046927SAndroid Build Coastguard Worker                                struct gl_vertex_array_object *vao,
3242*61046927SAndroid Build Coastguard Worker                                GLuint bindingIndex, GLuint buffer,
3243*61046927SAndroid Build Coastguard Worker                                GLintptr offset, GLsizei stride,
3244*61046927SAndroid Build Coastguard Worker                                const char *func)
3245*61046927SAndroid Build Coastguard Worker {
3246*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
3247*61046927SAndroid Build Coastguard Worker 
3248*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3249*61046927SAndroid Build Coastguard Worker     *
3250*61046927SAndroid Build Coastguard Worker     *    "An INVALID_VALUE error is generated if <bindingindex> is greater than
3251*61046927SAndroid Build Coastguard Worker     *     the value of MAX_VERTEX_ATTRIB_BINDINGS."
3252*61046927SAndroid Build Coastguard Worker     */
3253*61046927SAndroid Build Coastguard Worker    if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) {
3254*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3255*61046927SAndroid Build Coastguard Worker                   "%s(bindingindex=%u > "
3256*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_BINDINGS)",
3257*61046927SAndroid Build Coastguard Worker                   func, bindingIndex);
3258*61046927SAndroid Build Coastguard Worker       return;
3259*61046927SAndroid Build Coastguard Worker    }
3260*61046927SAndroid Build Coastguard Worker 
3261*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3262*61046927SAndroid Build Coastguard Worker     *
3263*61046927SAndroid Build Coastguard Worker     *    "The error INVALID_VALUE is generated if <stride> or <offset>
3264*61046927SAndroid Build Coastguard Worker     *     are negative."
3265*61046927SAndroid Build Coastguard Worker     */
3266*61046927SAndroid Build Coastguard Worker    if (offset < 0) {
3267*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3268*61046927SAndroid Build Coastguard Worker                   "%s(offset=%" PRId64 " < 0)",
3269*61046927SAndroid Build Coastguard Worker                   func, (int64_t) offset);
3270*61046927SAndroid Build Coastguard Worker       return;
3271*61046927SAndroid Build Coastguard Worker    }
3272*61046927SAndroid Build Coastguard Worker 
3273*61046927SAndroid Build Coastguard Worker    if (stride < 0) {
3274*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3275*61046927SAndroid Build Coastguard Worker                   "%s(stride=%d < 0)", func, stride);
3276*61046927SAndroid Build Coastguard Worker       return;
3277*61046927SAndroid Build Coastguard Worker    }
3278*61046927SAndroid Build Coastguard Worker 
3279*61046927SAndroid Build Coastguard Worker    if (((_mesa_is_desktop_gl(ctx) && ctx->Version >= 44) || _mesa_is_gles31(ctx)) &&
3280*61046927SAndroid Build Coastguard Worker        stride > ctx->Const.MaxVertexAttribStride) {
3281*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "%s(stride=%d > "
3282*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_STRIDE)", func, stride);
3283*61046927SAndroid Build Coastguard Worker       return;
3284*61046927SAndroid Build Coastguard Worker    }
3285*61046927SAndroid Build Coastguard Worker 
3286*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffer(ctx, vao, bindingIndex, buffer, offset,
3287*61046927SAndroid Build Coastguard Worker                               stride, false, func);
3288*61046927SAndroid Build Coastguard Worker }
3289*61046927SAndroid Build Coastguard Worker 
3290*61046927SAndroid Build Coastguard Worker 
3291*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindVertexBuffer_no_error(GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride)3292*61046927SAndroid Build Coastguard Worker _mesa_BindVertexBuffer_no_error(GLuint bindingIndex, GLuint buffer,
3293*61046927SAndroid Build Coastguard Worker                                 GLintptr offset, GLsizei stride)
3294*61046927SAndroid Build Coastguard Worker {
3295*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3296*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffer(ctx, ctx->Array.VAO, bindingIndex,
3297*61046927SAndroid Build Coastguard Worker                               buffer, offset, stride, true,
3298*61046927SAndroid Build Coastguard Worker                               "glBindVertexBuffer");
3299*61046927SAndroid Build Coastguard Worker }
3300*61046927SAndroid Build Coastguard Worker 
3301*61046927SAndroid Build Coastguard Worker 
3302*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindVertexBuffer(GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride)3303*61046927SAndroid Build Coastguard Worker _mesa_BindVertexBuffer(GLuint bindingIndex, GLuint buffer, GLintptr offset,
3304*61046927SAndroid Build Coastguard Worker                        GLsizei stride)
3305*61046927SAndroid Build Coastguard Worker {
3306*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3307*61046927SAndroid Build Coastguard Worker 
3308*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3309*61046927SAndroid Build Coastguard Worker     *
3310*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if no vertex array object
3311*61046927SAndroid Build Coastguard Worker     *     is bound."
3312*61046927SAndroid Build Coastguard Worker     */
3313*61046927SAndroid Build Coastguard Worker    if ((_mesa_is_desktop_gl_core(ctx) || _mesa_is_gles31(ctx)) &&
3314*61046927SAndroid Build Coastguard Worker        ctx->Array.VAO == ctx->Array.DefaultVAO) {
3315*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
3316*61046927SAndroid Build Coastguard Worker                   "glBindVertexBuffer(No array object bound)");
3317*61046927SAndroid Build Coastguard Worker       return;
3318*61046927SAndroid Build Coastguard Worker    }
3319*61046927SAndroid Build Coastguard Worker 
3320*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffer_err(ctx, ctx->Array.VAO, bindingIndex,
3321*61046927SAndroid Build Coastguard Worker                                   buffer, offset, stride,
3322*61046927SAndroid Build Coastguard Worker                                   "glBindVertexBuffer");
3323*61046927SAndroid Build Coastguard Worker }
3324*61046927SAndroid Build Coastguard Worker 
3325*61046927SAndroid Build Coastguard Worker 
3326*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexBuffer_no_error(GLuint vaobj,GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride)3327*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexBuffer_no_error(GLuint vaobj, GLuint bindingIndex,
3328*61046927SAndroid Build Coastguard Worker                                        GLuint buffer, GLintptr offset,
3329*61046927SAndroid Build Coastguard Worker                                        GLsizei stride)
3330*61046927SAndroid Build Coastguard Worker {
3331*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3332*61046927SAndroid Build Coastguard Worker 
3333*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
3334*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffer(ctx, vao, bindingIndex, buffer, offset,
3335*61046927SAndroid Build Coastguard Worker                               stride, true, "glVertexArrayVertexBuffer");
3336*61046927SAndroid Build Coastguard Worker }
3337*61046927SAndroid Build Coastguard Worker 
3338*61046927SAndroid Build Coastguard Worker 
3339*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexBuffer(GLuint vaobj,GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride)3340*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexBuffer(GLuint vaobj, GLuint bindingIndex, GLuint buffer,
3341*61046927SAndroid Build Coastguard Worker                               GLintptr offset, GLsizei stride)
3342*61046927SAndroid Build Coastguard Worker {
3343*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3344*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
3345*61046927SAndroid Build Coastguard Worker 
3346*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
3347*61046927SAndroid Build Coastguard Worker     *
3348*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by VertexArrayVertexBuffer
3349*61046927SAndroid Build Coastguard Worker     *    if <vaobj> is not [compatibility profile: zero or] the name of an
3350*61046927SAndroid Build Coastguard Worker     *    existing vertex array object."
3351*61046927SAndroid Build Coastguard Worker     */
3352*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glVertexArrayVertexBuffer");
3353*61046927SAndroid Build Coastguard Worker    if (!vao)
3354*61046927SAndroid Build Coastguard Worker       return;
3355*61046927SAndroid Build Coastguard Worker 
3356*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffer_err(ctx, vao, bindingIndex, buffer, offset,
3357*61046927SAndroid Build Coastguard Worker                                   stride, "glVertexArrayVertexBuffer");
3358*61046927SAndroid Build Coastguard Worker }
3359*61046927SAndroid Build Coastguard Worker 
3360*61046927SAndroid Build Coastguard Worker 
3361*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayBindVertexBufferEXT(GLuint vaobj,GLuint bindingIndex,GLuint buffer,GLintptr offset,GLsizei stride)3362*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayBindVertexBufferEXT(GLuint vaobj, GLuint bindingIndex, GLuint buffer,
3363*61046927SAndroid Build Coastguard Worker                                      GLintptr offset, GLsizei stride)
3364*61046927SAndroid Build Coastguard Worker {
3365*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3366*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
3367*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true, "glVertexArrayBindVertexBufferEXT");
3368*61046927SAndroid Build Coastguard Worker    if (!vao)
3369*61046927SAndroid Build Coastguard Worker       return;
3370*61046927SAndroid Build Coastguard Worker 
3371*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffer_err(ctx, vao, bindingIndex, buffer, offset,
3372*61046927SAndroid Build Coastguard Worker                                   stride, "glVertexArrayBindVertexBufferEXT");
3373*61046927SAndroid Build Coastguard Worker }
3374*61046927SAndroid Build Coastguard Worker 
3375*61046927SAndroid Build Coastguard Worker 
3376*61046927SAndroid Build Coastguard Worker static ALWAYS_INLINE void
vertex_array_vertex_buffers(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint first,GLsizei count,const GLuint * buffers,const GLintptr * offsets,const GLsizei * strides,bool no_error,const char * func)3377*61046927SAndroid Build Coastguard Worker vertex_array_vertex_buffers(struct gl_context *ctx,
3378*61046927SAndroid Build Coastguard Worker                             struct gl_vertex_array_object *vao,
3379*61046927SAndroid Build Coastguard Worker                             GLuint first, GLsizei count, const GLuint *buffers,
3380*61046927SAndroid Build Coastguard Worker                             const GLintptr *offsets, const GLsizei *strides,
3381*61046927SAndroid Build Coastguard Worker                             bool no_error, const char *func)
3382*61046927SAndroid Build Coastguard Worker {
3383*61046927SAndroid Build Coastguard Worker    GLint i;
3384*61046927SAndroid Build Coastguard Worker 
3385*61046927SAndroid Build Coastguard Worker    if (!buffers) {
3386*61046927SAndroid Build Coastguard Worker       /**
3387*61046927SAndroid Build Coastguard Worker        * The ARB_multi_bind spec says:
3388*61046927SAndroid Build Coastguard Worker        *
3389*61046927SAndroid Build Coastguard Worker        *    "If <buffers> is NULL, each affected vertex buffer binding point
3390*61046927SAndroid Build Coastguard Worker        *     from <first> through <first>+<count>-1 will be reset to have no
3391*61046927SAndroid Build Coastguard Worker        *     bound buffer object.  In this case, the offsets and strides
3392*61046927SAndroid Build Coastguard Worker        *     associated with the binding points are set to default values,
3393*61046927SAndroid Build Coastguard Worker        *     ignoring <offsets> and <strides>."
3394*61046927SAndroid Build Coastguard Worker        */
3395*61046927SAndroid Build Coastguard Worker       for (i = 0; i < count; i++)
3396*61046927SAndroid Build Coastguard Worker          _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(first + i),
3397*61046927SAndroid Build Coastguard Worker                                   NULL, 0, 16, false, false);
3398*61046927SAndroid Build Coastguard Worker 
3399*61046927SAndroid Build Coastguard Worker       return;
3400*61046927SAndroid Build Coastguard Worker    }
3401*61046927SAndroid Build Coastguard Worker 
3402*61046927SAndroid Build Coastguard Worker    /* Note that the error semantics for multi-bind commands differ from
3403*61046927SAndroid Build Coastguard Worker     * those of other GL commands.
3404*61046927SAndroid Build Coastguard Worker     *
3405*61046927SAndroid Build Coastguard Worker     * The Issues section in the ARB_multi_bind spec says:
3406*61046927SAndroid Build Coastguard Worker     *
3407*61046927SAndroid Build Coastguard Worker     *    "(11) Typically, OpenGL specifies that if an error is generated by
3408*61046927SAndroid Build Coastguard Worker     *          a command, that command has no effect.  This is somewhat
3409*61046927SAndroid Build Coastguard Worker     *          unfortunate for multi-bind commands, because it would require
3410*61046927SAndroid Build Coastguard Worker     *          a first pass to scan the entire list of bound objects for
3411*61046927SAndroid Build Coastguard Worker     *          errors and then a second pass to actually perform the
3412*61046927SAndroid Build Coastguard Worker     *          bindings.  Should we have different error semantics?
3413*61046927SAndroid Build Coastguard Worker     *
3414*61046927SAndroid Build Coastguard Worker     *       RESOLVED:  Yes.  In this specification, when the parameters for
3415*61046927SAndroid Build Coastguard Worker     *       one of the <count> binding points are invalid, that binding
3416*61046927SAndroid Build Coastguard Worker     *       point is not updated and an error will be generated.  However,
3417*61046927SAndroid Build Coastguard Worker     *       other binding points in the same command will be updated if
3418*61046927SAndroid Build Coastguard Worker     *       their parameters are valid and no other error occurs."
3419*61046927SAndroid Build Coastguard Worker     */
3420*61046927SAndroid Build Coastguard Worker 
3421*61046927SAndroid Build Coastguard Worker    _mesa_HashLockMaybeLocked(&ctx->Shared->BufferObjects,
3422*61046927SAndroid Build Coastguard Worker                              ctx->BufferObjectsLocked);
3423*61046927SAndroid Build Coastguard Worker 
3424*61046927SAndroid Build Coastguard Worker    for (i = 0; i < count; i++) {
3425*61046927SAndroid Build Coastguard Worker       struct gl_buffer_object *vbo;
3426*61046927SAndroid Build Coastguard Worker 
3427*61046927SAndroid Build Coastguard Worker       if (!no_error) {
3428*61046927SAndroid Build Coastguard Worker          /* The ARB_multi_bind spec says:
3429*61046927SAndroid Build Coastguard Worker           *
3430*61046927SAndroid Build Coastguard Worker           *    "An INVALID_VALUE error is generated if any value in
3431*61046927SAndroid Build Coastguard Worker           *     <offsets> or <strides> is negative (per binding)."
3432*61046927SAndroid Build Coastguard Worker           */
3433*61046927SAndroid Build Coastguard Worker          if (offsets[i] < 0) {
3434*61046927SAndroid Build Coastguard Worker             _mesa_error(ctx, GL_INVALID_VALUE,
3435*61046927SAndroid Build Coastguard Worker                         "%s(offsets[%u]=%" PRId64 " < 0)",
3436*61046927SAndroid Build Coastguard Worker                         func, i, (int64_t) offsets[i]);
3437*61046927SAndroid Build Coastguard Worker             continue;
3438*61046927SAndroid Build Coastguard Worker          }
3439*61046927SAndroid Build Coastguard Worker 
3440*61046927SAndroid Build Coastguard Worker          if (strides[i] < 0) {
3441*61046927SAndroid Build Coastguard Worker             _mesa_error(ctx, GL_INVALID_VALUE,
3442*61046927SAndroid Build Coastguard Worker                         "%s(strides[%u]=%d < 0)",
3443*61046927SAndroid Build Coastguard Worker                         func, i, strides[i]);
3444*61046927SAndroid Build Coastguard Worker             continue;
3445*61046927SAndroid Build Coastguard Worker          }
3446*61046927SAndroid Build Coastguard Worker 
3447*61046927SAndroid Build Coastguard Worker          if (_mesa_is_desktop_gl(ctx) && ctx->Version >= 44 &&
3448*61046927SAndroid Build Coastguard Worker              strides[i] > ctx->Const.MaxVertexAttribStride) {
3449*61046927SAndroid Build Coastguard Worker             _mesa_error(ctx, GL_INVALID_VALUE,
3450*61046927SAndroid Build Coastguard Worker                         "%s(strides[%u]=%d > "
3451*61046927SAndroid Build Coastguard Worker                         "GL_MAX_VERTEX_ATTRIB_STRIDE)", func, i, strides[i]);
3452*61046927SAndroid Build Coastguard Worker             continue;
3453*61046927SAndroid Build Coastguard Worker          }
3454*61046927SAndroid Build Coastguard Worker       }
3455*61046927SAndroid Build Coastguard Worker 
3456*61046927SAndroid Build Coastguard Worker       if (buffers[i]) {
3457*61046927SAndroid Build Coastguard Worker          struct gl_vertex_buffer_binding *binding =
3458*61046927SAndroid Build Coastguard Worker             &vao->BufferBinding[VERT_ATTRIB_GENERIC(first + i)];
3459*61046927SAndroid Build Coastguard Worker 
3460*61046927SAndroid Build Coastguard Worker          if (buffers[i] == 0)
3461*61046927SAndroid Build Coastguard Worker             vbo = NULL;
3462*61046927SAndroid Build Coastguard Worker          else if (binding->BufferObj && binding->BufferObj->Name == buffers[i])
3463*61046927SAndroid Build Coastguard Worker             vbo = binding->BufferObj;
3464*61046927SAndroid Build Coastguard Worker          else {
3465*61046927SAndroid Build Coastguard Worker             bool error;
3466*61046927SAndroid Build Coastguard Worker             vbo = _mesa_multi_bind_lookup_bufferobj(ctx, buffers, i, func,
3467*61046927SAndroid Build Coastguard Worker                                                     &error);
3468*61046927SAndroid Build Coastguard Worker             if (error)
3469*61046927SAndroid Build Coastguard Worker                continue;
3470*61046927SAndroid Build Coastguard Worker          }
3471*61046927SAndroid Build Coastguard Worker       } else {
3472*61046927SAndroid Build Coastguard Worker          vbo = NULL;
3473*61046927SAndroid Build Coastguard Worker       }
3474*61046927SAndroid Build Coastguard Worker 
3475*61046927SAndroid Build Coastguard Worker       _mesa_bind_vertex_buffer(ctx, vao, VERT_ATTRIB_GENERIC(first + i),
3476*61046927SAndroid Build Coastguard Worker                                vbo, offsets[i], strides[i], false, false);
3477*61046927SAndroid Build Coastguard Worker    }
3478*61046927SAndroid Build Coastguard Worker 
3479*61046927SAndroid Build Coastguard Worker    _mesa_HashUnlockMaybeLocked(&ctx->Shared->BufferObjects,
3480*61046927SAndroid Build Coastguard Worker                                ctx->BufferObjectsLocked);
3481*61046927SAndroid Build Coastguard Worker }
3482*61046927SAndroid Build Coastguard Worker 
3483*61046927SAndroid Build Coastguard Worker 
3484*61046927SAndroid Build Coastguard Worker static void
vertex_array_vertex_buffers_err(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint first,GLsizei count,const GLuint * buffers,const GLintptr * offsets,const GLsizei * strides,const char * func)3485*61046927SAndroid Build Coastguard Worker vertex_array_vertex_buffers_err(struct gl_context *ctx,
3486*61046927SAndroid Build Coastguard Worker                                 struct gl_vertex_array_object *vao,
3487*61046927SAndroid Build Coastguard Worker                                 GLuint first, GLsizei count,
3488*61046927SAndroid Build Coastguard Worker                                 const GLuint *buffers, const GLintptr *offsets,
3489*61046927SAndroid Build Coastguard Worker                                 const GLsizei *strides, const char *func)
3490*61046927SAndroid Build Coastguard Worker {
3491*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
3492*61046927SAndroid Build Coastguard Worker 
3493*61046927SAndroid Build Coastguard Worker    /* The ARB_multi_bind spec says:
3494*61046927SAndroid Build Coastguard Worker     *
3495*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if <first> + <count>
3496*61046927SAndroid Build Coastguard Worker     *     is greater than the value of MAX_VERTEX_ATTRIB_BINDINGS."
3497*61046927SAndroid Build Coastguard Worker     */
3498*61046927SAndroid Build Coastguard Worker    if (first + count > ctx->Const.MaxVertexAttribBindings) {
3499*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
3500*61046927SAndroid Build Coastguard Worker                   "%s(first=%u + count=%d > the value of "
3501*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_BINDINGS=%u)",
3502*61046927SAndroid Build Coastguard Worker                   func, first, count, ctx->Const.MaxVertexAttribBindings);
3503*61046927SAndroid Build Coastguard Worker       return;
3504*61046927SAndroid Build Coastguard Worker    }
3505*61046927SAndroid Build Coastguard Worker 
3506*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffers(ctx, vao, first, count, buffers, offsets,
3507*61046927SAndroid Build Coastguard Worker                                strides, false, func);
3508*61046927SAndroid Build Coastguard Worker }
3509*61046927SAndroid Build Coastguard Worker 
3510*61046927SAndroid Build Coastguard Worker 
3511*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindVertexBuffers_no_error(GLuint first,GLsizei count,const GLuint * buffers,const GLintptr * offsets,const GLsizei * strides)3512*61046927SAndroid Build Coastguard Worker _mesa_BindVertexBuffers_no_error(GLuint first, GLsizei count,
3513*61046927SAndroid Build Coastguard Worker                                  const GLuint *buffers, const GLintptr *offsets,
3514*61046927SAndroid Build Coastguard Worker                                  const GLsizei *strides)
3515*61046927SAndroid Build Coastguard Worker {
3516*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3517*61046927SAndroid Build Coastguard Worker 
3518*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffers(ctx, ctx->Array.VAO, first, count,
3519*61046927SAndroid Build Coastguard Worker                                buffers, offsets, strides, true,
3520*61046927SAndroid Build Coastguard Worker                                "glBindVertexBuffers");
3521*61046927SAndroid Build Coastguard Worker }
3522*61046927SAndroid Build Coastguard Worker 
3523*61046927SAndroid Build Coastguard Worker 
3524*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_BindVertexBuffers(GLuint first,GLsizei count,const GLuint * buffers,const GLintptr * offsets,const GLsizei * strides)3525*61046927SAndroid Build Coastguard Worker _mesa_BindVertexBuffers(GLuint first, GLsizei count, const GLuint *buffers,
3526*61046927SAndroid Build Coastguard Worker                         const GLintptr *offsets, const GLsizei *strides)
3527*61046927SAndroid Build Coastguard Worker {
3528*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3529*61046927SAndroid Build Coastguard Worker 
3530*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3531*61046927SAndroid Build Coastguard Worker     *
3532*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if no
3533*61046927SAndroid Build Coastguard Worker     *     vertex array object is bound."
3534*61046927SAndroid Build Coastguard Worker     */
3535*61046927SAndroid Build Coastguard Worker    if (_mesa_is_desktop_gl_core(ctx) &&
3536*61046927SAndroid Build Coastguard Worker        ctx->Array.VAO == ctx->Array.DefaultVAO) {
3537*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
3538*61046927SAndroid Build Coastguard Worker                   "glBindVertexBuffers(No array object bound)");
3539*61046927SAndroid Build Coastguard Worker       return;
3540*61046927SAndroid Build Coastguard Worker    }
3541*61046927SAndroid Build Coastguard Worker 
3542*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffers_err(ctx, ctx->Array.VAO, first, count,
3543*61046927SAndroid Build Coastguard Worker                                    buffers, offsets, strides,
3544*61046927SAndroid Build Coastguard Worker                                    "glBindVertexBuffers");
3545*61046927SAndroid Build Coastguard Worker }
3546*61046927SAndroid Build Coastguard Worker 
3547*61046927SAndroid Build Coastguard Worker 
3548*61046927SAndroid Build Coastguard Worker void
_mesa_InternalBindVertexBuffers(struct gl_context * ctx,struct gl_buffer_object ** buffers,const int * offsets,GLbitfield buffer_mask)3549*61046927SAndroid Build Coastguard Worker _mesa_InternalBindVertexBuffers(struct gl_context *ctx,
3550*61046927SAndroid Build Coastguard Worker                                 struct gl_buffer_object **buffers,
3551*61046927SAndroid Build Coastguard Worker                                 const int *offsets, GLbitfield buffer_mask)
3552*61046927SAndroid Build Coastguard Worker {
3553*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = ctx->Array.VAO;
3554*61046927SAndroid Build Coastguard Worker    unsigned param_index = 0;
3555*61046927SAndroid Build Coastguard Worker 
3556*61046927SAndroid Build Coastguard Worker    while (buffer_mask) {
3557*61046927SAndroid Build Coastguard Worker       unsigned i = u_bit_scan(&buffer_mask);
3558*61046927SAndroid Build Coastguard Worker       struct gl_buffer_object *buf = buffers[param_index];
3559*61046927SAndroid Build Coastguard Worker 
3560*61046927SAndroid Build Coastguard Worker       /* The buffer reference is passed to _mesa_bind_vertex_buffer. */
3561*61046927SAndroid Build Coastguard Worker       _mesa_bind_vertex_buffer(ctx, vao, i, buf, offsets[param_index],
3562*61046927SAndroid Build Coastguard Worker                                vao->BufferBinding[i].Stride, true, true);
3563*61046927SAndroid Build Coastguard Worker       param_index++;
3564*61046927SAndroid Build Coastguard Worker    }
3565*61046927SAndroid Build Coastguard Worker }
3566*61046927SAndroid Build Coastguard Worker 
3567*61046927SAndroid Build Coastguard Worker 
3568*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexBuffers_no_error(GLuint vaobj,GLuint first,GLsizei count,const GLuint * buffers,const GLintptr * offsets,const GLsizei * strides)3569*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexBuffers_no_error(GLuint vaobj, GLuint first,
3570*61046927SAndroid Build Coastguard Worker                                         GLsizei count, const GLuint *buffers,
3571*61046927SAndroid Build Coastguard Worker                                         const GLintptr *offsets,
3572*61046927SAndroid Build Coastguard Worker                                         const GLsizei *strides)
3573*61046927SAndroid Build Coastguard Worker {
3574*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3575*61046927SAndroid Build Coastguard Worker 
3576*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
3577*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffers(ctx, vao, first, count,
3578*61046927SAndroid Build Coastguard Worker                                buffers, offsets, strides, true,
3579*61046927SAndroid Build Coastguard Worker                                "glVertexArrayVertexBuffers");
3580*61046927SAndroid Build Coastguard Worker }
3581*61046927SAndroid Build Coastguard Worker 
3582*61046927SAndroid Build Coastguard Worker 
3583*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexBuffers(GLuint vaobj,GLuint first,GLsizei count,const GLuint * buffers,const GLintptr * offsets,const GLsizei * strides)3584*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexBuffers(GLuint vaobj, GLuint first, GLsizei count,
3585*61046927SAndroid Build Coastguard Worker                                const GLuint *buffers,
3586*61046927SAndroid Build Coastguard Worker                                const GLintptr *offsets, const GLsizei *strides)
3587*61046927SAndroid Build Coastguard Worker {
3588*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3589*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
3590*61046927SAndroid Build Coastguard Worker 
3591*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
3592*61046927SAndroid Build Coastguard Worker     *
3593*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by VertexArrayVertexBuffer
3594*61046927SAndroid Build Coastguard Worker     *    if <vaobj> is not [compatibility profile: zero or] the name of an
3595*61046927SAndroid Build Coastguard Worker     *    existing vertex array object."
3596*61046927SAndroid Build Coastguard Worker     */
3597*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glVertexArrayVertexBuffers");
3598*61046927SAndroid Build Coastguard Worker    if (!vao)
3599*61046927SAndroid Build Coastguard Worker       return;
3600*61046927SAndroid Build Coastguard Worker 
3601*61046927SAndroid Build Coastguard Worker    vertex_array_vertex_buffers_err(ctx, vao, first, count,
3602*61046927SAndroid Build Coastguard Worker                                    buffers, offsets, strides,
3603*61046927SAndroid Build Coastguard Worker                                    "glVertexArrayVertexBuffers");
3604*61046927SAndroid Build Coastguard Worker }
3605*61046927SAndroid Build Coastguard Worker 
3606*61046927SAndroid Build Coastguard Worker 
3607*61046927SAndroid Build Coastguard Worker static void
vertex_attrib_format(GLuint attribIndex,GLint size,GLenum type,GLboolean normalized,GLboolean integer,GLboolean doubles,GLbitfield legalTypes,GLsizei sizeMax,GLuint relativeOffset,const char * func)3608*61046927SAndroid Build Coastguard Worker vertex_attrib_format(GLuint attribIndex, GLint size, GLenum type,
3609*61046927SAndroid Build Coastguard Worker                      GLboolean normalized, GLboolean integer,
3610*61046927SAndroid Build Coastguard Worker                      GLboolean doubles, GLbitfield legalTypes,
3611*61046927SAndroid Build Coastguard Worker                      GLsizei sizeMax, GLuint relativeOffset,
3612*61046927SAndroid Build Coastguard Worker                      const char *func)
3613*61046927SAndroid Build Coastguard Worker {
3614*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3615*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
3616*61046927SAndroid Build Coastguard Worker 
3617*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, sizeMax, &size);
3618*61046927SAndroid Build Coastguard Worker 
3619*61046927SAndroid Build Coastguard Worker    if (!_mesa_is_no_error_enabled(ctx)) {
3620*61046927SAndroid Build Coastguard Worker       /* The ARB_vertex_attrib_binding spec says:
3621*61046927SAndroid Build Coastguard Worker        *
3622*61046927SAndroid Build Coastguard Worker        *    "An INVALID_OPERATION error is generated under any of the
3623*61046927SAndroid Build Coastguard Worker        *    following conditions:
3624*61046927SAndroid Build Coastguard Worker        *     - if no vertex array object is currently bound (see section
3625*61046927SAndroid Build Coastguard Worker        *       2.10);
3626*61046927SAndroid Build Coastguard Worker        *     - ..."
3627*61046927SAndroid Build Coastguard Worker        *
3628*61046927SAndroid Build Coastguard Worker        * This error condition only applies to VertexAttribFormat and
3629*61046927SAndroid Build Coastguard Worker        * VertexAttribIFormat in the extension spec, but we assume that this
3630*61046927SAndroid Build Coastguard Worker        * is an oversight.  In the OpenGL 4.3 (Core Profile) spec, it applies
3631*61046927SAndroid Build Coastguard Worker        * to all three functions.
3632*61046927SAndroid Build Coastguard Worker        */
3633*61046927SAndroid Build Coastguard Worker       if ((_mesa_is_desktop_gl_core(ctx) || _mesa_is_gles31(ctx)) &&
3634*61046927SAndroid Build Coastguard Worker           ctx->Array.VAO == ctx->Array.DefaultVAO) {
3635*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_OPERATION,
3636*61046927SAndroid Build Coastguard Worker                      "%s(No array object bound)", func);
3637*61046927SAndroid Build Coastguard Worker          return;
3638*61046927SAndroid Build Coastguard Worker       }
3639*61046927SAndroid Build Coastguard Worker 
3640*61046927SAndroid Build Coastguard Worker       /* The ARB_vertex_attrib_binding spec says:
3641*61046927SAndroid Build Coastguard Worker        *
3642*61046927SAndroid Build Coastguard Worker        *   "The error INVALID_VALUE is generated if index is greater than or
3643*61046927SAndroid Build Coastguard Worker        *   equal to the value of MAX_VERTEX_ATTRIBS."
3644*61046927SAndroid Build Coastguard Worker        */
3645*61046927SAndroid Build Coastguard Worker       if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
3646*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_VALUE,
3647*61046927SAndroid Build Coastguard Worker                      "%s(attribindex=%u > "
3648*61046927SAndroid Build Coastguard Worker                      "GL_MAX_VERTEX_ATTRIBS)",
3649*61046927SAndroid Build Coastguard Worker                      func, attribIndex);
3650*61046927SAndroid Build Coastguard Worker          return;
3651*61046927SAndroid Build Coastguard Worker       }
3652*61046927SAndroid Build Coastguard Worker 
3653*61046927SAndroid Build Coastguard Worker       if (!validate_array_format(ctx, func, ctx->Array.VAO,
3654*61046927SAndroid Build Coastguard Worker                                  VERT_ATTRIB_GENERIC(attribIndex),
3655*61046927SAndroid Build Coastguard Worker                                  legalTypes, 1, sizeMax, size, type,
3656*61046927SAndroid Build Coastguard Worker                                  normalized, integer, doubles, relativeOffset,
3657*61046927SAndroid Build Coastguard Worker                                  format)) {
3658*61046927SAndroid Build Coastguard Worker          return;
3659*61046927SAndroid Build Coastguard Worker       }
3660*61046927SAndroid Build Coastguard Worker    }
3661*61046927SAndroid Build Coastguard Worker 
3662*61046927SAndroid Build Coastguard Worker    _mesa_update_array_format(ctx, ctx->Array.VAO,
3663*61046927SAndroid Build Coastguard Worker                              VERT_ATTRIB_GENERIC(attribIndex), size, type,
3664*61046927SAndroid Build Coastguard Worker                              format, normalized, integer, doubles,
3665*61046927SAndroid Build Coastguard Worker                              relativeOffset);
3666*61046927SAndroid Build Coastguard Worker }
3667*61046927SAndroid Build Coastguard Worker 
3668*61046927SAndroid Build Coastguard Worker 
3669*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribFormat(GLuint attribIndex,GLint size,GLenum type,GLboolean normalized,GLuint relativeOffset)3670*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribFormat(GLuint attribIndex, GLint size, GLenum type,
3671*61046927SAndroid Build Coastguard Worker                          GLboolean normalized, GLuint relativeOffset)
3672*61046927SAndroid Build Coastguard Worker {
3673*61046927SAndroid Build Coastguard Worker    vertex_attrib_format(attribIndex, size, type, normalized,
3674*61046927SAndroid Build Coastguard Worker                         GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK,
3675*61046927SAndroid Build Coastguard Worker                         BGRA_OR_4, relativeOffset,
3676*61046927SAndroid Build Coastguard Worker                         "glVertexAttribFormat");
3677*61046927SAndroid Build Coastguard Worker }
3678*61046927SAndroid Build Coastguard Worker 
3679*61046927SAndroid Build Coastguard Worker 
3680*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribIFormat(GLuint attribIndex,GLint size,GLenum type,GLuint relativeOffset)3681*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribIFormat(GLuint attribIndex, GLint size, GLenum type,
3682*61046927SAndroid Build Coastguard Worker                           GLuint relativeOffset)
3683*61046927SAndroid Build Coastguard Worker {
3684*61046927SAndroid Build Coastguard Worker    vertex_attrib_format(attribIndex, size, type, GL_FALSE,
3685*61046927SAndroid Build Coastguard Worker                         GL_TRUE, GL_FALSE, ATTRIB_IFORMAT_TYPES_MASK, 4,
3686*61046927SAndroid Build Coastguard Worker                         relativeOffset, "glVertexAttribIFormat");
3687*61046927SAndroid Build Coastguard Worker }
3688*61046927SAndroid Build Coastguard Worker 
3689*61046927SAndroid Build Coastguard Worker 
3690*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribLFormat(GLuint attribIndex,GLint size,GLenum type,GLuint relativeOffset)3691*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribLFormat(GLuint attribIndex, GLint size, GLenum type,
3692*61046927SAndroid Build Coastguard Worker                           GLuint relativeOffset)
3693*61046927SAndroid Build Coastguard Worker {
3694*61046927SAndroid Build Coastguard Worker    vertex_attrib_format(attribIndex, size, type, GL_FALSE, GL_FALSE,
3695*61046927SAndroid Build Coastguard Worker                         GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK, 4,
3696*61046927SAndroid Build Coastguard Worker                         relativeOffset, "glVertexAttribLFormat");
3697*61046927SAndroid Build Coastguard Worker }
3698*61046927SAndroid Build Coastguard Worker 
3699*61046927SAndroid Build Coastguard Worker 
3700*61046927SAndroid Build Coastguard Worker static void
vertex_array_attrib_format(GLuint vaobj,bool isExtDsa,GLuint attribIndex,GLint size,GLenum type,GLboolean normalized,GLboolean integer,GLboolean doubles,GLbitfield legalTypes,GLsizei sizeMax,GLuint relativeOffset,const char * func)3701*61046927SAndroid Build Coastguard Worker vertex_array_attrib_format(GLuint vaobj, bool isExtDsa, GLuint attribIndex,
3702*61046927SAndroid Build Coastguard Worker                            GLint size, GLenum type, GLboolean normalized,
3703*61046927SAndroid Build Coastguard Worker                            GLboolean integer, GLboolean doubles,
3704*61046927SAndroid Build Coastguard Worker                            GLbitfield legalTypes, GLsizei sizeMax,
3705*61046927SAndroid Build Coastguard Worker                            GLuint relativeOffset, const char *func)
3706*61046927SAndroid Build Coastguard Worker {
3707*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3708*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
3709*61046927SAndroid Build Coastguard Worker 
3710*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
3711*61046927SAndroid Build Coastguard Worker 
3712*61046927SAndroid Build Coastguard Worker    GLenum format = get_array_format(ctx, sizeMax, &size);
3713*61046927SAndroid Build Coastguard Worker 
3714*61046927SAndroid Build Coastguard Worker    if (_mesa_is_no_error_enabled(ctx)) {
3715*61046927SAndroid Build Coastguard Worker       vao = _mesa_lookup_vao(ctx, vaobj);
3716*61046927SAndroid Build Coastguard Worker       if (!vao)
3717*61046927SAndroid Build Coastguard Worker          return;
3718*61046927SAndroid Build Coastguard Worker    } else {
3719*61046927SAndroid Build Coastguard Worker       vao = _mesa_lookup_vao_err(ctx, vaobj, isExtDsa, func);
3720*61046927SAndroid Build Coastguard Worker       if (!vao)
3721*61046927SAndroid Build Coastguard Worker          return;
3722*61046927SAndroid Build Coastguard Worker 
3723*61046927SAndroid Build Coastguard Worker       /* The ARB_vertex_attrib_binding spec says:
3724*61046927SAndroid Build Coastguard Worker        *
3725*61046927SAndroid Build Coastguard Worker        *   "The error INVALID_VALUE is generated if index is greater than or
3726*61046927SAndroid Build Coastguard Worker        *   equal to the value of MAX_VERTEX_ATTRIBS."
3727*61046927SAndroid Build Coastguard Worker        */
3728*61046927SAndroid Build Coastguard Worker       if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
3729*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_VALUE,
3730*61046927SAndroid Build Coastguard Worker                      "%s(attribindex=%u > GL_MAX_VERTEX_ATTRIBS)",
3731*61046927SAndroid Build Coastguard Worker                      func, attribIndex);
3732*61046927SAndroid Build Coastguard Worker          return;
3733*61046927SAndroid Build Coastguard Worker       }
3734*61046927SAndroid Build Coastguard Worker 
3735*61046927SAndroid Build Coastguard Worker       if (!validate_array_format(ctx, func, vao,
3736*61046927SAndroid Build Coastguard Worker                                  VERT_ATTRIB_GENERIC(attribIndex),
3737*61046927SAndroid Build Coastguard Worker                                  legalTypes, 1, sizeMax, size, type,
3738*61046927SAndroid Build Coastguard Worker                                  normalized, integer, doubles, relativeOffset,
3739*61046927SAndroid Build Coastguard Worker                                  format)) {
3740*61046927SAndroid Build Coastguard Worker          return;
3741*61046927SAndroid Build Coastguard Worker       }
3742*61046927SAndroid Build Coastguard Worker    }
3743*61046927SAndroid Build Coastguard Worker 
3744*61046927SAndroid Build Coastguard Worker    _mesa_update_array_format(ctx, vao, VERT_ATTRIB_GENERIC(attribIndex), size,
3745*61046927SAndroid Build Coastguard Worker                              type, format, normalized, integer, doubles,
3746*61046927SAndroid Build Coastguard Worker                              relativeOffset);
3747*61046927SAndroid Build Coastguard Worker }
3748*61046927SAndroid Build Coastguard Worker 
3749*61046927SAndroid Build Coastguard Worker 
3750*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayAttribFormat(GLuint vaobj,GLuint attribIndex,GLint size,GLenum type,GLboolean normalized,GLuint relativeOffset)3751*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayAttribFormat(GLuint vaobj, GLuint attribIndex, GLint size,
3752*61046927SAndroid Build Coastguard Worker                               GLenum type, GLboolean normalized,
3753*61046927SAndroid Build Coastguard Worker                               GLuint relativeOffset)
3754*61046927SAndroid Build Coastguard Worker {
3755*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_format(vaobj, false, attribIndex, size, type, normalized,
3756*61046927SAndroid Build Coastguard Worker                               GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK,
3757*61046927SAndroid Build Coastguard Worker                               BGRA_OR_4, relativeOffset,
3758*61046927SAndroid Build Coastguard Worker                               "glVertexArrayAttribFormat");
3759*61046927SAndroid Build Coastguard Worker }
3760*61046927SAndroid Build Coastguard Worker 
3761*61046927SAndroid Build Coastguard Worker 
3762*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribFormatEXT(GLuint vaobj,GLuint attribIndex,GLint size,GLenum type,GLboolean normalized,GLuint relativeOffset)3763*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribFormatEXT(GLuint vaobj, GLuint attribIndex, GLint size,
3764*61046927SAndroid Build Coastguard Worker                                        GLenum type, GLboolean normalized,
3765*61046927SAndroid Build Coastguard Worker                                        GLuint relativeOffset)
3766*61046927SAndroid Build Coastguard Worker {
3767*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_format(vaobj, true, attribIndex, size, type, normalized,
3768*61046927SAndroid Build Coastguard Worker                               GL_FALSE, GL_FALSE, ATTRIB_FORMAT_TYPES_MASK,
3769*61046927SAndroid Build Coastguard Worker                               BGRA_OR_4, relativeOffset,
3770*61046927SAndroid Build Coastguard Worker                               "glVertexArrayVertexAttribFormatEXT");
3771*61046927SAndroid Build Coastguard Worker }
3772*61046927SAndroid Build Coastguard Worker 
3773*61046927SAndroid Build Coastguard Worker 
3774*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayAttribIFormat(GLuint vaobj,GLuint attribIndex,GLint size,GLenum type,GLuint relativeOffset)3775*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayAttribIFormat(GLuint vaobj, GLuint attribIndex,
3776*61046927SAndroid Build Coastguard Worker                                GLint size, GLenum type,
3777*61046927SAndroid Build Coastguard Worker                                GLuint relativeOffset)
3778*61046927SAndroid Build Coastguard Worker {
3779*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_format(vaobj, false, attribIndex, size, type, GL_FALSE,
3780*61046927SAndroid Build Coastguard Worker                               GL_TRUE, GL_FALSE, ATTRIB_IFORMAT_TYPES_MASK,
3781*61046927SAndroid Build Coastguard Worker                               4, relativeOffset,
3782*61046927SAndroid Build Coastguard Worker                               "glVertexArrayAttribIFormat");
3783*61046927SAndroid Build Coastguard Worker }
3784*61046927SAndroid Build Coastguard Worker 
3785*61046927SAndroid Build Coastguard Worker 
3786*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribIFormatEXT(GLuint vaobj,GLuint attribIndex,GLint size,GLenum type,GLuint relativeOffset)3787*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribIFormatEXT(GLuint vaobj, GLuint attribIndex,
3788*61046927SAndroid Build Coastguard Worker                                         GLint size, GLenum type,
3789*61046927SAndroid Build Coastguard Worker                                         GLuint relativeOffset)
3790*61046927SAndroid Build Coastguard Worker {
3791*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_format(vaobj, true, attribIndex, size, type, GL_FALSE,
3792*61046927SAndroid Build Coastguard Worker                               GL_TRUE, GL_FALSE, ATTRIB_IFORMAT_TYPES_MASK,
3793*61046927SAndroid Build Coastguard Worker                               4, relativeOffset,
3794*61046927SAndroid Build Coastguard Worker                               "glVertexArrayVertexAttribIFormatEXT");
3795*61046927SAndroid Build Coastguard Worker }
3796*61046927SAndroid Build Coastguard Worker 
3797*61046927SAndroid Build Coastguard Worker 
3798*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayAttribLFormat(GLuint vaobj,GLuint attribIndex,GLint size,GLenum type,GLuint relativeOffset)3799*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayAttribLFormat(GLuint vaobj, GLuint attribIndex,
3800*61046927SAndroid Build Coastguard Worker                                GLint size, GLenum type,
3801*61046927SAndroid Build Coastguard Worker                                GLuint relativeOffset)
3802*61046927SAndroid Build Coastguard Worker {
3803*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_format(vaobj, false, attribIndex, size, type, GL_FALSE,
3804*61046927SAndroid Build Coastguard Worker                               GL_FALSE, GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK,
3805*61046927SAndroid Build Coastguard Worker                               4, relativeOffset,
3806*61046927SAndroid Build Coastguard Worker                               "glVertexArrayAttribLFormat");
3807*61046927SAndroid Build Coastguard Worker }
3808*61046927SAndroid Build Coastguard Worker 
3809*61046927SAndroid Build Coastguard Worker 
3810*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribLFormatEXT(GLuint vaobj,GLuint attribIndex,GLint size,GLenum type,GLuint relativeOffset)3811*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribLFormatEXT(GLuint vaobj, GLuint attribIndex,
3812*61046927SAndroid Build Coastguard Worker                                         GLint size, GLenum type,
3813*61046927SAndroid Build Coastguard Worker                                         GLuint relativeOffset)
3814*61046927SAndroid Build Coastguard Worker {
3815*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_format(vaobj, true, attribIndex, size, type, GL_FALSE,
3816*61046927SAndroid Build Coastguard Worker                               GL_FALSE, GL_TRUE, ATTRIB_LFORMAT_TYPES_MASK,
3817*61046927SAndroid Build Coastguard Worker                               4, relativeOffset,
3818*61046927SAndroid Build Coastguard Worker                               "glVertexArrayVertexAttribLFormatEXT");
3819*61046927SAndroid Build Coastguard Worker }
3820*61046927SAndroid Build Coastguard Worker 
3821*61046927SAndroid Build Coastguard Worker 
3822*61046927SAndroid Build Coastguard Worker static void
vertex_array_attrib_binding(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint attribIndex,GLuint bindingIndex,const char * func)3823*61046927SAndroid Build Coastguard Worker vertex_array_attrib_binding(struct gl_context *ctx,
3824*61046927SAndroid Build Coastguard Worker                             struct gl_vertex_array_object *vao,
3825*61046927SAndroid Build Coastguard Worker                             GLuint attribIndex, GLuint bindingIndex,
3826*61046927SAndroid Build Coastguard Worker                             const char *func)
3827*61046927SAndroid Build Coastguard Worker {
3828*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
3829*61046927SAndroid Build Coastguard Worker 
3830*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3831*61046927SAndroid Build Coastguard Worker     *
3832*61046927SAndroid Build Coastguard Worker     *    "<attribindex> must be less than the value of MAX_VERTEX_ATTRIBS and
3833*61046927SAndroid Build Coastguard Worker     *     <bindingindex> must be less than the value of
3834*61046927SAndroid Build Coastguard Worker     *     MAX_VERTEX_ATTRIB_BINDINGS, otherwise the error INVALID_VALUE
3835*61046927SAndroid Build Coastguard Worker     *     is generated."
3836*61046927SAndroid Build Coastguard Worker     */
3837*61046927SAndroid Build Coastguard Worker    if (attribIndex >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
3838*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3839*61046927SAndroid Build Coastguard Worker                   "%s(attribindex=%u >= "
3840*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIBS)",
3841*61046927SAndroid Build Coastguard Worker                   func, attribIndex);
3842*61046927SAndroid Build Coastguard Worker       return;
3843*61046927SAndroid Build Coastguard Worker    }
3844*61046927SAndroid Build Coastguard Worker 
3845*61046927SAndroid Build Coastguard Worker    if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) {
3846*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3847*61046927SAndroid Build Coastguard Worker                   "%s(bindingindex=%u >= "
3848*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_BINDINGS)",
3849*61046927SAndroid Build Coastguard Worker                   func, bindingIndex);
3850*61046927SAndroid Build Coastguard Worker       return;
3851*61046927SAndroid Build Coastguard Worker    }
3852*61046927SAndroid Build Coastguard Worker 
3853*61046927SAndroid Build Coastguard Worker    assert(VERT_ATTRIB_GENERIC(attribIndex) < ARRAY_SIZE(vao->VertexAttrib));
3854*61046927SAndroid Build Coastguard Worker 
3855*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, vao,
3856*61046927SAndroid Build Coastguard Worker                                VERT_ATTRIB_GENERIC(attribIndex),
3857*61046927SAndroid Build Coastguard Worker                                VERT_ATTRIB_GENERIC(bindingIndex));
3858*61046927SAndroid Build Coastguard Worker }
3859*61046927SAndroid Build Coastguard Worker 
3860*61046927SAndroid Build Coastguard Worker 
3861*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribBinding_no_error(GLuint attribIndex,GLuint bindingIndex)3862*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribBinding_no_error(GLuint attribIndex, GLuint bindingIndex)
3863*61046927SAndroid Build Coastguard Worker {
3864*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3865*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, ctx->Array.VAO,
3866*61046927SAndroid Build Coastguard Worker                                VERT_ATTRIB_GENERIC(attribIndex),
3867*61046927SAndroid Build Coastguard Worker                                VERT_ATTRIB_GENERIC(bindingIndex));
3868*61046927SAndroid Build Coastguard Worker }
3869*61046927SAndroid Build Coastguard Worker 
3870*61046927SAndroid Build Coastguard Worker 
3871*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexAttribBinding(GLuint attribIndex,GLuint bindingIndex)3872*61046927SAndroid Build Coastguard Worker _mesa_VertexAttribBinding(GLuint attribIndex, GLuint bindingIndex)
3873*61046927SAndroid Build Coastguard Worker {
3874*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3875*61046927SAndroid Build Coastguard Worker 
3876*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3877*61046927SAndroid Build Coastguard Worker     *
3878*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if no vertex array object
3879*61046927SAndroid Build Coastguard Worker     *     is bound."
3880*61046927SAndroid Build Coastguard Worker     */
3881*61046927SAndroid Build Coastguard Worker    if ((_mesa_is_desktop_gl_core(ctx) || _mesa_is_gles31(ctx)) &&
3882*61046927SAndroid Build Coastguard Worker        ctx->Array.VAO == ctx->Array.DefaultVAO) {
3883*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
3884*61046927SAndroid Build Coastguard Worker                   "glVertexAttribBinding(No array object bound)");
3885*61046927SAndroid Build Coastguard Worker       return;
3886*61046927SAndroid Build Coastguard Worker    }
3887*61046927SAndroid Build Coastguard Worker 
3888*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_binding(ctx, ctx->Array.VAO,
3889*61046927SAndroid Build Coastguard Worker                                attribIndex, bindingIndex,
3890*61046927SAndroid Build Coastguard Worker                                "glVertexAttribBinding");
3891*61046927SAndroid Build Coastguard Worker }
3892*61046927SAndroid Build Coastguard Worker 
3893*61046927SAndroid Build Coastguard Worker 
3894*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayAttribBinding_no_error(GLuint vaobj,GLuint attribIndex,GLuint bindingIndex)3895*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayAttribBinding_no_error(GLuint vaobj, GLuint attribIndex,
3896*61046927SAndroid Build Coastguard Worker                                         GLuint bindingIndex)
3897*61046927SAndroid Build Coastguard Worker {
3898*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3899*61046927SAndroid Build Coastguard Worker 
3900*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
3901*61046927SAndroid Build Coastguard Worker    _mesa_vertex_attrib_binding(ctx, vao,
3902*61046927SAndroid Build Coastguard Worker                                VERT_ATTRIB_GENERIC(attribIndex),
3903*61046927SAndroid Build Coastguard Worker                                VERT_ATTRIB_GENERIC(bindingIndex));
3904*61046927SAndroid Build Coastguard Worker }
3905*61046927SAndroid Build Coastguard Worker 
3906*61046927SAndroid Build Coastguard Worker 
3907*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayAttribBinding(GLuint vaobj,GLuint attribIndex,GLuint bindingIndex)3908*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayAttribBinding(GLuint vaobj, GLuint attribIndex, GLuint bindingIndex)
3909*61046927SAndroid Build Coastguard Worker {
3910*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3911*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
3912*61046927SAndroid Build Coastguard Worker 
3913*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
3914*61046927SAndroid Build Coastguard Worker     *
3915*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by VertexArrayAttribBinding
3916*61046927SAndroid Build Coastguard Worker     *    if <vaobj> is not [compatibility profile: zero or] the name of an
3917*61046927SAndroid Build Coastguard Worker     *    existing vertex array object."
3918*61046927SAndroid Build Coastguard Worker     */
3919*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glVertexArrayAttribBinding");
3920*61046927SAndroid Build Coastguard Worker    if (!vao)
3921*61046927SAndroid Build Coastguard Worker       return;
3922*61046927SAndroid Build Coastguard Worker 
3923*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_binding(ctx, vao, attribIndex, bindingIndex,
3924*61046927SAndroid Build Coastguard Worker                                "glVertexArrayAttribBinding");
3925*61046927SAndroid Build Coastguard Worker }
3926*61046927SAndroid Build Coastguard Worker 
3927*61046927SAndroid Build Coastguard Worker 
3928*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexAttribBindingEXT(GLuint vaobj,GLuint attribIndex,GLuint bindingIndex)3929*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexAttribBindingEXT(GLuint vaobj, GLuint attribIndex, GLuint bindingIndex)
3930*61046927SAndroid Build Coastguard Worker {
3931*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3932*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
3933*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true, "glVertexArrayVertexAttribBindingEXT");
3934*61046927SAndroid Build Coastguard Worker    if (!vao)
3935*61046927SAndroid Build Coastguard Worker       return;
3936*61046927SAndroid Build Coastguard Worker 
3937*61046927SAndroid Build Coastguard Worker    vertex_array_attrib_binding(ctx, vao, attribIndex, bindingIndex,
3938*61046927SAndroid Build Coastguard Worker                                "glVertexArrayVertexAttribBindingEXT");
3939*61046927SAndroid Build Coastguard Worker }
3940*61046927SAndroid Build Coastguard Worker 
3941*61046927SAndroid Build Coastguard Worker 
3942*61046927SAndroid Build Coastguard Worker static void
vertex_array_binding_divisor(struct gl_context * ctx,struct gl_vertex_array_object * vao,GLuint bindingIndex,GLuint divisor,const char * func)3943*61046927SAndroid Build Coastguard Worker vertex_array_binding_divisor(struct gl_context *ctx,
3944*61046927SAndroid Build Coastguard Worker                              struct gl_vertex_array_object *vao,
3945*61046927SAndroid Build Coastguard Worker                              GLuint bindingIndex, GLuint divisor,
3946*61046927SAndroid Build Coastguard Worker                              const char *func)
3947*61046927SAndroid Build Coastguard Worker {
3948*61046927SAndroid Build Coastguard Worker    ASSERT_OUTSIDE_BEGIN_END(ctx);
3949*61046927SAndroid Build Coastguard Worker 
3950*61046927SAndroid Build Coastguard Worker    if (!ctx->Extensions.ARB_instanced_arrays) {
3951*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION, "%s()", func);
3952*61046927SAndroid Build Coastguard Worker       return;
3953*61046927SAndroid Build Coastguard Worker    }
3954*61046927SAndroid Build Coastguard Worker 
3955*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3956*61046927SAndroid Build Coastguard Worker     *
3957*61046927SAndroid Build Coastguard Worker     *    "An INVALID_VALUE error is generated if <bindingindex> is greater
3958*61046927SAndroid Build Coastguard Worker     *     than or equal to the value of MAX_VERTEX_ATTRIB_BINDINGS."
3959*61046927SAndroid Build Coastguard Worker     */
3960*61046927SAndroid Build Coastguard Worker    if (bindingIndex >= ctx->Const.MaxVertexAttribBindings) {
3961*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE,
3962*61046927SAndroid Build Coastguard Worker                   "%s(bindingindex=%u > "
3963*61046927SAndroid Build Coastguard Worker                   "GL_MAX_VERTEX_ATTRIB_BINDINGS)",
3964*61046927SAndroid Build Coastguard Worker                   func, bindingIndex);
3965*61046927SAndroid Build Coastguard Worker       return;
3966*61046927SAndroid Build Coastguard Worker    }
3967*61046927SAndroid Build Coastguard Worker 
3968*61046927SAndroid Build Coastguard Worker    vertex_binding_divisor(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex), divisor);
3969*61046927SAndroid Build Coastguard Worker }
3970*61046927SAndroid Build Coastguard Worker 
3971*61046927SAndroid Build Coastguard Worker 
3972*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexBindingDivisor_no_error(GLuint bindingIndex,GLuint divisor)3973*61046927SAndroid Build Coastguard Worker _mesa_VertexBindingDivisor_no_error(GLuint bindingIndex, GLuint divisor)
3974*61046927SAndroid Build Coastguard Worker {
3975*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3976*61046927SAndroid Build Coastguard Worker    vertex_binding_divisor(ctx, ctx->Array.VAO,
3977*61046927SAndroid Build Coastguard Worker                           VERT_ATTRIB_GENERIC(bindingIndex), divisor);
3978*61046927SAndroid Build Coastguard Worker }
3979*61046927SAndroid Build Coastguard Worker 
3980*61046927SAndroid Build Coastguard Worker 
3981*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexBindingDivisor(GLuint bindingIndex,GLuint divisor)3982*61046927SAndroid Build Coastguard Worker _mesa_VertexBindingDivisor(GLuint bindingIndex, GLuint divisor)
3983*61046927SAndroid Build Coastguard Worker {
3984*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
3985*61046927SAndroid Build Coastguard Worker 
3986*61046927SAndroid Build Coastguard Worker    /* The ARB_vertex_attrib_binding spec says:
3987*61046927SAndroid Build Coastguard Worker     *
3988*61046927SAndroid Build Coastguard Worker     *    "An INVALID_OPERATION error is generated if no vertex array object
3989*61046927SAndroid Build Coastguard Worker     *     is bound."
3990*61046927SAndroid Build Coastguard Worker     */
3991*61046927SAndroid Build Coastguard Worker    if ((_mesa_is_desktop_gl_core(ctx) || _mesa_is_gles31(ctx)) &&
3992*61046927SAndroid Build Coastguard Worker        ctx->Array.VAO == ctx->Array.DefaultVAO) {
3993*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_OPERATION,
3994*61046927SAndroid Build Coastguard Worker                   "glVertexBindingDivisor(No array object bound)");
3995*61046927SAndroid Build Coastguard Worker       return;
3996*61046927SAndroid Build Coastguard Worker    }
3997*61046927SAndroid Build Coastguard Worker 
3998*61046927SAndroid Build Coastguard Worker    vertex_array_binding_divisor(ctx, ctx->Array.VAO,
3999*61046927SAndroid Build Coastguard Worker                                 bindingIndex, divisor,
4000*61046927SAndroid Build Coastguard Worker                                 "glVertexBindingDivisor");
4001*61046927SAndroid Build Coastguard Worker }
4002*61046927SAndroid Build Coastguard Worker 
4003*61046927SAndroid Build Coastguard Worker 
4004*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayBindingDivisor_no_error(GLuint vaobj,GLuint bindingIndex,GLuint divisor)4005*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayBindingDivisor_no_error(GLuint vaobj, GLuint bindingIndex,
4006*61046927SAndroid Build Coastguard Worker                                          GLuint divisor)
4007*61046927SAndroid Build Coastguard Worker {
4008*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4009*61046927SAndroid Build Coastguard Worker 
4010*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = _mesa_lookup_vao(ctx, vaobj);
4011*61046927SAndroid Build Coastguard Worker    vertex_binding_divisor(ctx, vao, VERT_ATTRIB_GENERIC(bindingIndex), divisor);
4012*61046927SAndroid Build Coastguard Worker }
4013*61046927SAndroid Build Coastguard Worker 
4014*61046927SAndroid Build Coastguard Worker 
4015*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayBindingDivisor(GLuint vaobj,GLuint bindingIndex,GLuint divisor)4016*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayBindingDivisor(GLuint vaobj, GLuint bindingIndex,
4017*61046927SAndroid Build Coastguard Worker                                 GLuint divisor)
4018*61046927SAndroid Build Coastguard Worker {
4019*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
4020*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4021*61046927SAndroid Build Coastguard Worker 
4022*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
4023*61046927SAndroid Build Coastguard Worker     *
4024*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by VertexArrayBindingDivisor
4025*61046927SAndroid Build Coastguard Worker     *    if <vaobj> is not [compatibility profile: zero or] the name of an
4026*61046927SAndroid Build Coastguard Worker     *    existing vertex array object."
4027*61046927SAndroid Build Coastguard Worker     */
4028*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, false, "glVertexArrayBindingDivisor");
4029*61046927SAndroid Build Coastguard Worker    if (!vao)
4030*61046927SAndroid Build Coastguard Worker        return;
4031*61046927SAndroid Build Coastguard Worker 
4032*61046927SAndroid Build Coastguard Worker    vertex_array_binding_divisor(ctx, vao, bindingIndex, divisor,
4033*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayBindingDivisor");
4034*61046927SAndroid Build Coastguard Worker }
4035*61046927SAndroid Build Coastguard Worker 
4036*61046927SAndroid Build Coastguard Worker 
4037*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_VertexArrayVertexBindingDivisorEXT(GLuint vaobj,GLuint bindingIndex,GLuint divisor)4038*61046927SAndroid Build Coastguard Worker _mesa_VertexArrayVertexBindingDivisorEXT(GLuint vaobj, GLuint bindingIndex,
4039*61046927SAndroid Build Coastguard Worker                                          GLuint divisor)
4040*61046927SAndroid Build Coastguard Worker {
4041*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao;
4042*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4043*61046927SAndroid Build Coastguard Worker 
4044*61046927SAndroid Build Coastguard Worker    /* The ARB_direct_state_access specification says:
4045*61046927SAndroid Build Coastguard Worker     *
4046*61046927SAndroid Build Coastguard Worker     *   "An INVALID_OPERATION error is generated by VertexArrayBindingDivisor
4047*61046927SAndroid Build Coastguard Worker     *    if <vaobj> is not [compatibility profile: zero or] the name of an
4048*61046927SAndroid Build Coastguard Worker     *    existing vertex array object."
4049*61046927SAndroid Build Coastguard Worker     */
4050*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true, "glVertexArrayVertexBindingDivisorEXT");
4051*61046927SAndroid Build Coastguard Worker    if (!vao)
4052*61046927SAndroid Build Coastguard Worker        return;
4053*61046927SAndroid Build Coastguard Worker 
4054*61046927SAndroid Build Coastguard Worker    vertex_array_binding_divisor(ctx, vao, bindingIndex, divisor,
4055*61046927SAndroid Build Coastguard Worker                                 "glVertexArrayVertexBindingDivisorEXT");
4056*61046927SAndroid Build Coastguard Worker }
4057*61046927SAndroid Build Coastguard Worker 
4058*61046927SAndroid Build Coastguard Worker /**
4059*61046927SAndroid Build Coastguard Worker  * Print current vertex object/array info.  For debug.
4060*61046927SAndroid Build Coastguard Worker  */
4061*61046927SAndroid Build Coastguard Worker void
_mesa_print_arrays(struct gl_context * ctx)4062*61046927SAndroid Build Coastguard Worker _mesa_print_arrays(struct gl_context *ctx)
4063*61046927SAndroid Build Coastguard Worker {
4064*61046927SAndroid Build Coastguard Worker    const struct gl_vertex_array_object *vao = ctx->Array.VAO;
4065*61046927SAndroid Build Coastguard Worker 
4066*61046927SAndroid Build Coastguard Worker    fprintf(stderr, "Array Object %u\n", vao->Name);
4067*61046927SAndroid Build Coastguard Worker 
4068*61046927SAndroid Build Coastguard Worker    GLbitfield mask = vao->Enabled;
4069*61046927SAndroid Build Coastguard Worker    while (mask) {
4070*61046927SAndroid Build Coastguard Worker       const gl_vert_attrib i = u_bit_scan(&mask);
4071*61046927SAndroid Build Coastguard Worker       const struct gl_array_attributes *array = &vao->VertexAttrib[i];
4072*61046927SAndroid Build Coastguard Worker 
4073*61046927SAndroid Build Coastguard Worker       const struct gl_vertex_buffer_binding *binding =
4074*61046927SAndroid Build Coastguard Worker          &vao->BufferBinding[array->BufferBindingIndex];
4075*61046927SAndroid Build Coastguard Worker       const struct gl_buffer_object *bo = binding->BufferObj;
4076*61046927SAndroid Build Coastguard Worker 
4077*61046927SAndroid Build Coastguard Worker       fprintf(stderr, "  %s: Ptr=%p, Type=%s, Size=%d, ElemSize=%u, "
4078*61046927SAndroid Build Coastguard Worker               "Stride=%d, Buffer=%u(Size %lu)\n",
4079*61046927SAndroid Build Coastguard Worker               gl_vert_attrib_name((gl_vert_attrib)i),
4080*61046927SAndroid Build Coastguard Worker               array->Ptr, _mesa_enum_to_string(array->Format.User.Type),
4081*61046927SAndroid Build Coastguard Worker               array->Format.User.Size,
4082*61046927SAndroid Build Coastguard Worker               array->Format._ElementSize, binding->Stride, bo ? bo->Name : 0,
4083*61046927SAndroid Build Coastguard Worker               (unsigned long)(bo ? bo->Size : 0));
4084*61046927SAndroid Build Coastguard Worker    }
4085*61046927SAndroid Build Coastguard Worker }
4086*61046927SAndroid Build Coastguard Worker 
4087*61046927SAndroid Build Coastguard Worker /**
4088*61046927SAndroid Build Coastguard Worker  * Initialize attributes of a vertex array within a vertex array object.
4089*61046927SAndroid Build Coastguard Worker  * \param vao  the container vertex array object
4090*61046927SAndroid Build Coastguard Worker  * \param index  which array in the VAO to initialize
4091*61046927SAndroid Build Coastguard Worker  * \param size  number of components (1, 2, 3 or 4) per attribute
4092*61046927SAndroid Build Coastguard Worker  * \param type  datatype of the attribute (GL_FLOAT, GL_INT, etc).
4093*61046927SAndroid Build Coastguard Worker  */
4094*61046927SAndroid Build Coastguard Worker static void
init_array(struct gl_context * ctx,struct gl_vertex_array_object * vao,gl_vert_attrib index,GLint size,GLint type)4095*61046927SAndroid Build Coastguard Worker init_array(struct gl_context *ctx,
4096*61046927SAndroid Build Coastguard Worker            struct gl_vertex_array_object *vao,
4097*61046927SAndroid Build Coastguard Worker            gl_vert_attrib index, GLint size, GLint type)
4098*61046927SAndroid Build Coastguard Worker {
4099*61046927SAndroid Build Coastguard Worker    assert(index < ARRAY_SIZE(vao->VertexAttrib));
4100*61046927SAndroid Build Coastguard Worker    struct gl_array_attributes *array = &vao->VertexAttrib[index];
4101*61046927SAndroid Build Coastguard Worker    assert(index < ARRAY_SIZE(vao->BufferBinding));
4102*61046927SAndroid Build Coastguard Worker    struct gl_vertex_buffer_binding *binding = &vao->BufferBinding[index];
4103*61046927SAndroid Build Coastguard Worker 
4104*61046927SAndroid Build Coastguard Worker    vao->NonIdentityBufferAttribMapping &= ~BITFIELD_BIT(index);
4105*61046927SAndroid Build Coastguard Worker 
4106*61046927SAndroid Build Coastguard Worker    _mesa_set_vertex_format(&array->Format, size, type, GL_RGBA,
4107*61046927SAndroid Build Coastguard Worker                            GL_FALSE, GL_FALSE, GL_FALSE);
4108*61046927SAndroid Build Coastguard Worker    array->Stride = 0;
4109*61046927SAndroid Build Coastguard Worker    array->Ptr = NULL;
4110*61046927SAndroid Build Coastguard Worker    array->RelativeOffset = 0;
4111*61046927SAndroid Build Coastguard Worker    ASSERT_BITFIELD_SIZE(struct gl_array_attributes, BufferBindingIndex,
4112*61046927SAndroid Build Coastguard Worker                         VERT_ATTRIB_MAX - 1);
4113*61046927SAndroid Build Coastguard Worker    array->BufferBindingIndex = index;
4114*61046927SAndroid Build Coastguard Worker 
4115*61046927SAndroid Build Coastguard Worker    binding->Offset = 0;
4116*61046927SAndroid Build Coastguard Worker    binding->Stride = array->Format._ElementSize;
4117*61046927SAndroid Build Coastguard Worker    binding->BufferObj = NULL;
4118*61046927SAndroid Build Coastguard Worker    binding->_BoundArrays = BITFIELD_BIT(index);
4119*61046927SAndroid Build Coastguard Worker }
4120*61046927SAndroid Build Coastguard Worker 
4121*61046927SAndroid Build Coastguard Worker static void
init_default_vao_state(struct gl_context * ctx)4122*61046927SAndroid Build Coastguard Worker init_default_vao_state(struct gl_context *ctx)
4123*61046927SAndroid Build Coastguard Worker {
4124*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = &ctx->Array.DefaultVAOState;
4125*61046927SAndroid Build Coastguard Worker 
4126*61046927SAndroid Build Coastguard Worker    vao->RefCount = 1;
4127*61046927SAndroid Build Coastguard Worker    vao->SharedAndImmutable = false;
4128*61046927SAndroid Build Coastguard Worker 
4129*61046927SAndroid Build Coastguard Worker    /* Init the individual arrays */
4130*61046927SAndroid Build Coastguard Worker    for (unsigned i = 0; i < ARRAY_SIZE(vao->VertexAttrib); i++) {
4131*61046927SAndroid Build Coastguard Worker       switch (i) {
4132*61046927SAndroid Build Coastguard Worker       case VERT_ATTRIB_NORMAL:
4133*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, VERT_ATTRIB_NORMAL, 3, GL_FLOAT);
4134*61046927SAndroid Build Coastguard Worker          break;
4135*61046927SAndroid Build Coastguard Worker       case VERT_ATTRIB_COLOR1:
4136*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, VERT_ATTRIB_COLOR1, 3, GL_FLOAT);
4137*61046927SAndroid Build Coastguard Worker          break;
4138*61046927SAndroid Build Coastguard Worker       case VERT_ATTRIB_FOG:
4139*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, VERT_ATTRIB_FOG, 1, GL_FLOAT);
4140*61046927SAndroid Build Coastguard Worker          break;
4141*61046927SAndroid Build Coastguard Worker       case VERT_ATTRIB_COLOR_INDEX:
4142*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, VERT_ATTRIB_COLOR_INDEX, 1, GL_FLOAT);
4143*61046927SAndroid Build Coastguard Worker          break;
4144*61046927SAndroid Build Coastguard Worker       case VERT_ATTRIB_EDGEFLAG:
4145*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, VERT_ATTRIB_EDGEFLAG, 1, GL_UNSIGNED_BYTE);
4146*61046927SAndroid Build Coastguard Worker          break;
4147*61046927SAndroid Build Coastguard Worker       case VERT_ATTRIB_POINT_SIZE:
4148*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, VERT_ATTRIB_POINT_SIZE, 1, GL_FLOAT);
4149*61046927SAndroid Build Coastguard Worker          break;
4150*61046927SAndroid Build Coastguard Worker       default:
4151*61046927SAndroid Build Coastguard Worker          init_array(ctx, vao, i, 4, GL_FLOAT);
4152*61046927SAndroid Build Coastguard Worker          break;
4153*61046927SAndroid Build Coastguard Worker       }
4154*61046927SAndroid Build Coastguard Worker    }
4155*61046927SAndroid Build Coastguard Worker 
4156*61046927SAndroid Build Coastguard Worker    vao->_AttributeMapMode = ATTRIBUTE_MAP_MODE_IDENTITY;
4157*61046927SAndroid Build Coastguard Worker }
4158*61046927SAndroid Build Coastguard Worker 
4159*61046927SAndroid Build Coastguard Worker /**
4160*61046927SAndroid Build Coastguard Worker  * Initialize vertex array state for given context.
4161*61046927SAndroid Build Coastguard Worker  */
4162*61046927SAndroid Build Coastguard Worker void
_mesa_init_varray(struct gl_context * ctx)4163*61046927SAndroid Build Coastguard Worker _mesa_init_varray(struct gl_context *ctx)
4164*61046927SAndroid Build Coastguard Worker {
4165*61046927SAndroid Build Coastguard Worker    init_default_vao_state(ctx);
4166*61046927SAndroid Build Coastguard Worker 
4167*61046927SAndroid Build Coastguard Worker    ctx->Array.DefaultVAO = _mesa_new_vao(ctx, 0);
4168*61046927SAndroid Build Coastguard Worker    _mesa_reference_vao(ctx, &ctx->Array.VAO, ctx->Array.DefaultVAO);
4169*61046927SAndroid Build Coastguard Worker    _mesa_set_draw_vao(ctx, ctx->Array.VAO);
4170*61046927SAndroid Build Coastguard Worker    ctx->Array.ActiveTexture = 0;   /* GL_ARB_multitexture */
4171*61046927SAndroid Build Coastguard Worker 
4172*61046927SAndroid Build Coastguard Worker    _mesa_InitHashTable(&ctx->Array.Objects);
4173*61046927SAndroid Build Coastguard Worker }
4174*61046927SAndroid Build Coastguard Worker 
4175*61046927SAndroid Build Coastguard Worker 
4176*61046927SAndroid Build Coastguard Worker /**
4177*61046927SAndroid Build Coastguard Worker  * Callback for deleting an array object.  Called by _mesa_DeleteHashTable().
4178*61046927SAndroid Build Coastguard Worker  */
4179*61046927SAndroid Build Coastguard Worker static void
delete_arrayobj_cb(void * data,void * userData)4180*61046927SAndroid Build Coastguard Worker delete_arrayobj_cb(void *data, void *userData)
4181*61046927SAndroid Build Coastguard Worker {
4182*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object *vao = (struct gl_vertex_array_object *) data;
4183*61046927SAndroid Build Coastguard Worker    struct gl_context *ctx = (struct gl_context *) userData;
4184*61046927SAndroid Build Coastguard Worker    _mesa_delete_vao(ctx, vao);
4185*61046927SAndroid Build Coastguard Worker }
4186*61046927SAndroid Build Coastguard Worker 
4187*61046927SAndroid Build Coastguard Worker 
4188*61046927SAndroid Build Coastguard Worker /**
4189*61046927SAndroid Build Coastguard Worker  * Free vertex array state for given context.
4190*61046927SAndroid Build Coastguard Worker  */
4191*61046927SAndroid Build Coastguard Worker void
_mesa_free_varray_data(struct gl_context * ctx)4192*61046927SAndroid Build Coastguard Worker _mesa_free_varray_data(struct gl_context *ctx)
4193*61046927SAndroid Build Coastguard Worker {
4194*61046927SAndroid Build Coastguard Worker    _mesa_DeinitHashTable(&ctx->Array.Objects, delete_arrayobj_cb, ctx);
4195*61046927SAndroid Build Coastguard Worker }
4196*61046927SAndroid Build Coastguard Worker 
4197*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexArrayIntegervEXT(GLuint vaobj,GLenum pname,GLint * param)4198*61046927SAndroid Build Coastguard Worker _mesa_GetVertexArrayIntegervEXT(GLuint vaobj, GLenum pname, GLint *param)
4199*61046927SAndroid Build Coastguard Worker {
4200*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4201*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
4202*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *buf;
4203*61046927SAndroid Build Coastguard Worker    void* ptr;
4204*61046927SAndroid Build Coastguard Worker 
4205*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true,
4206*61046927SAndroid Build Coastguard Worker                               "glGetVertexArrayIntegervEXT");
4207*61046927SAndroid Build Coastguard Worker    if (!vao)
4208*61046927SAndroid Build Coastguard Worker       return;
4209*61046927SAndroid Build Coastguard Worker 
4210*61046927SAndroid Build Coastguard Worker    /* The EXT_direct_state_access spec says:
4211*61046927SAndroid Build Coastguard Worker     *
4212*61046927SAndroid Build Coastguard Worker     *    "For GetVertexArrayIntegervEXT, pname must be one of the "Get value" tokens
4213*61046927SAndroid Build Coastguard Worker     *    in tables 6.6, 6.7, 6.8, and 6.9 that use GetIntegerv, IsEnabled, or
4214*61046927SAndroid Build Coastguard Worker     *    GetPointerv for their "Get command" (so excluding the VERTEX_ATTRIB_*
4215*61046927SAndroid Build Coastguard Worker     *    tokens)."
4216*61046927SAndroid Build Coastguard Worker     */
4217*61046927SAndroid Build Coastguard Worker    switch (pname) {
4218*61046927SAndroid Build Coastguard Worker       /* Tokens using GetIntegerv */
4219*61046927SAndroid Build Coastguard Worker       case GL_CLIENT_ACTIVE_TEXTURE:
4220*61046927SAndroid Build Coastguard Worker          *param = GL_TEXTURE0_ARB + ctx->Array.ActiveTexture;
4221*61046927SAndroid Build Coastguard Worker          break;
4222*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY_SIZE:
4223*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_POS].Format.User.Size;
4224*61046927SAndroid Build Coastguard Worker          break;
4225*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY_TYPE:
4226*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_POS].Format.User.Type;
4227*61046927SAndroid Build Coastguard Worker          break;
4228*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY_STRIDE:
4229*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_POS].Stride;
4230*61046927SAndroid Build Coastguard Worker          break;
4231*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY_BUFFER_BINDING:
4232*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_POS].BufferObj;
4233*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4234*61046927SAndroid Build Coastguard Worker          break;
4235*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY_SIZE:
4236*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR0].Format.User.Size;
4237*61046927SAndroid Build Coastguard Worker          break;
4238*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY_TYPE:
4239*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR0].Format.User.Type;
4240*61046927SAndroid Build Coastguard Worker          break;
4241*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY_STRIDE:
4242*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR0].Stride;
4243*61046927SAndroid Build Coastguard Worker          break;
4244*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY_BUFFER_BINDING:
4245*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_COLOR0].BufferObj;
4246*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4247*61046927SAndroid Build Coastguard Worker          break;
4248*61046927SAndroid Build Coastguard Worker       case GL_EDGE_FLAG_ARRAY_STRIDE:
4249*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Stride;
4250*61046927SAndroid Build Coastguard Worker          break;
4251*61046927SAndroid Build Coastguard Worker       case GL_EDGE_FLAG_ARRAY_BUFFER_BINDING:
4252*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_EDGEFLAG].BufferObj;
4253*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4254*61046927SAndroid Build Coastguard Worker          break;
4255*61046927SAndroid Build Coastguard Worker       case GL_INDEX_ARRAY_TYPE:
4256*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Format.User.Type;
4257*61046927SAndroid Build Coastguard Worker          break;
4258*61046927SAndroid Build Coastguard Worker       case GL_INDEX_ARRAY_STRIDE:
4259*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Stride;
4260*61046927SAndroid Build Coastguard Worker          break;
4261*61046927SAndroid Build Coastguard Worker       case GL_INDEX_ARRAY_BUFFER_BINDING:
4262*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_COLOR_INDEX].BufferObj;
4263*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4264*61046927SAndroid Build Coastguard Worker          break;
4265*61046927SAndroid Build Coastguard Worker       case GL_NORMAL_ARRAY_TYPE:
4266*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_NORMAL].Format.User.Type;
4267*61046927SAndroid Build Coastguard Worker          break;
4268*61046927SAndroid Build Coastguard Worker       case GL_NORMAL_ARRAY_STRIDE:
4269*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_NORMAL].Stride;
4270*61046927SAndroid Build Coastguard Worker          break;
4271*61046927SAndroid Build Coastguard Worker       case GL_NORMAL_ARRAY_BUFFER_BINDING:
4272*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_NORMAL].BufferObj;
4273*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4274*61046927SAndroid Build Coastguard Worker          break;
4275*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_SIZE:
4276*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Format.User.Size;
4277*61046927SAndroid Build Coastguard Worker          break;
4278*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_TYPE:
4279*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Format.User.Type;
4280*61046927SAndroid Build Coastguard Worker          break;
4281*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_STRIDE:
4282*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].Stride;
4283*61046927SAndroid Build Coastguard Worker          break;
4284*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
4285*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_TEX(ctx->Array.ActiveTexture)].BufferObj;
4286*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4287*61046927SAndroid Build Coastguard Worker          break;
4288*61046927SAndroid Build Coastguard Worker       case GL_FOG_COORD_ARRAY_TYPE:
4289*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_FOG].Format.User.Type;
4290*61046927SAndroid Build Coastguard Worker          break;
4291*61046927SAndroid Build Coastguard Worker       case GL_FOG_COORD_ARRAY_STRIDE:
4292*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_FOG].Stride;
4293*61046927SAndroid Build Coastguard Worker          break;
4294*61046927SAndroid Build Coastguard Worker       case GL_FOG_COORD_ARRAY_BUFFER_BINDING:
4295*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_FOG].BufferObj;
4296*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4297*61046927SAndroid Build Coastguard Worker          break;
4298*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY_SIZE:
4299*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR1].Format.User.Size;
4300*61046927SAndroid Build Coastguard Worker          break;
4301*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY_TYPE:
4302*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR1].Format.User.Type;
4303*61046927SAndroid Build Coastguard Worker          break;
4304*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY_STRIDE:
4305*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_COLOR1].Stride;
4306*61046927SAndroid Build Coastguard Worker          break;
4307*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING:
4308*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_COLOR1].BufferObj;
4309*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4310*61046927SAndroid Build Coastguard Worker          break;
4311*61046927SAndroid Build Coastguard Worker 
4312*61046927SAndroid Build Coastguard Worker       /* Tokens using IsEnabled */
4313*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY:
4314*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_POS);
4315*61046927SAndroid Build Coastguard Worker          break;
4316*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY:
4317*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_COLOR0);
4318*61046927SAndroid Build Coastguard Worker          break;
4319*61046927SAndroid Build Coastguard Worker       case GL_EDGE_FLAG_ARRAY:
4320*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_EDGEFLAG);
4321*61046927SAndroid Build Coastguard Worker          break;
4322*61046927SAndroid Build Coastguard Worker       case GL_INDEX_ARRAY:
4323*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_COLOR_INDEX);
4324*61046927SAndroid Build Coastguard Worker          break;
4325*61046927SAndroid Build Coastguard Worker       case GL_NORMAL_ARRAY:
4326*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_NORMAL);
4327*61046927SAndroid Build Coastguard Worker          break;
4328*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY:
4329*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_TEX(ctx->Array.ActiveTexture));
4330*61046927SAndroid Build Coastguard Worker          break;
4331*61046927SAndroid Build Coastguard Worker       case GL_FOG_COORD_ARRAY:
4332*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_FOG);
4333*61046927SAndroid Build Coastguard Worker          break;
4334*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY:
4335*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_COLOR1);
4336*61046927SAndroid Build Coastguard Worker          break;
4337*61046927SAndroid Build Coastguard Worker 
4338*61046927SAndroid Build Coastguard Worker       /* Tokens using GetPointerv */
4339*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY_POINTER:
4340*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY_POINTER:
4341*61046927SAndroid Build Coastguard Worker       case GL_EDGE_FLAG_ARRAY_POINTER:
4342*61046927SAndroid Build Coastguard Worker       case GL_INDEX_ARRAY_POINTER:
4343*61046927SAndroid Build Coastguard Worker       case GL_NORMAL_ARRAY_POINTER:
4344*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_POINTER:
4345*61046927SAndroid Build Coastguard Worker       case GL_FOG_COORD_ARRAY_POINTER:
4346*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY_POINTER:
4347*61046927SAndroid Build Coastguard Worker          _get_vao_pointerv(pname, vao, &ptr, "glGetVertexArrayIntegervEXT");
4348*61046927SAndroid Build Coastguard Worker          *param = (int) ((intptr_t) ptr & 0xFFFFFFFF);
4349*61046927SAndroid Build Coastguard Worker          break;
4350*61046927SAndroid Build Coastguard Worker 
4351*61046927SAndroid Build Coastguard Worker       default:
4352*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexArrayIntegervEXT(pname)");
4353*61046927SAndroid Build Coastguard Worker    }
4354*61046927SAndroid Build Coastguard Worker }
4355*61046927SAndroid Build Coastguard Worker 
4356*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexArrayPointervEXT(GLuint vaobj,GLenum pname,GLvoid ** param)4357*61046927SAndroid Build Coastguard Worker _mesa_GetVertexArrayPointervEXT(GLuint vaobj, GLenum pname, GLvoid** param)
4358*61046927SAndroid Build Coastguard Worker {
4359*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4360*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
4361*61046927SAndroid Build Coastguard Worker 
4362*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true,
4363*61046927SAndroid Build Coastguard Worker                               "glGetVertexArrayPointervEXT");
4364*61046927SAndroid Build Coastguard Worker    if (!vao)
4365*61046927SAndroid Build Coastguard Worker       return;
4366*61046927SAndroid Build Coastguard Worker 
4367*61046927SAndroid Build Coastguard Worker    /* The EXT_direct_state_access spec says:
4368*61046927SAndroid Build Coastguard Worker     *
4369*61046927SAndroid Build Coastguard Worker     *     "For GetVertexArrayPointervEXT, pname must be a *_ARRAY_POINTER token from
4370*61046927SAndroid Build Coastguard Worker     *     tables 6.6, 6.7, and 6.8 excluding VERTEX_ATTRIB_ARRAY_POINT."
4371*61046927SAndroid Build Coastguard Worker     */
4372*61046927SAndroid Build Coastguard Worker    switch (pname) {
4373*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ARRAY_POINTER:
4374*61046927SAndroid Build Coastguard Worker       case GL_COLOR_ARRAY_POINTER:
4375*61046927SAndroid Build Coastguard Worker       case GL_EDGE_FLAG_ARRAY_POINTER:
4376*61046927SAndroid Build Coastguard Worker       case GL_INDEX_ARRAY_POINTER:
4377*61046927SAndroid Build Coastguard Worker       case GL_NORMAL_ARRAY_POINTER:
4378*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_POINTER:
4379*61046927SAndroid Build Coastguard Worker       case GL_FOG_COORD_ARRAY_POINTER:
4380*61046927SAndroid Build Coastguard Worker       case GL_SECONDARY_COLOR_ARRAY_POINTER:
4381*61046927SAndroid Build Coastguard Worker          break;
4382*61046927SAndroid Build Coastguard Worker 
4383*61046927SAndroid Build Coastguard Worker       default:
4384*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexArrayPointervEXT(pname)");
4385*61046927SAndroid Build Coastguard Worker          return;
4386*61046927SAndroid Build Coastguard Worker    }
4387*61046927SAndroid Build Coastguard Worker 
4388*61046927SAndroid Build Coastguard Worker    /* pname has been validated, we can now use the helper function */
4389*61046927SAndroid Build Coastguard Worker    _get_vao_pointerv(pname, vao, param, "glGetVertexArrayPointervEXT");
4390*61046927SAndroid Build Coastguard Worker }
4391*61046927SAndroid Build Coastguard Worker 
4392*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexArrayIntegeri_vEXT(GLuint vaobj,GLuint index,GLenum pname,GLint * param)4393*61046927SAndroid Build Coastguard Worker _mesa_GetVertexArrayIntegeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLint *param)
4394*61046927SAndroid Build Coastguard Worker {
4395*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4396*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
4397*61046927SAndroid Build Coastguard Worker    struct gl_buffer_object *buf;
4398*61046927SAndroid Build Coastguard Worker 
4399*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true,
4400*61046927SAndroid Build Coastguard Worker                               "glGetVertexArrayIntegeri_vEXT");
4401*61046927SAndroid Build Coastguard Worker    if (!vao)
4402*61046927SAndroid Build Coastguard Worker       return;
4403*61046927SAndroid Build Coastguard Worker 
4404*61046927SAndroid Build Coastguard Worker 
4405*61046927SAndroid Build Coastguard Worker    /* The EXT_direct_state_access spec says:
4406*61046927SAndroid Build Coastguard Worker     *
4407*61046927SAndroid Build Coastguard Worker     *    "For GetVertexArrayIntegeri_vEXT, pname must be one of the
4408*61046927SAndroid Build Coastguard Worker     *    "Get value" tokens in tables 6.8 and 6.9 that use GetVertexAttribiv
4409*61046927SAndroid Build Coastguard Worker     *    or GetVertexAttribPointerv (so allowing only the VERTEX_ATTRIB_*
4410*61046927SAndroid Build Coastguard Worker     *    tokens) or a token of the form TEXTURE_COORD_ARRAY (the enable) or
4411*61046927SAndroid Build Coastguard Worker     *    TEXTURE_COORD_ARRAY_*; index identifies the vertex attribute
4412*61046927SAndroid Build Coastguard Worker     *    array to query or texture coordinate set index respectively."
4413*61046927SAndroid Build Coastguard Worker     */
4414*61046927SAndroid Build Coastguard Worker 
4415*61046927SAndroid Build Coastguard Worker    switch (pname) {
4416*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY:
4417*61046927SAndroid Build Coastguard Worker          *param = !!(vao->Enabled & VERT_BIT_TEX(index));
4418*61046927SAndroid Build Coastguard Worker          break;
4419*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_SIZE:
4420*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_TEX(index)].Format.User.Size;
4421*61046927SAndroid Build Coastguard Worker          break;
4422*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_TYPE:
4423*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_TEX(index)].Format.User.Type;
4424*61046927SAndroid Build Coastguard Worker          break;
4425*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_STRIDE:
4426*61046927SAndroid Build Coastguard Worker          *param = vao->VertexAttrib[VERT_ATTRIB_TEX(index)].Stride;
4427*61046927SAndroid Build Coastguard Worker          break;
4428*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING:
4429*61046927SAndroid Build Coastguard Worker          buf = vao->BufferBinding[VERT_ATTRIB_TEX(index)].BufferObj;
4430*61046927SAndroid Build Coastguard Worker          *param = buf ? buf->Name : 0;
4431*61046927SAndroid Build Coastguard Worker          break;
4432*61046927SAndroid Build Coastguard Worker       default:
4433*61046927SAndroid Build Coastguard Worker          *param = get_vertex_array_attrib(ctx, vao, index, pname, "glGetVertexArrayIntegeri_vEXT");
4434*61046927SAndroid Build Coastguard Worker    }
4435*61046927SAndroid Build Coastguard Worker }
4436*61046927SAndroid Build Coastguard Worker 
4437*61046927SAndroid Build Coastguard Worker void GLAPIENTRY
_mesa_GetVertexArrayPointeri_vEXT(GLuint vaobj,GLuint index,GLenum pname,GLvoid ** param)4438*61046927SAndroid Build Coastguard Worker _mesa_GetVertexArrayPointeri_vEXT(GLuint vaobj, GLuint index, GLenum pname, GLvoid** param)
4439*61046927SAndroid Build Coastguard Worker {
4440*61046927SAndroid Build Coastguard Worker    GET_CURRENT_CONTEXT(ctx);
4441*61046927SAndroid Build Coastguard Worker    struct gl_vertex_array_object* vao;
4442*61046927SAndroid Build Coastguard Worker 
4443*61046927SAndroid Build Coastguard Worker    vao = _mesa_lookup_vao_err(ctx, vaobj, true,
4444*61046927SAndroid Build Coastguard Worker                               "glGetVertexArrayPointeri_vEXT");
4445*61046927SAndroid Build Coastguard Worker    if (!vao)
4446*61046927SAndroid Build Coastguard Worker       return;
4447*61046927SAndroid Build Coastguard Worker 
4448*61046927SAndroid Build Coastguard Worker    if (index >= ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs) {
4449*61046927SAndroid Build Coastguard Worker       _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexArrayPointeri_vEXT(index)");
4450*61046927SAndroid Build Coastguard Worker       return;
4451*61046927SAndroid Build Coastguard Worker    }
4452*61046927SAndroid Build Coastguard Worker 
4453*61046927SAndroid Build Coastguard Worker    /* The EXT_direct_state_access spec says:
4454*61046927SAndroid Build Coastguard Worker     *
4455*61046927SAndroid Build Coastguard Worker     *     "For GetVertexArrayPointeri_vEXT, pname must be VERTEX_ATTRIB_ARRAY_POINTER
4456*61046927SAndroid Build Coastguard Worker     *     or TEXTURE_COORD_ARRAY_POINTER with the index parameter indicating the vertex
4457*61046927SAndroid Build Coastguard Worker     *     attribute or texture coordindate set index."
4458*61046927SAndroid Build Coastguard Worker     */
4459*61046927SAndroid Build Coastguard Worker    switch(pname) {
4460*61046927SAndroid Build Coastguard Worker       case GL_VERTEX_ATTRIB_ARRAY_POINTER:
4461*61046927SAndroid Build Coastguard Worker          *param = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
4462*61046927SAndroid Build Coastguard Worker          break;
4463*61046927SAndroid Build Coastguard Worker       case GL_TEXTURE_COORD_ARRAY_POINTER:
4464*61046927SAndroid Build Coastguard Worker          *param = (GLvoid *) vao->VertexAttrib[VERT_ATTRIB_TEX(index)].Ptr;
4465*61046927SAndroid Build Coastguard Worker          break;
4466*61046927SAndroid Build Coastguard Worker       default:
4467*61046927SAndroid Build Coastguard Worker          _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexArrayPointeri_vEXT(pname)");
4468*61046927SAndroid Build Coastguard Worker    }
4469*61046927SAndroid Build Coastguard Worker }
4470