Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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