blob: a127fe04ada83a8fc7ad9cfa9cc01d2579b8e1c7 [file] [log] [blame]
Gareth Hughes22144ab2001-03-12 00:48:37 +00001/*
2 * Mesa 3-D graphics library
Brian Paul0d4393a2004-02-11 22:53:38 +00003 * Version: 6.1
Gareth Hughes22144ab2001-03-12 00:48:37 +00004 *
Brian Paul0d4393a2004-02-11 22:53:38 +00005 * Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
Gareth Hughes22144ab2001-03-12 00:48:37 +00006 *
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
Keith Whitwellfc00cbe2001-12-20 15:30:45 +000025/* Author:
Brian Paul05a4b372002-10-29 20:28:36 +000026 * Keith Whitwell <keith@tungstengraphics.com>
Keith Whitwellfc00cbe2001-12-20 15:30:45 +000027 */
28
Keith Whitwellcab974c2000-12-26 05:09:27 +000029#include "glheader.h"
Keith Whitwell4b7d6f22001-06-01 22:22:10 +000030#include "api_arrayelt.h"
Keith Whitwellcab974c2000-12-26 05:09:27 +000031#include "context.h"
Keith Whitwellfc00cbe2001-12-20 15:30:45 +000032#include "glapi.h"
Brian Paul3c634522002-10-24 23:57:19 +000033#include "imports.h"
Keith Whitwellcab974c2000-12-26 05:09:27 +000034#include "macros.h"
Keith Whitwellcab974c2000-12-26 05:09:27 +000035#include "mtypes.h"
36
Karl Schultzb72902e2004-01-28 22:24:12 +000037typedef void (GLAPIENTRY *array_func)( const void * );
Keith Whitwellcab974c2000-12-26 05:09:27 +000038
39typedef struct {
Brian Paul0d4393a2004-02-11 22:53:38 +000040 const struct gl_client_array *array;
Gareth Hughes1fb0a432001-12-28 06:28:10 +000041 array_func func;
Keith Whitwell4b7d6f22001-06-01 22:22:10 +000042} AEarray;
Keith Whitwellcab974c2000-12-26 05:09:27 +000043
Brian Paul0d4393a2004-02-11 22:53:38 +000044typedef void (GLAPIENTRY *attrib_func)( GLuint indx, const void *data );
45
Keith Whitwellcab974c2000-12-26 05:09:27 +000046typedef struct {
Brian Paul0d4393a2004-02-11 22:53:38 +000047 const struct gl_client_array *array;
48 attrib_func func;
49 GLuint index;
50} AEattrib;
51
52typedef struct {
Brian Paul53ad0362004-02-09 00:24:48 +000053 AEarray arrays[32];
Brian Paul0d4393a2004-02-11 22:53:38 +000054 AEattrib attribs[VERT_ATTRIB_MAX + 1];
Keith Whitwellcab974c2000-12-26 05:09:27 +000055 GLuint NewState;
Keith Whitwell4b7d6f22001-06-01 22:22:10 +000056} AEcontext;
Keith Whitwellcab974c2000-12-26 05:09:27 +000057
Keith Whitwell4b7d6f22001-06-01 22:22:10 +000058#define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
Brian Paul0d4393a2004-02-11 22:53:38 +000059
60/*
61 * Convert GL_BYTE, GL_UNSIGNED_BYTE, .. GL_DOUBLE into an integer
62 * in the range [0, 7]. Luckily these type tokens are sequentially
Brian Paulf2f33502004-04-23 17:58:06 +000063 * numbered in gl.h, except for GL_DOUBLE.
Brian Paul0d4393a2004-02-11 22:53:38 +000064 */
Brian Paulf2f33502004-04-23 17:58:06 +000065#define TYPE_IDX(t) ( (t) == GL_DOUBLE ? 7 : (t) & 7 )
Keith Whitwellcab974c2000-12-26 05:09:27 +000066
Brian Paul0d4393a2004-02-11 22:53:38 +000067
Brian Paul2615e812004-02-24 14:47:01 +000068static array_func ColorFuncs[2][8] = {
Brian Paul53ad0362004-02-09 00:24:48 +000069 { (array_func)glColor3bv,
70 (array_func)glColor3ubv,
71 (array_func)glColor3sv,
72 (array_func)glColor3usv,
73 (array_func)glColor3iv,
74 (array_func)glColor3uiv,
75 (array_func)glColor3fv,
76 (array_func)glColor3dv },
77
78 { (array_func)glColor4bv,
79 (array_func)glColor4ubv,
80 (array_func)glColor4sv,
81 (array_func)glColor4usv,
82 (array_func)glColor4iv,
83 (array_func)glColor4uiv,
84 (array_func)glColor4fv,
85 (array_func)glColor4dv }
86};
87
Brian Paul2615e812004-02-24 14:47:01 +000088static array_func VertexFuncs[3][8] = {
Brian Paul53ad0362004-02-09 00:24:48 +000089 { 0,
90 0,
91 (array_func)glVertex2sv,
92 0,
93 (array_func)glVertex2iv,
94 0,
95 (array_func)glVertex2fv,
96 (array_func)glVertex2dv },
97
98 { 0,
99 0,
100 (array_func)glVertex3sv,
101 0,
102 (array_func)glVertex3iv,
103 0,
104 (array_func)glVertex3fv,
105 (array_func)glVertex3dv },
106
107 { 0,
108 0,
109 (array_func)glVertex4sv,
110 0,
111 (array_func)glVertex4iv,
112 0,
113 (array_func)glVertex4fv,
114 (array_func)glVertex4dv }
115};
116
Brian Paul2615e812004-02-24 14:47:01 +0000117static array_func IndexFuncs[8] = {
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000118 0,
Gareth Hughes1fb0a432001-12-28 06:28:10 +0000119 (array_func)glIndexubv,
120 (array_func)glIndexsv,
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000121 0,
Gareth Hughes1fb0a432001-12-28 06:28:10 +0000122 (array_func)glIndexiv,
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000123 0,
Gareth Hughes1fb0a432001-12-28 06:28:10 +0000124 (array_func)glIndexfv,
125 (array_func)glIndexdv
Keith Whitwellcab974c2000-12-26 05:09:27 +0000126};
127
Brian Paul2615e812004-02-24 14:47:01 +0000128static array_func NormalFuncs[8] = {
Brian Paul53ad0362004-02-09 00:24:48 +0000129 (array_func)glNormal3bv,
130 0,
131 (array_func)glNormal3sv,
132 0,
133 (array_func)glNormal3iv,
134 0,
135 (array_func)glNormal3fv,
136 (array_func)glNormal3dv,
137};
138
139
140/* Wrapper functions in case glSecondaryColor*EXT doesn't exist */
Brian Paul2615e812004-02-24 14:47:01 +0000141static void GLAPIENTRY SecondaryColor3bvEXT(const GLbyte *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000142{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000143 GL_CALL(SecondaryColor3bvEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000144}
145
Brian Paul2615e812004-02-24 14:47:01 +0000146static void GLAPIENTRY SecondaryColor3ubvEXT(const GLubyte *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000147{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000148 GL_CALL(SecondaryColor3ubvEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000149}
150
Brian Paul2615e812004-02-24 14:47:01 +0000151static void GLAPIENTRY SecondaryColor3svEXT(const GLshort *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000152{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000153 GL_CALL(SecondaryColor3svEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000154}
155
Brian Paul2615e812004-02-24 14:47:01 +0000156static void GLAPIENTRY SecondaryColor3usvEXT(const GLushort *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000157{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000158 GL_CALL(SecondaryColor3usvEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000159}
160
Brian Paul2615e812004-02-24 14:47:01 +0000161static void GLAPIENTRY SecondaryColor3ivEXT(const GLint *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000162{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000163 GL_CALL(SecondaryColor3ivEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000164}
165
Brian Paul2615e812004-02-24 14:47:01 +0000166static void GLAPIENTRY SecondaryColor3uivEXT(const GLuint *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000167{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000168 GL_CALL(SecondaryColor3uivEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000169}
170
Brian Paul2615e812004-02-24 14:47:01 +0000171static void GLAPIENTRY SecondaryColor3fvEXT(const GLfloat *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000172{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000173 GL_CALL(SecondaryColor3fvEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000174}
175
Brian Paul2615e812004-02-24 14:47:01 +0000176static void GLAPIENTRY SecondaryColor3dvEXT(const GLdouble *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000177{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000178 GL_CALL(SecondaryColor3dvEXT)(c);
Brian Paul53ad0362004-02-09 00:24:48 +0000179}
180
Brian Paul2615e812004-02-24 14:47:01 +0000181static array_func SecondaryColorFuncs[8] = {
Brian Paul53ad0362004-02-09 00:24:48 +0000182 (array_func) SecondaryColor3bvEXT,
183 (array_func) SecondaryColor3ubvEXT,
184 (array_func) SecondaryColor3svEXT,
185 (array_func) SecondaryColor3usvEXT,
186 (array_func) SecondaryColor3ivEXT,
187 (array_func) SecondaryColor3uivEXT,
188 (array_func) SecondaryColor3fvEXT,
189 (array_func) SecondaryColor3dvEXT,
190};
191
192
193/* Again, wrapper functions in case glSecondaryColor*EXT doesn't exist */
Brian Paul2615e812004-02-24 14:47:01 +0000194static void GLAPIENTRY FogCoordfvEXT(const GLfloat *f)
Brian Paul53ad0362004-02-09 00:24:48 +0000195{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000196 GL_CALL(FogCoordfvEXT)(f);
Brian Paul53ad0362004-02-09 00:24:48 +0000197}
198
Brian Paul2615e812004-02-24 14:47:01 +0000199static void GLAPIENTRY FogCoorddvEXT(const GLdouble *f)
Brian Paul53ad0362004-02-09 00:24:48 +0000200{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000201 GL_CALL(FogCoorddvEXT)(f);
Brian Paul53ad0362004-02-09 00:24:48 +0000202}
203
Brian Paul2615e812004-02-24 14:47:01 +0000204static array_func FogCoordFuncs[8] = {
Brian Paul53ad0362004-02-09 00:24:48 +0000205 0,
206 0,
207 0,
208 0,
209 0,
210 0,
211 (array_func) FogCoordfvEXT,
212 (array_func) FogCoorddvEXT
213};
214
Keith Whitwellcab974c2000-12-26 05:09:27 +0000215
Brian Paul0d4393a2004-02-11 22:53:38 +0000216/**********************************************************************/
217
218/* GL_BYTE attributes */
219
Brian Paul2615e812004-02-24 14:47:01 +0000220static void GLAPIENTRY VertexAttrib1Nbv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000221{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000222 GL_CALL(VertexAttrib1fNV)(index, BYTE_TO_FLOAT(v[0]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000223}
224
Brian Paul2615e812004-02-24 14:47:01 +0000225static void GLAPIENTRY VertexAttrib1bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000226{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000227 GL_CALL(VertexAttrib1fNV)(index, v[0]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000228}
229
Brian Paul2615e812004-02-24 14:47:01 +0000230static void GLAPIENTRY VertexAttrib2Nbv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000231{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000232 GL_CALL(VertexAttrib2fNV)(index, BYTE_TO_FLOAT(v[0]), BYTE_TO_FLOAT(v[1]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000233}
234
Brian Paul2615e812004-02-24 14:47:01 +0000235static void GLAPIENTRY VertexAttrib2bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000236{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000237 GL_CALL(VertexAttrib2fNV)(index, v[0], v[1]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000238}
239
Brian Paul2615e812004-02-24 14:47:01 +0000240static void GLAPIENTRY VertexAttrib3Nbv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000241{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000242 GL_CALL(VertexAttrib3fNV)(index, BYTE_TO_FLOAT(v[0]),
243 BYTE_TO_FLOAT(v[1]),
244 BYTE_TO_FLOAT(v[2]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000245}
246
Brian Paul2615e812004-02-24 14:47:01 +0000247static void GLAPIENTRY VertexAttrib3bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000248{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000249 GL_CALL(VertexAttrib3fNV)(index, v[0], v[1], v[2]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000250}
251
Brian Paul2615e812004-02-24 14:47:01 +0000252static void GLAPIENTRY VertexAttrib4Nbv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000253{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000254 GL_CALL(VertexAttrib4fNV)(index, BYTE_TO_FLOAT(v[0]),
255 BYTE_TO_FLOAT(v[1]),
256 BYTE_TO_FLOAT(v[2]),
257 BYTE_TO_FLOAT(v[3]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000258}
259
Brian Paul2615e812004-02-24 14:47:01 +0000260static void GLAPIENTRY VertexAttrib4bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000261{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000262 GL_CALL(VertexAttrib4fNV)(index, v[0], v[1], v[2], v[3]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000263}
264
265/* GL_UNSIGNED_BYTE attributes */
266
Brian Paul2615e812004-02-24 14:47:01 +0000267static void GLAPIENTRY VertexAttrib1Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000268{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000269 GL_CALL(VertexAttrib1fNV)(index, UBYTE_TO_FLOAT(v[0]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000270}
271
Brian Paul2615e812004-02-24 14:47:01 +0000272static void GLAPIENTRY VertexAttrib1ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000273{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000274 GL_CALL(VertexAttrib1fNV)(index, v[0]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000275}
276
Brian Paul2615e812004-02-24 14:47:01 +0000277static void GLAPIENTRY VertexAttrib2Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000278{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000279 GL_CALL(VertexAttrib2fNV)(index, UBYTE_TO_FLOAT(v[0]),
280 UBYTE_TO_FLOAT(v[1]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000281}
282
Brian Paul2615e812004-02-24 14:47:01 +0000283static void GLAPIENTRY VertexAttrib2ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000284{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000285 GL_CALL(VertexAttrib2fNV)(index, v[0], v[1]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000286}
287
Brian Paul2615e812004-02-24 14:47:01 +0000288static void GLAPIENTRY VertexAttrib3Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000289{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000290 GL_CALL(VertexAttrib3fNV)(index, UBYTE_TO_FLOAT(v[0]),
291 UBYTE_TO_FLOAT(v[1]),
292 UBYTE_TO_FLOAT(v[2]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000293}
Brian Paul2615e812004-02-24 14:47:01 +0000294static void GLAPIENTRY VertexAttrib3ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000295{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000296 GL_CALL(VertexAttrib3fNV)(index, v[0], v[1], v[2]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000297}
298
Brian Paul2615e812004-02-24 14:47:01 +0000299static void GLAPIENTRY VertexAttrib4Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000300{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000301 GL_CALL(VertexAttrib4fNV)(index, UBYTE_TO_FLOAT(v[0]),
Brian Paul0d4393a2004-02-11 22:53:38 +0000302 UBYTE_TO_FLOAT(v[1]),
303 UBYTE_TO_FLOAT(v[2]),
304 UBYTE_TO_FLOAT(v[3]));
305}
306
Brian Paul2615e812004-02-24 14:47:01 +0000307static void GLAPIENTRY VertexAttrib4ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000308{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000309 GL_CALL(VertexAttrib4fNV)(index, v[0], v[1], v[2], v[3]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000310}
311
312/* GL_SHORT attributes */
313
Brian Paul2615e812004-02-24 14:47:01 +0000314static void GLAPIENTRY VertexAttrib1Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000315{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000316 GL_CALL(VertexAttrib1fNV)(index, SHORT_TO_FLOAT(v[0]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000317}
318
Brian Paul2615e812004-02-24 14:47:01 +0000319static void GLAPIENTRY VertexAttrib1sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000320{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000321 GL_CALL(VertexAttrib1fNV)(index, v[0]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000322}
323
Brian Paul2615e812004-02-24 14:47:01 +0000324static void GLAPIENTRY VertexAttrib2Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000325{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000326 GL_CALL(VertexAttrib2fNV)(index, SHORT_TO_FLOAT(v[0]),
327 SHORT_TO_FLOAT(v[1]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000328}
329
Brian Paul2615e812004-02-24 14:47:01 +0000330static void GLAPIENTRY VertexAttrib2sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000331{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000332 GL_CALL(VertexAttrib2fNV)(index, v[0], v[1]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000333}
334
Brian Paul2615e812004-02-24 14:47:01 +0000335static void GLAPIENTRY VertexAttrib3Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000336{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000337 GL_CALL(VertexAttrib3fNV)(index, SHORT_TO_FLOAT(v[0]),
338 SHORT_TO_FLOAT(v[1]),
339 SHORT_TO_FLOAT(v[2]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000340}
341
Brian Paul2615e812004-02-24 14:47:01 +0000342static void GLAPIENTRY VertexAttrib3sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000343{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000344 GL_CALL(VertexAttrib3fNV)(index, v[0], v[1], v[2]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000345}
346
Brian Paul2615e812004-02-24 14:47:01 +0000347static void GLAPIENTRY VertexAttrib4Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000348{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000349 GL_CALL(VertexAttrib4fNV)(index, SHORT_TO_FLOAT(v[0]),
350 SHORT_TO_FLOAT(v[1]),
351 SHORT_TO_FLOAT(v[2]),
352 SHORT_TO_FLOAT(v[3]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000353}
354
Brian Paul2615e812004-02-24 14:47:01 +0000355static void GLAPIENTRY VertexAttrib4sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000356{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000357 GL_CALL(VertexAttrib4fNV)(index, v[0], v[1], v[2], v[3]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000358}
359
360/* GL_UNSIGNED_SHORT attributes */
361
Brian Paul2615e812004-02-24 14:47:01 +0000362static void GLAPIENTRY VertexAttrib1Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000363{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000364 GL_CALL(VertexAttrib1fNV)(index, USHORT_TO_FLOAT(v[0]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000365}
366
Brian Paul2615e812004-02-24 14:47:01 +0000367static void GLAPIENTRY VertexAttrib1usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000368{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000369 GL_CALL(VertexAttrib1fNV)(index, v[0]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000370}
371
Brian Paul2615e812004-02-24 14:47:01 +0000372static void GLAPIENTRY VertexAttrib2Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000373{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000374 GL_CALL(VertexAttrib2fNV)(index, USHORT_TO_FLOAT(v[0]),
375 USHORT_TO_FLOAT(v[1]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000376}
377
Brian Paul2615e812004-02-24 14:47:01 +0000378static void GLAPIENTRY VertexAttrib2usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000379{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000380 GL_CALL(VertexAttrib2fNV)(index, v[0], v[1]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000381}
382
Brian Paul2615e812004-02-24 14:47:01 +0000383static void GLAPIENTRY VertexAttrib3Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000384{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000385 GL_CALL(VertexAttrib3fNV)(index, USHORT_TO_FLOAT(v[0]),
386 USHORT_TO_FLOAT(v[1]),
387 USHORT_TO_FLOAT(v[2]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000388}
389
Brian Paul2615e812004-02-24 14:47:01 +0000390static void GLAPIENTRY VertexAttrib3usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000391{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000392 GL_CALL(VertexAttrib3fNV)(index, v[0], v[1], v[2]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000393}
394
Brian Paul2615e812004-02-24 14:47:01 +0000395static void GLAPIENTRY VertexAttrib4Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000396{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000397 GL_CALL(VertexAttrib4fNV)(index, USHORT_TO_FLOAT(v[0]),
398 USHORT_TO_FLOAT(v[1]),
399 USHORT_TO_FLOAT(v[2]),
400 USHORT_TO_FLOAT(v[3]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000401}
402
Brian Paul2615e812004-02-24 14:47:01 +0000403static void GLAPIENTRY VertexAttrib4usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000404{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000405 GL_CALL(VertexAttrib4fNV)(index, v[0], v[1], v[2], v[3]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000406}
407
408/* GL_INT attributes */
409
Brian Paul2615e812004-02-24 14:47:01 +0000410static void GLAPIENTRY VertexAttrib1Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000411{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000412 GL_CALL(VertexAttrib1fNV)(index, INT_TO_FLOAT(v[0]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000413}
414
Brian Paul2615e812004-02-24 14:47:01 +0000415static void GLAPIENTRY VertexAttrib1iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000416{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000417 GL_CALL(VertexAttrib1fNV)(index, v[0]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000418}
419
Brian Paul2615e812004-02-24 14:47:01 +0000420static void GLAPIENTRY VertexAttrib2Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000421{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000422 GL_CALL(VertexAttrib2fNV)(index, INT_TO_FLOAT(v[0]),
423 INT_TO_FLOAT(v[1]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000424}
425
Brian Paul2615e812004-02-24 14:47:01 +0000426static void GLAPIENTRY VertexAttrib2iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000427{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000428 GL_CALL(VertexAttrib2fNV)(index, v[0], v[1]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000429}
430
Brian Paul2615e812004-02-24 14:47:01 +0000431static void GLAPIENTRY VertexAttrib3Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000432{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000433 GL_CALL(VertexAttrib3fNV)(index, INT_TO_FLOAT(v[0]),
434 INT_TO_FLOAT(v[1]),
435 INT_TO_FLOAT(v[2]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000436}
437
Brian Paul2615e812004-02-24 14:47:01 +0000438static void GLAPIENTRY VertexAttrib3iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000439{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000440 GL_CALL(VertexAttrib3fNV)(index, v[0], v[1], v[2]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000441}
442
Brian Paul2615e812004-02-24 14:47:01 +0000443static void GLAPIENTRY VertexAttrib4Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000444{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000445 GL_CALL(VertexAttrib4fNV)(index, INT_TO_FLOAT(v[0]),
446 INT_TO_FLOAT(v[1]),
447 INT_TO_FLOAT(v[2]),
448 INT_TO_FLOAT(v[3]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000449}
450
Brian Paul2615e812004-02-24 14:47:01 +0000451static void GLAPIENTRY VertexAttrib4iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000452{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000453 GL_CALL(VertexAttrib4fNV)(index, v[0], v[1], v[2], v[3]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000454}
455
456/* GL_UNSIGNED_INT attributes */
457
Brian Paul2615e812004-02-24 14:47:01 +0000458static void GLAPIENTRY VertexAttrib1Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000459{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000460 GL_CALL(VertexAttrib1fNV)(index, UINT_TO_FLOAT(v[0]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000461}
462
Brian Paul2615e812004-02-24 14:47:01 +0000463static void GLAPIENTRY VertexAttrib1uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000464{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000465 GL_CALL(VertexAttrib1fNV)(index, v[0]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000466}
467
Brian Paul2615e812004-02-24 14:47:01 +0000468static void GLAPIENTRY VertexAttrib2Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000469{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000470 GL_CALL(VertexAttrib2fNV)(index, UINT_TO_FLOAT(v[0]),
471 UINT_TO_FLOAT(v[1]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000472}
473
Brian Paul2615e812004-02-24 14:47:01 +0000474static void GLAPIENTRY VertexAttrib2uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000475{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000476 GL_CALL(VertexAttrib2fNV)(index, v[0], v[1]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000477}
478
Brian Paul2615e812004-02-24 14:47:01 +0000479static void GLAPIENTRY VertexAttrib3Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000480{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000481 GL_CALL(VertexAttrib3fNV)(index, UINT_TO_FLOAT(v[0]),
482 UINT_TO_FLOAT(v[1]),
483 UINT_TO_FLOAT(v[2]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000484}
485
Brian Paul2615e812004-02-24 14:47:01 +0000486static void GLAPIENTRY VertexAttrib3uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000487{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000488 GL_CALL(VertexAttrib3fNV)(index, v[0], v[1], v[2]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000489}
490
Brian Paul2615e812004-02-24 14:47:01 +0000491static void GLAPIENTRY VertexAttrib4Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000492{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000493 GL_CALL(VertexAttrib4fNV)(index, UINT_TO_FLOAT(v[0]),
494 UINT_TO_FLOAT(v[1]),
495 UINT_TO_FLOAT(v[2]),
496 UINT_TO_FLOAT(v[3]));
Brian Paul0d4393a2004-02-11 22:53:38 +0000497}
498
Brian Paul2615e812004-02-24 14:47:01 +0000499static void GLAPIENTRY VertexAttrib4uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000500{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000501 GL_CALL(VertexAttrib4fNV)(index, v[0], v[1], v[2], v[3]);
Brian Paul0d4393a2004-02-11 22:53:38 +0000502}
503
504/* GL_FLOAT attributes */
505
Brian Paul2615e812004-02-24 14:47:01 +0000506static void GLAPIENTRY VertexAttrib1fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000507{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000508 GL_CALL(VertexAttrib1fvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000509}
510
Brian Paul2615e812004-02-24 14:47:01 +0000511static void GLAPIENTRY VertexAttrib2fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000512{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000513 GL_CALL(VertexAttrib2fvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000514}
515
Brian Paul2615e812004-02-24 14:47:01 +0000516static void GLAPIENTRY VertexAttrib3fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000517{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000518 GL_CALL(VertexAttrib3fvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000519}
520
Brian Paul2615e812004-02-24 14:47:01 +0000521static void GLAPIENTRY VertexAttrib4fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000522{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000523 GL_CALL(VertexAttrib4fvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000524}
525
526/* GL_DOUBLE attributes */
527
Brian Paul2615e812004-02-24 14:47:01 +0000528static void GLAPIENTRY VertexAttrib1dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000529{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000530 GL_CALL(VertexAttrib1dvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000531}
532
Brian Paul2615e812004-02-24 14:47:01 +0000533static void GLAPIENTRY VertexAttrib2dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000534{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000535 GL_CALL(VertexAttrib2dvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000536}
537
Brian Paul2615e812004-02-24 14:47:01 +0000538static void GLAPIENTRY VertexAttrib3dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000539{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000540 GL_CALL(VertexAttrib3dvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000541}
542
Brian Paul2615e812004-02-24 14:47:01 +0000543static void GLAPIENTRY VertexAttrib4dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000544{
Ian Romanickc1d455f2004-05-27 00:03:53 +0000545 GL_CALL(VertexAttrib4dvNV)(index, v);
Brian Paul0d4393a2004-02-11 22:53:38 +0000546}
547
548
549/*
550 * Array [size][type] of VertexAttrib functions
551 */
Brian Paul2615e812004-02-24 14:47:01 +0000552static attrib_func AttribFuncs[2][4][8] = {
Brian Paul0d4393a2004-02-11 22:53:38 +0000553 {
554 /* non-normalized */
555 {
556 /* size 1 */
557 (attrib_func) VertexAttrib1bv,
558 (attrib_func) VertexAttrib1ubv,
559 (attrib_func) VertexAttrib1sv,
560 (attrib_func) VertexAttrib1usv,
561 (attrib_func) VertexAttrib1iv,
562 (attrib_func) VertexAttrib1uiv,
563 (attrib_func) VertexAttrib1fv,
564 (attrib_func) VertexAttrib1dv
565 },
566 {
567 /* size 2 */
568 (attrib_func) VertexAttrib2bv,
569 (attrib_func) VertexAttrib2ubv,
570 (attrib_func) VertexAttrib2sv,
571 (attrib_func) VertexAttrib2usv,
572 (attrib_func) VertexAttrib2iv,
573 (attrib_func) VertexAttrib2uiv,
574 (attrib_func) VertexAttrib2fv,
575 (attrib_func) VertexAttrib2dv
576 },
577 {
578 /* size 3 */
579 (attrib_func) VertexAttrib3bv,
580 (attrib_func) VertexAttrib3ubv,
581 (attrib_func) VertexAttrib3sv,
582 (attrib_func) VertexAttrib3usv,
583 (attrib_func) VertexAttrib3iv,
584 (attrib_func) VertexAttrib3uiv,
585 (attrib_func) VertexAttrib3fv,
586 (attrib_func) VertexAttrib3dv
587 },
588 {
589 /* size 4 */
590 (attrib_func) VertexAttrib4bv,
591 (attrib_func) VertexAttrib4ubv,
592 (attrib_func) VertexAttrib4sv,
593 (attrib_func) VertexAttrib4usv,
594 (attrib_func) VertexAttrib4iv,
595 (attrib_func) VertexAttrib4uiv,
596 (attrib_func) VertexAttrib4fv,
597 (attrib_func) VertexAttrib4dv
598 }
599 },
600 {
601 /* normalized (except for float/double) */
602 {
603 /* size 1 */
604 (attrib_func) VertexAttrib1Nbv,
605 (attrib_func) VertexAttrib1Nubv,
606 (attrib_func) VertexAttrib1Nsv,
607 (attrib_func) VertexAttrib1Nusv,
608 (attrib_func) VertexAttrib1Niv,
609 (attrib_func) VertexAttrib1Nuiv,
610 (attrib_func) VertexAttrib1fv,
611 (attrib_func) VertexAttrib1dv
612 },
613 {
614 /* size 2 */
615 (attrib_func) VertexAttrib2Nbv,
616 (attrib_func) VertexAttrib2Nubv,
617 (attrib_func) VertexAttrib2Nsv,
618 (attrib_func) VertexAttrib2Nusv,
619 (attrib_func) VertexAttrib2Niv,
620 (attrib_func) VertexAttrib2Nuiv,
621 (attrib_func) VertexAttrib2fv,
622 (attrib_func) VertexAttrib2dv
623 },
624 {
625 /* size 3 */
626 (attrib_func) VertexAttrib3Nbv,
627 (attrib_func) VertexAttrib3Nubv,
628 (attrib_func) VertexAttrib3Nsv,
629 (attrib_func) VertexAttrib3Nusv,
630 (attrib_func) VertexAttrib3Niv,
631 (attrib_func) VertexAttrib3Nuiv,
632 (attrib_func) VertexAttrib3fv,
633 (attrib_func) VertexAttrib3dv
634 },
635 {
636 /* size 4 */
637 (attrib_func) VertexAttrib4Nbv,
638 (attrib_func) VertexAttrib4Nubv,
639 (attrib_func) VertexAttrib4Nsv,
640 (attrib_func) VertexAttrib4Nusv,
641 (attrib_func) VertexAttrib4Niv,
642 (attrib_func) VertexAttrib4Nuiv,
643 (attrib_func) VertexAttrib4fv,
644 (attrib_func) VertexAttrib4dv
645 }
646 }
647};
648
649/**********************************************************************/
650
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000651
652GLboolean _ae_create_context( GLcontext *ctx )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000653{
Keith Whitwellae0eaf92003-11-24 15:23:18 +0000654 if (ctx->aelt_context)
655 return GL_TRUE;
656
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000657 ctx->aelt_context = MALLOC( sizeof(AEcontext) );
Gareth Hughes1fb0a432001-12-28 06:28:10 +0000658 if (!ctx->aelt_context)
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000659 return GL_FALSE;
660
661 AE_CONTEXT(ctx)->NewState = ~0;
662 return GL_TRUE;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000663}
664
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000665
666void _ae_destroy_context( GLcontext *ctx )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000667{
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000668 if ( AE_CONTEXT( ctx ) ) {
669 FREE( ctx->aelt_context );
670 ctx->aelt_context = 0;
671 }
672}
673
674
Brian Paul0d4393a2004-02-11 22:53:38 +0000675/**
676 * Make a list of per-vertex functions to call for each glArrayElement call.
Brian Paul1e3d8682004-02-24 02:49:43 +0000677 * These functions access the array data (i.e. glVertex, glColor, glNormal,
678 * etc).
679 * Note: this may be called during display list construction.
Brian Paul0d4393a2004-02-11 22:53:38 +0000680 */
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000681static void _ae_update_state( GLcontext *ctx )
682{
683 AEcontext *actx = AE_CONTEXT(ctx);
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000684 AEarray *aa = actx->arrays;
Brian Paul0d4393a2004-02-11 22:53:38 +0000685 AEattrib *at = actx->attribs;
Brian Pauldb07de02002-04-19 00:23:08 +0000686 GLuint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000687
Brian Paul1e3d8682004-02-24 02:49:43 +0000688 /* conventional vertex arrays */
689 if (ctx->Array.Index.Enabled) {
Keith Whitwellcab974c2000-12-26 05:09:27 +0000690 aa->array = &ctx->Array.Index;
Brian Paul2615e812004-02-24 14:47:01 +0000691 aa->func = IndexFuncs[TYPE_IDX(aa->array->Type)];
Keith Whitwellcab974c2000-12-26 05:09:27 +0000692 aa++;
693 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000694 if (ctx->Array.EdgeFlag.Enabled) {
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000695 aa->array = &ctx->Array.EdgeFlag;
Brian Paul0d4393a2004-02-11 22:53:38 +0000696 aa->func = (array_func) glEdgeFlagv;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000697 aa++;
698 }
Brian Paul1e3d8682004-02-24 02:49:43 +0000699 if (ctx->Array.Normal.Enabled) {
700 aa->array = &ctx->Array.Normal;
Brian Paul2615e812004-02-24 14:47:01 +0000701 aa->func = NormalFuncs[TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000702 aa++;
703 }
704 if (ctx->Array.Color.Enabled) {
705 aa->array = &ctx->Array.Color;
Brian Paul2615e812004-02-24 14:47:01 +0000706 aa->func = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000707 aa++;
708 }
709 if (ctx->Array.SecondaryColor.Enabled) {
710 aa->array = &ctx->Array.SecondaryColor;
Brian Paul2615e812004-02-24 14:47:01 +0000711 aa->func = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000712 aa++;
713 }
714 if (ctx->Array.FogCoord.Enabled) {
715 aa->array = &ctx->Array.FogCoord;
Brian Paul2615e812004-02-24 14:47:01 +0000716 aa->func = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000717 aa++;
718 }
719 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
720 if (ctx->Array.TexCoord[i].Enabled) {
721 /* NOTE: we use generic glVertexAttrib functions here.
722 * If we ever de-alias conventional/generic vertex attribs this
723 * will have to change.
724 */
725 struct gl_client_array *attribArray = &ctx->Array.TexCoord[i];
726 at->array = attribArray;
Brian Paul2615e812004-02-24 14:47:01 +0000727 at->func = AttribFuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
Brian Paul9d1ff8c2004-02-24 14:59:26 +0000728 at->index = VERT_ATTRIB_TEX0 + i;
Brian Paul1e3d8682004-02-24 02:49:43 +0000729 at++;
Brian Paul0d4393a2004-02-11 22:53:38 +0000730 }
Brian Paul1e3d8682004-02-24 02:49:43 +0000731 }
Roland Scheideggerfaaf78a2004-02-11 01:06:03 +0000732
Brian Paul1e3d8682004-02-24 02:49:43 +0000733 /* generic vertex attribute arrays */
734 for (i = 1; i < VERT_ATTRIB_MAX; i++) { /* skip zero! */
735 if (ctx->Array.VertexAttrib[i].Enabled) {
736 struct gl_client_array *attribArray = &ctx->Array.VertexAttrib[i];
Brian Paul0d4393a2004-02-11 22:53:38 +0000737 at->array = attribArray;
738 /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
739 * function pointer here (for float arrays) since the pointer may
740 * change from one execution of _ae_loopback_array_elt() to
741 * the next. Doing so caused UT to break.
742 */
Brian Paul2615e812004-02-24 14:47:01 +0000743 at->func = AttribFuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000744 at->index = i;
Brian Paul0d4393a2004-02-11 22:53:38 +0000745 at++;
746 }
Roland Scheideggerfaaf78a2004-02-11 01:06:03 +0000747 }
Brian Paul1e3d8682004-02-24 02:49:43 +0000748
749 /* finally, vertex position */
750 if (ctx->Array.VertexAttrib[0].Enabled) {
751 /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
752 * issued as the last (proviking) attribute).
753 */
754 aa->array = &ctx->Array.VertexAttrib[0];
755 assert(aa->array->Size >= 2); /* XXX fix someday? */
Brian Paul2615e812004-02-24 14:47:01 +0000756 aa->func = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000757 aa++;
758 }
759 else if (ctx->Array.Vertex.Enabled) {
760 aa->array = &ctx->Array.Vertex;
Brian Paul2615e812004-02-24 14:47:01 +0000761 aa->func = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000762 aa++;
763 }
764
Brian Paul0d4393a2004-02-11 22:53:38 +0000765 ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX);
766 ASSERT(aa - actx->arrays < 32);
767 at->func = NULL; /* terminate the list */
768 aa->func = NULL; /* terminate the list */
Roland Scheideggerfaaf78a2004-02-11 01:06:03 +0000769
Keith Whitwellcab974c2000-12-26 05:09:27 +0000770 actx->NewState = 0;
771}
772
773
Brian Paul1e3d8682004-02-24 02:49:43 +0000774/**
775 * Called via glArrayElement() and glDrawArrays().
776 * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions
777 * for all enabled vertex arrays (for elt-th element).
778 * Note: this may be called during display list construction.
779 */
Karl Schultzd6745692003-12-04 20:23:44 +0000780void GLAPIENTRY _ae_loopback_array_elt( GLint elt )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000781{
782 GET_CURRENT_CONTEXT(ctx);
Brian Paul0d4393a2004-02-11 22:53:38 +0000783 const AEcontext *actx = AE_CONTEXT(ctx);
784 const AEarray *aa;
785 const AEattrib *at;
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000786
787 if (actx->NewState)
788 _ae_update_state( ctx );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000789
Brian Paul0d4393a2004-02-11 22:53:38 +0000790 /* generic attributes */
791 for (at = actx->attribs; at->func; at++) {
792 const GLubyte *src = at->array->BufferObj->Data
Brian Paul79b372b2004-03-26 23:54:53 +0000793 + (unsigned long) at->array->Ptr
Brian Paul0d4393a2004-02-11 22:53:38 +0000794 + elt * at->array->StrideB;
795 at->func( at->index, src );
Brian Paul53ad0362004-02-09 00:24:48 +0000796 }
797
Brian Paul0d4393a2004-02-11 22:53:38 +0000798 /* conventional arrays */
799 for (aa = actx->arrays; aa->func ; aa++) {
800 const GLubyte *src = aa->array->BufferObj->Data
Brian Paul79b372b2004-03-26 23:54:53 +0000801 + (unsigned long) aa->array->Ptr
Brian Paul0d4393a2004-02-11 22:53:38 +0000802 + elt * aa->array->StrideB;
Brian Paul0aa8a102004-02-08 02:03:41 +0000803 aa->func( src );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000804 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000805}
806
807
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000808
809void _ae_invalidate_state( GLcontext *ctx, GLuint new_state )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000810{
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000811 AE_CONTEXT(ctx)->NewState |= new_state;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000812}