1 /**************************************************************************
3 Copyright 2004 Tungsten Graphics Inc., Cedar Park, Texas.
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 on the rights to use, copy, modify, merge, publish, distribute, sub
11 license, and/or sell copies of the Software, and to permit persons to whom
12 the Software is furnished to do so, subject to the following conditions:
14 The above copyright notice and this permission notice (including the next
15 paragraph) shall be included in all copies or substantial portions of the
18 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21 ATI, TUNGSTEN GRAPHICS AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
22 DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23 OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24 USE OR OTHER DEALINGS IN THE SOFTWARE.
26 **************************************************************************/
30 * Keith Whitwell <keith@tungstengraphics.com>
40 #include "api_arrayelt.h"
42 #include "t_vtx_api.h"
45 /* Versions of all the entrypoints for situations where codegen isn't
48 * Note: Only one size for each attribute may be active at once.
49 * Eg. if Color3f is installed/active, then Color4f may not be, even
50 * if the vertex actually contains 4 color coordinates. This is
51 * because the 3f version won't otherwise set color[3] to 1.0 -- this
52 * is the job of the chooser function when switching between Color4f
55 #define ATTRFV( ATTR, N ) \
56 static void attrib_##ATTR##_##N( const GLfloat *v ) \
58 GET_CURRENT_CONTEXT( ctx ); \
59 TNLcontext *tnl = TNL_CONTEXT(ctx); \
64 if (N>0) tnl->vtx.vbptr[0] = v[0]; \
65 if (N>1) tnl->vtx.vbptr[1] = v[1]; \
66 if (N>2) tnl->vtx.vbptr[2] = v[2]; \
67 if (N>3) tnl->vtx.vbptr[3] = v[3]; \
69 for (i = N; i < tnl->vtx.vertex_size; i++) \
70 tnl->vtx.vbptr[i] = tnl->vtx.vertex[i]; \
72 tnl->vtx.vbptr += tnl->vtx.vertex_size; \
74 if (--tnl->vtx.counter == 0) \
75 _tnl_wrap_filled_vertex( ctx ); \
78 GLfloat *dest = tnl->vtx.attrptr[ATTR]; \
79 if (N>0) dest[0] = v[0]; \
80 if (N>1) dest[1] = v[1]; \
81 if (N>2) dest[2] = v[2]; \
82 if (N>3) dest[3] = v[3]; \
86 #define INIT(TAB, ATTR) \
87 TAB[ATTR][0] = attrib_##ATTR##_1; \
88 TAB[ATTR][1] = attrib_##ATTR##_2; \
89 TAB[ATTR][2] = attrib_##ATTR##_3; \
90 TAB[ATTR][3] = attrib_##ATTR##_4;
93 #define ATTRS( ATTRIB ) \
116 void _tnl_generic_attr_table_init( attrfv_func (*tab
)[4] )
136 /* These can be made efficient with codegen. Further, by adding more
137 * logic to do_choose(), the double-dispatch for legacy entrypoints
138 * like glVertex3f() can be removed.
140 #define DISPATCH_ATTRFV( ATTR, COUNT, P ) \
142 GET_CURRENT_CONTEXT( ctx ); \
143 TNLcontext *tnl = TNL_CONTEXT(ctx); \
144 tnl->vtx.tabfv[ATTR][COUNT-1]( P ); \
147 #define DISPATCH_ATTR1FV( ATTR, V ) DISPATCH_ATTRFV( ATTR, 1, V )
148 #define DISPATCH_ATTR2FV( ATTR, V ) DISPATCH_ATTRFV( ATTR, 2, V )
149 #define DISPATCH_ATTR3FV( ATTR, V ) DISPATCH_ATTRFV( ATTR, 3, V )
150 #define DISPATCH_ATTR4FV( ATTR, V ) DISPATCH_ATTRFV( ATTR, 4, V )
152 #define DISPATCH_ATTR1F( ATTR, S ) DISPATCH_ATTRFV( ATTR, 1, &(S) )
154 #define DISPATCH_ATTR2F( ATTR, S,T ) \
157 v[0] = S; v[1] = T; \
158 DISPATCH_ATTR2FV( ATTR, v ); \
160 #define DISPATCH_ATTR3F( ATTR, S,T,R ) \
163 v[0] = S; v[1] = T; v[2] = R; \
164 DISPATCH_ATTR3FV( ATTR, v ); \
166 #define DISPATCH_ATTR4F( ATTR, S,T,R,Q ) \
169 v[0] = S; v[1] = T; v[2] = R; v[3] = Q; \
170 DISPATCH_ATTR4FV( ATTR, v ); \
174 static void GLAPIENTRY
_tnl_Vertex2f( GLfloat x
, GLfloat y
)
176 DISPATCH_ATTR2F( _TNL_ATTRIB_POS
, x
, y
);
179 static void GLAPIENTRY
_tnl_Vertex2fv( const GLfloat
*v
)
181 DISPATCH_ATTR2FV( _TNL_ATTRIB_POS
, v
);
184 static void GLAPIENTRY
_tnl_Vertex3f( GLfloat x
, GLfloat y
, GLfloat z
)
186 DISPATCH_ATTR3F( _TNL_ATTRIB_POS
, x
, y
, z
);
189 static void GLAPIENTRY
_tnl_Vertex3fv( const GLfloat
*v
)
191 DISPATCH_ATTR3FV( _TNL_ATTRIB_POS
, v
);
194 static void GLAPIENTRY
_tnl_Vertex4f( GLfloat x
, GLfloat y
, GLfloat z
,
197 DISPATCH_ATTR4F( _TNL_ATTRIB_POS
, x
, y
, z
, w
);
200 static void GLAPIENTRY
_tnl_Vertex4fv( const GLfloat
*v
)
202 DISPATCH_ATTR4FV( _TNL_ATTRIB_POS
, v
);
205 static void GLAPIENTRY
_tnl_TexCoord1f( GLfloat x
)
207 DISPATCH_ATTR1F( _TNL_ATTRIB_TEX0
, x
);
210 static void GLAPIENTRY
_tnl_TexCoord1fv( const GLfloat
*v
)
212 DISPATCH_ATTR1FV( _TNL_ATTRIB_TEX0
, v
);
215 static void GLAPIENTRY
_tnl_TexCoord2f( GLfloat x
, GLfloat y
)
217 DISPATCH_ATTR2F( _TNL_ATTRIB_TEX0
, x
, y
);
220 static void GLAPIENTRY
_tnl_TexCoord2fv( const GLfloat
*v
)
222 DISPATCH_ATTR2FV( _TNL_ATTRIB_TEX0
, v
);
225 static void GLAPIENTRY
_tnl_TexCoord3f( GLfloat x
, GLfloat y
, GLfloat z
)
227 DISPATCH_ATTR3F( _TNL_ATTRIB_TEX0
, x
, y
, z
);
230 static void GLAPIENTRY
_tnl_TexCoord3fv( const GLfloat
*v
)
232 DISPATCH_ATTR3FV( _TNL_ATTRIB_TEX0
, v
);
235 static void GLAPIENTRY
_tnl_TexCoord4f( GLfloat x
, GLfloat y
, GLfloat z
,
238 DISPATCH_ATTR4F( _TNL_ATTRIB_TEX0
, x
, y
, z
, w
);
241 static void GLAPIENTRY
_tnl_TexCoord4fv( const GLfloat
*v
)
243 DISPATCH_ATTR4FV( _TNL_ATTRIB_TEX0
, v
);
246 static void GLAPIENTRY
_tnl_Normal3f( GLfloat x
, GLfloat y
, GLfloat z
)
248 DISPATCH_ATTR3F( _TNL_ATTRIB_NORMAL
, x
, y
, z
);
251 static void GLAPIENTRY
_tnl_Normal3fv( const GLfloat
*v
)
253 DISPATCH_ATTR3FV( _TNL_ATTRIB_NORMAL
, v
);
256 static void GLAPIENTRY
_tnl_FogCoordfEXT( GLfloat x
)
258 DISPATCH_ATTR1F( _TNL_ATTRIB_FOG
, x
);
261 static void GLAPIENTRY
_tnl_FogCoordfvEXT( const GLfloat
*v
)
263 DISPATCH_ATTR1FV( _TNL_ATTRIB_FOG
, v
);
266 static void GLAPIENTRY
_tnl_Color3f( GLfloat x
, GLfloat y
, GLfloat z
)
268 DISPATCH_ATTR3F( _TNL_ATTRIB_COLOR0
, x
, y
, z
);
271 static void GLAPIENTRY
_tnl_Color3fv( const GLfloat
*v
)
273 DISPATCH_ATTR3FV( _TNL_ATTRIB_COLOR0
, v
);
276 static void GLAPIENTRY
_tnl_Color4f( GLfloat x
, GLfloat y
, GLfloat z
,
279 DISPATCH_ATTR4F( _TNL_ATTRIB_COLOR0
, x
, y
, z
, w
);
282 static void GLAPIENTRY
_tnl_Color4fv( const GLfloat
*v
)
284 DISPATCH_ATTR4FV( _TNL_ATTRIB_COLOR0
, v
);
287 static void GLAPIENTRY
_tnl_SecondaryColor3fEXT( GLfloat x
, GLfloat y
,
290 DISPATCH_ATTR3F( _TNL_ATTRIB_COLOR1
, x
, y
, z
);
293 static void GLAPIENTRY
_tnl_SecondaryColor3fvEXT( const GLfloat
*v
)
295 DISPATCH_ATTR3FV( _TNL_ATTRIB_COLOR1
, v
);
298 static void GLAPIENTRY
_tnl_MultiTexCoord1f( GLenum target
, GLfloat x
)
300 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
301 DISPATCH_ATTR1F( attr
, x
);
304 static void GLAPIENTRY
_tnl_MultiTexCoord1fv( GLenum target
,
307 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
308 DISPATCH_ATTR1FV( attr
, v
);
311 static void GLAPIENTRY
_tnl_MultiTexCoord2f( GLenum target
, GLfloat x
,
314 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
315 DISPATCH_ATTR2F( attr
, x
, y
);
318 static void GLAPIENTRY
_tnl_MultiTexCoord2fv( GLenum target
,
321 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
322 DISPATCH_ATTR2FV( attr
, v
);
325 static void GLAPIENTRY
_tnl_MultiTexCoord3f( GLenum target
, GLfloat x
,
326 GLfloat y
, GLfloat z
)
328 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
329 DISPATCH_ATTR3F( attr
, x
, y
, z
);
332 static void GLAPIENTRY
_tnl_MultiTexCoord3fv( GLenum target
,
335 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
336 DISPATCH_ATTR3FV( attr
, v
);
339 static void GLAPIENTRY
_tnl_MultiTexCoord4f( GLenum target
, GLfloat x
,
340 GLfloat y
, GLfloat z
,
343 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
344 DISPATCH_ATTR4F( attr
, x
, y
, z
, w
);
347 static void GLAPIENTRY
_tnl_MultiTexCoord4fv( GLenum target
,
350 GLuint attr
= (target
& 0x7) + _TNL_ATTRIB_TEX0
;
351 DISPATCH_ATTR4FV( attr
, v
);
354 static void GLAPIENTRY
_tnl_VertexAttrib1fNV( GLuint index
, GLfloat x
)
356 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
357 DISPATCH_ATTR1F( index
, x
);
360 static void GLAPIENTRY
_tnl_VertexAttrib1fvNV( GLuint index
,
363 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
364 DISPATCH_ATTR1FV( index
, v
);
367 static void GLAPIENTRY
_tnl_VertexAttrib2fNV( GLuint index
, GLfloat x
,
370 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
371 DISPATCH_ATTR2F( index
, x
, y
);
374 static void GLAPIENTRY
_tnl_VertexAttrib2fvNV( GLuint index
,
377 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
378 DISPATCH_ATTR2FV( index
, v
);
381 static void GLAPIENTRY
_tnl_VertexAttrib3fNV( GLuint index
, GLfloat x
,
382 GLfloat y
, GLfloat z
)
384 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
385 DISPATCH_ATTR3F( index
, x
, y
, z
);
388 static void GLAPIENTRY
_tnl_VertexAttrib3fvNV( GLuint index
,
391 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
392 DISPATCH_ATTR3FV( index
, v
);
395 static void GLAPIENTRY
_tnl_VertexAttrib4fNV( GLuint index
, GLfloat x
,
396 GLfloat y
, GLfloat z
,
399 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
400 DISPATCH_ATTR4F( index
, x
, y
, z
, w
);
403 static void GLAPIENTRY
_tnl_VertexAttrib4fvNV( GLuint index
,
406 if (index
>= VERT_ATTRIB_MAX
) index
= ERROR_ATTRIB
;
407 DISPATCH_ATTR4FV( index
, v
);
411 /* Install the generic versions of the 2nd level dispatch functions.
412 * [dBorca] Some of these have a codegen alternative.
414 void _tnl_generic_exec_vtxfmt_init( GLcontext
*ctx
)
416 GLvertexformat
*vfmt
= &(TNL_CONTEXT(ctx
)->exec_vtxfmt
);
418 vfmt
->Color3f
= _tnl_Color3f
;
419 vfmt
->Color3fv
= _tnl_Color3fv
;
420 vfmt
->Color4f
= _tnl_Color4f
;
421 vfmt
->Color4fv
= _tnl_Color4fv
;
422 vfmt
->FogCoordfEXT
= _tnl_FogCoordfEXT
;
423 vfmt
->FogCoordfvEXT
= _tnl_FogCoordfvEXT
;
424 vfmt
->MultiTexCoord1fARB
= _tnl_MultiTexCoord1f
;
425 vfmt
->MultiTexCoord1fvARB
= _tnl_MultiTexCoord1fv
;
426 vfmt
->MultiTexCoord2fARB
= _tnl_MultiTexCoord2f
;
427 vfmt
->MultiTexCoord2fvARB
= _tnl_MultiTexCoord2fv
;
428 vfmt
->MultiTexCoord3fARB
= _tnl_MultiTexCoord3f
;
429 vfmt
->MultiTexCoord3fvARB
= _tnl_MultiTexCoord3fv
;
430 vfmt
->MultiTexCoord4fARB
= _tnl_MultiTexCoord4f
;
431 vfmt
->MultiTexCoord4fvARB
= _tnl_MultiTexCoord4fv
;
432 vfmt
->Normal3f
= _tnl_Normal3f
;
433 vfmt
->Normal3fv
= _tnl_Normal3fv
;
434 vfmt
->SecondaryColor3fEXT
= _tnl_SecondaryColor3fEXT
;
435 vfmt
->SecondaryColor3fvEXT
= _tnl_SecondaryColor3fvEXT
;
436 vfmt
->TexCoord1f
= _tnl_TexCoord1f
;
437 vfmt
->TexCoord1fv
= _tnl_TexCoord1fv
;
438 vfmt
->TexCoord2f
= _tnl_TexCoord2f
;
439 vfmt
->TexCoord2fv
= _tnl_TexCoord2fv
;
440 vfmt
->TexCoord3f
= _tnl_TexCoord3f
;
441 vfmt
->TexCoord3fv
= _tnl_TexCoord3fv
;
442 vfmt
->TexCoord4f
= _tnl_TexCoord4f
;
443 vfmt
->TexCoord4fv
= _tnl_TexCoord4fv
;
444 vfmt
->Vertex2f
= _tnl_Vertex2f
;
445 vfmt
->Vertex2fv
= _tnl_Vertex2fv
;
446 vfmt
->Vertex3f
= _tnl_Vertex3f
;
447 vfmt
->Vertex3fv
= _tnl_Vertex3fv
;
448 vfmt
->Vertex4f
= _tnl_Vertex4f
;
449 vfmt
->Vertex4fv
= _tnl_Vertex4fv
;
450 vfmt
->VertexAttrib1fNV
= _tnl_VertexAttrib1fNV
;
451 vfmt
->VertexAttrib1fvNV
= _tnl_VertexAttrib1fvNV
;
452 vfmt
->VertexAttrib2fNV
= _tnl_VertexAttrib2fNV
;
453 vfmt
->VertexAttrib2fvNV
= _tnl_VertexAttrib2fvNV
;
454 vfmt
->VertexAttrib3fNV
= _tnl_VertexAttrib3fNV
;
455 vfmt
->VertexAttrib3fvNV
= _tnl_VertexAttrib3fvNV
;
456 vfmt
->VertexAttrib4fNV
= _tnl_VertexAttrib4fNV
;
457 vfmt
->VertexAttrib4fvNV
= _tnl_VertexAttrib4fvNV
;