1 /*
2 * Mesa 3-D graphics library
3 *
4 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 /**
26 * This file implements the glArrayElement() function.
27 * It involves looking at the format/type of all the enabled vertex arrays
28 * and emitting a list of pointers to functions which set the per-vertex
29 * state for the element/index.
30 */
31
32
33 /* Author:
34 * Keith Whitwell <keithw@vmware.com>
35 */
36
37 #include "glheader.h"
38 #include "arrayobj.h"
39 #include "api_arrayelt.h"
40 #include "bufferobj.h"
41 #include "context.h"
42 #include "imports.h"
43 #include "macros.h"
44 #include "mtypes.h"
45 #include "main/dispatch.h"
46 #include "varray.h"
47
48 typedef void (GLAPIENTRY *array_func)( const void * );
49
50 typedef struct {
51 const struct gl_array_attributes *array;
52 const struct gl_vertex_buffer_binding *binding;
53 int offset;
54 } AEarray;
55
56 typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
57
58 typedef struct {
59 const struct gl_array_attributes *array;
60 const struct gl_vertex_buffer_binding *binding;
61 attrib_func func;
62 GLuint index;
63 } AEattrib;
64
65 typedef struct {
66 AEarray arrays[32];
67 AEattrib attribs[VERT_ATTRIB_MAX + 1];
68
69 /* List of VBOs we need to map before executing ArrayElements */
70 struct gl_buffer_object *vbo[VERT_ATTRIB_MAX];
71 GLuint nr_vbos;
72 GLboolean mapped_vbos; /**< Any currently mapped VBOs? */
73
74 bool dirty_state;
75 } AEcontext;
76
77
78 /** Cast wrapper */
79 static inline AEcontext *
AE_CONTEXT(struct gl_context * ctx)80 AE_CONTEXT(struct gl_context *ctx)
81 {
82 return (AEcontext *) ctx->aelt_context;
83 }
84
85
86 /*
87 * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer
88 * in the range [0, 7]. Luckily these type tokens are sequentially
89 * numbered in gl.h, except for GL_DOUBLE.
90 */
91 static inline int
TYPE_IDX(GLenum t)92 TYPE_IDX(GLenum t)
93 {
94 return t == GL_DOUBLE ? 7 : t & 7;
95 }
96
97
98 bool
_ae_is_state_dirty(struct gl_context * ctx)99 _ae_is_state_dirty(struct gl_context *ctx)
100 {
101 return AE_CONTEXT(ctx)->dirty_state;
102 }
103
104
105 #define NUM_TYPES 8
106
107
108 static const int ColorFuncs[2][NUM_TYPES] = {
109 {
110 _gloffset_Color3bv,
111 _gloffset_Color3ubv,
112 _gloffset_Color3sv,
113 _gloffset_Color3usv,
114 _gloffset_Color3iv,
115 _gloffset_Color3uiv,
116 _gloffset_Color3fv,
117 _gloffset_Color3dv,
118 },
119 {
120 _gloffset_Color4bv,
121 _gloffset_Color4ubv,
122 _gloffset_Color4sv,
123 _gloffset_Color4usv,
124 _gloffset_Color4iv,
125 _gloffset_Color4uiv,
126 _gloffset_Color4fv,
127 _gloffset_Color4dv,
128 },
129 };
130
131 static const int VertexFuncs[3][NUM_TYPES] = {
132 {
133 -1,
134 -1,
135 _gloffset_Vertex2sv,
136 -1,
137 _gloffset_Vertex2iv,
138 -1,
139 _gloffset_Vertex2fv,
140 _gloffset_Vertex2dv,
141 },
142 {
143 -1,
144 -1,
145 _gloffset_Vertex3sv,
146 -1,
147 _gloffset_Vertex3iv,
148 -1,
149 _gloffset_Vertex3fv,
150 _gloffset_Vertex3dv,
151 },
152 {
153 -1,
154 -1,
155 _gloffset_Vertex4sv,
156 -1,
157 _gloffset_Vertex4iv,
158 -1,
159 _gloffset_Vertex4fv,
160 _gloffset_Vertex4dv,
161 },
162 };
163
164 static const int IndexFuncs[NUM_TYPES] = {
165 -1,
166 _gloffset_Indexubv,
167 _gloffset_Indexsv,
168 -1,
169 _gloffset_Indexiv,
170 -1,
171 _gloffset_Indexfv,
172 _gloffset_Indexdv,
173 };
174
175 static const int NormalFuncs[NUM_TYPES] = {
176 _gloffset_Normal3bv,
177 -1,
178 _gloffset_Normal3sv,
179 -1,
180 _gloffset_Normal3iv,
181 -1,
182 _gloffset_Normal3fv,
183 _gloffset_Normal3dv,
184 };
185
186 /* Note: _gloffset_* for these may not be a compile-time constant. */
187 static int SecondaryColorFuncs[NUM_TYPES];
188 static int FogCoordFuncs[NUM_TYPES];
189
190
191 /**
192 ** GL_NV_vertex_program
193 **/
194
195 /* GL_BYTE attributes */
196
197 static void GLAPIENTRY
VertexAttrib1NbvNV(GLuint index,const GLbyte * v)198 VertexAttrib1NbvNV(GLuint index, const GLbyte *v)
199 {
200 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0])));
201 }
202
203 static void GLAPIENTRY
VertexAttrib1bvNV(GLuint index,const GLbyte * v)204 VertexAttrib1bvNV(GLuint index, const GLbyte *v)
205 {
206 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
207 }
208
209 static void GLAPIENTRY
VertexAttrib2NbvNV(GLuint index,const GLbyte * v)210 VertexAttrib2NbvNV(GLuint index, const GLbyte *v)
211 {
212 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1])));
213 }
214
215 static void GLAPIENTRY
VertexAttrib2bvNV(GLuint index,const GLbyte * v)216 VertexAttrib2bvNV(GLuint index, const GLbyte *v)
217 {
218 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
219 }
220
221 static void GLAPIENTRY
VertexAttrib3NbvNV(GLuint index,const GLbyte * v)222 VertexAttrib3NbvNV(GLuint index, const GLbyte *v)
223 {
224 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
225 BYTE_TO_FLOAT(v[1]),
226 BYTE_TO_FLOAT(v[2])));
227 }
228
229 static void GLAPIENTRY
VertexAttrib3bvNV(GLuint index,const GLbyte * v)230 VertexAttrib3bvNV(GLuint index, const GLbyte *v)
231 {
232 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
233 }
234
235 static void GLAPIENTRY
VertexAttrib4NbvNV(GLuint index,const GLbyte * v)236 VertexAttrib4NbvNV(GLuint index, const GLbyte *v)
237 {
238 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
239 BYTE_TO_FLOAT(v[1]),
240 BYTE_TO_FLOAT(v[2]),
241 BYTE_TO_FLOAT(v[3])));
242 }
243
244 static void GLAPIENTRY
VertexAttrib4bvNV(GLuint index,const GLbyte * v)245 VertexAttrib4bvNV(GLuint index, const GLbyte *v)
246 {
247 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
248 }
249
250 /* GL_UNSIGNED_BYTE attributes */
251
252 static void GLAPIENTRY
VertexAttrib1NubvNV(GLuint index,const GLubyte * v)253 VertexAttrib1NubvNV(GLuint index, const GLubyte *v)
254 {
255 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0])));
256 }
257
258 static void GLAPIENTRY
VertexAttrib1ubvNV(GLuint index,const GLubyte * v)259 VertexAttrib1ubvNV(GLuint index, const GLubyte *v)
260 {
261 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
262 }
263
264 static void GLAPIENTRY
VertexAttrib2NubvNV(GLuint index,const GLubyte * v)265 VertexAttrib2NubvNV(GLuint index, const GLubyte *v)
266 {
267 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
268 UBYTE_TO_FLOAT(v[1])));
269 }
270
271 static void GLAPIENTRY
VertexAttrib2ubvNV(GLuint index,const GLubyte * v)272 VertexAttrib2ubvNV(GLuint index, const GLubyte *v)
273 {
274 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
275 }
276
277 static void GLAPIENTRY
VertexAttrib3NubvNV(GLuint index,const GLubyte * v)278 VertexAttrib3NubvNV(GLuint index, const GLubyte *v)
279 {
280 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
281 UBYTE_TO_FLOAT(v[1]),
282 UBYTE_TO_FLOAT(v[2])));
283 }
284 static void GLAPIENTRY
VertexAttrib3ubvNV(GLuint index,const GLubyte * v)285 VertexAttrib3ubvNV(GLuint index, const GLubyte *v)
286 {
287 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
288 (GLfloat)v[1], (GLfloat)v[2]));
289 }
290
291 static void GLAPIENTRY
VertexAttrib4NubvNV(GLuint index,const GLubyte * v)292 VertexAttrib4NubvNV(GLuint index, const GLubyte *v)
293 {
294 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0]),
295 UBYTE_TO_FLOAT(v[1]),
296 UBYTE_TO_FLOAT(v[2]),
297 UBYTE_TO_FLOAT(v[3])));
298 }
299
300 static void GLAPIENTRY
VertexAttrib4ubvNV(GLuint index,const GLubyte * v)301 VertexAttrib4ubvNV(GLuint index, const GLubyte *v)
302 {
303 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
304 (GLfloat)v[1], (GLfloat)v[2],
305 (GLfloat)v[3]));
306 }
307
308 /* GL_SHORT attributes */
309
310 static void GLAPIENTRY
VertexAttrib1NsvNV(GLuint index,const GLshort * v)311 VertexAttrib1NsvNV(GLuint index, const GLshort *v)
312 {
313 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0])));
314 }
315
316 static void GLAPIENTRY
VertexAttrib1svNV(GLuint index,const GLshort * v)317 VertexAttrib1svNV(GLuint index, const GLshort *v)
318 {
319 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
320 }
321
322 static void GLAPIENTRY
VertexAttrib2NsvNV(GLuint index,const GLshort * v)323 VertexAttrib2NsvNV(GLuint index, const GLshort *v)
324 {
325 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
326 SHORT_TO_FLOAT(v[1])));
327 }
328
329 static void GLAPIENTRY
VertexAttrib2svNV(GLuint index,const GLshort * v)330 VertexAttrib2svNV(GLuint index, const GLshort *v)
331 {
332 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
333 }
334
335 static void GLAPIENTRY
VertexAttrib3NsvNV(GLuint index,const GLshort * v)336 VertexAttrib3NsvNV(GLuint index, const GLshort *v)
337 {
338 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
339 SHORT_TO_FLOAT(v[1]),
340 SHORT_TO_FLOAT(v[2])));
341 }
342
343 static void GLAPIENTRY
VertexAttrib3svNV(GLuint index,const GLshort * v)344 VertexAttrib3svNV(GLuint index, const GLshort *v)
345 {
346 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
347 (GLfloat)v[2]));
348 }
349
350 static void GLAPIENTRY
VertexAttrib4NsvNV(GLuint index,const GLshort * v)351 VertexAttrib4NsvNV(GLuint index, const GLshort *v)
352 {
353 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0]),
354 SHORT_TO_FLOAT(v[1]),
355 SHORT_TO_FLOAT(v[2]),
356 SHORT_TO_FLOAT(v[3])));
357 }
358
359 static void GLAPIENTRY
VertexAttrib4svNV(GLuint index,const GLshort * v)360 VertexAttrib4svNV(GLuint index, const GLshort *v)
361 {
362 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
363 (GLfloat)v[2], (GLfloat)v[3]));
364 }
365
366 /* GL_UNSIGNED_SHORT attributes */
367
368 static void GLAPIENTRY
VertexAttrib1NusvNV(GLuint index,const GLushort * v)369 VertexAttrib1NusvNV(GLuint index, const GLushort *v)
370 {
371 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0])));
372 }
373
374 static void GLAPIENTRY
VertexAttrib1usvNV(GLuint index,const GLushort * v)375 VertexAttrib1usvNV(GLuint index, const GLushort *v)
376 {
377 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
378 }
379
380 static void GLAPIENTRY
VertexAttrib2NusvNV(GLuint index,const GLushort * v)381 VertexAttrib2NusvNV(GLuint index, const GLushort *v)
382 {
383 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
384 USHORT_TO_FLOAT(v[1])));
385 }
386
387 static void GLAPIENTRY
VertexAttrib2usvNV(GLuint index,const GLushort * v)388 VertexAttrib2usvNV(GLuint index, const GLushort *v)
389 {
390 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
391 (GLfloat)v[1]));
392 }
393
394 static void GLAPIENTRY
VertexAttrib3NusvNV(GLuint index,const GLushort * v)395 VertexAttrib3NusvNV(GLuint index, const GLushort *v)
396 {
397 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
398 USHORT_TO_FLOAT(v[1]),
399 USHORT_TO_FLOAT(v[2])));
400 }
401
402 static void GLAPIENTRY
VertexAttrib3usvNV(GLuint index,const GLushort * v)403 VertexAttrib3usvNV(GLuint index, const GLushort *v)
404 {
405 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
406 (GLfloat)v[2]));
407 }
408
409 static void GLAPIENTRY
VertexAttrib4NusvNV(GLuint index,const GLushort * v)410 VertexAttrib4NusvNV(GLuint index, const GLushort *v)
411 {
412 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
413 USHORT_TO_FLOAT(v[1]),
414 USHORT_TO_FLOAT(v[2]),
415 USHORT_TO_FLOAT(v[3])));
416 }
417
418 static void GLAPIENTRY
VertexAttrib4usvNV(GLuint index,const GLushort * v)419 VertexAttrib4usvNV(GLuint index, const GLushort *v)
420 {
421 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
422 (GLfloat)v[2], (GLfloat)v[3]));
423 }
424
425 /* GL_INT attributes */
426
427 static void GLAPIENTRY
VertexAttrib1NivNV(GLuint index,const GLint * v)428 VertexAttrib1NivNV(GLuint index, const GLint *v)
429 {
430 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0])));
431 }
432
433 static void GLAPIENTRY
VertexAttrib1ivNV(GLuint index,const GLint * v)434 VertexAttrib1ivNV(GLuint index, const GLint *v)
435 {
436 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
437 }
438
439 static void GLAPIENTRY
VertexAttrib2NivNV(GLuint index,const GLint * v)440 VertexAttrib2NivNV(GLuint index, const GLint *v)
441 {
442 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
443 INT_TO_FLOAT(v[1])));
444 }
445
446 static void GLAPIENTRY
VertexAttrib2ivNV(GLuint index,const GLint * v)447 VertexAttrib2ivNV(GLuint index, const GLint *v)
448 {
449 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
450 }
451
452 static void GLAPIENTRY
VertexAttrib3NivNV(GLuint index,const GLint * v)453 VertexAttrib3NivNV(GLuint index, const GLint *v)
454 {
455 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
456 INT_TO_FLOAT(v[1]),
457 INT_TO_FLOAT(v[2])));
458 }
459
460 static void GLAPIENTRY
VertexAttrib3ivNV(GLuint index,const GLint * v)461 VertexAttrib3ivNV(GLuint index, const GLint *v)
462 {
463 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
464 (GLfloat)v[2]));
465 }
466
467 static void GLAPIENTRY
VertexAttrib4NivNV(GLuint index,const GLint * v)468 VertexAttrib4NivNV(GLuint index, const GLint *v)
469 {
470 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
471 INT_TO_FLOAT(v[1]),
472 INT_TO_FLOAT(v[2]),
473 INT_TO_FLOAT(v[3])));
474 }
475
476 static void GLAPIENTRY
VertexAttrib4ivNV(GLuint index,const GLint * v)477 VertexAttrib4ivNV(GLuint index, const GLint *v)
478 {
479 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
480 (GLfloat)v[2], (GLfloat)v[3]));
481 }
482
483 /* GL_UNSIGNED_INT attributes */
484
485 static void GLAPIENTRY
VertexAttrib1NuivNV(GLuint index,const GLuint * v)486 VertexAttrib1NuivNV(GLuint index, const GLuint *v)
487 {
488 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));
489 }
490
491 static void GLAPIENTRY
VertexAttrib1uivNV(GLuint index,const GLuint * v)492 VertexAttrib1uivNV(GLuint index, const GLuint *v)
493 {
494 CALL_VertexAttrib1fNV(GET_DISPATCH(), (index, (GLfloat)v[0]));
495 }
496
497 static void GLAPIENTRY
VertexAttrib2NuivNV(GLuint index,const GLuint * v)498 VertexAttrib2NuivNV(GLuint index, const GLuint *v)
499 {
500 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
501 UINT_TO_FLOAT(v[1])));
502 }
503
504 static void GLAPIENTRY
VertexAttrib2uivNV(GLuint index,const GLuint * v)505 VertexAttrib2uivNV(GLuint index, const GLuint *v)
506 {
507 CALL_VertexAttrib2fNV(GET_DISPATCH(), (index, (GLfloat)v[0],
508 (GLfloat)v[1]));
509 }
510
511 static void GLAPIENTRY
VertexAttrib3NuivNV(GLuint index,const GLuint * v)512 VertexAttrib3NuivNV(GLuint index, const GLuint *v)
513 {
514 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
515 UINT_TO_FLOAT(v[1]),
516 UINT_TO_FLOAT(v[2])));
517 }
518
519 static void GLAPIENTRY
VertexAttrib3uivNV(GLuint index,const GLuint * v)520 VertexAttrib3uivNV(GLuint index, const GLuint *v)
521 {
522 CALL_VertexAttrib3fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
523 (GLfloat)v[2]));
524 }
525
526 static void GLAPIENTRY
VertexAttrib4NuivNV(GLuint index,const GLuint * v)527 VertexAttrib4NuivNV(GLuint index, const GLuint *v)
528 {
529 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
530 UINT_TO_FLOAT(v[1]),
531 UINT_TO_FLOAT(v[2]),
532 UINT_TO_FLOAT(v[3])));
533 }
534
535 static void GLAPIENTRY
VertexAttrib4uivNV(GLuint index,const GLuint * v)536 VertexAttrib4uivNV(GLuint index, const GLuint *v)
537 {
538 CALL_VertexAttrib4fNV(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
539 (GLfloat)v[2], (GLfloat)v[3]));
540 }
541
542 /* GL_FLOAT attributes */
543
544 static void GLAPIENTRY
VertexAttrib1fvNV(GLuint index,const GLfloat * v)545 VertexAttrib1fvNV(GLuint index, const GLfloat *v)
546 {
547 CALL_VertexAttrib1fvNV(GET_DISPATCH(), (index, v));
548 }
549
550 static void GLAPIENTRY
VertexAttrib2fvNV(GLuint index,const GLfloat * v)551 VertexAttrib2fvNV(GLuint index, const GLfloat *v)
552 {
553 CALL_VertexAttrib2fvNV(GET_DISPATCH(), (index, v));
554 }
555
556 static void GLAPIENTRY
VertexAttrib3fvNV(GLuint index,const GLfloat * v)557 VertexAttrib3fvNV(GLuint index, const GLfloat *v)
558 {
559 CALL_VertexAttrib3fvNV(GET_DISPATCH(), (index, v));
560 }
561
562 static void GLAPIENTRY
VertexAttrib4fvNV(GLuint index,const GLfloat * v)563 VertexAttrib4fvNV(GLuint index, const GLfloat *v)
564 {
565 CALL_VertexAttrib4fvNV(GET_DISPATCH(), (index, v));
566 }
567
568 /* GL_DOUBLE attributes */
569
570 static void GLAPIENTRY
VertexAttrib1dvNV(GLuint index,const GLdouble * v)571 VertexAttrib1dvNV(GLuint index, const GLdouble *v)
572 {
573 CALL_VertexAttrib1dvNV(GET_DISPATCH(), (index, v));
574 }
575
576 static void GLAPIENTRY
VertexAttrib2dvNV(GLuint index,const GLdouble * v)577 VertexAttrib2dvNV(GLuint index, const GLdouble *v)
578 {
579 CALL_VertexAttrib2dvNV(GET_DISPATCH(), (index, v));
580 }
581
582 static void GLAPIENTRY
VertexAttrib3dvNV(GLuint index,const GLdouble * v)583 VertexAttrib3dvNV(GLuint index, const GLdouble *v)
584 {
585 CALL_VertexAttrib3dvNV(GET_DISPATCH(), (index, v));
586 }
587
588 static void GLAPIENTRY
VertexAttrib4dvNV(GLuint index,const GLdouble * v)589 VertexAttrib4dvNV(GLuint index, const GLdouble *v)
590 {
591 CALL_VertexAttrib4dvNV(GET_DISPATCH(), (index, v));
592 }
593
594
595 /*
596 * Array [size][type] of VertexAttrib functions
597 */
598 static attrib_func AttribFuncsNV[2][4][NUM_TYPES] = {
599 {
600 /* non-normalized */
601 {
602 /* size 1 */
603 (attrib_func) VertexAttrib1bvNV,
604 (attrib_func) VertexAttrib1ubvNV,
605 (attrib_func) VertexAttrib1svNV,
606 (attrib_func) VertexAttrib1usvNV,
607 (attrib_func) VertexAttrib1ivNV,
608 (attrib_func) VertexAttrib1uivNV,
609 (attrib_func) VertexAttrib1fvNV,
610 (attrib_func) VertexAttrib1dvNV
611 },
612 {
613 /* size 2 */
614 (attrib_func) VertexAttrib2bvNV,
615 (attrib_func) VertexAttrib2ubvNV,
616 (attrib_func) VertexAttrib2svNV,
617 (attrib_func) VertexAttrib2usvNV,
618 (attrib_func) VertexAttrib2ivNV,
619 (attrib_func) VertexAttrib2uivNV,
620 (attrib_func) VertexAttrib2fvNV,
621 (attrib_func) VertexAttrib2dvNV
622 },
623 {
624 /* size 3 */
625 (attrib_func) VertexAttrib3bvNV,
626 (attrib_func) VertexAttrib3ubvNV,
627 (attrib_func) VertexAttrib3svNV,
628 (attrib_func) VertexAttrib3usvNV,
629 (attrib_func) VertexAttrib3ivNV,
630 (attrib_func) VertexAttrib3uivNV,
631 (attrib_func) VertexAttrib3fvNV,
632 (attrib_func) VertexAttrib3dvNV
633 },
634 {
635 /* size 4 */
636 (attrib_func) VertexAttrib4bvNV,
637 (attrib_func) VertexAttrib4ubvNV,
638 (attrib_func) VertexAttrib4svNV,
639 (attrib_func) VertexAttrib4usvNV,
640 (attrib_func) VertexAttrib4ivNV,
641 (attrib_func) VertexAttrib4uivNV,
642 (attrib_func) VertexAttrib4fvNV,
643 (attrib_func) VertexAttrib4dvNV
644 }
645 },
646 {
647 /* normalized (except for float/double) */
648 {
649 /* size 1 */
650 (attrib_func) VertexAttrib1NbvNV,
651 (attrib_func) VertexAttrib1NubvNV,
652 (attrib_func) VertexAttrib1NsvNV,
653 (attrib_func) VertexAttrib1NusvNV,
654 (attrib_func) VertexAttrib1NivNV,
655 (attrib_func) VertexAttrib1NuivNV,
656 (attrib_func) VertexAttrib1fvNV,
657 (attrib_func) VertexAttrib1dvNV
658 },
659 {
660 /* size 2 */
661 (attrib_func) VertexAttrib2NbvNV,
662 (attrib_func) VertexAttrib2NubvNV,
663 (attrib_func) VertexAttrib2NsvNV,
664 (attrib_func) VertexAttrib2NusvNV,
665 (attrib_func) VertexAttrib2NivNV,
666 (attrib_func) VertexAttrib2NuivNV,
667 (attrib_func) VertexAttrib2fvNV,
668 (attrib_func) VertexAttrib2dvNV
669 },
670 {
671 /* size 3 */
672 (attrib_func) VertexAttrib3NbvNV,
673 (attrib_func) VertexAttrib3NubvNV,
674 (attrib_func) VertexAttrib3NsvNV,
675 (attrib_func) VertexAttrib3NusvNV,
676 (attrib_func) VertexAttrib3NivNV,
677 (attrib_func) VertexAttrib3NuivNV,
678 (attrib_func) VertexAttrib3fvNV,
679 (attrib_func) VertexAttrib3dvNV
680 },
681 {
682 /* size 4 */
683 (attrib_func) VertexAttrib4NbvNV,
684 (attrib_func) VertexAttrib4NubvNV,
685 (attrib_func) VertexAttrib4NsvNV,
686 (attrib_func) VertexAttrib4NusvNV,
687 (attrib_func) VertexAttrib4NivNV,
688 (attrib_func) VertexAttrib4NuivNV,
689 (attrib_func) VertexAttrib4fvNV,
690 (attrib_func) VertexAttrib4dvNV
691 }
692 }
693 };
694
695
696 /**
697 ** GL_ARB_vertex_program
698 **/
699
700 /* GL_BYTE attributes */
701
702 static void GLAPIENTRY
VertexAttrib1NbvARB(GLuint index,const GLbyte * v)703 VertexAttrib1NbvARB(GLuint index, const GLbyte *v)
704 {
705 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0])));
706 }
707
708 static void GLAPIENTRY
VertexAttrib1bvARB(GLuint index,const GLbyte * v)709 VertexAttrib1bvARB(GLuint index, const GLbyte *v)
710 {
711 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
712 }
713
714 static void GLAPIENTRY
VertexAttrib2NbvARB(GLuint index,const GLbyte * v)715 VertexAttrib2NbvARB(GLuint index, const GLbyte *v)
716 {
717 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1])));
718 }
719
720 static void GLAPIENTRY
VertexAttrib2bvARB(GLuint index,const GLbyte * v)721 VertexAttrib2bvARB(GLuint index, const GLbyte *v)
722 {
723 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1]));
724 }
725
726 static void GLAPIENTRY
VertexAttrib3NbvARB(GLuint index,const GLbyte * v)727 VertexAttrib3NbvARB(GLuint index, const GLbyte *v)
728 {
729 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
730 BYTE_TO_FLOAT(v[1]),
731 BYTE_TO_FLOAT(v[2])));
732 }
733
734 static void GLAPIENTRY
VertexAttrib3bvARB(GLuint index,const GLbyte * v)735 VertexAttrib3bvARB(GLuint index, const GLbyte *v)
736 {
737 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
738 }
739
740 static void GLAPIENTRY
VertexAttrib4NbvARB(GLuint index,const GLbyte * v)741 VertexAttrib4NbvARB(GLuint index, const GLbyte *v)
742 {
743 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, BYTE_TO_FLOAT(v[0]),
744 BYTE_TO_FLOAT(v[1]),
745 BYTE_TO_FLOAT(v[2]),
746 BYTE_TO_FLOAT(v[3])));
747 }
748
749 static void GLAPIENTRY
VertexAttrib4bvARB(GLuint index,const GLbyte * v)750 VertexAttrib4bvARB(GLuint index, const GLbyte *v)
751 {
752 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
753 }
754
755 /* GL_UNSIGNED_BYTE attributes */
756
757 static void GLAPIENTRY
VertexAttrib1NubvARB(GLuint index,const GLubyte * v)758 VertexAttrib1NubvARB(GLuint index, const GLubyte *v)
759 {
760 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UBYTE_TO_FLOAT(v[0])));
761 }
762
763 static void GLAPIENTRY
VertexAttrib1ubvARB(GLuint index,const GLubyte * v)764 VertexAttrib1ubvARB(GLuint index, const GLubyte *v)
765 {
766 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
767 }
768
769 static void GLAPIENTRY
VertexAttrib2NubvARB(GLuint index,const GLubyte * v)770 VertexAttrib2NubvARB(GLuint index, const GLubyte *v)
771 {
772 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index,
773 UBYTE_TO_FLOAT(v[0]),
774 UBYTE_TO_FLOAT(v[1])));
775 }
776
777 static void GLAPIENTRY
VertexAttrib2ubvARB(GLuint index,const GLubyte * v)778 VertexAttrib2ubvARB(GLuint index, const GLubyte *v)
779 {
780 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index,
781 (GLfloat)v[0], (GLfloat)v[1]));
782 }
783
784 static void GLAPIENTRY
VertexAttrib3NubvARB(GLuint index,const GLubyte * v)785 VertexAttrib3NubvARB(GLuint index, const GLubyte *v)
786 {
787 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index,
788 UBYTE_TO_FLOAT(v[0]),
789 UBYTE_TO_FLOAT(v[1]),
790 UBYTE_TO_FLOAT(v[2])));
791 }
792 static void GLAPIENTRY
VertexAttrib3ubvARB(GLuint index,const GLubyte * v)793 VertexAttrib3ubvARB(GLuint index, const GLubyte *v)
794 {
795 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index,
796 (GLfloat)v[0],
797 (GLfloat)v[1],
798 (GLfloat)v[2]));
799 }
800
801 static void GLAPIENTRY
VertexAttrib4NubvARB(GLuint index,const GLubyte * v)802 VertexAttrib4NubvARB(GLuint index, const GLubyte *v)
803 {
804 CALL_VertexAttrib4fARB(GET_DISPATCH(),
805 (index,
806 UBYTE_TO_FLOAT(v[0]),
807 UBYTE_TO_FLOAT(v[1]),
808 UBYTE_TO_FLOAT(v[2]),
809 UBYTE_TO_FLOAT(v[3])));
810 }
811
812 static void GLAPIENTRY
VertexAttrib4ubvARB(GLuint index,const GLubyte * v)813 VertexAttrib4ubvARB(GLuint index, const GLubyte *v)
814 {
815 CALL_VertexAttrib4fARB(GET_DISPATCH(),
816 (index,
817 (GLfloat)v[0], (GLfloat)v[1],
818 (GLfloat)v[2], (GLfloat)v[3]));
819 }
820
821 /* GL_SHORT attributes */
822
823 static void GLAPIENTRY
VertexAttrib1NsvARB(GLuint index,const GLshort * v)824 VertexAttrib1NsvARB(GLuint index, const GLshort *v)
825 {
826 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, SHORT_TO_FLOAT(v[0])));
827 }
828
829 static void GLAPIENTRY
VertexAttrib1svARB(GLuint index,const GLshort * v)830 VertexAttrib1svARB(GLuint index, const GLshort *v)
831 {
832 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
833 }
834
835 static void GLAPIENTRY
VertexAttrib2NsvARB(GLuint index,const GLshort * v)836 VertexAttrib2NsvARB(GLuint index, const GLshort *v)
837 {
838 CALL_VertexAttrib2fARB(GET_DISPATCH(),
839 (index, SHORT_TO_FLOAT(v[0]),
840 SHORT_TO_FLOAT(v[1])));
841 }
842
843 static void GLAPIENTRY
VertexAttrib2svARB(GLuint index,const GLshort * v)844 VertexAttrib2svARB(GLuint index, const GLshort *v)
845 {
846 CALL_VertexAttrib2fARB(GET_DISPATCH(),
847 (index, (GLfloat)v[0], (GLfloat)v[1]));
848 }
849
850 static void GLAPIENTRY
VertexAttrib3NsvARB(GLuint index,const GLshort * v)851 VertexAttrib3NsvARB(GLuint index, const GLshort *v)
852 {
853 CALL_VertexAttrib3fARB(GET_DISPATCH(),
854 (index,
855 SHORT_TO_FLOAT(v[0]),
856 SHORT_TO_FLOAT(v[1]),
857 SHORT_TO_FLOAT(v[2])));
858 }
859
860 static void GLAPIENTRY
VertexAttrib3svARB(GLuint index,const GLshort * v)861 VertexAttrib3svARB(GLuint index, const GLshort *v)
862 {
863 CALL_VertexAttrib3fARB(GET_DISPATCH(),
864 (index,
865 (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2]));
866 }
867
868 static void GLAPIENTRY
VertexAttrib4NsvARB(GLuint index,const GLshort * v)869 VertexAttrib4NsvARB(GLuint index, const GLshort *v)
870 {
871 CALL_VertexAttrib4fARB(GET_DISPATCH(),
872 (index,
873 SHORT_TO_FLOAT(v[0]),
874 SHORT_TO_FLOAT(v[1]),
875 SHORT_TO_FLOAT(v[2]),
876 SHORT_TO_FLOAT(v[3])));
877 }
878
879 static void GLAPIENTRY
VertexAttrib4svARB(GLuint index,const GLshort * v)880 VertexAttrib4svARB(GLuint index, const GLshort *v)
881 {
882 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
883 (GLfloat)v[2], (GLfloat)v[3]));
884 }
885
886 /* GL_UNSIGNED_SHORT attributes */
887
888 static void GLAPIENTRY
VertexAttrib1NusvARB(GLuint index,const GLushort * v)889 VertexAttrib1NusvARB(GLuint index, const GLushort *v)
890 {
891 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0])));
892 }
893
894 static void GLAPIENTRY
VertexAttrib1usvARB(GLuint index,const GLushort * v)895 VertexAttrib1usvARB(GLuint index, const GLushort *v)
896 {
897 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
898 }
899
900 static void GLAPIENTRY
VertexAttrib2NusvARB(GLuint index,const GLushort * v)901 VertexAttrib2NusvARB(GLuint index, const GLushort *v)
902 {
903 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
904 USHORT_TO_FLOAT(v[1])));
905 }
906
907 static void GLAPIENTRY
VertexAttrib2usvARB(GLuint index,const GLushort * v)908 VertexAttrib2usvARB(GLuint index, const GLushort *v)
909 {
910 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
911 (GLfloat)v[1]));
912 }
913
914 static void GLAPIENTRY
VertexAttrib3NusvARB(GLuint index,const GLushort * v)915 VertexAttrib3NusvARB(GLuint index, const GLushort *v)
916 {
917 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
918 USHORT_TO_FLOAT(v[1]),
919 USHORT_TO_FLOAT(v[2])));
920 }
921
922 static void GLAPIENTRY
VertexAttrib3usvARB(GLuint index,const GLushort * v)923 VertexAttrib3usvARB(GLuint index, const GLushort *v)
924 {
925 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
926 (GLfloat)v[1], (GLfloat)v[2]));
927 }
928
929 static void GLAPIENTRY
VertexAttrib4NusvARB(GLuint index,const GLushort * v)930 VertexAttrib4NusvARB(GLuint index, const GLushort *v)
931 {
932 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, USHORT_TO_FLOAT(v[0]),
933 USHORT_TO_FLOAT(v[1]),
934 USHORT_TO_FLOAT(v[2]),
935 USHORT_TO_FLOAT(v[3])));
936 }
937
938 static void GLAPIENTRY
VertexAttrib4usvARB(GLuint index,const GLushort * v)939 VertexAttrib4usvARB(GLuint index, const GLushort *v)
940 {
941 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1], (GLfloat)v[2], (GLfloat)v[3]));
942 }
943
944 /* GL_INT attributes */
945
946 static void GLAPIENTRY
VertexAttrib1NivARB(GLuint index,const GLint * v)947 VertexAttrib1NivARB(GLuint index, const GLint *v)
948 {
949 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0])));
950 }
951
952 static void GLAPIENTRY
VertexAttrib1ivARB(GLuint index,const GLint * v)953 VertexAttrib1ivARB(GLuint index, const GLint *v)
954 {
955 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
956 }
957
958 static void GLAPIENTRY
VertexAttrib2NivARB(GLuint index,const GLint * v)959 VertexAttrib2NivARB(GLuint index, const GLint *v)
960 {
961 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
962 INT_TO_FLOAT(v[1])));
963 }
964
965 static void GLAPIENTRY
VertexAttrib2ivARB(GLuint index,const GLint * v)966 VertexAttrib2ivARB(GLuint index, const GLint *v)
967 {
968 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
969 (GLfloat)v[1]));
970 }
971
972 static void GLAPIENTRY
VertexAttrib3NivARB(GLuint index,const GLint * v)973 VertexAttrib3NivARB(GLuint index, const GLint *v)
974 {
975 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
976 INT_TO_FLOAT(v[1]),
977 INT_TO_FLOAT(v[2])));
978 }
979
980 static void GLAPIENTRY
VertexAttrib3ivARB(GLuint index,const GLint * v)981 VertexAttrib3ivARB(GLuint index, const GLint *v)
982 {
983 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
984 (GLfloat)v[1], (GLfloat)v[2]));
985 }
986
987 static void GLAPIENTRY
VertexAttrib4NivARB(GLuint index,const GLint * v)988 VertexAttrib4NivARB(GLuint index, const GLint *v)
989 {
990 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, INT_TO_FLOAT(v[0]),
991 INT_TO_FLOAT(v[1]),
992 INT_TO_FLOAT(v[2]),
993 INT_TO_FLOAT(v[3])));
994 }
995
996 static void GLAPIENTRY
VertexAttrib4ivARB(GLuint index,const GLint * v)997 VertexAttrib4ivARB(GLuint index, const GLint *v)
998 {
999 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
1000 (GLfloat)v[2], (GLfloat)v[3]));
1001 }
1002
1003 /* GL_UNSIGNED_INT attributes */
1004
1005 static void GLAPIENTRY
VertexAttrib1NuivARB(GLuint index,const GLuint * v)1006 VertexAttrib1NuivARB(GLuint index, const GLuint *v)
1007 {
1008 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0])));
1009 }
1010
1011 static void GLAPIENTRY
VertexAttrib1uivARB(GLuint index,const GLuint * v)1012 VertexAttrib1uivARB(GLuint index, const GLuint *v)
1013 {
1014 CALL_VertexAttrib1fARB(GET_DISPATCH(), (index, (GLfloat)v[0]));
1015 }
1016
1017 static void GLAPIENTRY
VertexAttrib2NuivARB(GLuint index,const GLuint * v)1018 VertexAttrib2NuivARB(GLuint index, const GLuint *v)
1019 {
1020 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
1021 UINT_TO_FLOAT(v[1])));
1022 }
1023
1024 static void GLAPIENTRY
VertexAttrib2uivARB(GLuint index,const GLuint * v)1025 VertexAttrib2uivARB(GLuint index, const GLuint *v)
1026 {
1027 CALL_VertexAttrib2fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
1028 (GLfloat)v[1]));
1029 }
1030
1031 static void GLAPIENTRY
VertexAttrib3NuivARB(GLuint index,const GLuint * v)1032 VertexAttrib3NuivARB(GLuint index, const GLuint *v)
1033 {
1034 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
1035 UINT_TO_FLOAT(v[1]),
1036 UINT_TO_FLOAT(v[2])));
1037 }
1038
1039 static void GLAPIENTRY
VertexAttrib3uivARB(GLuint index,const GLuint * v)1040 VertexAttrib3uivARB(GLuint index, const GLuint *v)
1041 {
1042 CALL_VertexAttrib3fARB(GET_DISPATCH(), (index, (GLfloat)v[0],
1043 (GLfloat)v[1], (GLfloat)v[2]));
1044 }
1045
1046 static void GLAPIENTRY
VertexAttrib4NuivARB(GLuint index,const GLuint * v)1047 VertexAttrib4NuivARB(GLuint index, const GLuint *v)
1048 {
1049 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, UINT_TO_FLOAT(v[0]),
1050 UINT_TO_FLOAT(v[1]),
1051 UINT_TO_FLOAT(v[2]),
1052 UINT_TO_FLOAT(v[3])));
1053 }
1054
1055 static void GLAPIENTRY
VertexAttrib4uivARB(GLuint index,const GLuint * v)1056 VertexAttrib4uivARB(GLuint index, const GLuint *v)
1057 {
1058 CALL_VertexAttrib4fARB(GET_DISPATCH(), (index, (GLfloat)v[0], (GLfloat)v[1],
1059 (GLfloat)v[2], (GLfloat)v[3]));
1060 }
1061
1062 /* GL_FLOAT attributes */
1063
1064 static void GLAPIENTRY
VertexAttrib1fvARB(GLuint index,const GLfloat * v)1065 VertexAttrib1fvARB(GLuint index, const GLfloat *v)
1066 {
1067 CALL_VertexAttrib1fvARB(GET_DISPATCH(), (index, v));
1068 }
1069
1070 static void GLAPIENTRY
VertexAttrib2fvARB(GLuint index,const GLfloat * v)1071 VertexAttrib2fvARB(GLuint index, const GLfloat *v)
1072 {
1073 CALL_VertexAttrib2fvARB(GET_DISPATCH(), (index, v));
1074 }
1075
1076 static void GLAPIENTRY
VertexAttrib3fvARB(GLuint index,const GLfloat * v)1077 VertexAttrib3fvARB(GLuint index, const GLfloat *v)
1078 {
1079 CALL_VertexAttrib3fvARB(GET_DISPATCH(), (index, v));
1080 }
1081
1082 static void GLAPIENTRY
VertexAttrib4fvARB(GLuint index,const GLfloat * v)1083 VertexAttrib4fvARB(GLuint index, const GLfloat *v)
1084 {
1085 CALL_VertexAttrib4fvARB(GET_DISPATCH(), (index, v));
1086 }
1087
1088 /* GL_DOUBLE attributes */
1089
1090 static void GLAPIENTRY
VertexAttrib1dvARB(GLuint index,const GLdouble * v)1091 VertexAttrib1dvARB(GLuint index, const GLdouble *v)
1092 {
1093 CALL_VertexAttrib1dv(GET_DISPATCH(), (index, v));
1094 }
1095
1096 static void GLAPIENTRY
VertexAttrib2dvARB(GLuint index,const GLdouble * v)1097 VertexAttrib2dvARB(GLuint index, const GLdouble *v)
1098 {
1099 CALL_VertexAttrib2dv(GET_DISPATCH(), (index, v));
1100 }
1101
1102 static void GLAPIENTRY
VertexAttrib3dvARB(GLuint index,const GLdouble * v)1103 VertexAttrib3dvARB(GLuint index, const GLdouble *v)
1104 {
1105 CALL_VertexAttrib3dv(GET_DISPATCH(), (index, v));
1106 }
1107
1108 static void GLAPIENTRY
VertexAttrib4dvARB(GLuint index,const GLdouble * v)1109 VertexAttrib4dvARB(GLuint index, const GLdouble *v)
1110 {
1111 CALL_VertexAttrib4dv(GET_DISPATCH(), (index, v));
1112 }
1113
1114
1115 /**
1116 * Integer-valued attributes
1117 */
1118 static void GLAPIENTRY
VertexAttribI1bv(GLuint index,const GLbyte * v)1119 VertexAttribI1bv(GLuint index, const GLbyte *v)
1120 {
1121 CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
1122 }
1123
1124 static void GLAPIENTRY
VertexAttribI2bv(GLuint index,const GLbyte * v)1125 VertexAttribI2bv(GLuint index, const GLbyte *v)
1126 {
1127 CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
1128 }
1129
1130 static void GLAPIENTRY
VertexAttribI3bv(GLuint index,const GLbyte * v)1131 VertexAttribI3bv(GLuint index, const GLbyte *v)
1132 {
1133 CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
1134 }
1135
1136 static void GLAPIENTRY
VertexAttribI4bv(GLuint index,const GLbyte * v)1137 VertexAttribI4bv(GLuint index, const GLbyte *v)
1138 {
1139 CALL_VertexAttribI4bv(GET_DISPATCH(), (index, v));
1140 }
1141
1142
1143 static void GLAPIENTRY
VertexAttribI1ubv(GLuint index,const GLubyte * v)1144 VertexAttribI1ubv(GLuint index, const GLubyte *v)
1145 {
1146 CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
1147 }
1148
1149 static void GLAPIENTRY
VertexAttribI2ubv(GLuint index,const GLubyte * v)1150 VertexAttribI2ubv(GLuint index, const GLubyte *v)
1151 {
1152 CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
1153 }
1154
1155 static void GLAPIENTRY
VertexAttribI3ubv(GLuint index,const GLubyte * v)1156 VertexAttribI3ubv(GLuint index, const GLubyte *v)
1157 {
1158 CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
1159 }
1160
1161 static void GLAPIENTRY
VertexAttribI4ubv(GLuint index,const GLubyte * v)1162 VertexAttribI4ubv(GLuint index, const GLubyte *v)
1163 {
1164 CALL_VertexAttribI4ubv(GET_DISPATCH(), (index, v));
1165 }
1166
1167
1168
1169 static void GLAPIENTRY
VertexAttribI1sv(GLuint index,const GLshort * v)1170 VertexAttribI1sv(GLuint index, const GLshort *v)
1171 {
1172 CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
1173 }
1174
1175 static void GLAPIENTRY
VertexAttribI2sv(GLuint index,const GLshort * v)1176 VertexAttribI2sv(GLuint index, const GLshort *v)
1177 {
1178 CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
1179 }
1180
1181 static void GLAPIENTRY
VertexAttribI3sv(GLuint index,const GLshort * v)1182 VertexAttribI3sv(GLuint index, const GLshort *v)
1183 {
1184 CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
1185 }
1186
1187 static void GLAPIENTRY
VertexAttribI4sv(GLuint index,const GLshort * v)1188 VertexAttribI4sv(GLuint index, const GLshort *v)
1189 {
1190 CALL_VertexAttribI4sv(GET_DISPATCH(), (index, v));
1191 }
1192
1193
1194 static void GLAPIENTRY
VertexAttribI1usv(GLuint index,const GLushort * v)1195 VertexAttribI1usv(GLuint index, const GLushort *v)
1196 {
1197 CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
1198 }
1199
1200 static void GLAPIENTRY
VertexAttribI2usv(GLuint index,const GLushort * v)1201 VertexAttribI2usv(GLuint index, const GLushort *v)
1202 {
1203 CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
1204 }
1205
1206 static void GLAPIENTRY
VertexAttribI3usv(GLuint index,const GLushort * v)1207 VertexAttribI3usv(GLuint index, const GLushort *v)
1208 {
1209 CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
1210 }
1211
1212 static void GLAPIENTRY
VertexAttribI4usv(GLuint index,const GLushort * v)1213 VertexAttribI4usv(GLuint index, const GLushort *v)
1214 {
1215 CALL_VertexAttribI4usv(GET_DISPATCH(), (index, v));
1216 }
1217
1218
1219
1220 static void GLAPIENTRY
VertexAttribI1iv(GLuint index,const GLint * v)1221 VertexAttribI1iv(GLuint index, const GLint *v)
1222 {
1223 CALL_VertexAttribI1iEXT(GET_DISPATCH(), (index, v[0]));
1224 }
1225
1226 static void GLAPIENTRY
VertexAttribI2iv(GLuint index,const GLint * v)1227 VertexAttribI2iv(GLuint index, const GLint *v)
1228 {
1229 CALL_VertexAttribI2iEXT(GET_DISPATCH(), (index, v[0], v[1]));
1230 }
1231
1232 static void GLAPIENTRY
VertexAttribI3iv(GLuint index,const GLint * v)1233 VertexAttribI3iv(GLuint index, const GLint *v)
1234 {
1235 CALL_VertexAttribI3iEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
1236 }
1237
1238 static void GLAPIENTRY
VertexAttribI4iv(GLuint index,const GLint * v)1239 VertexAttribI4iv(GLuint index, const GLint *v)
1240 {
1241 CALL_VertexAttribI4ivEXT(GET_DISPATCH(), (index, v));
1242 }
1243
1244
1245 static void GLAPIENTRY
VertexAttribI1uiv(GLuint index,const GLuint * v)1246 VertexAttribI1uiv(GLuint index, const GLuint *v)
1247 {
1248 CALL_VertexAttribI1uiEXT(GET_DISPATCH(), (index, v[0]));
1249 }
1250
1251 static void GLAPIENTRY
VertexAttribI2uiv(GLuint index,const GLuint * v)1252 VertexAttribI2uiv(GLuint index, const GLuint *v)
1253 {
1254 CALL_VertexAttribI2uiEXT(GET_DISPATCH(), (index, v[0], v[1]));
1255 }
1256
1257 static void GLAPIENTRY
VertexAttribI3uiv(GLuint index,const GLuint * v)1258 VertexAttribI3uiv(GLuint index, const GLuint *v)
1259 {
1260 CALL_VertexAttribI3uiEXT(GET_DISPATCH(), (index, v[0], v[1], v[2]));
1261 }
1262
1263 static void GLAPIENTRY
VertexAttribI4uiv(GLuint index,const GLuint * v)1264 VertexAttribI4uiv(GLuint index, const GLuint *v)
1265 {
1266 CALL_VertexAttribI4uivEXT(GET_DISPATCH(), (index, v));
1267 }
1268
1269 /* GL_DOUBLE unconverted attributes */
1270
1271 static void GLAPIENTRY
VertexAttribL1dv(GLuint index,const GLdouble * v)1272 VertexAttribL1dv(GLuint index, const GLdouble *v)
1273 {
1274 CALL_VertexAttribL1dv(GET_DISPATCH(), (index, v));
1275 }
1276
1277 static void GLAPIENTRY
VertexAttribL2dv(GLuint index,const GLdouble * v)1278 VertexAttribL2dv(GLuint index, const GLdouble *v)
1279 {
1280 CALL_VertexAttribL2dv(GET_DISPATCH(), (index, v));
1281 }
1282
1283 static void GLAPIENTRY
VertexAttribL3dv(GLuint index,const GLdouble * v)1284 VertexAttribL3dv(GLuint index, const GLdouble *v)
1285 {
1286 CALL_VertexAttribL3dv(GET_DISPATCH(), (index, v));
1287 }
1288
1289 static void GLAPIENTRY
VertexAttribL4dv(GLuint index,const GLdouble * v)1290 VertexAttribL4dv(GLuint index, const GLdouble *v)
1291 {
1292 CALL_VertexAttribL4dv(GET_DISPATCH(), (index, v));
1293 }
1294
1295 /*
1296 * Array [unnormalized/normalized/integer][size][type] of VertexAttrib
1297 * functions
1298 */
1299 static const attrib_func AttribFuncsARB[4][4][NUM_TYPES] = {
1300 {
1301 /* non-normalized */
1302 {
1303 /* size 1 */
1304 (attrib_func) VertexAttrib1bvARB,
1305 (attrib_func) VertexAttrib1ubvARB,
1306 (attrib_func) VertexAttrib1svARB,
1307 (attrib_func) VertexAttrib1usvARB,
1308 (attrib_func) VertexAttrib1ivARB,
1309 (attrib_func) VertexAttrib1uivARB,
1310 (attrib_func) VertexAttrib1fvARB,
1311 (attrib_func) VertexAttrib1dvARB
1312 },
1313 {
1314 /* size 2 */
1315 (attrib_func) VertexAttrib2bvARB,
1316 (attrib_func) VertexAttrib2ubvARB,
1317 (attrib_func) VertexAttrib2svARB,
1318 (attrib_func) VertexAttrib2usvARB,
1319 (attrib_func) VertexAttrib2ivARB,
1320 (attrib_func) VertexAttrib2uivARB,
1321 (attrib_func) VertexAttrib2fvARB,
1322 (attrib_func) VertexAttrib2dvARB
1323 },
1324 {
1325 /* size 3 */
1326 (attrib_func) VertexAttrib3bvARB,
1327 (attrib_func) VertexAttrib3ubvARB,
1328 (attrib_func) VertexAttrib3svARB,
1329 (attrib_func) VertexAttrib3usvARB,
1330 (attrib_func) VertexAttrib3ivARB,
1331 (attrib_func) VertexAttrib3uivARB,
1332 (attrib_func) VertexAttrib3fvARB,
1333 (attrib_func) VertexAttrib3dvARB
1334 },
1335 {
1336 /* size 4 */
1337 (attrib_func) VertexAttrib4bvARB,
1338 (attrib_func) VertexAttrib4ubvARB,
1339 (attrib_func) VertexAttrib4svARB,
1340 (attrib_func) VertexAttrib4usvARB,
1341 (attrib_func) VertexAttrib4ivARB,
1342 (attrib_func) VertexAttrib4uivARB,
1343 (attrib_func) VertexAttrib4fvARB,
1344 (attrib_func) VertexAttrib4dvARB
1345 }
1346 },
1347 {
1348 /* normalized (except for float/double) */
1349 {
1350 /* size 1 */
1351 (attrib_func) VertexAttrib1NbvARB,
1352 (attrib_func) VertexAttrib1NubvARB,
1353 (attrib_func) VertexAttrib1NsvARB,
1354 (attrib_func) VertexAttrib1NusvARB,
1355 (attrib_func) VertexAttrib1NivARB,
1356 (attrib_func) VertexAttrib1NuivARB,
1357 (attrib_func) VertexAttrib1fvARB,
1358 (attrib_func) VertexAttrib1dvARB
1359 },
1360 {
1361 /* size 2 */
1362 (attrib_func) VertexAttrib2NbvARB,
1363 (attrib_func) VertexAttrib2NubvARB,
1364 (attrib_func) VertexAttrib2NsvARB,
1365 (attrib_func) VertexAttrib2NusvARB,
1366 (attrib_func) VertexAttrib2NivARB,
1367 (attrib_func) VertexAttrib2NuivARB,
1368 (attrib_func) VertexAttrib2fvARB,
1369 (attrib_func) VertexAttrib2dvARB
1370 },
1371 {
1372 /* size 3 */
1373 (attrib_func) VertexAttrib3NbvARB,
1374 (attrib_func) VertexAttrib3NubvARB,
1375 (attrib_func) VertexAttrib3NsvARB,
1376 (attrib_func) VertexAttrib3NusvARB,
1377 (attrib_func) VertexAttrib3NivARB,
1378 (attrib_func) VertexAttrib3NuivARB,
1379 (attrib_func) VertexAttrib3fvARB,
1380 (attrib_func) VertexAttrib3dvARB
1381 },
1382 {
1383 /* size 4 */
1384 (attrib_func) VertexAttrib4NbvARB,
1385 (attrib_func) VertexAttrib4NubvARB,
1386 (attrib_func) VertexAttrib4NsvARB,
1387 (attrib_func) VertexAttrib4NusvARB,
1388 (attrib_func) VertexAttrib4NivARB,
1389 (attrib_func) VertexAttrib4NuivARB,
1390 (attrib_func) VertexAttrib4fvARB,
1391 (attrib_func) VertexAttrib4dvARB
1392 }
1393 },
1394
1395 {
1396 /* integer-valued */
1397 {
1398 /* size 1 */
1399 (attrib_func) VertexAttribI1bv,
1400 (attrib_func) VertexAttribI1ubv,
1401 (attrib_func) VertexAttribI1sv,
1402 (attrib_func) VertexAttribI1usv,
1403 (attrib_func) VertexAttribI1iv,
1404 (attrib_func) VertexAttribI1uiv,
1405 NULL, /* GL_FLOAT */
1406 NULL /* GL_DOUBLE */
1407 },
1408 {
1409 /* size 2 */
1410 (attrib_func) VertexAttribI2bv,
1411 (attrib_func) VertexAttribI2ubv,
1412 (attrib_func) VertexAttribI2sv,
1413 (attrib_func) VertexAttribI2usv,
1414 (attrib_func) VertexAttribI2iv,
1415 (attrib_func) VertexAttribI2uiv,
1416 NULL, /* GL_FLOAT */
1417 NULL /* GL_DOUBLE */
1418 },
1419 {
1420 /* size 3 */
1421 (attrib_func) VertexAttribI3bv,
1422 (attrib_func) VertexAttribI3ubv,
1423 (attrib_func) VertexAttribI3sv,
1424 (attrib_func) VertexAttribI3usv,
1425 (attrib_func) VertexAttribI3iv,
1426 (attrib_func) VertexAttribI3uiv,
1427 NULL, /* GL_FLOAT */
1428 NULL /* GL_DOUBLE */
1429 },
1430 {
1431 /* size 4 */
1432 (attrib_func) VertexAttribI4bv,
1433 (attrib_func) VertexAttribI4ubv,
1434 (attrib_func) VertexAttribI4sv,
1435 (attrib_func) VertexAttribI4usv,
1436 (attrib_func) VertexAttribI4iv,
1437 (attrib_func) VertexAttribI4uiv,
1438 NULL, /* GL_FLOAT */
1439 NULL /* GL_DOUBLE */
1440 }
1441 },
1442 {
1443 /* double-valued */
1444 {
1445 /* size 1 */
1446 NULL,
1447 NULL,
1448 NULL,
1449 NULL,
1450 NULL,
1451 NULL,
1452 NULL,
1453 (attrib_func) VertexAttribL1dv,
1454 },
1455 {
1456 /* size 2 */
1457 NULL,
1458 NULL,
1459 NULL,
1460 NULL,
1461 NULL,
1462 NULL,
1463 NULL,
1464 (attrib_func) VertexAttribL2dv,
1465 },
1466 {
1467 /* size 3 */
1468 NULL,
1469 NULL,
1470 NULL,
1471 NULL,
1472 NULL,
1473 NULL,
1474 NULL,
1475 (attrib_func) VertexAttribL3dv,
1476 },
1477 {
1478 /* size 4 */
1479 NULL,
1480 NULL,
1481 NULL,
1482 NULL,
1483 NULL,
1484 NULL,
1485 NULL,
1486 (attrib_func) VertexAttribL4dv,
1487 }
1488 }
1489
1490 };
1491
1492
1493 GLboolean
_ae_create_context(struct gl_context * ctx)1494 _ae_create_context(struct gl_context *ctx)
1495 {
1496 if (ctx->aelt_context)
1497 return GL_TRUE;
1498
1499 /* These _gloffset_* values may not be compile-time constants */
1500 SecondaryColorFuncs[0] = _gloffset_SecondaryColor3bv;
1501 SecondaryColorFuncs[1] = _gloffset_SecondaryColor3ubv;
1502 SecondaryColorFuncs[2] = _gloffset_SecondaryColor3sv;
1503 SecondaryColorFuncs[3] = _gloffset_SecondaryColor3usv;
1504 SecondaryColorFuncs[4] = _gloffset_SecondaryColor3iv;
1505 SecondaryColorFuncs[5] = _gloffset_SecondaryColor3uiv;
1506 SecondaryColorFuncs[6] = _gloffset_SecondaryColor3fvEXT;
1507 SecondaryColorFuncs[7] = _gloffset_SecondaryColor3dv;
1508
1509 FogCoordFuncs[0] = -1;
1510 FogCoordFuncs[1] = -1;
1511 FogCoordFuncs[2] = -1;
1512 FogCoordFuncs[3] = -1;
1513 FogCoordFuncs[4] = -1;
1514 FogCoordFuncs[5] = -1;
1515 FogCoordFuncs[6] = _gloffset_FogCoordfvEXT;
1516 FogCoordFuncs[7] = _gloffset_FogCoorddv;
1517
1518 ctx->aelt_context = calloc(1, sizeof(AEcontext));
1519 if (!ctx->aelt_context)
1520 return GL_FALSE;
1521
1522 AE_CONTEXT(ctx)->dirty_state = true;
1523 return GL_TRUE;
1524 }
1525
1526
1527 void
_ae_destroy_context(struct gl_context * ctx)1528 _ae_destroy_context(struct gl_context *ctx)
1529 {
1530 if (AE_CONTEXT(ctx)) {
1531 free(ctx->aelt_context);
1532 ctx->aelt_context = NULL;
1533 }
1534 }
1535
1536
1537 /**
1538 * Check if the given vertex buffer object exists and is not mapped.
1539 * If so, add it to the list of buffers we must map before executing
1540 * an glArrayElement call.
1541 */
1542 static void
check_vbo(AEcontext * actx,struct gl_buffer_object * vbo)1543 check_vbo(AEcontext *actx, struct gl_buffer_object *vbo)
1544 {
1545 if (_mesa_is_bufferobj(vbo) &&
1546 !_mesa_bufferobj_mapped(vbo, MAP_INTERNAL)) {
1547 GLuint i;
1548 for (i = 0; i < actx->nr_vbos; i++)
1549 if (actx->vbo[i] == vbo)
1550 return; /* already in the list, we're done */
1551 assert(actx->nr_vbos < VERT_ATTRIB_MAX);
1552 actx->vbo[actx->nr_vbos++] = vbo;
1553 }
1554 }
1555
1556
1557 /**
1558 * Make a list of per-vertex functions to call for each glArrayElement call.
1559 * These functions access the array data (i.e. glVertex, glColor, glNormal,
1560 * etc).
1561 * Note: this may be called during display list construction.
1562 */
1563 static void
_ae_update_state(struct gl_context * ctx)1564 _ae_update_state(struct gl_context *ctx)
1565 {
1566 AEcontext *actx = AE_CONTEXT(ctx);
1567 AEarray *aa = actx->arrays; /* non-indexed arrays (ex: glNormal) */
1568 AEattrib *at = actx->attribs; /* indexed arrays (ex: glMultiTexCoord) */
1569 GLuint i;
1570 struct gl_vertex_array_object *vao = ctx->Array.VAO;
1571
1572 actx->nr_vbos = 0;
1573
1574 /* conventional vertex arrays */
1575 if (vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX].Enabled) {
1576 aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR_INDEX];
1577 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1578 aa->offset = IndexFuncs[TYPE_IDX(aa->array->Type)];
1579 check_vbo(actx, aa->binding->BufferObj);
1580 aa++;
1581 }
1582
1583 if (vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG].Enabled) {
1584 aa->array = &vao->VertexAttrib[VERT_ATTRIB_EDGEFLAG];
1585 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1586 aa->offset = _gloffset_EdgeFlagv;
1587 check_vbo(actx, aa->binding->BufferObj);
1588 aa++;
1589 }
1590
1591 if (vao->VertexAttrib[VERT_ATTRIB_NORMAL].Enabled) {
1592 aa->array = &vao->VertexAttrib[VERT_ATTRIB_NORMAL];
1593 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1594 aa->offset = NormalFuncs[TYPE_IDX(aa->array->Type)];
1595 check_vbo(actx, aa->binding->BufferObj);
1596 aa++;
1597 }
1598
1599 if (vao->VertexAttrib[VERT_ATTRIB_COLOR0].Enabled) {
1600 aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR0];
1601 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1602 aa->offset = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
1603 check_vbo(actx, aa->binding->BufferObj);
1604 aa++;
1605 }
1606
1607 if (vao->VertexAttrib[VERT_ATTRIB_COLOR1].Enabled) {
1608 aa->array = &vao->VertexAttrib[VERT_ATTRIB_COLOR1];
1609 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1610 aa->offset = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
1611 check_vbo(actx, aa->binding->BufferObj);
1612 aa++;
1613 }
1614
1615 if (vao->VertexAttrib[VERT_ATTRIB_FOG].Enabled) {
1616 aa->array = &vao->VertexAttrib[VERT_ATTRIB_FOG];
1617 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1618 aa->offset = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
1619 check_vbo(actx, aa->binding->BufferObj);
1620 aa++;
1621 }
1622
1623 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
1624 struct gl_array_attributes *attribArray =
1625 &vao->VertexAttrib[VERT_ATTRIB_TEX(i)];
1626 if (attribArray->Enabled) {
1627 /* NOTE: we use generic glVertexAttribNV functions here.
1628 * If we ever remove GL_NV_vertex_program this will have to change.
1629 */
1630 at->array = attribArray;
1631 at->binding = &vao->BufferBinding[attribArray->BufferBindingIndex];
1632 assert(!at->array->Normalized);
1633 at->func = AttribFuncsNV[at->array->Normalized]
1634 [at->array->Size-1]
1635 [TYPE_IDX(at->array->Type)];
1636 at->index = VERT_ATTRIB_TEX0 + i;
1637 check_vbo(actx, at->binding->BufferObj);
1638 at++;
1639 }
1640 }
1641
1642 /* generic vertex attribute arrays */
1643 for (i = 1; i < VERT_ATTRIB_GENERIC_MAX; i++) { /* skip zero! */
1644 struct gl_array_attributes *attribArray =
1645 &vao->VertexAttrib[VERT_ATTRIB_GENERIC(i)];
1646 if (attribArray->Enabled) {
1647 GLint intOrNorm;
1648 at->array = attribArray;
1649 at->binding = &vao->BufferBinding[attribArray->BufferBindingIndex];
1650 /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
1651 * function pointer here (for float arrays) since the pointer may
1652 * change from one execution of _ae_ArrayElement() to
1653 * the next. Doing so caused UT to break.
1654 */
1655 if (at->array->Doubles)
1656 intOrNorm = 3;
1657 else if (at->array->Integer)
1658 intOrNorm = 2;
1659 else if (at->array->Normalized)
1660 intOrNorm = 1;
1661 else
1662 intOrNorm = 0;
1663
1664 at->func = AttribFuncsARB[intOrNorm]
1665 [at->array->Size-1]
1666 [TYPE_IDX(at->array->Type)];
1667
1668 at->index = i;
1669 check_vbo(actx, at->binding->BufferObj);
1670 at++;
1671 }
1672 }
1673
1674 /* finally, vertex position */
1675 if (vao->VertexAttrib[VERT_ATTRIB_GENERIC0].Enabled) {
1676 /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
1677 * issued as the last (provoking) attribute).
1678 */
1679 aa->array = &vao->VertexAttrib[VERT_ATTRIB_GENERIC0];
1680 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1681 assert(aa->array->Size >= 2); /* XXX fix someday? */
1682 aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
1683 check_vbo(actx, aa->binding->BufferObj);
1684 aa++;
1685 }
1686 else if (vao->VertexAttrib[VERT_ATTRIB_POS].Enabled) {
1687 aa->array = &vao->VertexAttrib[VERT_ATTRIB_POS];
1688 aa->binding = &vao->BufferBinding[aa->array->BufferBindingIndex];
1689 aa->offset = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
1690 check_vbo(actx, aa->binding->BufferObj);
1691 aa++;
1692 }
1693
1694 check_vbo(actx, vao->IndexBufferObj);
1695
1696 assert(at - actx->attribs <= VERT_ATTRIB_MAX);
1697 assert(aa - actx->arrays < 32);
1698 at->func = NULL; /* terminate the list */
1699 aa->offset = -1; /* terminate the list */
1700
1701 actx->dirty_state = false;
1702 }
1703
1704
1705 /**
1706 * Before replaying glArrayElements calls we need to map (for reading) any
1707 * VBOs referenced by the enabled vertex arrays.
1708 */
1709 void
_ae_map_vbos(struct gl_context * ctx)1710 _ae_map_vbos(struct gl_context *ctx)
1711 {
1712 AEcontext *actx = AE_CONTEXT(ctx);
1713 GLuint i;
1714
1715 if (actx->mapped_vbos)
1716 return;
1717
1718 if (actx->dirty_state)
1719 _ae_update_state(ctx);
1720
1721 for (i = 0; i < actx->nr_vbos; i++)
1722 ctx->Driver.MapBufferRange(ctx, 0,
1723 actx->vbo[i]->Size,
1724 GL_MAP_READ_BIT,
1725 actx->vbo[i],
1726 MAP_INTERNAL);
1727
1728 if (actx->nr_vbos)
1729 actx->mapped_vbos = GL_TRUE;
1730 }
1731
1732
1733 /**
1734 * Unmap VBOs
1735 */
1736 void
_ae_unmap_vbos(struct gl_context * ctx)1737 _ae_unmap_vbos(struct gl_context *ctx)
1738 {
1739 AEcontext *actx = AE_CONTEXT(ctx);
1740 GLuint i;
1741
1742 if (!actx->mapped_vbos)
1743 return;
1744
1745 assert (!actx->dirty_state);
1746
1747 for (i = 0; i < actx->nr_vbos; i++)
1748 ctx->Driver.UnmapBuffer(ctx, actx->vbo[i], MAP_INTERNAL);
1749
1750 actx->mapped_vbos = GL_FALSE;
1751 }
1752
1753
1754 /**
1755 * Called via glArrayElement() and glDrawArrays().
1756 * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions
1757 * for all enabled vertex arrays (for elt-th element).
1758 * Note: this may be called during display list construction.
1759 */
1760 void GLAPIENTRY
_ae_ArrayElement(GLint elt)1761 _ae_ArrayElement(GLint elt)
1762 {
1763 GET_CURRENT_CONTEXT(ctx);
1764 const AEcontext *actx = AE_CONTEXT(ctx);
1765 const AEarray *aa;
1766 const AEattrib *at;
1767 const struct _glapi_table * const disp = GET_DISPATCH();
1768 GLboolean do_map;
1769
1770 /* If PrimitiveRestart is enabled and the index is the RestartIndex
1771 * then we call PrimitiveRestartNV and return.
1772 */
1773 if (ctx->Array.PrimitiveRestart && (elt == ctx->Array.RestartIndex)) {
1774 CALL_PrimitiveRestartNV((struct _glapi_table *)disp, ());
1775 return;
1776 }
1777
1778 if (actx->dirty_state) {
1779 assert(!actx->mapped_vbos);
1780 _ae_update_state(ctx);
1781 }
1782
1783 /* Determine if we need to map/unmap VBOs */
1784 do_map = actx->nr_vbos && !actx->mapped_vbos;
1785
1786 if (do_map)
1787 _ae_map_vbos(ctx);
1788
1789 /* emit generic attribute elements */
1790 for (at = actx->attribs; at->func; at++) {
1791 const GLubyte *src
1792 = ADD_POINTERS(at->binding->BufferObj->Mappings[MAP_INTERNAL].Pointer,
1793 _mesa_vertex_attrib_address(at->array, at->binding))
1794 + elt * at->binding->Stride;
1795 at->func(at->index, src);
1796 }
1797
1798 /* emit conventional arrays elements */
1799 for (aa = actx->arrays; aa->offset != -1 ; aa++) {
1800 const GLubyte *src
1801 = ADD_POINTERS(aa->binding->BufferObj->Mappings[MAP_INTERNAL].Pointer,
1802 _mesa_vertex_attrib_address(aa->array, aa->binding))
1803 + elt * aa->binding->Stride;
1804 CALL_by_offset(disp, (array_func), aa->offset, ((const void *) src));
1805 }
1806
1807 if (do_map)
1808 _ae_unmap_vbos(ctx);
1809 }
1810
1811
1812 void
_ae_invalidate_state(struct gl_context * ctx)1813 _ae_invalidate_state(struct gl_context *ctx)
1814 {
1815 AEcontext *actx = AE_CONTEXT(ctx);
1816
1817 /* Only interested in this subset of mesa state. Need to prune
1818 * this down as both tnl/ and the drivers can raise statechanges
1819 * for arcane reasons in the middle of seemingly atomic operations
1820 * like DrawElements, over which we'd like to keep a known set of
1821 * arrays and vbo's mapped.
1822 *
1823 * Luckily, neither the drivers nor tnl muck with the state that
1824 * concerns us here:
1825 */
1826 assert(ctx->NewState & (_NEW_ARRAY | _NEW_PROGRAM));
1827
1828 assert(!actx->mapped_vbos);
1829 actx->dirty_state = true;
1830 }
1831
1832
1833 void
_mesa_install_arrayelt_vtxfmt(struct _glapi_table * disp,const GLvertexformat * vfmt)1834 _mesa_install_arrayelt_vtxfmt(struct _glapi_table *disp,
1835 const GLvertexformat *vfmt)
1836 {
1837 SET_ArrayElement(disp, vfmt->ArrayElement);
1838 }
1839