blob: b375828d03ad92323ef8821cb8f011c2808c647d [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
63 * numbered in gl.h
64 */
Keith Whitwell4b7d6f22001-06-01 22:22:10 +000065#define TYPE_IDX(t) ((t) & 0xf)
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{
143 _glapi_Dispatch->SecondaryColor3bvEXT(c);
144}
145
Brian Paul2615e812004-02-24 14:47:01 +0000146static void GLAPIENTRY SecondaryColor3ubvEXT(const GLubyte *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000147{
148 _glapi_Dispatch->SecondaryColor3ubvEXT(c);
149}
150
Brian Paul2615e812004-02-24 14:47:01 +0000151static void GLAPIENTRY SecondaryColor3svEXT(const GLshort *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000152{
153 _glapi_Dispatch->SecondaryColor3svEXT(c);
154}
155
Brian Paul2615e812004-02-24 14:47:01 +0000156static void GLAPIENTRY SecondaryColor3usvEXT(const GLushort *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000157{
158 _glapi_Dispatch->SecondaryColor3usvEXT(c);
159}
160
Brian Paul2615e812004-02-24 14:47:01 +0000161static void GLAPIENTRY SecondaryColor3ivEXT(const GLint *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000162{
163 _glapi_Dispatch->SecondaryColor3ivEXT(c);
164}
165
Brian Paul2615e812004-02-24 14:47:01 +0000166static void GLAPIENTRY SecondaryColor3uivEXT(const GLuint *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000167{
168 _glapi_Dispatch->SecondaryColor3uivEXT(c);
169}
170
Brian Paul2615e812004-02-24 14:47:01 +0000171static void GLAPIENTRY SecondaryColor3fvEXT(const GLfloat *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000172{
173 _glapi_Dispatch->SecondaryColor3fvEXT(c);
174}
175
Brian Paul2615e812004-02-24 14:47:01 +0000176static void GLAPIENTRY SecondaryColor3dvEXT(const GLdouble *c)
Brian Paul53ad0362004-02-09 00:24:48 +0000177{
178 _glapi_Dispatch->SecondaryColor3dvEXT(c);
179}
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{
196 _glapi_Dispatch->FogCoordfvEXT(f);
197}
198
Brian Paul2615e812004-02-24 14:47:01 +0000199static void GLAPIENTRY FogCoorddvEXT(const GLdouble *f)
Brian Paul53ad0362004-02-09 00:24:48 +0000200{
201 _glapi_Dispatch->FogCoorddvEXT(f);
202}
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{
222 _glapi_Dispatch->VertexAttrib1fNV(index, BYTE_TO_FLOAT(v[0]));
223}
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{
227 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
228}
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{
232 _glapi_Dispatch->VertexAttrib2fNV(index, BYTE_TO_FLOAT(v[0]),
233 BYTE_TO_FLOAT(v[1]));
234}
235
Brian Paul2615e812004-02-24 14:47:01 +0000236static void GLAPIENTRY VertexAttrib2bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000237{
238 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
239}
240
Brian Paul2615e812004-02-24 14:47:01 +0000241static void GLAPIENTRY VertexAttrib3Nbv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000242{
243 _glapi_Dispatch->VertexAttrib3fNV(index, BYTE_TO_FLOAT(v[0]),
244 BYTE_TO_FLOAT(v[1]),
245 BYTE_TO_FLOAT(v[2]));
246}
247
Brian Paul2615e812004-02-24 14:47:01 +0000248static void GLAPIENTRY VertexAttrib3bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000249{
250 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
251}
252
Brian Paul2615e812004-02-24 14:47:01 +0000253static void GLAPIENTRY VertexAttrib4Nbv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000254{
255 _glapi_Dispatch->VertexAttrib4fNV(index, BYTE_TO_FLOAT(v[0]),
256 BYTE_TO_FLOAT(v[1]),
257 BYTE_TO_FLOAT(v[2]),
258 BYTE_TO_FLOAT(v[3]));
259}
260
Brian Paul2615e812004-02-24 14:47:01 +0000261static void GLAPIENTRY VertexAttrib4bv(GLuint index, const GLbyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000262{
263 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
264}
265
266/* GL_UNSIGNED_BYTE attributes */
267
Brian Paul2615e812004-02-24 14:47:01 +0000268static void GLAPIENTRY VertexAttrib1Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000269{
270 _glapi_Dispatch->VertexAttrib1fNV(index, UBYTE_TO_FLOAT(v[0]));
271}
272
Brian Paul2615e812004-02-24 14:47:01 +0000273static void GLAPIENTRY VertexAttrib1ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000274{
275 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
276}
277
Brian Paul2615e812004-02-24 14:47:01 +0000278static void GLAPIENTRY VertexAttrib2Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000279{
280 _glapi_Dispatch->VertexAttrib2fNV(index, UBYTE_TO_FLOAT(v[0]),
281 UBYTE_TO_FLOAT(v[1]));
282}
283
Brian Paul2615e812004-02-24 14:47:01 +0000284static void GLAPIENTRY VertexAttrib2ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000285{
286 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
287}
288
Brian Paul2615e812004-02-24 14:47:01 +0000289static void GLAPIENTRY VertexAttrib3Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000290{
291 _glapi_Dispatch->VertexAttrib3fNV(index, UBYTE_TO_FLOAT(v[0]),
292 UBYTE_TO_FLOAT(v[1]),
293 UBYTE_TO_FLOAT(v[2]));
294}
Brian Paul2615e812004-02-24 14:47:01 +0000295static void GLAPIENTRY VertexAttrib3ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000296{
297 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
298}
299
Brian Paul2615e812004-02-24 14:47:01 +0000300static void GLAPIENTRY VertexAttrib4Nubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000301{
302 _glapi_Dispatch->VertexAttrib4fNV(index, UBYTE_TO_FLOAT(v[0]),
303 UBYTE_TO_FLOAT(v[1]),
304 UBYTE_TO_FLOAT(v[2]),
305 UBYTE_TO_FLOAT(v[3]));
306}
307
Brian Paul2615e812004-02-24 14:47:01 +0000308static void GLAPIENTRY VertexAttrib4ubv(GLuint index, const GLubyte *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000309{
310 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
311}
312
313/* GL_SHORT attributes */
314
Brian Paul2615e812004-02-24 14:47:01 +0000315static void GLAPIENTRY VertexAttrib1Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000316{
317 _glapi_Dispatch->VertexAttrib1fNV(index, SHORT_TO_FLOAT(v[0]));
318}
319
Brian Paul2615e812004-02-24 14:47:01 +0000320static void GLAPIENTRY VertexAttrib1sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000321{
322 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
323}
324
Brian Paul2615e812004-02-24 14:47:01 +0000325static void GLAPIENTRY VertexAttrib2Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000326{
327 _glapi_Dispatch->VertexAttrib2fNV(index, SHORT_TO_FLOAT(v[0]),
328 SHORT_TO_FLOAT(v[1]));
329}
330
Brian Paul2615e812004-02-24 14:47:01 +0000331static void GLAPIENTRY VertexAttrib2sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000332{
333 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
334}
335
Brian Paul2615e812004-02-24 14:47:01 +0000336static void GLAPIENTRY VertexAttrib3Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000337{
338 _glapi_Dispatch->VertexAttrib3fNV(index, SHORT_TO_FLOAT(v[0]),
339 SHORT_TO_FLOAT(v[1]),
340 SHORT_TO_FLOAT(v[2]));
341}
342
Brian Paul2615e812004-02-24 14:47:01 +0000343static void GLAPIENTRY VertexAttrib3sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000344{
345 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
346}
347
Brian Paul2615e812004-02-24 14:47:01 +0000348static void GLAPIENTRY VertexAttrib4Nsv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000349{
350 _glapi_Dispatch->VertexAttrib4fNV(index, SHORT_TO_FLOAT(v[0]),
351 SHORT_TO_FLOAT(v[1]),
352 SHORT_TO_FLOAT(v[2]),
353 SHORT_TO_FLOAT(v[3]));
354}
355
Brian Paul2615e812004-02-24 14:47:01 +0000356static void GLAPIENTRY VertexAttrib4sv(GLuint index, const GLshort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000357{
358 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
359}
360
361/* GL_UNSIGNED_SHORT attributes */
362
Brian Paul2615e812004-02-24 14:47:01 +0000363static void GLAPIENTRY VertexAttrib1Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000364{
365 _glapi_Dispatch->VertexAttrib1fNV(index, USHORT_TO_FLOAT(v[0]));
366}
367
Brian Paul2615e812004-02-24 14:47:01 +0000368static void GLAPIENTRY VertexAttrib1usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000369{
370 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
371}
372
Brian Paul2615e812004-02-24 14:47:01 +0000373static void GLAPIENTRY VertexAttrib2Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000374{
375 _glapi_Dispatch->VertexAttrib2fNV(index, USHORT_TO_FLOAT(v[0]),
376 USHORT_TO_FLOAT(v[1]));
377}
378
Brian Paul2615e812004-02-24 14:47:01 +0000379static void GLAPIENTRY VertexAttrib2usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000380{
381 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
382}
383
Brian Paul2615e812004-02-24 14:47:01 +0000384static void GLAPIENTRY VertexAttrib3Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000385{
386 _glapi_Dispatch->VertexAttrib3fNV(index, USHORT_TO_FLOAT(v[0]),
387 USHORT_TO_FLOAT(v[1]),
388 USHORT_TO_FLOAT(v[2]));
389}
390
Brian Paul2615e812004-02-24 14:47:01 +0000391static void GLAPIENTRY VertexAttrib3usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000392{
393 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
394}
395
Brian Paul2615e812004-02-24 14:47:01 +0000396static void GLAPIENTRY VertexAttrib4Nusv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000397{
398 _glapi_Dispatch->VertexAttrib4fNV(index, USHORT_TO_FLOAT(v[0]),
399 USHORT_TO_FLOAT(v[1]),
400 USHORT_TO_FLOAT(v[2]),
401 USHORT_TO_FLOAT(v[3]));
402}
403
Brian Paul2615e812004-02-24 14:47:01 +0000404static void GLAPIENTRY VertexAttrib4usv(GLuint index, const GLushort *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000405{
406 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
407}
408
409/* GL_INT attributes */
410
Brian Paul2615e812004-02-24 14:47:01 +0000411static void GLAPIENTRY VertexAttrib1Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000412{
413 _glapi_Dispatch->VertexAttrib1fNV(index, INT_TO_FLOAT(v[0]));
414}
415
Brian Paul2615e812004-02-24 14:47:01 +0000416static void GLAPIENTRY VertexAttrib1iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000417{
418 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
419}
420
Brian Paul2615e812004-02-24 14:47:01 +0000421static void GLAPIENTRY VertexAttrib2Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000422{
423 _glapi_Dispatch->VertexAttrib2fNV(index, INT_TO_FLOAT(v[0]),
424 INT_TO_FLOAT(v[1]));
425}
426
Brian Paul2615e812004-02-24 14:47:01 +0000427static void GLAPIENTRY VertexAttrib2iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000428{
429 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
430}
431
Brian Paul2615e812004-02-24 14:47:01 +0000432static void GLAPIENTRY VertexAttrib3Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000433{
434 _glapi_Dispatch->VertexAttrib3fNV(index, INT_TO_FLOAT(v[0]),
435 INT_TO_FLOAT(v[1]),
436 INT_TO_FLOAT(v[2]));
437}
438
Brian Paul2615e812004-02-24 14:47:01 +0000439static void GLAPIENTRY VertexAttrib3iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000440{
441 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
442}
443
Brian Paul2615e812004-02-24 14:47:01 +0000444static void GLAPIENTRY VertexAttrib4Niv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000445{
446 _glapi_Dispatch->VertexAttrib4fNV(index, INT_TO_FLOAT(v[0]),
447 INT_TO_FLOAT(v[1]),
448 INT_TO_FLOAT(v[2]),
449 INT_TO_FLOAT(v[3]));
450}
451
Brian Paul2615e812004-02-24 14:47:01 +0000452static void GLAPIENTRY VertexAttrib4iv(GLuint index, const GLint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000453{
454 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
455}
456
457/* GL_UNSIGNED_INT attributes */
458
Brian Paul2615e812004-02-24 14:47:01 +0000459static void GLAPIENTRY VertexAttrib1Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000460{
461 _glapi_Dispatch->VertexAttrib1fNV(index, UINT_TO_FLOAT(v[0]));
462}
463
Brian Paul2615e812004-02-24 14:47:01 +0000464static void GLAPIENTRY VertexAttrib1uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000465{
466 _glapi_Dispatch->VertexAttrib1fNV(index, v[0]);
467}
468
Brian Paul2615e812004-02-24 14:47:01 +0000469static void GLAPIENTRY VertexAttrib2Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000470{
471 _glapi_Dispatch->VertexAttrib2fNV(index, UINT_TO_FLOAT(v[0]),
472 UINT_TO_FLOAT(v[1]));
473}
474
Brian Paul2615e812004-02-24 14:47:01 +0000475static void GLAPIENTRY VertexAttrib2uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000476{
477 _glapi_Dispatch->VertexAttrib2fNV(index, v[0], v[1]);
478}
479
Brian Paul2615e812004-02-24 14:47:01 +0000480static void GLAPIENTRY VertexAttrib3Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000481{
482 _glapi_Dispatch->VertexAttrib3fNV(index, UINT_TO_FLOAT(v[0]),
483 UINT_TO_FLOAT(v[1]),
484 UINT_TO_FLOAT(v[2]));
485}
486
Brian Paul2615e812004-02-24 14:47:01 +0000487static void GLAPIENTRY VertexAttrib3uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000488{
489 _glapi_Dispatch->VertexAttrib3fNV(index, v[0], v[1], v[2]);
490}
491
Brian Paul2615e812004-02-24 14:47:01 +0000492static void GLAPIENTRY VertexAttrib4Nuiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000493{
494 _glapi_Dispatch->VertexAttrib4fNV(index, UINT_TO_FLOAT(v[0]),
495 UINT_TO_FLOAT(v[1]),
496 UINT_TO_FLOAT(v[2]),
497 UINT_TO_FLOAT(v[3]));
498}
499
Brian Paul2615e812004-02-24 14:47:01 +0000500static void GLAPIENTRY VertexAttrib4uiv(GLuint index, const GLuint *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000501{
502 _glapi_Dispatch->VertexAttrib4fNV(index, v[0], v[1], v[2], v[3]);
503}
504
505/* GL_FLOAT attributes */
506
Brian Paul2615e812004-02-24 14:47:01 +0000507static void GLAPIENTRY VertexAttrib1fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000508{
509 _glapi_Dispatch->VertexAttrib1fvNV(index, v);
510}
511
Brian Paul2615e812004-02-24 14:47:01 +0000512static void GLAPIENTRY VertexAttrib2fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000513{
514 _glapi_Dispatch->VertexAttrib2fvNV(index, v);
515}
516
Brian Paul2615e812004-02-24 14:47:01 +0000517static void GLAPIENTRY VertexAttrib3fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000518{
519 _glapi_Dispatch->VertexAttrib3fvNV(index, v);
520}
521
Brian Paul2615e812004-02-24 14:47:01 +0000522static void GLAPIENTRY VertexAttrib4fv(GLuint index, const GLfloat *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000523{
524 _glapi_Dispatch->VertexAttrib4fvNV(index, v);
525}
526
527/* GL_DOUBLE attributes */
528
Brian Paul2615e812004-02-24 14:47:01 +0000529static void GLAPIENTRY VertexAttrib1dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000530{
531 _glapi_Dispatch->VertexAttrib1dvNV(index, v);
532}
533
Brian Paul2615e812004-02-24 14:47:01 +0000534static void GLAPIENTRY VertexAttrib2dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000535{
536 _glapi_Dispatch->VertexAttrib2dvNV(index, v);
537}
538
Brian Paul2615e812004-02-24 14:47:01 +0000539static void GLAPIENTRY VertexAttrib3dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000540{
541 _glapi_Dispatch->VertexAttrib3dvNV(index, v);
542}
543
Brian Paul2615e812004-02-24 14:47:01 +0000544static void GLAPIENTRY VertexAttrib4dv(GLuint index, const GLdouble *v)
Brian Paul0d4393a2004-02-11 22:53:38 +0000545{
546 _glapi_Dispatch->VertexAttrib4dvNV(index, v);
547}
548
549
550/*
551 * Array [size][type] of VertexAttrib functions
552 */
Brian Paul2615e812004-02-24 14:47:01 +0000553static attrib_func AttribFuncs[2][4][8] = {
Brian Paul0d4393a2004-02-11 22:53:38 +0000554 {
555 /* non-normalized */
556 {
557 /* size 1 */
558 (attrib_func) VertexAttrib1bv,
559 (attrib_func) VertexAttrib1ubv,
560 (attrib_func) VertexAttrib1sv,
561 (attrib_func) VertexAttrib1usv,
562 (attrib_func) VertexAttrib1iv,
563 (attrib_func) VertexAttrib1uiv,
564 (attrib_func) VertexAttrib1fv,
565 (attrib_func) VertexAttrib1dv
566 },
567 {
568 /* size 2 */
569 (attrib_func) VertexAttrib2bv,
570 (attrib_func) VertexAttrib2ubv,
571 (attrib_func) VertexAttrib2sv,
572 (attrib_func) VertexAttrib2usv,
573 (attrib_func) VertexAttrib2iv,
574 (attrib_func) VertexAttrib2uiv,
575 (attrib_func) VertexAttrib2fv,
576 (attrib_func) VertexAttrib2dv
577 },
578 {
579 /* size 3 */
580 (attrib_func) VertexAttrib3bv,
581 (attrib_func) VertexAttrib3ubv,
582 (attrib_func) VertexAttrib3sv,
583 (attrib_func) VertexAttrib3usv,
584 (attrib_func) VertexAttrib3iv,
585 (attrib_func) VertexAttrib3uiv,
586 (attrib_func) VertexAttrib3fv,
587 (attrib_func) VertexAttrib3dv
588 },
589 {
590 /* size 4 */
591 (attrib_func) VertexAttrib4bv,
592 (attrib_func) VertexAttrib4ubv,
593 (attrib_func) VertexAttrib4sv,
594 (attrib_func) VertexAttrib4usv,
595 (attrib_func) VertexAttrib4iv,
596 (attrib_func) VertexAttrib4uiv,
597 (attrib_func) VertexAttrib4fv,
598 (attrib_func) VertexAttrib4dv
599 }
600 },
601 {
602 /* normalized (except for float/double) */
603 {
604 /* size 1 */
605 (attrib_func) VertexAttrib1Nbv,
606 (attrib_func) VertexAttrib1Nubv,
607 (attrib_func) VertexAttrib1Nsv,
608 (attrib_func) VertexAttrib1Nusv,
609 (attrib_func) VertexAttrib1Niv,
610 (attrib_func) VertexAttrib1Nuiv,
611 (attrib_func) VertexAttrib1fv,
612 (attrib_func) VertexAttrib1dv
613 },
614 {
615 /* size 2 */
616 (attrib_func) VertexAttrib2Nbv,
617 (attrib_func) VertexAttrib2Nubv,
618 (attrib_func) VertexAttrib2Nsv,
619 (attrib_func) VertexAttrib2Nusv,
620 (attrib_func) VertexAttrib2Niv,
621 (attrib_func) VertexAttrib2Nuiv,
622 (attrib_func) VertexAttrib2fv,
623 (attrib_func) VertexAttrib2dv
624 },
625 {
626 /* size 3 */
627 (attrib_func) VertexAttrib3Nbv,
628 (attrib_func) VertexAttrib3Nubv,
629 (attrib_func) VertexAttrib3Nsv,
630 (attrib_func) VertexAttrib3Nusv,
631 (attrib_func) VertexAttrib3Niv,
632 (attrib_func) VertexAttrib3Nuiv,
633 (attrib_func) VertexAttrib3fv,
634 (attrib_func) VertexAttrib3dv
635 },
636 {
637 /* size 4 */
638 (attrib_func) VertexAttrib4Nbv,
639 (attrib_func) VertexAttrib4Nubv,
640 (attrib_func) VertexAttrib4Nsv,
641 (attrib_func) VertexAttrib4Nusv,
642 (attrib_func) VertexAttrib4Niv,
643 (attrib_func) VertexAttrib4Nuiv,
644 (attrib_func) VertexAttrib4fv,
645 (attrib_func) VertexAttrib4dv
646 }
647 }
648};
649
650/**********************************************************************/
651
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000652
653GLboolean _ae_create_context( GLcontext *ctx )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000654{
Keith Whitwellae0eaf92003-11-24 15:23:18 +0000655 if (ctx->aelt_context)
656 return GL_TRUE;
657
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000658 ctx->aelt_context = MALLOC( sizeof(AEcontext) );
Gareth Hughes1fb0a432001-12-28 06:28:10 +0000659 if (!ctx->aelt_context)
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000660 return GL_FALSE;
661
662 AE_CONTEXT(ctx)->NewState = ~0;
663 return GL_TRUE;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000664}
665
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000666
667void _ae_destroy_context( GLcontext *ctx )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000668{
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000669 if ( AE_CONTEXT( ctx ) ) {
670 FREE( ctx->aelt_context );
671 ctx->aelt_context = 0;
672 }
673}
674
675
Brian Paul0d4393a2004-02-11 22:53:38 +0000676/**
677 * Make a list of per-vertex functions to call for each glArrayElement call.
Brian Paul1e3d8682004-02-24 02:49:43 +0000678 * These functions access the array data (i.e. glVertex, glColor, glNormal,
679 * etc).
680 * Note: this may be called during display list construction.
Brian Paul0d4393a2004-02-11 22:53:38 +0000681 */
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000682static void _ae_update_state( GLcontext *ctx )
683{
684 AEcontext *actx = AE_CONTEXT(ctx);
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000685 AEarray *aa = actx->arrays;
Brian Paul0d4393a2004-02-11 22:53:38 +0000686 AEattrib *at = actx->attribs;
Brian Pauldb07de02002-04-19 00:23:08 +0000687 GLuint i;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000688
Brian Paul1e3d8682004-02-24 02:49:43 +0000689 /* conventional vertex arrays */
690 if (ctx->Array.Index.Enabled) {
Keith Whitwellcab974c2000-12-26 05:09:27 +0000691 aa->array = &ctx->Array.Index;
Brian Paul2615e812004-02-24 14:47:01 +0000692 aa->func = IndexFuncs[TYPE_IDX(aa->array->Type)];
Keith Whitwellcab974c2000-12-26 05:09:27 +0000693 aa++;
694 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000695 if (ctx->Array.EdgeFlag.Enabled) {
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000696 aa->array = &ctx->Array.EdgeFlag;
Brian Paul0d4393a2004-02-11 22:53:38 +0000697 aa->func = (array_func) glEdgeFlagv;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000698 aa++;
699 }
Brian Paul1e3d8682004-02-24 02:49:43 +0000700 if (ctx->Array.Normal.Enabled) {
701 aa->array = &ctx->Array.Normal;
Brian Paul2615e812004-02-24 14:47:01 +0000702 aa->func = NormalFuncs[TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000703 aa++;
704 }
705 if (ctx->Array.Color.Enabled) {
706 aa->array = &ctx->Array.Color;
Brian Paul2615e812004-02-24 14:47:01 +0000707 aa->func = ColorFuncs[aa->array->Size-3][TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000708 aa++;
709 }
710 if (ctx->Array.SecondaryColor.Enabled) {
711 aa->array = &ctx->Array.SecondaryColor;
Brian Paul2615e812004-02-24 14:47:01 +0000712 aa->func = SecondaryColorFuncs[TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000713 aa++;
714 }
715 if (ctx->Array.FogCoord.Enabled) {
716 aa->array = &ctx->Array.FogCoord;
Brian Paul2615e812004-02-24 14:47:01 +0000717 aa->func = FogCoordFuncs[TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000718 aa++;
719 }
720 for (i = 0; i < ctx->Const.MaxTextureCoordUnits; i++) {
721 if (ctx->Array.TexCoord[i].Enabled) {
722 /* NOTE: we use generic glVertexAttrib functions here.
723 * If we ever de-alias conventional/generic vertex attribs this
724 * will have to change.
725 */
726 struct gl_client_array *attribArray = &ctx->Array.TexCoord[i];
727 at->array = attribArray;
Brian Paul2615e812004-02-24 14:47:01 +0000728 at->func = AttribFuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
Brian Paul9d1ff8c2004-02-24 14:59:26 +0000729 at->index = VERT_ATTRIB_TEX0 + i;
Brian Paul1e3d8682004-02-24 02:49:43 +0000730 at++;
Brian Paul0d4393a2004-02-11 22:53:38 +0000731 }
Brian Paul1e3d8682004-02-24 02:49:43 +0000732 }
Roland Scheideggerfaaf78a2004-02-11 01:06:03 +0000733
Brian Paul1e3d8682004-02-24 02:49:43 +0000734 /* generic vertex attribute arrays */
735 for (i = 1; i < VERT_ATTRIB_MAX; i++) { /* skip zero! */
736 if (ctx->Array.VertexAttrib[i].Enabled) {
737 struct gl_client_array *attribArray = &ctx->Array.VertexAttrib[i];
Brian Paul0d4393a2004-02-11 22:53:38 +0000738 at->array = attribArray;
739 /* Note: we can't grab the _glapi_Dispatch->VertexAttrib1fvNV
740 * function pointer here (for float arrays) since the pointer may
741 * change from one execution of _ae_loopback_array_elt() to
742 * the next. Doing so caused UT to break.
743 */
Brian Paul2615e812004-02-24 14:47:01 +0000744 at->func = AttribFuncs[at->array->Normalized][at->array->Size-1][TYPE_IDX(at->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000745 at->index = i;
Brian Paul0d4393a2004-02-11 22:53:38 +0000746 at++;
747 }
Roland Scheideggerfaaf78a2004-02-11 01:06:03 +0000748 }
Brian Paul1e3d8682004-02-24 02:49:43 +0000749
750 /* finally, vertex position */
751 if (ctx->Array.VertexAttrib[0].Enabled) {
752 /* Use glVertex(v) instead of glVertexAttrib(0, v) to be sure it's
753 * issued as the last (proviking) attribute).
754 */
755 aa->array = &ctx->Array.VertexAttrib[0];
756 assert(aa->array->Size >= 2); /* XXX fix someday? */
Brian Paul2615e812004-02-24 14:47:01 +0000757 aa->func = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000758 aa++;
759 }
760 else if (ctx->Array.Vertex.Enabled) {
761 aa->array = &ctx->Array.Vertex;
Brian Paul2615e812004-02-24 14:47:01 +0000762 aa->func = VertexFuncs[aa->array->Size-2][TYPE_IDX(aa->array->Type)];
Brian Paul1e3d8682004-02-24 02:49:43 +0000763 aa++;
764 }
765
Brian Paul0d4393a2004-02-11 22:53:38 +0000766 ASSERT(at - actx->attribs <= VERT_ATTRIB_MAX);
767 ASSERT(aa - actx->arrays < 32);
768 at->func = NULL; /* terminate the list */
769 aa->func = NULL; /* terminate the list */
Roland Scheideggerfaaf78a2004-02-11 01:06:03 +0000770
Keith Whitwellcab974c2000-12-26 05:09:27 +0000771 actx->NewState = 0;
772}
773
774
Brian Paul1e3d8682004-02-24 02:49:43 +0000775/**
776 * Called via glArrayElement() and glDrawArrays().
777 * Issue the glNormal, glVertex, glColor, glVertexAttrib, etc functions
778 * for all enabled vertex arrays (for elt-th element).
779 * Note: this may be called during display list construction.
780 */
Karl Schultzd6745692003-12-04 20:23:44 +0000781void GLAPIENTRY _ae_loopback_array_elt( GLint elt )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000782{
783 GET_CURRENT_CONTEXT(ctx);
Brian Paul0d4393a2004-02-11 22:53:38 +0000784 const AEcontext *actx = AE_CONTEXT(ctx);
785 const AEarray *aa;
786 const AEattrib *at;
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000787
788 if (actx->NewState)
789 _ae_update_state( ctx );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000790
Brian Paul0d4393a2004-02-11 22:53:38 +0000791 /* generic attributes */
792 for (at = actx->attribs; at->func; at++) {
793 const GLubyte *src = at->array->BufferObj->Data
Brian Paul79b372b2004-03-26 23:54:53 +0000794 + (unsigned long) at->array->Ptr
Brian Paul0d4393a2004-02-11 22:53:38 +0000795 + elt * at->array->StrideB;
796 at->func( at->index, src );
Brian Paul53ad0362004-02-09 00:24:48 +0000797 }
798
Brian Paul0d4393a2004-02-11 22:53:38 +0000799 /* conventional arrays */
800 for (aa = actx->arrays; aa->func ; aa++) {
801 const GLubyte *src = aa->array->BufferObj->Data
Brian Paul79b372b2004-03-26 23:54:53 +0000802 + (unsigned long) aa->array->Ptr
Brian Paul0d4393a2004-02-11 22:53:38 +0000803 + elt * aa->array->StrideB;
Brian Paul0aa8a102004-02-08 02:03:41 +0000804 aa->func( src );
Keith Whitwellcab974c2000-12-26 05:09:27 +0000805 }
Keith Whitwellcab974c2000-12-26 05:09:27 +0000806}
807
808
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000809
810void _ae_invalidate_state( GLcontext *ctx, GLuint new_state )
Keith Whitwellcab974c2000-12-26 05:09:27 +0000811{
Keith Whitwell4b7d6f22001-06-01 22:22:10 +0000812 AE_CONTEXT(ctx)->NewState |= new_state;
Keith Whitwellcab974c2000-12-26 05:09:27 +0000813}