8b731355b5172dfd5ecccd6ca802553bac7ea049
2 * Mesa 3-D graphics library
5 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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 * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM,
21 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
22 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE
23 * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27 * Keith Whitwell <keith@tungstengraphics.com>
28 * Daniel Borca <dborca@users.sourceforge.net>
43 #include "math/m_translate.h"
44 #include "swrast_setup/swrast_setup.h"
47 #include "tnl/t_context.h"
52 static void copy_pv( GLcontext
*ctx
, GLuint edst
, GLuint esrc
)
54 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
55 GrVertex
*dst
= fxMesa
->verts
+ edst
;
56 GrVertex
*src
= fxMesa
->verts
+ esrc
;
59 *(GLuint
*)&dst
->pargb
= *(GLuint
*)&src
->pargb
;
60 #else /* !FX_PACKEDCOLOR */
61 COPY_FLOAT(dst
->r
, src
->r
);
62 COPY_FLOAT(dst
->g
, src
->g
);
63 COPY_FLOAT(dst
->b
, src
->b
);
64 COPY_FLOAT(dst
->a
, src
->a
);
65 #endif /* !FX_PACKEDCOLOR */
68 static void copy_pv2( GLcontext
*ctx
, GLuint edst
, GLuint esrc
)
70 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
71 GrVertex
*dst
= fxMesa
->verts
+ edst
;
72 GrVertex
*src
= fxMesa
->verts
+ esrc
;
75 *(GLuint
*)&dst
->pargb
= *(GLuint
*)&src
->pargb
;
76 *(GLuint
*)&dst
->pspec
= *(GLuint
*)&src
->pspec
;
77 #else /* !FX_PACKEDCOLOR */
78 COPY_FLOAT(dst
->r
, src
->r
);
79 COPY_FLOAT(dst
->g
, src
->g
);
80 COPY_FLOAT(dst
->b
, src
->b
);
81 COPY_FLOAT(dst
->a
, src
->a
);
82 COPY_FLOAT(dst
->r1
, src
->r1
);
83 COPY_FLOAT(dst
->g1
, src
->g1
);
84 COPY_FLOAT(dst
->b1
, src
->b1
);
85 #endif /* !FX_PACKEDCOLOR */
89 void (*emit
) (GLcontext
*ctx
, GLuint start
, GLuint end
, void *dest
);
90 tnl_copy_pv_func copy_pv
;
91 tnl_interp_func interp
;
92 GLboolean (*check_tex_sizes
) (GLcontext
*ctx
);
94 } setup_tab
[MAX_SETUP
];
97 #define GET_COLOR(ptr, idx) ((ptr)->data[idx])
100 static void interp_extras( GLcontext
*ctx
,
102 GLuint dst
, GLuint out
, GLuint in
,
103 GLboolean force_boundary
)
105 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
107 /* If stride is zero, ColorPtr[1] is constant across the VB, so
108 * there is no point interpolating between two values as they will
111 if (VB
->ColorPtr
[1]) {
112 assert(VB
->ColorPtr
[1]->stride
== 4 * sizeof(GLfloat
));
115 GET_COLOR(VB
->ColorPtr
[1], dst
),
116 GET_COLOR(VB
->ColorPtr
[1], out
),
117 GET_COLOR(VB
->ColorPtr
[1], in
) );
119 if (VB
->SecondaryColorPtr
[1]) {
121 GET_COLOR(VB
->SecondaryColorPtr
[1], dst
),
122 GET_COLOR(VB
->SecondaryColorPtr
[1], out
),
123 GET_COLOR(VB
->SecondaryColorPtr
[1], in
) );
128 VB
->EdgeFlag
[dst
] = VB
->EdgeFlag
[out
] || force_boundary
;
131 setup_tab
[FX_CONTEXT(ctx
)->SetupIndex
].interp(ctx
, t
, dst
, out
, in
,
135 static void copy_pv_extras( GLcontext
*ctx
, GLuint dst
, GLuint src
)
137 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
139 if (VB
->ColorPtr
[1]) {
140 COPY_4FV( GET_COLOR(VB
->ColorPtr
[1], dst
),
141 GET_COLOR(VB
->ColorPtr
[1], src
) );
143 if (VB
->SecondaryColorPtr
[1]) {
144 COPY_3FV( GET_COLOR(VB
->SecondaryColorPtr
[1], dst
),
145 GET_COLOR(VB
->SecondaryColorPtr
[1], src
) );
149 setup_tab
[FX_CONTEXT(ctx
)->SetupIndex
].copy_pv(ctx
, dst
, src
);
153 #define IND (SETUP_XYZW|SETUP_RGBA)
154 #define TAG(x) x##_wg
157 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0)
158 #define TAG(x) x##_wgt0
161 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
162 #define TAG(x) x##_wgt0t1
165 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX)
166 #define TAG(x) x##_wgpt0
169 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
171 #define TAG(x) x##_wgpt0t1
174 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_PSIZ)
175 #define TAG(x) x##_wga
178 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ)
179 #define TAG(x) x##_wgt0a
182 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ)
183 #define TAG(x) x##_wgt0t1a
186 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ)
187 #define TAG(x) x##_wgpt0a
190 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
191 SETUP_PTEX|SETUP_PSIZ)
192 #define TAG(x) x##_wgpt0t1a
196 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC)
197 #define TAG(x) x##_2wg
200 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
201 #define TAG(x) x##_2wgt0
204 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1)
205 #define TAG(x) x##_2wgt0t1
208 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX)
209 #define TAG(x) x##_2wgpt0
212 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
214 #define TAG(x) x##_2wgpt0t1
217 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ)
218 #define TAG(x) x##_2wga
221 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ)
222 #define TAG(x) x##_2wgt0a
225 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ)
226 #define TAG(x) x##_2wgt0t1a
229 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ)
230 #define TAG(x) x##_2wgpt0a
233 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
234 SETUP_PTEX|SETUP_PSIZ)
235 #define TAG(x) x##_2wgpt0t1a
239 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_FOGC)
240 #define TAG(x) x##_wgf
243 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_FOGC)
244 #define TAG(x) x##_wgt0f
247 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_FOGC)
248 #define TAG(x) x##_wgt0t1f
251 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_FOGC)
252 #define TAG(x) x##_wgpt0f
255 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
256 SETUP_PTEX|SETUP_FOGC)
257 #define TAG(x) x##_wgpt0t1f
260 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_PSIZ|SETUP_FOGC)
261 #define TAG(x) x##_wgaf
264 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
265 #define TAG(x) x##_wgt0af
268 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
269 #define TAG(x) x##_wgt0t1af
272 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
273 #define TAG(x) x##_wgpt0af
276 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
277 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
278 #define TAG(x) x##_wgpt0t1af
282 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_FOGC)
283 #define TAG(x) x##_2wgf
286 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_FOGC)
287 #define TAG(x) x##_2wgt0f
290 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_FOGC)
291 #define TAG(x) x##_2wgt0t1f
294 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_FOGC)
295 #define TAG(x) x##_2wgpt0f
298 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
299 SETUP_PTEX|SETUP_FOGC)
300 #define TAG(x) x##_2wgpt0t1f
303 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ|SETUP_FOGC)
304 #define TAG(x) x##_2wgaf
307 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
308 #define TAG(x) x##_2wgt0af
311 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
312 #define TAG(x) x##_2wgt0t1af
315 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
316 #define TAG(x) x##_2wgpt0af
319 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
320 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
321 #define TAG(x) x##_2wgpt0t1af
326 /* Snapping for voodoo-1
328 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA)
329 #define TAG(x) x##_wsg
332 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0)
333 #define TAG(x) x##_wsgt0
336 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
338 #define TAG(x) x##_wsgt0t1
341 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
343 #define TAG(x) x##_wsgpt0
346 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
347 SETUP_TMU1|SETUP_PTEX)
348 #define TAG(x) x##_wsgpt0t1
351 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_PSIZ)
352 #define TAG(x) x##_wsga
355 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ)
356 #define TAG(x) x##_wsgt0a
359 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
360 SETUP_TMU1|SETUP_PSIZ)
361 #define TAG(x) x##_wsgt0t1a
364 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
365 SETUP_PTEX|SETUP_PSIZ)
366 #define TAG(x) x##_wsgpt0a
369 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
370 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ)
371 #define TAG(x) x##_wsgpt0t1a
375 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC)
376 #define TAG(x) x##_2wsg
379 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
380 #define TAG(x) x##_2wsgt0
383 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
385 #define TAG(x) x##_2wsgt0t1
388 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
390 #define TAG(x) x##_2wsgpt0
393 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
394 SETUP_TMU1|SETUP_PTEX)
395 #define TAG(x) x##_2wsgpt0t1
398 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ)
399 #define TAG(x) x##_2wsga
402 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ)
403 #define TAG(x) x##_2wsgt0a
406 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
407 SETUP_TMU1|SETUP_PSIZ)
408 #define TAG(x) x##_2wsgt0t1a
411 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
412 SETUP_PTEX|SETUP_PSIZ)
413 #define TAG(x) x##_2wsgpt0a
416 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
417 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ)
418 #define TAG(x) x##_2wsgpt0t1a
422 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_FOGC)
423 #define TAG(x) x##_wsgf
426 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_FOGC)
427 #define TAG(x) x##_wsgt0f
430 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
431 SETUP_TMU1|SETUP_FOGC)
432 #define TAG(x) x##_wsgt0t1f
435 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
436 SETUP_PTEX|SETUP_FOGC)
437 #define TAG(x) x##_wsgpt0f
440 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
441 SETUP_TMU1|SETUP_PTEX|SETUP_FOGC)
442 #define TAG(x) x##_wsgpt0t1f
445 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_PSIZ|SETUP_FOGC)
446 #define TAG(x) x##_wsgaf
449 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
450 #define TAG(x) x##_wsgt0af
453 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
454 SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
455 #define TAG(x) x##_wsgt0t1af
458 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
459 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
460 #define TAG(x) x##_wsgpt0af
463 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
464 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
465 #define TAG(x) x##_wsgpt0t1af
469 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_FOGC)
470 #define TAG(x) x##_2wsgf
473 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_FOGC)
474 #define TAG(x) x##_2wsgt0f
477 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
478 SETUP_TMU1|SETUP_FOGC)
479 #define TAG(x) x##_2wsgt0t1f
482 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
483 SETUP_PTEX|SETUP_FOGC)
484 #define TAG(x) x##_2wsgpt0f
487 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
488 SETUP_TMU1|SETUP_PTEX|SETUP_FOGC)
489 #define TAG(x) x##_2wsgpt0t1f
492 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ|SETUP_FOGC)
493 #define TAG(x) x##_2wsgaf
496 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
497 #define TAG(x) x##_2wsgt0af
500 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
501 SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
502 #define TAG(x) x##_2wsgt0t1af
505 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
506 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
507 #define TAG(x) x##_2wsgpt0af
510 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
511 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
512 #define TAG(x) x##_2wsgpt0t1af
517 /* Vertex repair (multipass rendering)
519 #define IND (SETUP_RGBA)
523 #define IND (SETUP_TMU0)
524 #define TAG(x) x##_t0
527 #define IND (SETUP_TMU0|SETUP_TMU1)
528 #define TAG(x) x##_t0t1
531 #define IND (SETUP_RGBA|SETUP_TMU0)
532 #define TAG(x) x##_gt0
535 #define IND (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
536 #define TAG(x) x##_gt0t1
540 #define IND (SETUP_RGBA|SETUP_SPEC)
541 #define TAG(x) x##_2g
544 #define IND (SETUP_TMU0|SETUP_SPEC)
545 #define TAG(x) x##_2t0
548 #define IND (SETUP_TMU0|SETUP_SPEC|SETUP_TMU1)
549 #define TAG(x) x##_2t0t1
552 #define IND (SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
553 #define TAG(x) x##_2gt0
556 #define IND (SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1)
557 #define TAG(x) x##_2gt0t1
562 static void init_setup_tab( void )
659 void fxPrintSetupFlags(char *msg
, GLuint flags
)
661 fprintf(stderr
, "%s(%x): %s%s%s%s%s%s%s%s\n",
664 (flags
& SETUP_XYZW
) ? " xyzw," : "",
665 (flags
& SETUP_SNAP
) ? " snap," : "",
666 (flags
& SETUP_RGBA
) ? " rgba," : "",
667 (flags
& SETUP_TMU0
) ? " tex-0," : "",
668 (flags
& SETUP_TMU1
) ? " tex-1," : "",
669 (flags
& SETUP_PSIZ
) ? " psiz," : "",
670 (flags
& SETUP_SPEC
) ? " spec," : "",
671 (flags
& SETUP_FOGC
) ? " fog," : "");
676 void fxCheckTexSizes( GLcontext
*ctx
)
678 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
679 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
681 if (!setup_tab
[fxMesa
->SetupIndex
].check_tex_sizes(ctx
)) {
682 GLuint ind
= fxMesa
->SetupIndex
|= (SETUP_PTEX
|SETUP_RGBA
);
684 /* Tdfx handles projective textures nicely; just have to change
685 * up to the new vertex format.
687 if (setup_tab
[ind
].vertex_format
!= fxMesa
->stw_hint_state
) {
689 fxMesa
->stw_hint_state
= setup_tab
[ind
].vertex_format
;
690 FX_grHints(GR_HINT_STWHINT
, fxMesa
->stw_hint_state
);
692 /* This is required as we have just changed the vertex
693 * format, so the interp routines must also change.
694 * In the unfilled and twosided cases we are using the
695 * Extras ones anyway, so leave them in place.
697 if (!(ctx
->_TriangleCaps
& (DD_TRI_LIGHT_TWOSIDE
|DD_TRI_UNFILLED
))) {
698 tnl
->Driver
.Render
.Interp
= setup_tab
[fxMesa
->SetupIndex
].interp
;
705 void fxBuildVertices( GLcontext
*ctx
, GLuint start
, GLuint end
,
708 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
709 GrVertex
*v
= (fxMesa
->verts
+ start
);
714 if (newinputs
& VERT_BIT_POS
) {
715 setup_tab
[fxMesa
->SetupIndex
].emit( ctx
, start
, end
, v
);
719 if (newinputs
& VERT_BIT_COLOR0
)
722 if (newinputs
& VERT_BIT_COLOR1
)
725 if (newinputs
& VERT_BIT_FOG
)
728 if (newinputs
& VERT_BIT_TEX0
)
731 if (newinputs
& VERT_BIT_TEX1
)
732 ind
|= SETUP_TMU0
|SETUP_TMU1
;
734 if (fxMesa
->SetupIndex
& SETUP_PTEX
)
737 ind
&= fxMesa
->SetupIndex
;
740 setup_tab
[ind
].emit( ctx
, start
, end
, v
);
746 void fxChooseVertexState( GLcontext
*ctx
)
748 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
749 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
750 GLuint ind
= SETUP_XYZW
|SETUP_RGBA
;
752 if (fxMesa
->snapVertices
)
755 fxMesa
->tmu_source
[0] = 0;
756 fxMesa
->tmu_source
[1] = 1;
758 if (ctx
->Texture
._EnabledUnits
& 0x2) {
759 if (ctx
->Texture
._EnabledUnits
& 0x1) {
763 fxMesa
->tmu_source
[0] = 1;
764 fxMesa
->tmu_source
[1] = 0;
766 else if (ctx
->Texture
._EnabledUnits
& 0x1) {
770 if (ctx
->_TriangleCaps
& DD_POINT_ATTEN
) {
774 if (ctx
->_TriangleCaps
& DD_SEPARATE_SPECULAR
) {
778 if (ctx
->Fog
.FogCoordinateSource
== GL_FOG_COORDINATE_EXT
) {
782 fxMesa
->SetupIndex
= ind
;
784 if (ctx
->_TriangleCaps
& (DD_TRI_LIGHT_TWOSIDE
|DD_TRI_UNFILLED
)) {
785 tnl
->Driver
.Render
.Interp
= interp_extras
;
786 tnl
->Driver
.Render
.CopyPV
= copy_pv_extras
;
788 tnl
->Driver
.Render
.Interp
= setup_tab
[ind
].interp
;
789 tnl
->Driver
.Render
.CopyPV
= setup_tab
[ind
].copy_pv
;
792 if (setup_tab
[ind
].vertex_format
!= fxMesa
->stw_hint_state
) {
793 fxMesa
->stw_hint_state
= setup_tab
[ind
].vertex_format
;
794 FX_grHints(GR_HINT_STWHINT
, fxMesa
->stw_hint_state
);
800 void fxAllocVB( GLcontext
*ctx
)
802 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
803 GLuint size
= TNL_CONTEXT(ctx
)->vb
.Size
;
804 static int firsttime
= 1;
810 fxMesa
->verts
= (GrVertex
*)ALIGN_MALLOC(size
* sizeof(GrVertex
), 32);
811 fxMesa
->SetupIndex
= SETUP_XYZW
|SETUP_RGBA
;
815 void fxFreeVB( GLcontext
*ctx
)
817 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
819 ALIGN_FREE(fxMesa
->verts
);
827 * Need this to provide at least one external definition.
830 extern int gl_fx_dummy_function_vb(void);
832 gl_fx_dummy_function_vb(void)