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
;
58 *(GLuint
*)&dst
->pargb
= *(GLuint
*)&src
->pargb
;
61 static void copy_pv2( GLcontext
*ctx
, GLuint edst
, GLuint esrc
)
63 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
64 GrVertex
*dst
= fxMesa
->verts
+ edst
;
65 GrVertex
*src
= fxMesa
->verts
+ esrc
;
67 *(GLuint
*)&dst
->pargb
= *(GLuint
*)&src
->pargb
;
68 *(GLuint
*)&dst
->pspec
= *(GLuint
*)&src
->pspec
;
72 void (*emit
)( GLcontext
*, GLuint
, GLuint
, void * );
73 tnl_copy_pv_func copy_pv
;
74 tnl_interp_func interp
;
75 GLboolean (*check_tex_sizes
)( GLcontext
*ctx
);
77 } setup_tab
[MAX_SETUP
];
80 #define GET_COLOR(ptr, idx) ((ptr)->data[idx])
83 static void interp_extras( GLcontext
*ctx
,
85 GLuint dst
, GLuint out
, GLuint in
,
86 GLboolean force_boundary
)
88 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
90 if (VB
->ColorPtr
[1]) {
91 assert(VB
->ColorPtr
[1]->stride
== 4 * sizeof(GLfloat
));
94 GET_COLOR(VB
->ColorPtr
[1], dst
),
95 GET_COLOR(VB
->ColorPtr
[1], out
),
96 GET_COLOR(VB
->ColorPtr
[1], in
) );
98 if (VB
->SecondaryColorPtr
[1]) {
100 GET_COLOR(VB
->SecondaryColorPtr
[1], dst
),
101 GET_COLOR(VB
->SecondaryColorPtr
[1], out
),
102 GET_COLOR(VB
->SecondaryColorPtr
[1], in
) );
107 VB
->EdgeFlag
[dst
] = VB
->EdgeFlag
[out
] || force_boundary
;
110 setup_tab
[FX_CONTEXT(ctx
)->SetupIndex
].interp(ctx
, t
, dst
, out
, in
,
114 static void copy_pv_extras( GLcontext
*ctx
, GLuint dst
, GLuint src
)
116 struct vertex_buffer
*VB
= &TNL_CONTEXT(ctx
)->vb
;
118 if (VB
->ColorPtr
[1]) {
119 COPY_4FV( GET_COLOR(VB
->ColorPtr
[1], dst
),
120 GET_COLOR(VB
->ColorPtr
[1], src
) );
122 if (VB
->SecondaryColorPtr
[1]) {
123 COPY_3FV( GET_COLOR(VB
->SecondaryColorPtr
[1], dst
),
124 GET_COLOR(VB
->SecondaryColorPtr
[1], src
) );
128 setup_tab
[FX_CONTEXT(ctx
)->SetupIndex
].copy_pv(ctx
, dst
, src
);
132 #define IND (SETUP_XYZW|SETUP_RGBA)
133 #define TAG(x) x##_wg
136 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0)
137 #define TAG(x) x##_wgt0
140 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
141 #define TAG(x) x##_wgt0t1
144 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX)
145 #define TAG(x) x##_wgpt0
148 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
150 #define TAG(x) x##_wgpt0t1
153 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_PSIZ)
154 #define TAG(x) x##_wga
157 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ)
158 #define TAG(x) x##_wgt0a
161 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ)
162 #define TAG(x) x##_wgt0t1a
165 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ)
166 #define TAG(x) x##_wgpt0a
169 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
170 SETUP_PTEX|SETUP_PSIZ)
171 #define TAG(x) x##_wgpt0t1a
175 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC)
176 #define TAG(x) x##_2wg
179 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
180 #define TAG(x) x##_2wgt0
183 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1)
184 #define TAG(x) x##_2wgt0t1
187 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX)
188 #define TAG(x) x##_2wgpt0
191 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
193 #define TAG(x) x##_2wgpt0t1
196 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ)
197 #define TAG(x) x##_2wga
200 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ)
201 #define TAG(x) x##_2wgt0a
204 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ)
205 #define TAG(x) x##_2wgt0t1a
208 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ)
209 #define TAG(x) x##_2wgpt0a
212 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
213 SETUP_PTEX|SETUP_PSIZ)
214 #define TAG(x) x##_2wgpt0t1a
218 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_FOGC)
219 #define TAG(x) x##_wgf
222 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_FOGC)
223 #define TAG(x) x##_wgt0f
226 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_FOGC)
227 #define TAG(x) x##_wgt0t1f
230 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_FOGC)
231 #define TAG(x) x##_wgpt0f
234 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
235 SETUP_PTEX|SETUP_FOGC)
236 #define TAG(x) x##_wgpt0t1f
239 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_PSIZ|SETUP_FOGC)
240 #define TAG(x) x##_wgaf
243 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
244 #define TAG(x) x##_wgt0af
247 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
248 #define TAG(x) x##_wgt0t1af
251 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
252 #define TAG(x) x##_wgpt0af
255 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
256 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
257 #define TAG(x) x##_wgpt0t1af
261 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_FOGC)
262 #define TAG(x) x##_2wgf
265 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_FOGC)
266 #define TAG(x) x##_2wgt0f
269 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_FOGC)
270 #define TAG(x) x##_2wgt0t1f
273 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_FOGC)
274 #define TAG(x) x##_2wgpt0f
277 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
278 SETUP_PTEX|SETUP_FOGC)
279 #define TAG(x) x##_2wgpt0t1f
282 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ|SETUP_FOGC)
283 #define TAG(x) x##_2wgaf
286 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
287 #define TAG(x) x##_2wgt0af
290 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
291 #define TAG(x) x##_2wgt0t1af
294 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
295 #define TAG(x) x##_2wgpt0af
298 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
299 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
300 #define TAG(x) x##_2wgpt0t1af
305 /* Snapping for voodoo-1
307 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA)
308 #define TAG(x) x##_wsg
311 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0)
312 #define TAG(x) x##_wsgt0
315 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
317 #define TAG(x) x##_wsgt0t1
320 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
322 #define TAG(x) x##_wsgpt0
325 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
326 SETUP_TMU1|SETUP_PTEX)
327 #define TAG(x) x##_wsgpt0t1
330 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_PSIZ)
331 #define TAG(x) x##_wsga
334 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ)
335 #define TAG(x) x##_wsgt0a
338 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
339 SETUP_TMU1|SETUP_PSIZ)
340 #define TAG(x) x##_wsgt0t1a
343 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
344 SETUP_PTEX|SETUP_PSIZ)
345 #define TAG(x) x##_wsgpt0a
348 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
349 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ)
350 #define TAG(x) x##_wsgpt0t1a
354 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC)
355 #define TAG(x) x##_2wsg
358 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
359 #define TAG(x) x##_2wsgt0
362 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
364 #define TAG(x) x##_2wsgt0t1
367 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
369 #define TAG(x) x##_2wsgpt0
372 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
373 SETUP_TMU1|SETUP_PTEX)
374 #define TAG(x) x##_2wsgpt0t1
377 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ)
378 #define TAG(x) x##_2wsga
381 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ)
382 #define TAG(x) x##_2wsgt0a
385 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
386 SETUP_TMU1|SETUP_PSIZ)
387 #define TAG(x) x##_2wsgt0t1a
390 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
391 SETUP_PTEX|SETUP_PSIZ)
392 #define TAG(x) x##_2wsgpt0a
395 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
396 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ)
397 #define TAG(x) x##_2wsgpt0t1a
401 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_FOGC)
402 #define TAG(x) x##_wsgf
405 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_FOGC)
406 #define TAG(x) x##_wsgt0f
409 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
410 SETUP_TMU1|SETUP_FOGC)
411 #define TAG(x) x##_wsgt0t1f
414 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
415 SETUP_PTEX|SETUP_FOGC)
416 #define TAG(x) x##_wsgpt0f
419 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
420 SETUP_TMU1|SETUP_PTEX|SETUP_FOGC)
421 #define TAG(x) x##_wsgpt0t1f
424 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_PSIZ|SETUP_FOGC)
425 #define TAG(x) x##_wsgaf
428 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
429 #define TAG(x) x##_wsgt0af
432 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
433 SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
434 #define TAG(x) x##_wsgt0t1af
437 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
438 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
439 #define TAG(x) x##_wsgpt0af
442 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
443 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
444 #define TAG(x) x##_wsgpt0t1af
448 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_FOGC)
449 #define TAG(x) x##_2wsgf
452 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_FOGC)
453 #define TAG(x) x##_2wsgt0f
456 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
457 SETUP_TMU1|SETUP_FOGC)
458 #define TAG(x) x##_2wsgt0t1f
461 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
462 SETUP_PTEX|SETUP_FOGC)
463 #define TAG(x) x##_2wsgpt0f
466 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
467 SETUP_TMU1|SETUP_PTEX|SETUP_FOGC)
468 #define TAG(x) x##_2wsgpt0t1f
471 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ|SETUP_FOGC)
472 #define TAG(x) x##_2wsgaf
475 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ|SETUP_FOGC)
476 #define TAG(x) x##_2wsgt0af
479 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
480 SETUP_TMU1|SETUP_PSIZ|SETUP_FOGC)
481 #define TAG(x) x##_2wsgt0t1af
484 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
485 SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
486 #define TAG(x) x##_2wsgpt0af
489 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
490 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ|SETUP_FOGC)
491 #define TAG(x) x##_2wsgpt0t1af
496 /* Vertex repair (multipass rendering)
498 #define IND (SETUP_RGBA)
502 #define IND (SETUP_TMU0)
503 #define TAG(x) x##_t0
506 #define IND (SETUP_TMU0|SETUP_TMU1)
507 #define TAG(x) x##_t0t1
510 #define IND (SETUP_RGBA|SETUP_TMU0)
511 #define TAG(x) x##_gt0
514 #define IND (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
515 #define TAG(x) x##_gt0t1
519 #define IND (SETUP_RGBA|SETUP_SPEC)
520 #define TAG(x) x##_2g
523 #define IND (SETUP_TMU0|SETUP_SPEC)
524 #define TAG(x) x##_2t0
527 #define IND (SETUP_TMU0|SETUP_SPEC|SETUP_TMU1)
528 #define TAG(x) x##_2t0t1
531 #define IND (SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
532 #define TAG(x) x##_2gt0
535 #define IND (SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1)
536 #define TAG(x) x##_2gt0t1
541 static void init_setup_tab( void )
638 void fxPrintSetupFlags(char *msg
, GLuint flags
)
640 fprintf(stderr
, "%s(%x): %s%s%s%s%s%s%s%s\n",
643 (flags
& SETUP_XYZW
) ? " xyzw," : "",
644 (flags
& SETUP_SNAP
) ? " snap," : "",
645 (flags
& SETUP_RGBA
) ? " rgba," : "",
646 (flags
& SETUP_TMU0
) ? " tex-0," : "",
647 (flags
& SETUP_TMU1
) ? " tex-1," : "",
648 (flags
& SETUP_PSIZ
) ? " psiz," : "",
649 (flags
& SETUP_SPEC
) ? " spec," : "",
650 (flags
& SETUP_FOGC
) ? " fog," : "");
655 void fxCheckTexSizes( GLcontext
*ctx
)
657 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
658 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
660 if (!setup_tab
[fxMesa
->SetupIndex
].check_tex_sizes(ctx
)) {
661 GLuint ind
= fxMesa
->SetupIndex
|= (SETUP_PTEX
|SETUP_RGBA
);
663 /* Tdfx handles projective textures nicely; just have to change
664 * up to the new vertex format.
666 if (setup_tab
[ind
].vertex_format
!= fxMesa
->stw_hint_state
) {
668 fxMesa
->stw_hint_state
= setup_tab
[ind
].vertex_format
;
669 FX_grHints(GR_HINT_STWHINT
, fxMesa
->stw_hint_state
);
671 /* This is required as we have just changed the vertex
672 * format, so the interp routines must also change.
673 * In the unfilled and twosided cases we are using the
674 * Extras ones anyway, so leave them in place.
676 if (!(ctx
->_TriangleCaps
& (DD_TRI_LIGHT_TWOSIDE
|DD_TRI_UNFILLED
))) {
677 tnl
->Driver
.Render
.Interp
= setup_tab
[fxMesa
->SetupIndex
].interp
;
684 void fxBuildVertices( GLcontext
*ctx
, GLuint start
, GLuint count
,
687 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
688 GrVertex
*v
= (fxMesa
->verts
+ start
);
693 if (newinputs
& VERT_BIT_POS
) {
694 setup_tab
[fxMesa
->SetupIndex
].emit( ctx
, start
, count
, v
);
698 /* [dBorca] masked by VERT_BIT_POS ?!?
699 if (newinputs & VERT_BIT_POINT_SIZE)
702 if (newinputs
& VERT_BIT_COLOR0
)
705 if (newinputs
& VERT_BIT_COLOR1
)
708 if (newinputs
& VERT_BIT_FOG
)
711 if (newinputs
& VERT_BIT_TEX0
)
714 if (newinputs
& VERT_BIT_TEX1
)
715 ind
|= SETUP_TMU0
|SETUP_TMU1
;
717 if (fxMesa
->SetupIndex
& SETUP_PTEX
)
720 ind
&= fxMesa
->SetupIndex
;
723 setup_tab
[ind
].emit( ctx
, start
, count
, v
);
729 void fxChooseVertexState( GLcontext
*ctx
)
731 TNLcontext
*tnl
= TNL_CONTEXT(ctx
);
732 fxMesaContext fxMesa
= FX_CONTEXT( ctx
);
733 GLuint ind
= SETUP_XYZW
|SETUP_RGBA
;
735 if (fxMesa
->snapVertices
)
738 fxMesa
->tmu_source
[0] = 0;
739 fxMesa
->tmu_source
[1] = 1;
741 if (ctx
->Texture
._EnabledUnits
& 0x2) {
742 if (ctx
->Texture
._EnabledUnits
& 0x1) {
746 fxMesa
->tmu_source
[0] = 1;
747 fxMesa
->tmu_source
[1] = 0;
749 else if (ctx
->Texture
._EnabledUnits
& 0x1) {
753 if (ctx
->_TriangleCaps
& DD_POINT_ATTEN
) {
757 if (ctx
->_TriangleCaps
& DD_SEPARATE_SPECULAR
) {
761 if (ctx
->Fog
.FogCoordinateSource
== GL_FOG_COORDINATE_EXT
) {
765 fxMesa
->SetupIndex
= ind
;
767 if (ctx
->_TriangleCaps
& (DD_TRI_LIGHT_TWOSIDE
|DD_TRI_UNFILLED
)) {
768 tnl
->Driver
.Render
.Interp
= interp_extras
;
769 tnl
->Driver
.Render
.CopyPV
= copy_pv_extras
;
771 tnl
->Driver
.Render
.Interp
= setup_tab
[ind
].interp
;
772 tnl
->Driver
.Render
.CopyPV
= setup_tab
[ind
].copy_pv
;
775 if (setup_tab
[ind
].vertex_format
!= fxMesa
->stw_hint_state
) {
776 fxMesa
->stw_hint_state
= setup_tab
[ind
].vertex_format
;
777 FX_grHints(GR_HINT_STWHINT
, fxMesa
->stw_hint_state
);
783 void fxAllocVB( GLcontext
*ctx
)
785 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
786 GLuint size
= TNL_CONTEXT(ctx
)->vb
.Size
;
787 static int firsttime
= 1;
793 fxMesa
->verts
= (GrVertex
*)ALIGN_MALLOC(size
* sizeof(GrVertex
), 32);
794 fxMesa
->SetupIndex
= SETUP_XYZW
|SETUP_RGBA
;
798 void fxFreeVB( GLcontext
*ctx
)
800 fxMesaContext fxMesa
= FX_CONTEXT(ctx
);
802 ALIGN_FREE(fxMesa
->verts
);
810 * Need this to provide at least one external definition.
813 extern int gl_fx_dummy_function_vb(void);
815 gl_fx_dummy_function_vb(void)