2 * Author: Max Lingua <sunmax@libero.it>
5 /**** MACROS start ****/
7 /* point/line macros */
9 #define LINE_VERT_VARS \
12 int x[3], y[3], z[3]; \
19 int i, tmp, tmp2, tmp3; \
21 #define LINE_VERT_VARS_VOIDS \
22 (void) v; (void) vvv; (void) x; (void) y; (void) z; (void) idx; \
23 (void) dx01; (void) dy01; (void) delt02; (void) deltzy; \
24 (void) zstart; (void) start02; (void) ystart; (void) y01y12; \
25 (void) i; (void) tmp; (void) tmp2; (void) tmp3; (void) ydiff; (void) fy
27 #define LINE_FLAT_VARS \
28 int arstart, gbstart; \
29 int deltarx, deltgbx, deltary, deltgby; \
31 #define LINE_FLAT_VARS_VOIDS \
32 (void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \
33 (void) deltary; (void) deltgby; (void) col
35 #define LINE_GOURAUD_VARS \
36 int arstart, gbstart; \
37 int deltary, deltgby; \
38 int ctmp, ctmp2, ctmp3, ctmp4; \
40 #define LINE_GOURAUD_VARS_VOIDS \
41 (void) arstart; (void) gbstart; (void) deltary; (void) deltgby; \
42 (void) ctmp; (void) ctmp2; (void) ctmp3; (void) ctmp4; (void) col
44 #define SORT_LINE_VERT() \
46 if(v[0].attrib[FRAG_ATTRIB_WPOS][1] <= v[1].attrib[FRAG_ATTRIB_WPOS][1]) { \
51 } else if (v[0].attrib[FRAG_ATTRIB_WPOS][1] > v[1].attrib[FRAG_ATTRIB_WPOS][1]) { \
59 #define SET_LINE_VERT() \
61 x[0] = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][0] * 1024.0f * 1024.0f); /* 0x100000 */ \
62 y[0] = fy[0] = dPriv->h - v[idx[0]].attrib[FRAG_ATTRIB_WPOS][1]; \
63 z[0] = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][2]) * 1024.0f * 32.0f; /* 0x8000; */ \
65 x[1] = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][0] * 1024.0f * 1024.0f); /* 0x100000 */ \
66 y[1] = dPriv->h - v[idx[1]].attrib[FRAG_ATTRIB_WPOS][1]; \
67 z[1] = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][2]) * 1024.0f * 32.0f; /* 0x8000 */ \
70 #define SET_LINE_XY() \
72 tmp = v[idx[0]].attrib[FRAG_ATTRIB_WPOS][0]; \
73 tmp2 = v[idx[1]].attrib[FRAG_ATTRIB_WPOS][0]; \
78 ydiff = fy[0] - (float)y[0]; \
83 #define SET_LINE_DIR() \
86 y01y12 |= 0x80000000; \
92 end01 = ((tmp << 16) | tmp2); \
95 delt02 = -(dx01/dy01); \
99 if (dy01 > tmp3) { /* Y MAJ */ \
100 /* NOTE: tmp3 always >=0 */ \
102 } else if (delt02 >= 0){ /* X MAJ - positive delta */ \
103 start02 = x[0] + delt02/2; \
104 dy01 = tmp3; /* could be 0 */ \
105 } else { /* X MAJ - negative delta */ \
106 start02 = x[0] + delt02/2 + ((1 << 20) - 1); \
107 dy01 = tmp3; /* could be 0 */ \
111 #define SET_LINE_Z() \
116 deltzy = (z[1] - z[0])/dy01; \
118 deltzy = 0; /* dy01 = tmp3 = 0 (it's a point)*/ \
122 #define SET_LINE_FLAT_COL() \
124 col[0] = &(v[idx[0]].color[0]); \
125 deltarx = deltary = deltgbx = deltgby = 0; \
126 gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \
127 arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \
130 #define SET_LINE_GOURAUD_COL() \
132 col[0] = &(v[idx[0]].color[0]); \
133 col[1] = &(v[idx[1]].color[0]); \
138 for (i=0; i<2; i++) { \
139 /* FIXME: swapped ! */ \
140 col[i][0] = vvv[!idx[i]]->v.color.red; \
141 col[i][1] = vvv[!idx[i]]->v.color.green; \
142 col[i][2] = vvv[!idx[i]]->v.color.blue; \
143 col[i][3] = vvv[!idx[i]]->v.color.alpha; \
148 ctmp = ((col[0][1] - col[1][1]) << 7) / dy01; \
149 ctmp2 = ((col[0][2] - col[1][2]) << 7) / dy01; \
150 deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
152 ctmp3 = ((col[0][3] - col[1][3]) << 7) / dy01; \
153 ctmp4 = ((col[0][0] - col[1][0]) << 7) / dy01; \
154 deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
156 ctmp = ((col[1][1] - col[0][1]) << 7); \
157 ctmp2 = ((col[1][2] - col[0][2]) << 7); \
158 deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
160 ctmp3 = ((col[1][3] - col[0][3]) << 7); \
161 ctmp4 = ((col[1][0] - col[0][0]) << 7); \
162 deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
163 deltgby = deltary = 0; \
166 idx[0] = 1; /* FIXME: swapped */ \
169 (((int)((ydiff * ctmp) + (col[idx[0]][1] << 7)) << 16) & 0x7FFF0000) \
170 | ((int)((ydiff * ctmp2) + (col[idx[0]][2] << 7)) & 0x7FFF); \
172 (((int)((ydiff * ctmp3) + (col[idx[0]][3] << 7)) << 16) & 0x7FFF0000) \
173 | ((int)((ydiff * ctmp4) + (col[idx[0]][0] << 7)) & 0x7FFF); \
176 #define SEND_LINE_COL() \
184 #define SEND_LINE_VERT() \
199 /* tri macros (mostly stolen from utah-glx...) */
203 int x[3], y[3], z[3]; \
208 int delt01, delt02, delt12; \
209 int deltzx, deltzy, zstart; \
210 int start02, end01, end12; \
211 int ystart, y01y12; \
214 #define VERT_VARS_VOIDS \
215 (void) v; (void) x; (void) y; (void) z; (void) idx; (void) dx01; \
216 (void) dy01; (void) dx02; (void) dy02; (void) dx12; (void) dy12; \
217 (void) delt01; (void) delt02; (void) delt12; (void) deltzx; \
218 (void) deltzy; (void) zstart; (void) start02; (void) end01; \
219 (void) end12; (void) ystart; (void) y01y12; (void) i; (void) tmp; \
220 (void) lr; (void) ydiff; (void) fy
222 #define GOURAUD_VARS \
223 int arstart, gbstart; \
224 int deltarx, deltgbx, deltary, deltgby; \
225 int ctmp, ctmp2, ctmp3, ctmp4; \
227 #define GOURAUD_VARS_VOIDS \
228 (void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \
229 (void) deltary; (void) deltgby; (void) ctmp; (void) ctmp2; \
230 (void) ctmp3; (void) ctmp4; (void) col
233 int arstart, gbstart; \
234 int deltarx, deltgbx, deltary, deltgby; \
236 #define FLAT_VARS_VOIDS \
237 (void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \
238 (void) deltary; (void) deltgby; (void) col
242 GLfloat ru0, ru1, ru2; \
244 GLfloat rv0, rv1, rv2; \
245 GLfloat w0, w1, w2; \
246 GLfloat rw0, rw1, rw2; \
249 int deltdx, deltvx, deltux, deltdy, deltvy, deltuy; \
250 int deltwx, deltwy; \
251 int rbaseu, rbasev; \
252 int dstart, ustart, wstart, vstart; \
253 static int stmp = 0; \
254 s3vTextureObjectPtr t
255 #define TEX_VARS_VOIDS \
256 (void) u0; (void) u1; (void) u2; (void) ru0; (void) ru1; (void) ru2; \
257 (void) v0; (void) v1; (void) v2; (void) rv0; (void) rv1; (void) rv2; \
258 (void) w0; (void) w1; (void) w2; (void) rw0; (void) rw1; (void) rw2; \
259 (void) baseu; (void) basev; (void) d0; (void) d1; (void) d2; \
260 (void) deltdx; (void) deltvx; (void) deltux; (void) deltdy; \
261 (void) deltuy; (void) deltwx; (void) deltwy; (void) rbaseu; \
262 (void) rbasev; (void) dstart; (void) ustart; (void) wstart; \
263 (void) vstart; (void) stmp; (void) t
265 #define SORT_VERT() \
267 for (i=0; i<3; i++) \
268 fy[i] = v[i].attrib[FRAG_ATTRIB_WPOS][1]; \
270 if (fy[1] > fy[0]) { /* (fy[1] > fy[0]) */ \
272 if (fy[2] > fy[0]) { \
274 if (fy[1] > fy[2]) { \
286 } else { /* (fy[1] < y[0]) */ \
287 if (fy[2] > fy[0]) { \
293 if (fy[2] > fy[1]) { \
306 for (i=0; i<3; i++) \
308 x[i] = ((v[idx[i]].attrib[FRAG_ATTRIB_WPOS][0]) * /* 0x100000*/ 1024.0 * 1024.0); \
309 y[i] = fy[i] = (dPriv->h - v[idx[i]].attrib[FRAG_ATTRIB_WPOS][1]); \
310 z[i] = ((v[idx[i]].attrib[FRAG_ATTRIB_WPOS][2]) * /* 0x8000 */ 1024.0 * 32.0); \
313 ydiff = fy[0] - (float)y[0]; \
317 dx12 = x[2] - x[1]; \
318 dy12 = y[1] - y[2]; \
319 dx01 = x[1] - x[0]; \
320 dy01 = y[0] - y[1]; \
321 dx02 = x[2] - x[0]; \
322 dy02 = y[0] - y[2]; \
324 delt01 = delt02 = delt12 = 0; \
330 if (dy01) delt01 = dx01 / dy01; \
331 if (dy12) delt12 = dx12 / dy12; \
332 delt02 = dx02 / dy02; \
334 start02 = x[0] + (ydiff * delt02); \
335 end01 = x[0] + (ydiff * delt01); \
336 end12 = x[1] + ((fy[1] - (GLfloat)y[1]) * delt12); \
341 tmp = x[1] - (dy01 * delt02 + x[0]); \
350 y01y12 = ((((y[0] - y[1]) & 0x7FF) << 16) \
351 | ((y[1] - y[2]) & 0x7FF) | lr); \
356 deltzy = (z[2] - z[0]) / dy02; \
358 deltzx = (z[1] - (dy01 * deltzy + z[0])) / tmp; \
362 zstart = (deltzy * ydiff) + z[0]; \
365 #define SET_FLAT_COL() \
367 col[0] = &(v[0].color[0]); \
368 deltarx = deltary = deltgbx = deltgby = 0; \
369 gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \
370 arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \
373 #define SET_GOURAUD_COL() \
375 col[0] = &(v[idx[0]].color[0]); \
376 col[1] = &(v[idx[1]].color[0]); \
377 col[2] = &(v[idx[2]].color[0]); \
379 ctmp = ((col[2][3] - col[0][3]) << 7) / dy02; \
380 ctmp2 = ((col[2][0] - col[0][0]) << 7) / dy02; \
381 deltary = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
382 ctmp3 = ((col[2][1] - col[0][1]) << 7) / dy02; \
383 ctmp4 = ((col[2][2] - col[0][2]) << 7) / dy02; \
384 deltgby = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
386 (((int)((ydiff * ctmp3) + (col[0][1] << 7)) << 16) & 0x7FFF0000) \
387 | ((int)((ydiff * ctmp4) + (col[0][2] << 7)) & 0x7FFF); \
389 (((int)((ydiff * ctmp) + (col[0][3] << 7)) << 16) & 0x7FFF0000) \
390 | ((int)((ydiff * ctmp2) + (col[0][0] << 7)) & 0x7FFF); \
392 int ax, rx, gx, bx; \
393 ax = ((col[1][3] << 7) - (dy01 * ctmp + (col[0][3] << 7))) / tmp; \
394 rx = ((col[1][0] << 7) - (dy01 * ctmp2 + (col[0][0] << 7))) / tmp; \
395 gx = ((col[1][1] << 7) - (dy01 * ctmp3 + (col[0][1] << 7))) / tmp; \
396 bx = ((col[1][2] << 7) - (dy01 * ctmp4 + (col[0][2] << 7))) / tmp; \
397 deltarx = ((ax << 16) & 0xFFFF0000) | (rx & 0xFFFF); \
398 deltgbx = ((gx << 16) & 0xFFFF0000) | (bx & 0xFFFF); \
400 deltgbx = deltarx = 0; \
404 #define SET_TEX_VERT() \
406 t = ((s3vTextureObjectPtr) \
407 ctx->Texture.Unit[0]._Current->DriverData); \
408 deltwx = deltwy = wstart = deltdx = deltdy = dstart = 0; \
410 u0 = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] \
411 * (GLfloat)(t->image[0].image->Width) * 256.0); \
412 u1 = (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] \
413 * (GLfloat)(t->globj->Image[0][0]->Width) * 256.0); \
414 u2 = (v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0] \
415 * (GLfloat)(t->globj->Image[0][0]->Width) * 256.0); \
416 v0 = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] \
417 * (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \
418 v1 = (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] \
419 * (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \
420 v2 = (v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1] \
421 * (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \
423 w0 = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][3]); \
424 w1 = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][3]); \
425 w2 = (v[idx[2]].attrib[FRAG_ATTRIB_WPOS][3]); \
428 #define SET_BASEUV() \
478 rw0 = (512.0 * w0); \
479 rw1 = (512.0 * w1); \
480 rw2 = (512.0 * w2); \
488 suv = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] - \
489 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
490 (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] - \
491 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1]) - \
492 (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] - \
493 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
494 (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] - \
495 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][2]); \
497 sxy = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] - \
498 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
499 (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] - \
500 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1]) - \
501 (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] - \
502 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
503 (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] - \
504 v[idx[2]].attrib[FRAG_ATTRIB_TEX0][2]); \
506 if (sxy < 0) sxy *= -1.0; \
507 if (suv < 0) suv *= -1.0; \
509 lev = *(int*)&suv - *(int *)&sxy; \
514 dstart = (lev << 27); \
522 ru0 = (((u0 - baseu) * rw0)); \
523 ru1 = (((u1 - baseu) * rw1)); \
524 ru2 = (((u2 - baseu) * rw2)); \
525 rv0 = (((v0 - basev) * rw0)); \
526 rv1 = (((v1 - basev) * rw1)); \
527 rv2 = (((v2 - basev) * rw2)); \
529 while (baseu < 0) { baseu += (t->globj->Image[0][0]->Width << 8); } \
530 while (basev < 0) { basev += (t->globj->Image[0][0]->Height << 8); } \
532 if (!(baseu & 0xFF)) \
533 { baseu = (baseu >> 8); } \
535 { baseu = (baseu >> 8) + 1; } \
537 if ((basev & 0x80) || !(basev & 0xFF)) \
538 { basev = (basev >> 8); } \
540 { basev = (basev >> 8) - 1; } \
542 rbaseu = (baseu) << (16 - t->globj->Image[0][0]->WidthLog2); \
543 rbasev = (basev) << (16 - t->globj->Image[0][0]->WidthLog2); \
544 deltuy = (((ru2 - ru0) / dy02)); \
545 deltvy = (((rv2 - rv0) / dy02)); \
546 rw0 *= (1024.0 * 512.0); \
547 rw1 *= (1024.0 * 512.0); \
548 rw2 *= (1024.0 * 512.0); \
549 deltwy = ((rw2 - rw0) / dy02); \
551 deltux = ((ru1 - (dy01 * deltuy + ru0)) / tmp); \
552 deltvx = ((rv1 - (dy01 * deltvy + rv0)) / tmp); \
553 deltwx = ((rw1 - (dy01 * deltwy + rw0)) / tmp); \
554 } else { deltux = deltvx = deltwx = 0; } \
555 ustart = (deltuy * ydiff) + (ru0); \
556 vstart = (deltvy * ydiff) + (rv0); \
557 wstart = (deltwy * ydiff) + (rw0); \
560 #define SEND_UVWD() \
562 DMAOUT((rbasev & 0xFFFF)); \
563 DMAOUT((0xa0000000 | (rbaseu & 0xFFFF))); \
578 #define SEND_VERT() \
603 /**** MACROS end ****/
608 static void TAG(s3v_point
)( s3vContextPtr vmesa
,
609 const s3vVertex
*_v0
)
613 static void TAG(s3v_line
)( s3vContextPtr vmesa
,
614 const s3vVertex
*_v0
,
615 const s3vVertex
*_v1
)
617 GLcontext
*ctx
= vmesa
->glCtx
;
618 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
621 #if (IND & S3V_RAST_FLAT_BIT)
626 #if (IND & S3V_RAST_CULL_BIT)
630 LINE_VERT_VARS_VOIDS
;
631 #if (IND & S3V_RAST_FLAT_BIT)
632 LINE_FLAT_VARS_VOIDS
;
634 LINE_GOURAUD_VARS_VOIDS
;
637 DEBUG(("*** s3v_line: "));
638 #if (IND & S3V_RAST_CULL_BIT)
641 #if (IND & S3V_RAST_FLAT_BIT)
648 s3v_print_vertex(ctx
, _v0
);
649 s3v_print_vertex(ctx
, _v1
);
652 s3v_translate_vertex( ctx
, _v0
, &v
[0] );
653 s3v_translate_vertex( ctx
, _v1
, &v
[1] );
655 #if (IND & S3V_RAST_CULL_BIT)
656 /* FIXME: should we cull lines too? */
658 (void)v
; /* v[0]; v[1]; */
667 #if (IND & S3V_RAST_FLAT_BIT)
670 SET_LINE_GOURAUD_COL();
673 DMAOUT_CHECK(3DLINE_GBD
, 15);
680 static void TAG(s3v_triangle
)( s3vContextPtr vmesa
,
681 const s3vVertex
*_v0
,
682 const s3vVertex
*_v1
,
683 const s3vVertex
*_v2
)
685 GLcontext
*ctx
= vmesa
->glCtx
;
686 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
689 #if (IND & S3v_RAST_FLAT_BIT)
694 #if (IND & S3V_RAST_TEX_BIT)
697 #if (IND & S3V_RAST_CULL_BIT)
701 #if (IND & S3v_RAST_FLAT_BIT)
706 #if (IND & S3V_RAST_TEX_BIT)
710 DEBUG(("*** s3v_triangle: "));
711 #if (IND & S3V_RAST_CULL_BIT)
714 #if (IND & S3V_RAST_FLAT_BIT)
717 #if (IND & S3V_RAST_TEX_BIT)
724 s3v_print_vertex(ctx
, _v0
);
725 s3v_print_vertex(ctx
, _v1
);
726 s3v_print_vertex(ctx
, _v2
);
729 s3v_translate_vertex( ctx
, _v0
, &v
[0] );
730 s3v_translate_vertex( ctx
, _v1
, &v
[1] );
731 s3v_translate_vertex( ctx
, _v2
, &v
[2] );
733 #if (IND & S3V_RAST_CULL_BIT)
734 cull
= vmesa
->backface_sign
*
735 ((v
[1].attrib
[FRAG_ATTRIB_WPOS
][0] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][0]) * (v
[0].attrib
[FRAG_ATTRIB_WPOS
][1] - v
[2].attrib
[FRAG_ATTRIB_WPOS
][1]) +
736 (v
[1].attrib
[FRAG_ATTRIB_WPOS
][1] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][1]) * (v
[2].attrib
[FRAG_ATTRIB_WPOS
][0] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][0]));
738 if (cull
< vmesa
->cull_zero
/* -0.02f */) return;
741 (void)v
; /* v[0]; v[1]; v[2]; */
746 if (dy02
== 0) return;
752 #if (IND & S3V_RAST_TEX_BIT)
757 #if (IND & S3V_RAST_FLAT_BIT)
763 #if (IND & S3V_RAST_TEX_BIT)
764 DMAOUT_CHECK(3DTRI_BASEV
, 31);
770 DMAOUT_CHECK(3DTRI_GBX
, 17);
777 static void TAG(s3v_quad
)( s3vContextPtr vmesa
,
778 const s3vVertex
*_v0
,
779 const s3vVertex
*_v1
,
780 const s3vVertex
*_v2
,
781 const s3vVertex
*_v3
)
783 GLcontext
*ctx
= vmesa
->glCtx
;
784 __DRIdrawablePrivate
*dPriv
= vmesa
->driDrawable
;
788 #if (IND & S3v_RAST_FLAT_BIT)
793 #if (IND & S3V_RAST_TEX_BIT)
796 #if (IND & S3V_RAST_CULL_BIT)
800 #if (IND & S3v_RAST_FLAT_BIT)
805 #if (IND & S3V_RAST_TEX_BIT)
809 DEBUG(("*** s3v_quad: "));
810 #if (IND & S3V_RAST_CULL_BIT)
812 /* printf(""); */ /* speed trick */
814 #if (IND & S3V_RAST_FLAT_BIT)
817 #if (IND & S3V_RAST_TEX_BIT)
824 s3v_print_vertex(ctx
, _v0
);
825 s3v_print_vertex(ctx
, _v1
);
826 s3v_print_vertex(ctx
, _v2
);
827 s3v_print_vertex(ctx
, _v3
);
829 s3v_translate_vertex( ctx
, _v0
, &temp_v
[0] );
830 s3v_translate_vertex( ctx
, _v1
, &temp_v
[1] );
831 s3v_translate_vertex( ctx
, _v2
, &temp_v
[2] );
832 s3v_translate_vertex( ctx
, _v3
, &temp_v
[3] );
834 /* FIRST TRI (0,1,2) */
837 /* printf(""); */ /* speed trick (a) [turn on if (a) is return]*/
843 #if (IND & S3V_RAST_CULL_BIT)
844 cull
= vmesa
->backface_sign
*
845 ((v
[1].attrib
[FRAG_ATTRIB_WPOS
][0] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][0]) * (v
[0].attrib
[FRAG_ATTRIB_WPOS
][1] - v
[2].attrib
[FRAG_ATTRIB_WPOS
][1]) +
846 (v
[1].attrib
[FRAG_ATTRIB_WPOS
][1] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][1]) * (v
[2].attrib
[FRAG_ATTRIB_WPOS
][0] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][0]));
848 if (cull
< vmesa
->cull_zero
/* -0.02f */) goto second
; /* return; */ /* (a) */
861 if (dy02
== 0) goto second
;
867 #if (IND & S3V_RAST_TEX_BIT)
872 #if (IND & S3V_RAST_FLAT_BIT)
878 #if (IND & S3V_RAST_TEX_BIT)
879 DMAOUT_CHECK(3DTRI_BASEV
, 31);
885 DMAOUT_CHECK(3DTRI_GBX
, 17);
891 /* SECOND TRI (0,2,3) */
898 #if (IND & S3V_RAST_CULL_BIT)
899 cull
= vmesa
->backface_sign
*
900 ((v
[1].attrib
[FRAG_ATTRIB_WPOS
][0] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][0]) * (v
[0].attrib
[FRAG_ATTRIB_WPOS
][1] - v
[2].attrib
[FRAG_ATTRIB_WPOS
][1]) +
901 (v
[1].attrib
[FRAG_ATTRIB_WPOS
][1] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][1]) * (v
[2].attrib
[FRAG_ATTRIB_WPOS
][0] - v
[0].attrib
[FRAG_ATTRIB_WPOS
][0]));
903 if (cull
< /* -0.02f */ vmesa
->cull_zero
) return;
909 /* printf(""); */ /* speed trick */
918 if (dy02
== 0) return;
924 #if (IND & S3V_RAST_TEX_BIT)
929 #if (IND & S3V_RAST_FLAT_BIT)
935 #if (IND & S3V_RAST_TEX_BIT)
936 DMAOUT_CHECK(3DTRI_BASEV
, 31);
942 DMAOUT_CHECK(3DTRI_GBX
, 17);
949 static void TAG(s3v_init
)(void)
951 s3v_point_tab
[IND
] = TAG(s3v_point
);
952 s3v_line_tab
[IND
] = TAG(s3v_line
);
953 s3v_tri_tab
[IND
] = TAG(s3v_triangle
);
954 s3v_quad_tab
[IND
] = TAG(s3v_quad
);