1 /* $XFree86: xc/lib/GL/mesa/src/drv/r200/r200_vtxfmt_c.c,v 1.2 2002/12/16 16:18:56 dawes Exp $ */
3 Copyright (C) The Weather Channel, Inc. 2002. All Rights Reserved.
5 The Weather Channel (TM) funded Tungsten Graphics to develop the
6 initial release of the Radeon 8500 driver under the XFree86 license.
7 This notice must be preserved.
9 Permission is hereby granted, free of charge, to any person obtaining
10 a copy of this software and associated documentation files (the
11 "Software"), to deal in the Software without restriction, including
12 without limitation the rights to use, copy, modify, merge, publish,
13 distribute, sublicense, and/or sell copies of the Software, and to
14 permit persons to whom the Software is furnished to do so, subject to
15 the following conditions:
17 The above copyright notice and this permission notice (including the
18 next paragraph) shall be included in all copies or substantial
19 portions of the Software.
21 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
24 IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
25 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
29 **************************************************************************/
33 * Keith Whitwell <keith@tungstengraphics.com>
40 #include "simple_list.h"
44 #include "r200_vtxfmt.h"
49 /* Fallback versions of all the entrypoints for situations where
50 * codegen isn't available. This is still a lot faster than the
51 * vb/pipeline implementation in Mesa.
53 static void r200_Vertex3f( GLfloat x
, GLfloat y
, GLfloat z
)
55 GET_CURRENT_CONTEXT(ctx
);
56 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
59 *rmesa
->vb
.dmaptr
++ = *(int *)&x
;
60 *rmesa
->vb
.dmaptr
++ = *(int *)&y
;
61 *rmesa
->vb
.dmaptr
++ = *(int *)&z
;
63 for (i
= 3; i
< rmesa
->vb
.vertex_size
; i
++)
64 *rmesa
->vb
.dmaptr
++ = rmesa
->vb
.vertex
[i
].i
;
66 if (--rmesa
->vb
.counter
== 0)
71 static void r200_Vertex3fv( const GLfloat
*v
)
73 GET_CURRENT_CONTEXT(ctx
);
74 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
77 *rmesa
->vb
.dmaptr
++ = *(int *)&v
[0];
78 *rmesa
->vb
.dmaptr
++ = *(int *)&v
[1];
79 *rmesa
->vb
.dmaptr
++ = *(int *)&v
[2];
81 for (i
= 3; i
< rmesa
->vb
.vertex_size
; i
++)
82 *rmesa
->vb
.dmaptr
++ = rmesa
->vb
.vertex
[i
].i
;
84 if (--rmesa
->vb
.counter
== 0)
89 static void r200_Vertex2f( GLfloat x
, GLfloat y
)
91 GET_CURRENT_CONTEXT(ctx
);
92 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
95 *rmesa
->vb
.dmaptr
++ = *(int *)&x
;
96 *rmesa
->vb
.dmaptr
++ = *(int *)&y
;
97 *rmesa
->vb
.dmaptr
++ = 0;
99 for (i
= 3; i
< rmesa
->vb
.vertex_size
; i
++)
100 *rmesa
->vb
.dmaptr
++ = rmesa
->vb
.vertex
[i
].i
;
102 if (--rmesa
->vb
.counter
== 0)
107 static void r200_Vertex2fv( const GLfloat
*v
)
109 GET_CURRENT_CONTEXT(ctx
);
110 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
113 *rmesa
->vb
.dmaptr
++ = *(int *)&v
[0];
114 *rmesa
->vb
.dmaptr
++ = *(int *)&v
[1];
115 *rmesa
->vb
.dmaptr
++ = 0;
117 for (i
= 3; i
< rmesa
->vb
.vertex_size
; i
++)
118 *rmesa
->vb
.dmaptr
++ = rmesa
->vb
.vertex
[i
].i
;
120 if (--rmesa
->vb
.counter
== 0)
126 /* Color for ubyte (packed) color formats:
129 static void r200_Color3ub_ub( GLubyte r
, GLubyte g
, GLubyte b
)
131 GET_CURRENT_CONTEXT(ctx
);
132 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
133 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
140 static void r200_Color3ubv_ub( const GLubyte
*v
)
142 GET_CURRENT_CONTEXT(ctx
);
143 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
144 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
151 static void r200_Color4ub_ub( GLubyte r
, GLubyte g
, GLubyte b
, GLubyte a
)
153 GET_CURRENT_CONTEXT(ctx
);
154 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
155 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
162 static void r200_Color4ubv_ub( const GLubyte
*v
)
164 GET_CURRENT_CONTEXT(ctx
);
165 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
166 *(GLuint
*)rmesa
->vb
.colorptr
= LE32_TO_CPU(*(GLuint
*)v
);
170 static void r200_Color3f_ub( GLfloat r
, GLfloat g
, GLfloat b
)
172 GET_CURRENT_CONTEXT(ctx
);
173 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
174 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
175 UNCLAMPED_FLOAT_TO_UBYTE( dest
->red
, r
);
176 UNCLAMPED_FLOAT_TO_UBYTE( dest
->green
, g
);
177 UNCLAMPED_FLOAT_TO_UBYTE( dest
->blue
, b
);
181 static void r200_Color3fv_ub( const GLfloat
*v
)
183 GET_CURRENT_CONTEXT(ctx
);
184 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
185 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
186 UNCLAMPED_FLOAT_TO_UBYTE( dest
->red
, v
[0] );
187 UNCLAMPED_FLOAT_TO_UBYTE( dest
->green
, v
[1] );
188 UNCLAMPED_FLOAT_TO_UBYTE( dest
->blue
, v
[2] );
192 static void r200_Color4f_ub( GLfloat r
, GLfloat g
, GLfloat b
, GLfloat a
)
194 GET_CURRENT_CONTEXT(ctx
);
195 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
196 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
197 UNCLAMPED_FLOAT_TO_UBYTE( dest
->red
, r
);
198 UNCLAMPED_FLOAT_TO_UBYTE( dest
->green
, g
);
199 UNCLAMPED_FLOAT_TO_UBYTE( dest
->blue
, b
);
200 UNCLAMPED_FLOAT_TO_UBYTE( dest
->alpha
, a
);
203 static void r200_Color4fv_ub( const GLfloat
*v
)
205 GET_CURRENT_CONTEXT(ctx
);
206 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
207 r200_color_t
*dest
= rmesa
->vb
.colorptr
;
208 UNCLAMPED_FLOAT_TO_UBYTE( dest
->red
, v
[0] );
209 UNCLAMPED_FLOAT_TO_UBYTE( dest
->green
, v
[1] );
210 UNCLAMPED_FLOAT_TO_UBYTE( dest
->blue
, v
[2] );
211 UNCLAMPED_FLOAT_TO_UBYTE( dest
->alpha
, v
[3] );
215 /* Color for float color+alpha formats:
218 static void r200_Color3ub_4f( GLubyte r
, GLubyte g
, GLubyte b
)
220 GET_CURRENT_CONTEXT(ctx
);
221 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
222 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
223 dest
[0] = UBYTE_TO_FLOAT(r
);
224 dest
[1] = UBYTE_TO_FLOAT(g
);
225 dest
[2] = UBYTE_TO_FLOAT(b
);
229 static void r200_Color3ubv_4f( const GLubyte
*v
)
231 GET_CURRENT_CONTEXT(ctx
);
232 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
233 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
234 dest
[0] = UBYTE_TO_FLOAT(v
[0]);
235 dest
[1] = UBYTE_TO_FLOAT(v
[1]);
236 dest
[2] = UBYTE_TO_FLOAT(v
[2]);
240 static void r200_Color4ub_4f( GLubyte r
, GLubyte g
, GLubyte b
, GLubyte a
)
242 GET_CURRENT_CONTEXT(ctx
);
243 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
244 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
245 dest
[0] = UBYTE_TO_FLOAT(r
);
246 dest
[1] = UBYTE_TO_FLOAT(g
);
247 dest
[2] = UBYTE_TO_FLOAT(b
);
248 dest
[3] = UBYTE_TO_FLOAT(a
);
251 static void r200_Color4ubv_4f( const GLubyte
*v
)
253 GET_CURRENT_CONTEXT(ctx
);
254 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
255 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
256 dest
[0] = UBYTE_TO_FLOAT(v
[0]);
257 dest
[1] = UBYTE_TO_FLOAT(v
[1]);
258 dest
[2] = UBYTE_TO_FLOAT(v
[2]);
259 dest
[3] = UBYTE_TO_FLOAT(v
[3]);
264 static void r200_Color3f_4f( GLfloat r
, GLfloat g
, GLfloat b
)
266 GET_CURRENT_CONTEXT(ctx
);
267 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
268 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
275 static void r200_Color3fv_4f( const GLfloat
*v
)
277 GET_CURRENT_CONTEXT(ctx
);
278 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
279 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
286 static void r200_Color4f_4f( GLfloat r
, GLfloat g
, GLfloat b
, GLfloat a
)
288 GET_CURRENT_CONTEXT(ctx
);
289 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
290 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
297 static void r200_Color4fv_4f( const GLfloat
*v
)
299 GET_CURRENT_CONTEXT(ctx
);
300 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
301 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
309 /* Color for float color formats:
312 static void r200_Color3ub_3f( GLubyte r
, GLubyte g
, GLubyte b
)
314 GET_CURRENT_CONTEXT(ctx
);
315 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
316 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
317 dest
[0] = UBYTE_TO_FLOAT(r
);
318 dest
[1] = UBYTE_TO_FLOAT(g
);
319 dest
[2] = UBYTE_TO_FLOAT(b
);
322 static void r200_Color3ubv_3f( const GLubyte
*v
)
324 GET_CURRENT_CONTEXT(ctx
);
325 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
326 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
327 dest
[0] = UBYTE_TO_FLOAT(v
[0]);
328 dest
[1] = UBYTE_TO_FLOAT(v
[1]);
329 dest
[2] = UBYTE_TO_FLOAT(v
[2]);
332 static void r200_Color4ub_3f( GLubyte r
, GLubyte g
, GLubyte b
, GLubyte a
)
334 GET_CURRENT_CONTEXT(ctx
);
335 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
336 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
337 dest
[0] = UBYTE_TO_FLOAT(r
);
338 dest
[1] = UBYTE_TO_FLOAT(g
);
339 dest
[2] = UBYTE_TO_FLOAT(b
);
340 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] = UBYTE_TO_FLOAT(a
);
343 static void r200_Color4ubv_3f( const GLubyte
*v
)
345 GET_CURRENT_CONTEXT(ctx
);
346 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
347 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
348 dest
[0] = UBYTE_TO_FLOAT(v
[0]);
349 dest
[1] = UBYTE_TO_FLOAT(v
[1]);
350 dest
[2] = UBYTE_TO_FLOAT(v
[2]);
351 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] = UBYTE_TO_FLOAT(v
[3]);
356 static void r200_Color3f_3f( GLfloat r
, GLfloat g
, GLfloat b
)
358 GET_CURRENT_CONTEXT(ctx
);
359 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
360 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
366 static void r200_Color3fv_3f( const GLfloat
*v
)
368 GET_CURRENT_CONTEXT(ctx
);
369 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
370 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
376 static void r200_Color4f_3f( GLfloat r
, GLfloat g
, GLfloat b
, GLfloat a
)
378 GET_CURRENT_CONTEXT(ctx
);
379 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
380 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
384 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] = a
;
387 static void r200_Color4fv_3f( const GLfloat
*v
)
389 GET_CURRENT_CONTEXT(ctx
);
390 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
391 GLfloat
*dest
= rmesa
->vb
.floatcolorptr
;
395 ctx
->Current
.Attrib
[VERT_ATTRIB_COLOR0
][3] = v
[3];
402 static void r200_SecondaryColor3ubEXT_ub( GLubyte r
, GLubyte g
, GLubyte b
)
404 GET_CURRENT_CONTEXT(ctx
);
405 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
406 r200_color_t
*dest
= rmesa
->vb
.specptr
;
413 static void r200_SecondaryColor3ubvEXT_ub( const GLubyte
*v
)
415 GET_CURRENT_CONTEXT(ctx
);
416 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
417 r200_color_t
*dest
= rmesa
->vb
.specptr
;
425 static void r200_SecondaryColor3fEXT_ub( GLfloat r
, GLfloat g
, GLfloat b
)
427 GET_CURRENT_CONTEXT(ctx
);
428 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
429 r200_color_t
*dest
= rmesa
->vb
.specptr
;
430 UNCLAMPED_FLOAT_TO_UBYTE( dest
->red
, r
);
431 UNCLAMPED_FLOAT_TO_UBYTE( dest
->green
, g
);
432 UNCLAMPED_FLOAT_TO_UBYTE( dest
->blue
, b
);
436 static void r200_SecondaryColor3fvEXT_ub( const GLfloat
*v
)
438 GET_CURRENT_CONTEXT(ctx
);
439 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
440 r200_color_t
*dest
= rmesa
->vb
.specptr
;
441 UNCLAMPED_FLOAT_TO_UBYTE( dest
->red
, v
[0] );
442 UNCLAMPED_FLOAT_TO_UBYTE( dest
->green
, v
[1] );
443 UNCLAMPED_FLOAT_TO_UBYTE( dest
->blue
, v
[2] );
448 static void r200_SecondaryColor3ubEXT_3f( GLubyte r
, GLubyte g
, GLubyte b
)
450 GET_CURRENT_CONTEXT(ctx
);
451 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
452 GLfloat
*dest
= rmesa
->vb
.floatspecptr
;
453 dest
[0] = UBYTE_TO_FLOAT(r
);
454 dest
[1] = UBYTE_TO_FLOAT(g
);
455 dest
[2] = UBYTE_TO_FLOAT(b
);
459 static void r200_SecondaryColor3ubvEXT_3f( const GLubyte
*v
)
461 GET_CURRENT_CONTEXT(ctx
);
462 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
463 GLfloat
*dest
= rmesa
->vb
.floatspecptr
;
464 dest
[0] = UBYTE_TO_FLOAT(v
[0]);
465 dest
[1] = UBYTE_TO_FLOAT(v
[1]);
466 dest
[2] = UBYTE_TO_FLOAT(v
[2]);
471 static void r200_SecondaryColor3fEXT_3f( GLfloat r
, GLfloat g
, GLfloat b
)
473 GET_CURRENT_CONTEXT(ctx
);
474 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
475 GLfloat
*dest
= rmesa
->vb
.floatspecptr
;
482 static void r200_SecondaryColor3fvEXT_3f( const GLfloat
*v
)
484 GET_CURRENT_CONTEXT(ctx
);
485 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
486 GLfloat
*dest
= rmesa
->vb
.floatspecptr
;
497 static void r200_Normal3f( GLfloat n0
, GLfloat n1
, GLfloat n2
)
499 GET_CURRENT_CONTEXT(ctx
);
500 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
501 GLfloat
*dest
= rmesa
->vb
.normalptr
;
507 static void r200_Normal3fv( const GLfloat
*v
)
509 GET_CURRENT_CONTEXT(ctx
);
510 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
511 GLfloat
*dest
= rmesa
->vb
.normalptr
;
520 static void r200_FogCoordfEXT( GLfloat f
)
522 GET_CURRENT_CONTEXT(ctx
);
523 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
524 GLfloat
*dest
= rmesa
->vb
.fogptr
;
525 dest
[0] = r200ComputeFogBlendFactor( ctx
, f
);
526 /* ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = f;*/
529 static void r200_FogCoordfvEXT( const GLfloat
*v
)
531 GET_CURRENT_CONTEXT(ctx
);
532 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
533 GLfloat
*dest
= rmesa
->vb
.fogptr
;
534 dest
[0] = r200ComputeFogBlendFactor( ctx
, v
[0] );
535 /* ctx->Current.Attrib[VERT_ATTRIB_FOG][0] = v[0];*/
542 /* \todo maybe (target & 4 ? target & 5 : target & 3) is more save than (target & 7) */
543 static void r200_MultiTexCoord1fARB(GLenum target
, GLfloat s
)
545 GET_CURRENT_CONTEXT(ctx
);
546 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
547 GLint unit
= (target
& 7);
548 GLfloat
* const dest
= rmesa
->vb
.texcoordptr
[unit
];
550 switch( ctx
->Texture
.Unit
[unit
]._ReallyEnabled
) {
551 case TEXTURE_CUBE_BIT
:
556 case TEXTURE_RECT_BIT
:
564 static void r200_MultiTexCoord2fARB(GLenum target
, GLfloat s
, GLfloat t
)
566 GET_CURRENT_CONTEXT(ctx
);
567 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
568 GLint unit
= (target
& 7);
569 GLfloat
* const dest
= rmesa
->vb
.texcoordptr
[unit
];
571 switch( ctx
->Texture
.Unit
[unit
]._ReallyEnabled
) {
572 case TEXTURE_CUBE_BIT
:
577 case TEXTURE_RECT_BIT
:
582 VFMT_FALLBACK(__FUNCTION__
);
583 CALL_MultiTexCoord2fARB(GET_DISPATCH(), (target
, s
, t
));
588 static void r200_MultiTexCoord3fARB(GLenum target
, GLfloat s
, GLfloat t
, GLfloat r
)
590 GET_CURRENT_CONTEXT(ctx
);
591 r200ContextPtr rmesa
= R200_CONTEXT(ctx
);
592 GLint unit
= (target
& 7);
593 GLfloat
* const dest
= rmesa
->vb
.texcoordptr
[unit
];
595 switch( ctx
->Texture
.Unit
[unit
]._ReallyEnabled
) {
596 case TEXTURE_CUBE_BIT
:
603 VFMT_FALLBACK(__FUNCTION__
);
604 CALL_MultiTexCoord3fARB(GET_DISPATCH(), (target
, s
, t
, r
));
609 static void r200_TexCoord1f(GLfloat s
)
611 r200_MultiTexCoord1fARB(GL_TEXTURE0
, s
);
614 static void r200_TexCoord2f(GLfloat s
, GLfloat t
)
616 r200_MultiTexCoord2fARB(GL_TEXTURE0
, s
, t
);
619 static void r200_TexCoord3f(GLfloat s
, GLfloat t
, GLfloat r
)
621 r200_MultiTexCoord3fARB(GL_TEXTURE0
, s
, t
, r
);
624 static void r200_TexCoord1fv(const GLfloat
*v
)
626 r200_MultiTexCoord1fARB(GL_TEXTURE0
, v
[0]);
629 static void r200_TexCoord2fv(const GLfloat
*v
)
631 r200_MultiTexCoord2fARB(GL_TEXTURE0
, v
[0], v
[1]);
634 static void r200_TexCoord3fv(const GLfloat
*v
)
636 r200_MultiTexCoord3fARB(GL_TEXTURE0
, v
[0], v
[1], v
[2]);
639 static void r200_MultiTexCoord1fvARB(GLenum target
, const GLfloat
*v
)
641 r200_MultiTexCoord1fARB(target
, v
[0]);
644 static void r200_MultiTexCoord2fvARB(GLenum target
, const GLfloat
*v
)
646 r200_MultiTexCoord2fARB(target
, v
[0], v
[1]);
649 static void r200_MultiTexCoord3fvARB(GLenum target
, const GLfloat
*v
)
651 r200_MultiTexCoord3fARB(target
, v
[0], v
[1], v
[2]);
655 static struct dynfn
*lookup( struct dynfn
*l
, const int *key
)
660 if (f
->key
[0] == key
[0] && f
->key
[1] == key
[1])
667 /* Can't use the loopback template for this:
670 #define CHOOSE(FN, FNTYPE, MASK0, MASK1, ARGS1, ARGS2 ) \
671 static void choose_##FN ARGS1 \
673 GET_CURRENT_CONTEXT(ctx); \
674 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
678 key[0] = rmesa->vb.vtxfmt_0 & MASK0; \
679 key[1] = rmesa->vb.vtxfmt_1 & MASK1; \
681 dfn = lookup( &rmesa->vb.dfn_cache.FN, key ); \
683 dfn = rmesa->vb.codegen.FN( ctx, key ); \
684 else if (R200_DEBUG & DEBUG_CODEGEN) \
685 fprintf(stderr, "%s -- cached codegen\n", __FUNCTION__ ); \
688 SET_ ## FN (ctx->Exec, (FNTYPE)(dfn->code)); \
690 if (R200_DEBUG & DEBUG_CODEGEN) \
691 fprintf(stderr, "%s -- generic version\n", __FUNCTION__ ); \
692 SET_ ## FN (ctx->Exec, r200_##FN); \
695 ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT; \
696 CALL_ ## FN (ctx->Exec, ARGS2); \
701 /* For the _3f case, only allow one color function to be hooked in at
702 * a time. Eventually, use a similar mechanism to allow selecting the
703 * color component of the vertex format based on client behaviour.
705 * Note: Perform these actions even if there is a codegen or cached
706 * codegen version of the chosen function.
708 #define CHOOSE_COLOR(FN, FNTYPE, NR, MASK0, MASK1, ARGS1, ARGS2 ) \
709 static void choose_##FN ARGS1 \
711 GET_CURRENT_CONTEXT(ctx); \
712 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
716 key[0] = rmesa->vb.vtxfmt_0 & MASK0; \
717 key[1] = rmesa->vb.vtxfmt_1 & MASK1; \
719 if (VTX_COLOR(rmesa->vb.vtxfmt_0,0) == R200_VTX_PK_RGBA) { \
720 SET_ ## FN (ctx->Exec, r200_##FN##_ub); \
722 else if (VTX_COLOR(rmesa->vb.vtxfmt_0,0) == R200_VTX_FP_RGB) { \
724 if (rmesa->vb.installed_color_3f_sz != NR) { \
725 rmesa->vb.installed_color_3f_sz = NR; \
726 if (NR == 3) ctx->Current.Attrib[VERT_ATTRIB_COLOR0][3] = 1.0; \
727 if (ctx->Driver.NeedFlush & FLUSH_UPDATE_CURRENT) { \
728 r200_copy_to_current( ctx ); \
729 _mesa_install_exec_vtxfmt( ctx, &rmesa->vb.vtxfmt ); \
730 CALL_ ## FN (ctx->Exec, ARGS2); \
735 SET_ ## FN (ctx->Exec, r200_##FN##_3f); \
738 SET_ ## FN (ctx->Exec, r200_##FN##_4f); \
742 dfn = lookup( &rmesa->vb.dfn_cache.FN, key ); \
743 if (!dfn) dfn = rmesa->vb.codegen.FN( ctx, key ); \
746 if (R200_DEBUG & DEBUG_CODEGEN) \
747 fprintf(stderr, "%s -- codegen version\n", __FUNCTION__ ); \
748 SET_ ## FN (ctx->Exec, (FNTYPE)dfn->code); \
750 else if (R200_DEBUG & DEBUG_CODEGEN) \
751 fprintf(stderr, "%s -- 'c' version\n", __FUNCTION__ ); \
753 ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT; \
754 CALL_ ## FN (ctx->Exec, ARGS2); \
759 /* Right now there are both _ub and _3f versions of the secondary color
760 * functions. Currently, we only set-up the hardware to use the _ub versions.
761 * The _3f versions are needed for the cases where secondary color isn't used
762 * in the vertex format, but it still needs to be stored in the context
765 #define CHOOSE_SECONDARY_COLOR(FN, FNTYPE, MASK0, MASK1, ARGS1, ARGS2 ) \
766 static void choose_##FN ARGS1 \
768 GET_CURRENT_CONTEXT(ctx); \
769 r200ContextPtr rmesa = R200_CONTEXT(ctx); \
773 key[0] = rmesa->vb.vtxfmt_0 & MASK0; \
774 key[1] = rmesa->vb.vtxfmt_1 & MASK1; \
776 dfn = lookup( &rmesa->vb.dfn_cache.FN, key ); \
778 dfn = rmesa->vb.codegen.FN( ctx, key ); \
779 else if (R200_DEBUG & DEBUG_CODEGEN) \
780 fprintf(stderr, "%s -- cached version\n", __FUNCTION__ ); \
783 SET_ ## FN (ctx->Exec, (FNTYPE)(dfn->code)); \
785 if (R200_DEBUG & DEBUG_CODEGEN) \
786 fprintf(stderr, "%s -- generic version\n", __FUNCTION__ ); \
787 SET_ ## FN (ctx->Exec, (VTX_COLOR(rmesa->vb.vtxfmt_0,1) == R200_VTX_PK_RGBA) \
788 ? r200_##FN##_ub : r200_##FN##_3f); \
791 ctx->Driver.NeedFlush |= FLUSH_UPDATE_CURRENT; \
792 CALL_ ## FN (ctx->Exec, ARGS2); \
803 #define MASK_XYZW (R200_VTX_W0|R200_VTX_Z0)
804 #define MASK_NORM (MASK_XYZW|R200_VTX_N0)
805 #define MASK_FOG (MASK_NORM |R200_VTX_DISCRETE_FOG)
806 #define MASK_COLOR (MASK_FOG |(R200_VTX_COLOR_MASK<<R200_VTX_COLOR_0_SHIFT))
807 #define MASK_SPEC (MASK_COLOR|(R200_VTX_COLOR_MASK<<R200_VTX_COLOR_1_SHIFT))
811 #define MASK_ST0 (0x7 << R200_VTX_TEX0_COMP_CNT_SHIFT)
812 /* FIXME: maybe something like in the radeon driver is needed here? */
815 typedef void (*p4f
)( GLfloat
, GLfloat
, GLfloat
, GLfloat
);
816 typedef void (*p3f
)( GLfloat
, GLfloat
, GLfloat
);
817 typedef void (*p2f
)( GLfloat
, GLfloat
);
818 typedef void (*p1f
)( GLfloat
);
819 typedef void (*pe3f
)( GLenum
, GLfloat
, GLfloat
, GLfloat
);
820 typedef void (*pe2f
)( GLenum
, GLfloat
, GLfloat
);
821 typedef void (*pe1f
)( GLenum
, GLfloat
);
822 typedef void (*p4ub
)( GLubyte
, GLubyte
, GLubyte
, GLubyte
);
823 typedef void (*p3ub
)( GLubyte
, GLubyte
, GLubyte
);
824 typedef void (*pfv
)( const GLfloat
* );
825 typedef void (*pefv
)( GLenum
, const GLfloat
* );
826 typedef void (*pubv
)( const GLubyte
* );
829 CHOOSE(Normal3f
, p3f
, MASK_NORM
, 0,
830 (GLfloat a
,GLfloat b
,GLfloat c
), (a
,b
,c
))
831 CHOOSE(Normal3fv
, pfv
, MASK_NORM
, 0,
832 (const GLfloat
*v
), (v
))
835 CHOOSE_COLOR(Color4ub
, p4ub
, 4, MASK_COLOR
, 0,
836 (GLubyte a
,GLubyte b
, GLubyte c
, GLubyte d
), (a
,b
,c
,d
))
837 CHOOSE_COLOR(Color4ubv
, pubv
, 4, MASK_COLOR
, 0,
838 (const GLubyte
*v
), (v
))
839 CHOOSE_COLOR(Color3ub
, p3ub
, 3, MASK_COLOR
, 0,
840 (GLubyte a
,GLubyte b
, GLubyte c
), (a
,b
,c
))
841 CHOOSE_COLOR(Color3ubv
, pubv
, 3, MASK_COLOR
, 0,
842 (const GLubyte
*v
), (v
))
843 CHOOSE_SECONDARY_COLOR(SecondaryColor3ubEXT
, p3ub
, MASK_SPEC
, 0,
844 (GLubyte a
,GLubyte b
, GLubyte c
), (a
,b
,c
))
845 CHOOSE_SECONDARY_COLOR(SecondaryColor3ubvEXT
, pubv
, MASK_SPEC
, 0,
846 (const GLubyte
*v
), (v
))
849 CHOOSE_COLOR(Color4f
, p4f
, 4, MASK_COLOR
, 0,
850 (GLfloat a
,GLfloat b
, GLfloat c
, GLfloat d
), (a
,b
,c
,d
))
851 CHOOSE_COLOR(Color4fv
, pfv
, 4, MASK_COLOR
, 0,
852 (const GLfloat
*v
), (v
))
853 CHOOSE_COLOR(Color3f
, p3f
, 3, MASK_COLOR
, 0,
854 (GLfloat a
,GLfloat b
, GLfloat c
), (a
,b
,c
))
855 CHOOSE_COLOR(Color3fv
, pfv
, 3, MASK_COLOR
, 0,
856 (const GLfloat
*v
), (v
))
859 CHOOSE_SECONDARY_COLOR(SecondaryColor3fEXT
, p3f
, MASK_SPEC
, 0,
860 (GLfloat a
,GLfloat b
, GLfloat c
), (a
,b
,c
))
861 CHOOSE_SECONDARY_COLOR(SecondaryColor3fvEXT
, pfv
, MASK_SPEC
, 0,
862 (const GLfloat
*v
), (v
))
864 CHOOSE(TexCoord3f
, p3f
, ~0, MASK_ST0
,
865 (GLfloat a
,GLfloat b
,GLfloat c
), (a
,b
,c
))
866 CHOOSE(TexCoord3fv
, pfv
, ~0, MASK_ST0
,
867 (const GLfloat
*v
), (v
))
868 CHOOSE(TexCoord2f
, p2f
, ~0, MASK_ST0
,
869 (GLfloat a
,GLfloat b
), (a
,b
))
870 CHOOSE(TexCoord2fv
, pfv
, ~0, MASK_ST0
,
871 (const GLfloat
*v
), (v
))
872 CHOOSE(TexCoord1f
, p1f
, ~0, MASK_ST0
,
874 CHOOSE(TexCoord1fv
, pfv
, ~0, MASK_ST0
,
875 (const GLfloat
*v
), (v
))
877 CHOOSE(MultiTexCoord3fARB
, pe3f
, ~0, ~0,
878 (GLenum u
,GLfloat a
,GLfloat b
,GLfloat c
), (u
,a
,b
,c
))
879 CHOOSE(MultiTexCoord3fvARB
, pefv
, ~0, ~0,
880 (GLenum u
,const GLfloat
*v
), (u
,v
))
881 CHOOSE(MultiTexCoord2fARB
, pe2f
, ~0, ~0,
882 (GLenum u
,GLfloat a
,GLfloat b
), (u
,a
,b
))
883 CHOOSE(MultiTexCoord2fvARB
, pefv
, ~0, ~0,
884 (GLenum u
,const GLfloat
*v
), (u
,v
))
885 CHOOSE(MultiTexCoord1fARB
, pe1f
, ~0, ~0,
886 (GLenum u
,GLfloat a
), (u
,a
))
887 CHOOSE(MultiTexCoord1fvARB
, pefv
, ~0, ~0,
888 (GLenum u
,const GLfloat
*v
), (u
,v
))
890 CHOOSE(Vertex3f
, p3f
, ~0, ~0,
891 (GLfloat a
,GLfloat b
,GLfloat c
), (a
,b
,c
))
892 CHOOSE(Vertex3fv
, pfv
, ~0, ~0,
893 (const GLfloat
*v
), (v
))
894 CHOOSE(Vertex2f
, p2f
, ~0, ~0,
895 (GLfloat a
,GLfloat b
), (a
,b
))
896 CHOOSE(Vertex2fv
, pfv
, ~0, ~0,
897 (const GLfloat
*v
), (v
))
899 CHOOSE(FogCoordfEXT
, p1f
, MASK_FOG
, ~0,
901 CHOOSE(FogCoordfvEXT
, pfv
, MASK_FOG
, ~0,
902 (const GLfloat
*f
), (f
))
907 void r200VtxfmtInitChoosers( GLvertexformat
*vfmt
)
909 vfmt
->Color3f
= choose_Color3f
;
910 vfmt
->Color3fv
= choose_Color3fv
;
911 vfmt
->Color4f
= choose_Color4f
;
912 vfmt
->Color4fv
= choose_Color4fv
;
913 vfmt
->SecondaryColor3fEXT
= choose_SecondaryColor3fEXT
;
914 vfmt
->SecondaryColor3fvEXT
= choose_SecondaryColor3fvEXT
;
915 vfmt
->MultiTexCoord1fARB
= choose_MultiTexCoord1fARB
;
916 vfmt
->MultiTexCoord1fvARB
= choose_MultiTexCoord1fvARB
;
917 vfmt
->MultiTexCoord2fARB
= choose_MultiTexCoord2fARB
;
918 vfmt
->MultiTexCoord2fvARB
= choose_MultiTexCoord2fvARB
;
919 vfmt
->MultiTexCoord3fARB
= choose_MultiTexCoord3fARB
;
920 vfmt
->MultiTexCoord3fvARB
= choose_MultiTexCoord3fvARB
;
921 vfmt
->Normal3f
= choose_Normal3f
;
922 vfmt
->Normal3fv
= choose_Normal3fv
;
923 vfmt
->TexCoord1f
= choose_TexCoord1f
;
924 vfmt
->TexCoord1fv
= choose_TexCoord1fv
;
925 vfmt
->TexCoord2f
= choose_TexCoord2f
;
926 vfmt
->TexCoord2fv
= choose_TexCoord2fv
;
927 vfmt
->TexCoord3f
= choose_TexCoord3f
;
928 vfmt
->TexCoord3fv
= choose_TexCoord3fv
;
929 vfmt
->Vertex2f
= choose_Vertex2f
;
930 vfmt
->Vertex2fv
= choose_Vertex2fv
;
931 vfmt
->Vertex3f
= choose_Vertex3f
;
932 vfmt
->Vertex3fv
= choose_Vertex3fv
;
933 /* vfmt->FogCoordfEXT = choose_FogCoordfEXT;
934 vfmt->FogCoordfvEXT = choose_FogCoordfvEXT;*/
936 /* TODO: restore ubyte colors to vtxfmt.
939 vfmt
->Color3ub
= choose_Color3ub
;
940 vfmt
->Color3ubv
= choose_Color3ubv
;
941 vfmt
->Color4ub
= choose_Color4ub
;
942 vfmt
->Color4ubv
= choose_Color4ubv
;
943 vfmt
->SecondaryColor3ubEXT
= choose_SecondaryColor3ubEXT
;
944 vfmt
->SecondaryColor3ubvEXT
= choose_SecondaryColor3ubvEXT
;
949 static struct dynfn
*codegen_noop( GLcontext
*ctx
, const int *key
)
951 (void) ctx
; (void) key
;
955 void r200InitCodegen( struct dfn_generators
*gen
, GLboolean useCodegen
)
957 gen
->Vertex3f
= codegen_noop
;
958 gen
->Vertex3fv
= codegen_noop
;
959 gen
->Color4ub
= codegen_noop
;
960 gen
->Color4ubv
= codegen_noop
;
961 gen
->Normal3f
= codegen_noop
;
962 gen
->Normal3fv
= codegen_noop
;
964 gen
->TexCoord3f
= codegen_noop
;
965 gen
->TexCoord3fv
= codegen_noop
;
966 gen
->TexCoord2f
= codegen_noop
;
967 gen
->TexCoord2fv
= codegen_noop
;
968 gen
->TexCoord1f
= codegen_noop
;
969 gen
->TexCoord1fv
= codegen_noop
;
971 gen
->MultiTexCoord3fARB
= codegen_noop
;
972 gen
->MultiTexCoord3fvARB
= codegen_noop
;
973 gen
->MultiTexCoord2fARB
= codegen_noop
;
974 gen
->MultiTexCoord2fvARB
= codegen_noop
;
975 gen
->MultiTexCoord1fARB
= codegen_noop
;
976 gen
->MultiTexCoord1fvARB
= codegen_noop
;
977 /* gen->FogCoordfEXT = codegen_noop;
978 gen->FogCoordfvEXT = codegen_noop;*/
980 gen
->Vertex2f
= codegen_noop
;
981 gen
->Vertex2fv
= codegen_noop
;
982 gen
->Color3ub
= codegen_noop
;
983 gen
->Color3ubv
= codegen_noop
;
984 gen
->Color4f
= codegen_noop
;
985 gen
->Color4fv
= codegen_noop
;
986 gen
->Color3f
= codegen_noop
;
987 gen
->Color3fv
= codegen_noop
;
988 gen
->SecondaryColor3fEXT
= codegen_noop
;
989 gen
->SecondaryColor3fvEXT
= codegen_noop
;
990 gen
->SecondaryColor3ubEXT
= codegen_noop
;
991 gen
->SecondaryColor3ubvEXT
= codegen_noop
;
994 #if defined(USE_X86_ASM)
995 r200InitX86Codegen( gen
);
998 #if defined(USE_SSE_ASM)
999 r200InitSSECodegen( gen
);