Rename the various function types in t_context.h to include a tnl_ prefix.
[mesa.git] / src / mesa / drivers / glide / fxvb.c
1 /*
2 * Mesa 3-D graphics library
3 * Version: 5.1
4 *
5 * Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
6 *
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:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
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.
24 */
25
26 /* Authors:
27 * Keith Whitwell <keith@tungstengraphics.com>
28 * Daniel Borca <dborca@users.sourceforge.net>
29 */
30
31 #ifdef HAVE_CONFIG_H
32 #include "conf.h"
33 #endif
34
35 #ifdef FX
36
37 #include "glheader.h"
38 #include "mtypes.h"
39 #include "imports.h"
40 #include "macros.h"
41 #include "colormac.h"
42
43 #include "math/m_translate.h"
44 #include "swrast_setup/swrast_setup.h"
45
46 #include "tnl/tnl.h"
47 #include "tnl/t_context.h"
48
49 #include "fxdrv.h"
50
51
52 static void copy_pv( GLcontext *ctx, GLuint edst, GLuint esrc )
53 {
54 fxMesaContext fxMesa = FX_CONTEXT( ctx );
55 GrVertex *dst = fxMesa->verts + edst;
56 GrVertex *src = fxMesa->verts + esrc;
57
58 *(GLuint *)&dst->pargb = *(GLuint *)&src->pargb;
59 }
60
61 static void copy_pv2( GLcontext *ctx, GLuint edst, GLuint esrc )
62 {
63 fxMesaContext fxMesa = FX_CONTEXT( ctx );
64 GrVertex *dst = fxMesa->verts + edst;
65 GrVertex *src = fxMesa->verts + esrc;
66
67 *(GLuint *)&dst->pargb = *(GLuint *)&src->pargb;
68 *(GLuint *)&dst->pspec = *(GLuint *)&src->pspec;
69 }
70
71 typedef void (*emit_func)( GLcontext *, GLuint, GLuint, void * );
72
73 static struct {
74 emit_func emit;
75 tnl_copy_pv_func copy_pv;
76 tnl_interp_func interp;
77 GLboolean (*check_tex_sizes)( GLcontext *ctx );
78 GLuint vertex_format;
79 } setup_tab[MAX_SETUP];
80
81
82 #define GET_COLOR(ptr, idx) ((ptr)->data[idx])
83
84
85 static void interp_extras( GLcontext *ctx,
86 GLfloat t,
87 GLuint dst, GLuint out, GLuint in,
88 GLboolean force_boundary )
89 {
90 struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
91
92 if (VB->ColorPtr[1]) {
93 assert(VB->ColorPtr[1]->stride == 4 * sizeof(GLfloat));
94
95 INTERP_4F( t,
96 GET_COLOR(VB->ColorPtr[1], dst),
97 GET_COLOR(VB->ColorPtr[1], out),
98 GET_COLOR(VB->ColorPtr[1], in) );
99
100 if (VB->SecondaryColorPtr[1]) {
101 INTERP_3F( t,
102 GET_COLOR(VB->SecondaryColorPtr[1], dst),
103 GET_COLOR(VB->SecondaryColorPtr[1], out),
104 GET_COLOR(VB->SecondaryColorPtr[1], in) );
105 }
106 }
107
108 if (VB->EdgeFlag) {
109 VB->EdgeFlag[dst] = VB->EdgeFlag[out] || force_boundary;
110 }
111
112 setup_tab[FX_CONTEXT(ctx)->SetupIndex].interp(ctx, t, dst, out, in,
113 force_boundary);
114 }
115
116 static void copy_pv_extras( GLcontext *ctx, GLuint dst, GLuint src )
117 {
118 struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
119
120 if (VB->ColorPtr[1]) {
121 COPY_4FV( GET_COLOR(VB->ColorPtr[1], dst),
122 GET_COLOR(VB->ColorPtr[1], src) );
123
124 if (VB->SecondaryColorPtr[1]) {
125 COPY_3FV( GET_COLOR(VB->SecondaryColorPtr[1], dst),
126 GET_COLOR(VB->SecondaryColorPtr[1], src) );
127 }
128 }
129
130 setup_tab[FX_CONTEXT(ctx)->SetupIndex].copy_pv(ctx, dst, src);
131 }
132
133
134 #define IND (SETUP_XYZW|SETUP_RGBA)
135 #define TAG(x) x##_wg
136 #include "fxvbtmp.h"
137
138 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0)
139 #define TAG(x) x##_wgt0
140 #include "fxvbtmp.h"
141
142 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
143 #define TAG(x) x##_wgt0t1
144 #include "fxvbtmp.h"
145
146 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX)
147 #define TAG(x) x##_wgpt0
148 #include "fxvbtmp.h"
149
150 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
151 SETUP_PTEX)
152 #define TAG(x) x##_wgpt0t1
153 #include "fxvbtmp.h"
154
155 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_PSIZ)
156 #define TAG(x) x##_wga
157 #include "fxvbtmp.h"
158
159 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ)
160 #define TAG(x) x##_wgt0a
161 #include "fxvbtmp.h"
162
163 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ)
164 #define TAG(x) x##_wgt0t1a
165 #include "fxvbtmp.h"
166
167 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ)
168 #define TAG(x) x##_wgpt0a
169 #include "fxvbtmp.h"
170
171 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_TMU0|SETUP_TMU1|\
172 SETUP_PTEX|SETUP_PSIZ)
173 #define TAG(x) x##_wgpt0t1a
174 #include "fxvbtmp.h"
175
176
177 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC)
178 #define TAG(x) x##_2wg
179 #include "fxvbtmp.h"
180
181 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
182 #define TAG(x) x##_2wgt0
183 #include "fxvbtmp.h"
184
185 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1)
186 #define TAG(x) x##_2wgt0t1
187 #include "fxvbtmp.h"
188
189 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX)
190 #define TAG(x) x##_2wgpt0
191 #include "fxvbtmp.h"
192
193 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
194 SETUP_PTEX)
195 #define TAG(x) x##_2wgpt0t1
196 #include "fxvbtmp.h"
197
198 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ)
199 #define TAG(x) x##_2wga
200 #include "fxvbtmp.h"
201
202 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ)
203 #define TAG(x) x##_2wgt0a
204 #include "fxvbtmp.h"
205
206 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|SETUP_PSIZ)
207 #define TAG(x) x##_2wgt0t1a
208 #include "fxvbtmp.h"
209
210 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PTEX|SETUP_PSIZ)
211 #define TAG(x) x##_2wgpt0a
212 #include "fxvbtmp.h"
213
214 #define IND (SETUP_XYZW|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1|\
215 SETUP_PTEX|SETUP_PSIZ)
216 #define TAG(x) x##_2wgpt0t1a
217 #include "fxvbtmp.h"
218
219
220 /* Snapping for voodoo-1
221 */
222 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA)
223 #define TAG(x) x##_wsg
224 #include "fxvbtmp.h"
225
226 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0)
227 #define TAG(x) x##_wsgt0
228 #include "fxvbtmp.h"
229
230 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
231 SETUP_TMU1)
232 #define TAG(x) x##_wsgt0t1
233 #include "fxvbtmp.h"
234
235 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
236 SETUP_PTEX)
237 #define TAG(x) x##_wsgpt0
238 #include "fxvbtmp.h"
239
240 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
241 SETUP_TMU1|SETUP_PTEX)
242 #define TAG(x) x##_wsgpt0t1
243 #include "fxvbtmp.h"
244
245 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_PSIZ)
246 #define TAG(x) x##_wsga
247 #include "fxvbtmp.h"
248
249 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|SETUP_PSIZ)
250 #define TAG(x) x##_wsgt0a
251 #include "fxvbtmp.h"
252
253 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
254 SETUP_TMU1|SETUP_PSIZ)
255 #define TAG(x) x##_wsgt0t1a
256 #include "fxvbtmp.h"
257
258 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
259 SETUP_PTEX|SETUP_PSIZ)
260 #define TAG(x) x##_wsgpt0a
261 #include "fxvbtmp.h"
262
263 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_TMU0|\
264 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ)
265 #define TAG(x) x##_wsgpt0t1a
266 #include "fxvbtmp.h"
267
268
269 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC)
270 #define TAG(x) x##_2wsg
271 #include "fxvbtmp.h"
272
273 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
274 #define TAG(x) x##_2wsgt0
275 #include "fxvbtmp.h"
276
277 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
278 SETUP_TMU1)
279 #define TAG(x) x##_2wsgt0t1
280 #include "fxvbtmp.h"
281
282 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
283 SETUP_PTEX)
284 #define TAG(x) x##_2wsgpt0
285 #include "fxvbtmp.h"
286
287 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
288 SETUP_TMU1|SETUP_PTEX)
289 #define TAG(x) x##_2wsgpt0t1
290 #include "fxvbtmp.h"
291
292 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_PSIZ)
293 #define TAG(x) x##_2wsga
294 #include "fxvbtmp.h"
295
296 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_PSIZ)
297 #define TAG(x) x##_2wsgt0a
298 #include "fxvbtmp.h"
299
300 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
301 SETUP_TMU1|SETUP_PSIZ)
302 #define TAG(x) x##_2wsgt0t1a
303 #include "fxvbtmp.h"
304
305 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
306 SETUP_PTEX|SETUP_PSIZ)
307 #define TAG(x) x##_2wsgpt0a
308 #include "fxvbtmp.h"
309
310 #define IND (SETUP_XYZW|SETUP_SNAP|SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|\
311 SETUP_TMU1|SETUP_PTEX|SETUP_PSIZ)
312 #define TAG(x) x##_2wsgpt0t1a
313 #include "fxvbtmp.h"
314
315
316 /* Vertex repair (multipass rendering)
317 */
318 #define IND (SETUP_RGBA)
319 #define TAG(x) x##_g
320 #include "fxvbtmp.h"
321
322 #define IND (SETUP_TMU0)
323 #define TAG(x) x##_t0
324 #include "fxvbtmp.h"
325
326 #define IND (SETUP_TMU0|SETUP_TMU1)
327 #define TAG(x) x##_t0t1
328 #include "fxvbtmp.h"
329
330 #define IND (SETUP_RGBA|SETUP_TMU0)
331 #define TAG(x) x##_gt0
332 #include "fxvbtmp.h"
333
334 #define IND (SETUP_RGBA|SETUP_TMU0|SETUP_TMU1)
335 #define TAG(x) x##_gt0t1
336 #include "fxvbtmp.h"
337
338
339 #define IND (SETUP_RGBA|SETUP_SPEC)
340 #define TAG(x) x##_2g
341 #include "fxvbtmp.h"
342
343 #define IND (SETUP_TMU0|SETUP_SPEC)
344 #define TAG(x) x##_2t0
345 #include "fxvbtmp.h"
346
347 #define IND (SETUP_TMU0|SETUP_SPEC|SETUP_TMU1)
348 #define TAG(x) x##_2t0t1
349 #include "fxvbtmp.h"
350
351 #define IND (SETUP_RGBA|SETUP_SPEC|SETUP_TMU0)
352 #define TAG(x) x##_2gt0
353 #include "fxvbtmp.h"
354
355 #define IND (SETUP_RGBA|SETUP_SPEC|SETUP_TMU0|SETUP_TMU1)
356 #define TAG(x) x##_2gt0t1
357 #include "fxvbtmp.h"
358
359
360
361 static void init_setup_tab( void )
362 {
363 init_wg();
364 init_wgt0();
365 init_wgt0t1();
366 init_wgpt0();
367 init_wgpt0t1();
368 init_wga();
369 init_wgt0a();
370 init_wgt0t1a();
371 init_wgpt0a();
372 init_wgpt0t1a();
373 init_2wg();
374 init_2wgt0();
375 init_2wgt0t1();
376 init_2wgpt0();
377 init_2wgpt0t1();
378 init_2wga();
379 init_2wgt0a();
380 init_2wgt0t1a();
381 init_2wgpt0a();
382 init_2wgpt0t1a();
383
384 init_wsg();
385 init_wsgt0();
386 init_wsgt0t1();
387 init_wsgpt0();
388 init_wsgpt0t1();
389 init_wsga();
390 init_wsgt0a();
391 init_wsgt0t1a();
392 init_wsgpt0a();
393 init_wsgpt0t1a();
394 init_2wsg();
395 init_2wsgt0();
396 init_2wsgt0t1();
397 init_2wsgpt0();
398 init_2wsgpt0t1();
399 init_2wsga();
400 init_2wsgt0a();
401 init_2wsgt0t1a();
402 init_2wsgpt0a();
403 init_2wsgpt0t1a();
404
405 init_g();
406 init_t0();
407 init_t0t1();
408 init_gt0();
409 init_gt0t1();
410 init_2g();
411 init_2t0();
412 init_2t0t1();
413 init_2gt0();
414 init_2gt0t1();
415 }
416
417
418 void fxPrintSetupFlags(char *msg, GLuint flags )
419 {
420 fprintf(stderr, "%s(%x): %s%s%s%s%s%s%s\n",
421 msg,
422 (int)flags,
423 (flags & SETUP_XYZW) ? " xyzw," : "",
424 (flags & SETUP_SNAP) ? " snap," : "",
425 (flags & SETUP_RGBA) ? " rgba," : "",
426 (flags & SETUP_TMU0) ? " tex-0," : "",
427 (flags & SETUP_TMU1) ? " tex-1," : "",
428 (flags & SETUP_PSIZ) ? " psiz," : "",
429 (flags & SETUP_SPEC) ? " spec," : "");
430 }
431
432
433
434 void fxCheckTexSizes( GLcontext *ctx )
435 {
436 TNLcontext *tnl = TNL_CONTEXT(ctx);
437 fxMesaContext fxMesa = FX_CONTEXT( ctx );
438
439 if (!setup_tab[fxMesa->SetupIndex].check_tex_sizes(ctx)) {
440 GLuint ind = fxMesa->SetupIndex |= (SETUP_PTEX|SETUP_RGBA);
441
442 /* Tdfx handles projective textures nicely; just have to change
443 * up to the new vertex format.
444 */
445 if (setup_tab[ind].vertex_format != fxMesa->stw_hint_state) {
446
447 fxMesa->stw_hint_state = setup_tab[ind].vertex_format;
448 FX_grHints(GR_HINT_STWHINT, fxMesa->stw_hint_state);
449
450 /* This is required as we have just changed the vertex
451 * format, so the interp routines must also change.
452 * In the unfilled and twosided cases we are using the
453 * Extras ones anyway, so leave them in place.
454 */
455 if (!(ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED))) {
456 tnl->Driver.Render.Interp = setup_tab[fxMesa->SetupIndex].interp;
457 }
458 }
459 }
460 }
461
462
463 void fxBuildVertices( GLcontext *ctx, GLuint start, GLuint count,
464 GLuint newinputs )
465 {
466 fxMesaContext fxMesa = FX_CONTEXT( ctx );
467 GrVertex *v = (fxMesa->verts + start);
468
469 if (!newinputs)
470 return;
471
472 if (newinputs & VERT_BIT_POS) {
473 setup_tab[fxMesa->SetupIndex].emit( ctx, start, count, v );
474 } else {
475 GLuint ind = 0;
476
477 /* [dBorca] masked by VERT_BIT_POS ?!?
478 if (newinputs & VERT_BIT_POINT_SIZE)
479 ind |= SETUP_PSIZ;*/
480
481 if (newinputs & VERT_BIT_COLOR0)
482 ind |= SETUP_RGBA;
483
484 if (newinputs & VERT_BIT_COLOR1)
485 ind |= SETUP_SPEC;
486
487 if (newinputs & VERT_BIT_TEX0)
488 ind |= SETUP_TMU0;
489
490 if (newinputs & VERT_BIT_TEX1)
491 ind |= SETUP_TMU0|SETUP_TMU1;
492
493 if (fxMesa->SetupIndex & SETUP_PTEX)
494 ind = ~0;
495
496 ind &= fxMesa->SetupIndex;
497
498 if (ind) {
499 setup_tab[ind].emit( ctx, start, count, v );
500 }
501 }
502 }
503
504
505 void fxChooseVertexState( GLcontext *ctx )
506 {
507 TNLcontext *tnl = TNL_CONTEXT(ctx);
508 fxMesaContext fxMesa = FX_CONTEXT( ctx );
509 GLuint ind = SETUP_XYZW|SETUP_RGBA;
510
511 if (fxMesa->snapVertices)
512 ind |= SETUP_SNAP;
513
514 fxMesa->tmu_source[0] = 0;
515 fxMesa->tmu_source[1] = 1;
516
517 if (ctx->Texture._EnabledUnits & 0x2) {
518 if (ctx->Texture._EnabledUnits & 0x1) {
519 ind |= SETUP_TMU1;
520 }
521 ind |= SETUP_TMU0;
522 fxMesa->tmu_source[0] = 1;
523 fxMesa->tmu_source[1] = 0;
524 }
525 else if (ctx->Texture._EnabledUnits & 0x1) {
526 ind |= SETUP_TMU0;
527 }
528
529 if (ctx->_TriangleCaps & DD_POINT_ATTEN) {
530 ind |= SETUP_PSIZ;
531 }
532
533 if (ctx->_TriangleCaps & DD_SEPARATE_SPECULAR) {
534 ind |= SETUP_SPEC;
535 }
536
537 fxMesa->SetupIndex = ind;
538
539 if (ctx->_TriangleCaps & (DD_TRI_LIGHT_TWOSIDE|DD_TRI_UNFILLED)) {
540 tnl->Driver.Render.Interp = interp_extras;
541 tnl->Driver.Render.CopyPV = copy_pv_extras;
542 } else {
543 tnl->Driver.Render.Interp = setup_tab[ind].interp;
544 tnl->Driver.Render.CopyPV = setup_tab[ind].copy_pv;
545 }
546
547 if (setup_tab[ind].vertex_format != fxMesa->stw_hint_state) {
548 fxMesa->stw_hint_state = setup_tab[ind].vertex_format;
549 FX_grHints(GR_HINT_STWHINT, fxMesa->stw_hint_state);
550 }
551 }
552
553
554
555 void fxAllocVB( GLcontext *ctx )
556 {
557 fxMesaContext fxMesa = FX_CONTEXT(ctx);
558 GLuint size = TNL_CONTEXT(ctx)->vb.Size;
559 static int firsttime = 1;
560 if (firsttime) {
561 init_setup_tab();
562 firsttime = 0;
563 }
564
565 fxMesa->verts = (GrVertex *)ALIGN_MALLOC(size * sizeof(GrVertex), 32);
566 fxMesa->SetupIndex = SETUP_XYZW|SETUP_RGBA;
567 }
568
569
570 void fxFreeVB( GLcontext *ctx )
571 {
572 fxMesaContext fxMesa = FX_CONTEXT(ctx);
573 if (fxMesa->verts) {
574 ALIGN_FREE(fxMesa->verts);
575 fxMesa->verts = 0;
576 }
577 }
578 #else
579
580
581 /*
582 * Need this to provide at least one external definition.
583 */
584
585 extern int gl_fx_dummy_function_vb(void);
586 int
587 gl_fx_dummy_function_vb(void)
588 {
589 return 0;
590 }
591
592 #endif /* FX */