f5b3695bfd9b2d61389106aa23621bd4362df472
1 /* $Id: api_arrayelt.c,v 1.5 2001/12/28 06:28:10 gareth Exp $ */
4 * Mesa 3-D graphics library
7 * Copyright (C) 1999-2001 Brian Paul All Rights Reserved.
9 * Permission is hereby granted, free of charge, to any person obtaining a
10 * copy of this software and associated documentation files (the "Software"),
11 * to deal in the Software without restriction, including without limitation
12 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13 * and/or sell copies of the Software, and to permit persons to whom the
14 * Software is furnished to do so, subject to the following conditions:
16 * The above copyright notice and this permission notice shall be included
17 * in all copies or substantial portions of the Software.
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 * Keith Whitwell <keith_whitwell@yahoo.com>
32 #include "api_arrayelt.h"
40 typedef void (*texarray_func
)( GLenum
, const void * );
44 struct gl_client_array
*array
;
48 typedef void (*array_func
)( const void * );
51 struct gl_client_array
*array
;
56 AEtexarray texarrays
[MAX_TEXTURE_UNITS
+1];
61 #define AE_CONTEXT(ctx) ((AEcontext *)(ctx)->aelt_context)
62 #define TYPE_IDX(t) ((t) & 0xf)
64 static void (*colorfuncs
[2][8])( const void * ) = {
65 { (array_func
)glColor3bv
,
66 (array_func
)glColor3ub
,
67 (array_func
)glColor3sv
,
68 (array_func
)glColor3usv
,
69 (array_func
)glColor3iv
,
70 (array_func
)glColor3uiv
,
71 (array_func
)glColor3fv
,
72 (array_func
)glColor3dv
},
74 { (array_func
)glColor4bv
,
75 (array_func
)glColor4ub
,
76 (array_func
)glColor4sv
,
77 (array_func
)glColor4usv
,
78 (array_func
)glColor4iv
,
79 (array_func
)glColor4uiv
,
80 (array_func
)glColor4fv
,
81 (array_func
)glColor4dv
}
84 static void (*vertexfuncs
[3][8])( const void * ) = {
87 (array_func
)glVertex2sv
,
89 (array_func
)glVertex2iv
,
91 (array_func
)glVertex2fv
,
92 (array_func
)glVertex2dv
},
96 (array_func
)glVertex3sv
,
98 (array_func
)glVertex3iv
,
100 (array_func
)glVertex3fv
,
101 (array_func
)glVertex3dv
},
105 (array_func
)glVertex4sv
,
107 (array_func
)glVertex4iv
,
109 (array_func
)glVertex4fv
,
110 (array_func
)glVertex4dv
}
114 static void (*multitexfuncs
[4][8])( GLenum
, const void * ) = {
117 (texarray_func
)glMultiTexCoord1svARB
,
119 (texarray_func
)glMultiTexCoord1ivARB
,
121 (texarray_func
)glMultiTexCoord1fvARB
,
122 (texarray_func
)glMultiTexCoord1dvARB
},
126 (texarray_func
)glMultiTexCoord2svARB
,
128 (texarray_func
)glMultiTexCoord2ivARB
,
130 (texarray_func
)glMultiTexCoord2fvARB
,
131 (texarray_func
)glMultiTexCoord2dvARB
},
135 (texarray_func
)glMultiTexCoord3svARB
,
137 (texarray_func
)glMultiTexCoord3ivARB
,
139 (texarray_func
)glMultiTexCoord3fvARB
,
140 (texarray_func
)glMultiTexCoord3dvARB
},
144 (texarray_func
)glMultiTexCoord4svARB
,
146 (texarray_func
)glMultiTexCoord4ivARB
,
148 (texarray_func
)glMultiTexCoord4fvARB
,
149 (texarray_func
)glMultiTexCoord4dvARB
}
152 static void (*indexfuncs
[8])( const void * ) = {
154 (array_func
)glIndexubv
,
155 (array_func
)glIndexsv
,
157 (array_func
)glIndexiv
,
159 (array_func
)glIndexfv
,
160 (array_func
)glIndexdv
164 static void (*normalfuncs
[8])( const void * ) = {
165 (array_func
)glNormal3bv
,
167 (array_func
)glNormal3sv
,
169 (array_func
)glNormal3iv
,
171 (array_func
)glNormal3fv
,
172 (array_func
)glNormal3dv
,
175 static void (*fogcoordfuncs
[8])( const void * );
176 static void (*secondarycolorfuncs
[8])( const void * );
178 GLboolean
_ae_create_context( GLcontext
*ctx
)
180 static int firsttime
= 1;
182 ctx
->aelt_context
= MALLOC( sizeof(AEcontext
) );
183 if (!ctx
->aelt_context
)
191 /* Don't really want to use api_compat.h for this, but the
192 * rational for using _glapi_get_proc_address is the same.
194 fogcoordfuncs
[0] = (array_func
) _glapi_get_proc_address("glSecondaryColor3bvEXT");
195 fogcoordfuncs
[1] = (array_func
) _glapi_get_proc_address("glSecondaryColor3ubvEXT");
196 fogcoordfuncs
[2] = (array_func
) _glapi_get_proc_address("glSecondaryColor3svEXT");
197 fogcoordfuncs
[3] = (array_func
) _glapi_get_proc_address("glSecondaryColor3usvEXT");
198 fogcoordfuncs
[4] = (array_func
) _glapi_get_proc_address("glSecondaryColor3ivEXT");
199 fogcoordfuncs
[5] = (array_func
) _glapi_get_proc_address("glSecondaryColor3uivEXT");
200 fogcoordfuncs
[6] = (array_func
) _glapi_get_proc_address("glSecondaryColor3fvEXT");
201 fogcoordfuncs
[7] = (array_func
) _glapi_get_proc_address("glSecondaryColor3dvEXT");
203 secondarycolorfuncs
[6] = (array_func
) _glapi_get_proc_address("glFogCoordfvEXT");
204 secondarycolorfuncs
[7] = (array_func
) _glapi_get_proc_address("glFogCoorddvEXT");
207 AE_CONTEXT(ctx
)->NewState
= ~0;
212 void _ae_destroy_context( GLcontext
*ctx
)
214 if ( AE_CONTEXT( ctx
) ) {
215 FREE( ctx
->aelt_context
);
216 ctx
->aelt_context
= 0;
221 static void _ae_update_state( GLcontext
*ctx
)
223 AEcontext
*actx
= AE_CONTEXT(ctx
);
224 AEtexarray
*ta
= actx
->texarrays
;
225 AEarray
*aa
= actx
->arrays
;
228 for (i
= 0 ; i
< ctx
->Const
.MaxTextureUnits
; i
++)
229 if (ctx
->Array
.TexCoord
[i
].Enabled
) {
231 ta
->array
= &ctx
->Array
.TexCoord
[i
];
232 ta
->func
= multitexfuncs
[ta
->array
->Size
-1][TYPE_IDX(ta
->array
->Type
)];
238 if (ctx
->Array
.Color
.Enabled
) {
239 aa
->array
= &ctx
->Array
.Color
;
240 aa
->func
= colorfuncs
[aa
->array
->Size
-3][TYPE_IDX(aa
->array
->Type
)];
244 if (ctx
->Array
.Normal
.Enabled
) {
245 aa
->array
= &ctx
->Array
.Normal
;
246 aa
->func
= normalfuncs
[TYPE_IDX(aa
->array
->Type
)];
250 if (ctx
->Array
.Index
.Enabled
) {
251 aa
->array
= &ctx
->Array
.Index
;
252 aa
->func
= indexfuncs
[TYPE_IDX(aa
->array
->Type
)];
256 if (ctx
->Array
.EdgeFlag
.Enabled
) {
257 aa
->array
= &ctx
->Array
.EdgeFlag
;
258 aa
->func
= (array_func
)glEdgeFlagv
;
262 if (ctx
->Array
.FogCoord
.Enabled
) {
263 aa
->array
= &ctx
->Array
.FogCoord
;
264 aa
->func
= fogcoordfuncs
[TYPE_IDX(aa
->array
->Type
)];
268 if (ctx
->Array
.SecondaryColor
.Enabled
) {
269 aa
->array
= &ctx
->Array
.SecondaryColor
;
270 aa
->func
= secondarycolorfuncs
[TYPE_IDX(aa
->array
->Type
)];
276 if (ctx
->Array
.Vertex
.Enabled
) {
277 aa
->array
= &ctx
->Array
.Vertex
;
278 aa
->func
= vertexfuncs
[aa
->array
->Size
-2][TYPE_IDX(aa
->array
->Type
)];
287 void _ae_loopback_array_elt( GLint elt
)
289 GET_CURRENT_CONTEXT(ctx
);
290 AEcontext
*actx
= AE_CONTEXT(ctx
);
295 _ae_update_state( ctx
);
297 for (ta
= actx
->texarrays
; ta
->func
; ta
++) {
298 ta
->func( ta
->unit
, (char *)ta
->array
->Ptr
+ elt
* ta
->array
->StrideB
);
303 for (aa
= actx
->arrays
; aa
->func
; aa
++) {
304 aa
->func( (char *)aa
->array
->Ptr
+ elt
* aa
->array
->StrideB
);
310 void _ae_invalidate_state( GLcontext
*ctx
, GLuint new_state
)
312 AE_CONTEXT(ctx
)->NewState
|= new_state
;