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