Import s3virge and trident drivers. Not functional yet; no Makefile, no DRI-aware...
[mesa.git] / src / mesa / drivers / dri / s3v / s3v_tritmp.h
1 /*
2 * Author: Max Lingua <sunmax@libero.it>
3 */
4
5 /**** MACROS start ****/
6
7 /* point/line macros */
8
9 #define LINE_VERT_VARS \
10 SWvertex v[3]; \
11 s3vVertex* vvv[2]; \
12 int x[3], y[3], z[3]; \
13 int idx[3]; \
14 int dx01, dy01; \
15 int delt02; \
16 int deltzy, zstart; \
17 int start02, end01; \
18 int ystart, y01y12; \
19 int i, tmp, tmp2, tmp3; \
20 GLfloat ydiff, fy[3]
21
22 #define LINE_FLAT_VARS \
23 int arstart, gbstart; \
24 int deltarx, deltgbx, deltary, deltgby; \
25 GLubyte *(col)[3]
26
27 #define LINE_GOURAUD_VARS \
28 int arstart, gbstart; \
29 int deltary, deltgby; \
30 int ctmp, ctmp2, ctmp3, ctmp4; \
31 GLubyte *(col)[3]
32
33 #define SORT_LINE_VERT() \
34 do { \
35 if(v[0].win[1] <= v[1].win[1]) { \
36 \
37 idx[0] = 0; \
38 idx[1] = 1; \
39 \
40 } else if (v[0].win[1] > v[1].win[1]) { \
41 \
42 idx[0] = 1; \
43 idx[1] = 0; \
44 \
45 } \
46 } while(0)
47
48 #define SET_LINE_VERT() \
49 do { \
50 x[0] = (v[idx[0]].win[0] * 1024.0f * 1024.0f); /* 0x100000 */ \
51 y[0] = fy[0] = dPriv->h - v[idx[0]].win[1]; \
52 z[0] = (v[idx[0]].win[2]) * 1024.0f * 32.0f; /* 0x8000; */ \
53 \
54 x[1] = (v[idx[1]].win[0] * 1024.0f * 1024.0f); /* 0x100000 */ \
55 y[1] = dPriv->h - v[idx[1]].win[1]; \
56 z[1] = (v[idx[1]].win[2]) * 1024.0f * 32.0f; /* 0x8000 */ \
57 } while(0)
58
59 #define SET_LINE_XY() \
60 do { \
61 tmp = v[idx[0]].win[0]; \
62 tmp2 = v[idx[1]].win[0]; \
63 \
64 dx01 = x[0] - x[1]; \
65 dy01 = y[0] - y[1]; \
66 \
67 ydiff = fy[0] - (float)y[0]; \
68 ystart = y[0]; \
69 y01y12 = dy01 + 1; \
70 } while (0)
71
72 #define SET_LINE_DIR() \
73 do { \
74 if (tmp2 > tmp) { \
75 y01y12 |= 0x80000000; \
76 tmp3 = tmp2-tmp; \
77 } else { \
78 tmp3 = tmp-tmp2; \
79 } \
80 \
81 end01 = ((tmp << 16) | tmp2); \
82 \
83 if (dy01) \
84 delt02 = -(dx01/dy01); \
85 else \
86 delt02 = 0; \
87 \
88 if (dy01 > tmp3) { /* Y MAJ */ \
89 /* NOTE: tmp3 always >=0 */ \
90 start02 = x[0]; \
91 } else if (delt02 >= 0){ /* X MAJ - positive delta */ \
92 start02 = x[0] + delt02/2; \
93 dy01 = tmp3; /* could be 0 */ \
94 } else { /* X MAJ - negative delta */ \
95 start02 = x[0] + delt02/2 + ((1 << 20) - 1); \
96 dy01 = tmp3; /* could be 0 */ \
97 } \
98 } while(0)
99
100 #define SET_LINE_Z() \
101 do { \
102 zstart = z[0]; \
103 \
104 if (dy01) { \
105 deltzy = (z[1] - z[0])/dy01; \
106 } else { \
107 deltzy = 0; /* dy01 = tmp3 = 0 (it's a point)*/ \
108 } \
109 } while (0)
110
111 #define SET_LINE_FLAT_COL() \
112 do { \
113 col[0] = &(v[idx[0]].color[0]); \
114 deltarx = deltary = deltgbx = deltgby = 0; \
115 gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \
116 arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \
117 } while(0)
118
119 #define SET_LINE_GOURAUD_COL() \
120 do { \
121 col[0] = &(v[idx[0]].color[0]); \
122 col[1] = &(v[idx[1]].color[0]); \
123 \
124 vvv[0] = _v0; \
125 vvv[1] = _v1; \
126 \
127 for (i=0; i<2; i++) { \
128 /* FIXME: swapped ! */ \
129 col[i][0] = vvv[!idx[i]]->v.color.red; \
130 col[i][1] = vvv[!idx[i]]->v.color.green; \
131 col[i][2] = vvv[!idx[i]]->v.color.blue; \
132 col[i][3] = vvv[!idx[i]]->v.color.alpha; \
133 } \
134 \
135 if (dy01) { \
136 \
137 ctmp = ((col[0][1] - col[1][1]) << 7) / dy01; \
138 ctmp2 = ((col[0][2] - col[1][2]) << 7) / dy01; \
139 deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
140 \
141 ctmp3 = ((col[0][3] - col[1][3]) << 7) / dy01; \
142 ctmp4 = ((col[0][0] - col[1][0]) << 7) / dy01; \
143 deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
144 } else { \
145 ctmp = ((col[1][1] - col[0][1]) << 7); \
146 ctmp2 = ((col[1][2] - col[0][2]) << 7); \
147 deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
148 \
149 ctmp3 = ((col[1][3] - col[0][3]) << 7); \
150 ctmp4 = ((col[1][0] - col[0][0]) << 7); \
151 deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
152 deltgby = deltary = 0; \
153 } \
154 \
155 idx[0] = 1; /* FIXME: swapped */ \
156 \
157 gbstart = \
158 (((int)((ydiff * ctmp) + (col[idx[0]][1] << 7)) << 16) & 0x7FFF0000) \
159 | ((int)((ydiff * ctmp2) + (col[idx[0]][2] << 7)) & 0x7FFF); \
160 arstart = \
161 (((int)((ydiff * ctmp3) + (col[idx[0]][3] << 7)) << 16) & 0x7FFF0000) \
162 | ((int)((ydiff * ctmp4) + (col[idx[0]][0] << 7)) & 0x7FFF); \
163 } while(0)
164
165 #define SEND_LINE_COL() \
166 do { \
167 DMAOUT(deltgby); \
168 DMAOUT(deltary); \
169 DMAOUT(gbstart); \
170 DMAOUT(arstart); \
171 } while (0)
172
173 #define SEND_LINE_VERT() \
174 do { \
175 DMAOUT(deltzy); \
176 DMAOUT(zstart); \
177 DMAOUT(0); \
178 DMAOUT(0); \
179 DMAOUT(0); \
180 DMAOUT(end01); \
181 DMAOUT(delt02); \
182 DMAOUT(start02); \
183 DMAOUT(ystart); \
184 DMAOUT(y01y12); \
185 } while (0)
186
187
188 /* tri macros (mostly stolen from utah-glx...) */
189
190 #define VERT_VARS \
191 SWvertex v[3]; \
192 int x[3], y[3], z[3]; \
193 int idx[3]; \
194 int dx01, dy01; \
195 int dx02, dy02; \
196 int dx12, dy12; \
197 int delt01, delt02, delt12; \
198 int deltzx, deltzy, zstart; \
199 int start02, end01, end12; \
200 int ystart, y01y12; \
201 int i, tmp, lr; \
202 GLfloat ydiff, fy[3]
203
204 #define GOURAUD_VARS \
205 int arstart, gbstart; \
206 int deltarx, deltgbx, deltary, deltgby; \
207 int ctmp, ctmp2, ctmp3, ctmp4; \
208 GLubyte *(col)[3]
209
210 #define FLAT_VARS \
211 int arstart, gbstart; \
212 int deltarx, deltgbx, deltary, deltgby; \
213 GLubyte *(col)[3]
214
215 #define TEX_VARS \
216 int u0, u1, u2; \
217 GLfloat ru0, ru1, ru2; \
218 int v0, v1, v2; \
219 GLfloat rv0, rv1, rv2; \
220 GLfloat w0, w1, w2; \
221 GLfloat rw0, rw1, rw2; \
222 int baseu, basev; \
223 int d0, d1, d2; \
224 int deltdx, deltvx, deltux, deltdy, deltvy, deltuy; \
225 int deltwx, deltwy; \
226 int rbaseu, rbasev; \
227 int dstart, ustart, wstart, vstart; \
228 static int stmp = 0; \
229 s3vTextureObjectPtr t
230
231 #define SORT_VERT() \
232 do { \
233 for (i=0; i<3; i++) \
234 fy[i] = v[i].win[1]; \
235 \
236 if (fy[1] > fy[0]) { /* (fy[1] > fy[0]) */ \
237 \
238 if (fy[2] > fy[0]) { \
239 idx[0] = 0; \
240 if (fy[1] > fy[2]) { \
241 idx[1] = 2; \
242 idx[2] = 1; \
243 } else { \
244 idx[1] = 1; \
245 idx[2] = 2; \
246 } \
247 } else { \
248 idx[0] = 2; \
249 idx[1] = 0; \
250 idx[2] = 1; \
251 } \
252 } else { /* (fy[1] < y[0]) */ \
253 if (fy[2] > fy[0]) { \
254 idx[0] = 1; \
255 idx[1] = 0; \
256 idx[2] = 2; \
257 } else { \
258 idx[2] = 0; \
259 if (fy[2] > fy[1]) { \
260 idx[0] = 1; \
261 idx[1] = 2; \
262 } else { \
263 idx[0] = 2; \
264 idx[1] = 1; \
265 } \
266 } \
267 } \
268 } while(0)
269
270 #define SET_VERT() \
271 do { \
272 for (i=0; i<3; i++) \
273 { \
274 x[i] = ((v[idx[i]].win[0]) * /* 0x100000*/ 1024.0 * 1024.0); \
275 y[i] = fy[i] = (dPriv->h - v[idx[i]].win[1]); \
276 z[i] = ((v[idx[i]].win[2]) * /* 0x8000 */ 1024.0 * 32.0); \
277 } \
278 \
279 ydiff = fy[0] - (float)y[0]; \
280 \
281 ystart = y[0]; \
282 \
283 dx12 = x[2] - x[1]; \
284 dy12 = y[1] - y[2]; \
285 dx01 = x[1] - x[0]; \
286 dy01 = y[0] - y[1]; \
287 dx02 = x[2] - x[0]; \
288 dy02 = y[0] - y[2]; \
289 \
290 delt01 = delt02 = delt12 = 0; \
291 } while (0)
292
293
294 #define SET_XY() \
295 do { \
296 if (dy01) delt01 = dx01 / dy01; \
297 if (dy12) delt12 = dx12 / dy12; \
298 delt02 = dx02 / dy02; \
299 \
300 start02 = x[0] + (ydiff * delt02); \
301 end01 = x[0] + (ydiff * delt01); \
302 end12 = x[1] + ((fy[1] - (GLfloat)y[1]) * delt12); \
303 } while (0)
304
305 #define SET_DIR() \
306 do { \
307 tmp = x[1] - (dy01 * delt02 + x[0]); \
308 if (tmp > 0) { \
309 lr = 0x80000000; \
310 } else { \
311 tmp *= -1; \
312 lr = 0; \
313 } \
314 tmp >>= 20; \
315 \
316 y01y12 = ((((y[0] - y[1]) & 0x7FF) << 16) \
317 | ((y[1] - y[2]) & 0x7FF) | lr); \
318 } while (0)
319
320 #define SET_Z() \
321 do { \
322 deltzy = (z[2] - z[0]) / dy02; \
323 if (tmp) { \
324 deltzx = (z[1] - (dy01 * deltzy + z[0])) / tmp; \
325 } else { \
326 deltzx = 0; \
327 } \
328 zstart = (deltzy * ydiff) + z[0]; \
329 } while (0)
330
331 #define SET_FLAT_COL() \
332 do { \
333 col[0] = &(v[0].color[0]); \
334 deltarx = deltary = deltgbx = deltgby = 0; \
335 gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \
336 arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \
337 } while(0)
338
339 #define SET_GOURAUD_COL() \
340 do { \
341 col[0] = &(v[idx[0]].color[0]); \
342 col[1] = &(v[idx[1]].color[0]); \
343 col[2] = &(v[idx[2]].color[0]); \
344 \
345 ctmp = ((col[2][3] - col[0][3]) << 7) / dy02; \
346 ctmp2 = ((col[2][0] - col[0][0]) << 7) / dy02; \
347 deltary = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
348 ctmp3 = ((col[2][1] - col[0][1]) << 7) / dy02; \
349 ctmp4 = ((col[2][2] - col[0][2]) << 7) / dy02; \
350 deltgby = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
351 gbstart = \
352 (((int)((ydiff * ctmp3) + (col[0][1] << 7)) << 16) & 0x7FFF0000) \
353 | ((int)((ydiff * ctmp4) + (col[0][2] << 7)) & 0x7FFF); \
354 arstart = \
355 (((int)((ydiff * ctmp) + (col[0][3] << 7)) << 16) & 0x7FFF0000) \
356 | ((int)((ydiff * ctmp2) + (col[0][0] << 7)) & 0x7FFF); \
357 if (tmp) { \
358 int ax, rx, gx, bx; \
359 ax = ((col[1][3] << 7) - (dy01 * ctmp + (col[0][3] << 7))) / tmp; \
360 rx = ((col[1][0] << 7) - (dy01 * ctmp2 + (col[0][0] << 7))) / tmp; \
361 gx = ((col[1][1] << 7) - (dy01 * ctmp3 + (col[0][1] << 7))) / tmp; \
362 bx = ((col[1][2] << 7) - (dy01 * ctmp4 + (col[0][2] << 7))) / tmp; \
363 deltarx = ((ax << 16) & 0xFFFF0000) | (rx & 0xFFFF); \
364 deltgbx = ((gx << 16) & 0xFFFF0000) | (bx & 0xFFFF); \
365 } else { \
366 deltgbx = deltarx = 0; \
367 } \
368 } while (0)
369
370 #define SET_TEX_VERT() \
371 do { \
372 t = ((s3vTextureObjectPtr) \
373 ctx->Texture.Unit[0]._Current->DriverData); \
374 deltwx = deltwy = wstart = deltdx = deltdy = dstart = 0; \
375 \
376 u0 = (v[idx[0]].texcoord[0][0] \
377 * (GLfloat)(t->image[0].image->Width) * 256.0); \
378 u1 = (v[idx[1]].texcoord[0][0] \
379 * (GLfloat)(t->globj->Image[0]->Width) * 256.0); \
380 u2 = (v[idx[2]].texcoord[0][0] \
381 * (GLfloat)(t->globj->Image[0]->Width) * 256.0); \
382 v0 = (v[idx[0]].texcoord[0][1] \
383 * (GLfloat)(t->globj->Image[0]->Height) * 256.0); \
384 v1 = (v[idx[1]].texcoord[0][1] \
385 * (GLfloat)(t->globj->Image[0]->Height) * 256.0); \
386 v2 = (v[idx[2]].texcoord[0][1] \
387 * (GLfloat)(t->globj->Image[0]->Height) * 256.0); \
388 \
389 w0 = (v[idx[0]].win[3]); \
390 w1 = (v[idx[1]].win[3]); \
391 w2 = (v[idx[2]].win[3]); \
392 } while (0)
393
394 #define SET_BASEUV() \
395 do { \
396 if (u0 < u1) { \
397 if (u0 < u2) { \
398 baseu = u0; \
399 } else { \
400 baseu = u2; \
401 } \
402 } else { \
403 if (u1 < u2) { \
404 baseu = u1; \
405 } else { \
406 baseu = u2; \
407 } \
408 } \
409 \
410 if (v0 < v1) { \
411 if (v0 < v2) { \
412 basev = v0; \
413 } else { \
414 basev = v2; \
415 } \
416 } else { \
417 if (v1 < v2) { \
418 basev = v1; \
419 } else { \
420 basev = v2; \
421 } \
422 } \
423 } while (0)
424
425
426 #define SET_RW() \
427 do { \
428 /* GLfloat minW; \
429 \
430 if (w0 < w1) { \
431 if (w0 < w2) { \
432 minW = w0; \
433 } else { \
434 minW = w2; \
435 } \
436 } else { \
437 if (w1 < w2) { \
438 minW = w1; \
439 } else { \
440 minW = w2; \
441 } \
442 } */ \
443 \
444 rw0 = (512.0 * w0); \
445 rw1 = (512.0 * w1); \
446 rw2 = (512.0 * w2); \
447 } while (0)
448
449 #define SET_D() \
450 do { \
451 GLfloat sxy, suv; \
452 int lev; \
453 \
454 suv = (v[idx[0]].texcoord[0][0] - \
455 v[idx[2]].texcoord[0][0]) * \
456 (v[idx[1]].texcoord[0][1] - \
457 v[idx[2]].texcoord[0][1]) - \
458 (v[idx[1]].texcoord[0][0] - \
459 v[idx[2]].texcoord[0][0]) * \
460 (v[idx[0]].texcoord[0][1] - \
461 v[idx[2]].texcoord[0][2]); \
462 \
463 sxy = (v[idx[0]].texcoord[0][0] - \
464 v[idx[2]].texcoord[0][0]) * \
465 (v[idx[1]].texcoord[0][1] - \
466 v[idx[2]].texcoord[0][1]) - \
467 (v[idx[1]].texcoord[0][0] - \
468 v[idx[2]].texcoord[0][0]) * \
469 (v[idx[0]].texcoord[0][1] - \
470 v[idx[2]].texcoord[0][2]); \
471 \
472 if (sxy < 0) sxy *= -1.0; \
473 if (suv < 0) suv *= -1.0; \
474 \
475 lev = *(int*)&suv - *(int *)&sxy; \
476 if (lev < 0) \
477 lev = 0; \
478 else \
479 lev >>=23; \
480 dstart = (lev << 27); \
481 } while (0)
482
483 #define SET_UVWD() \
484 do { \
485 SET_BASEUV(); \
486 SET_RW(); \
487 SET_D(); \
488 ru0 = (((u0 - baseu) * rw0)); \
489 ru1 = (((u1 - baseu) * rw1)); \
490 ru2 = (((u2 - baseu) * rw2)); \
491 rv0 = (((v0 - basev) * rw0)); \
492 rv1 = (((v1 - basev) * rw1)); \
493 rv2 = (((v2 - basev) * rw2)); \
494 \
495 while (baseu < 0) { baseu += (t->globj->Image[0]->Width << 8); } \
496 while (basev < 0) { basev += (t->globj->Image[0]->Height << 8); } \
497 \
498 if (!(baseu & 0xFF)) \
499 { baseu = (baseu >> 8); } \
500 else \
501 { baseu = (baseu >> 8) + 1; } \
502 \
503 if ((basev & 0x80) || !(basev & 0xFF)) \
504 { basev = (basev >> 8); } \
505 else \
506 { basev = (basev >> 8) - 1; } \
507 \
508 rbaseu = (baseu) << (16 - t->globj->Image[0]->WidthLog2); \
509 rbasev = (basev) << (16 - t->globj->Image[0]->WidthLog2); \
510 deltuy = (((ru2 - ru0) / dy02)); \
511 deltvy = (((rv2 - rv0) / dy02)); \
512 rw0 *= (1024.0 * 512.0); \
513 rw1 *= (1024.0 * 512.0); \
514 rw2 *= (1024.0 * 512.0); \
515 deltwy = ((rw2 - rw0) / dy02); \
516 if (tmp) { \
517 deltux = ((ru1 - (dy01 * deltuy + ru0)) / tmp); \
518 deltvx = ((rv1 - (dy01 * deltvy + rv0)) / tmp); \
519 deltwx = ((rw1 - (dy01 * deltwy + rw0)) / tmp); \
520 } else { deltux = deltvx = deltwx = 0; } \
521 ustart = (deltuy * ydiff) + (ru0); \
522 vstart = (deltvy * ydiff) + (rv0); \
523 wstart = (deltwy * ydiff) + (rw0); \
524 } while (0)
525
526 #define SEND_UVWD() \
527 do { \
528 DMAOUT((rbasev & 0xFFFF)); \
529 DMAOUT((0xa0000000 | (rbaseu & 0xFFFF))); \
530 DMAOUT(deltwx); \
531 DMAOUT(deltwy); \
532 DMAOUT(wstart); \
533 DMAOUT(deltdx); \
534 DMAOUT(deltvx); \
535 DMAOUT(deltux); \
536 DMAOUT(deltdy); \
537 DMAOUT(deltvy); \
538 DMAOUT(deltuy); \
539 DMAOUT(dstart); \
540 DMAOUT(vstart); \
541 DMAOUT(ustart); \
542 } while (0)
543
544 #define SEND_VERT() \
545 do { \
546 DMAOUT(deltzx); \
547 DMAOUT(deltzy); \
548 DMAOUT(zstart); \
549 DMAOUT(delt12); \
550 DMAOUT(end12); \
551 DMAOUT(delt01); \
552 DMAOUT(end01); \
553 DMAOUT(delt02); \
554 DMAOUT(start02); \
555 DMAOUT(ystart); \
556 DMAOUT(y01y12); \
557 } while (0)
558
559 #define SEND_COL() \
560 do { \
561 DMAOUT(deltgbx); \
562 DMAOUT(deltarx); \
563 DMAOUT(deltgby); \
564 DMAOUT(deltary); \
565 DMAOUT(gbstart); \
566 DMAOUT(arstart); \
567 } while (0)
568
569 /**** MACROS end ****/
570
571
572
573
574 static void TAG(s3v_point)( s3vContextPtr vmesa,
575 const s3vVertex *_v0 )
576 {
577 }
578
579 static void TAG(s3v_line)( s3vContextPtr vmesa,
580 const s3vVertex *_v0,
581 const s3vVertex *_v1 )
582 {
583 GLcontext *ctx = vmesa->glCtx;
584 __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
585
586 LINE_VERT_VARS;
587 #if (IND & S3V_RAST_FLAT_BIT)
588 LINE_FLAT_VARS;
589 #else
590 LINE_GOURAUD_VARS;
591 #endif
592 #if (IND & S3V_RAST_CULL_BIT)
593 GLfloat cull;
594 #endif
595
596 DEBUG(("*** s3v_line: "));
597 #if (IND & S3V_RAST_CULL_BIT)
598 DEBUG(("cull "));
599 #endif
600 #if (IND & S3V_RAST_FLAT_BIT)
601 DEBUG(("flat "));
602 #endif
603
604 DEBUG(("***\n"));
605
606 #if 0
607 s3v_print_vertex(ctx, _v0);
608 s3v_print_vertex(ctx, _v1);
609 #endif
610
611 s3v_translate_vertex( ctx, _v0, &v[0] );
612 s3v_translate_vertex( ctx, _v1, &v[1] );
613
614 #if (IND & S3V_RAST_CULL_BIT)
615 /* FIXME: should we cull lines too? */
616 #endif
617 (void)v; /* v[0]; v[1]; */
618
619 SORT_LINE_VERT();
620 SET_LINE_VERT();
621
622 SET_LINE_XY();
623 SET_LINE_DIR();
624 SET_LINE_Z();
625
626 #if (IND & S3V_RAST_FLAT_BIT)
627 SET_LINE_FLAT_COL();
628 #else
629 SET_LINE_GOURAUD_COL();
630 #endif
631
632 DMAOUT_CHECK(3DLINE_GBD, 15);
633 SEND_LINE_COL();
634 DMAOUT(0);
635 SEND_LINE_VERT();
636 DMAFINISH();
637 }
638
639 static void TAG(s3v_triangle)( s3vContextPtr vmesa,
640 const s3vVertex *_v0,
641 const s3vVertex *_v1,
642 const s3vVertex *_v2 )
643 {
644 GLcontext *ctx = vmesa->glCtx;
645 __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
646
647 VERT_VARS;
648 #if (IND & S3v_RAST_FLAT_BIT)
649 FLAT_VARS;
650 #else
651 GOURAUD_VARS;
652 #endif
653 #if (IND & S3V_RAST_TEX_BIT)
654 TEX_VARS;
655 #endif
656 #if (IND & S3V_RAST_CULL_BIT)
657 GLfloat cull;
658 #endif
659
660 DEBUG(("*** s3v_triangle: "));
661 #if (IND & S3V_RAST_CULL_BIT)
662 DEBUG(("cull "));
663 #endif
664 #if (IND & S3V_RAST_FLAT_BIT)
665 DEBUG(("flat "));
666 #endif
667 #if (IND & S3V_RAST_TEX_BIT)
668 DEBUG(("tex "));
669 #endif
670
671 DEBUG(("***\n"));
672
673 #if 0
674 s3v_print_vertex(ctx, _v0);
675 s3v_print_vertex(ctx, _v1);
676 s3v_print_vertex(ctx, _v2);
677 #endif
678
679 s3v_translate_vertex( ctx, _v0, &v[0] );
680 s3v_translate_vertex( ctx, _v1, &v[1] );
681 s3v_translate_vertex( ctx, _v2, &v[2] );
682
683 #if (IND & S3V_RAST_CULL_BIT)
684 cull = vmesa->backface_sign *
685 ((v[1].win[0] - v[0].win[0]) * (v[0].win[1] - v[2].win[1]) +
686 (v[1].win[1] - v[0].win[1]) * (v[2].win[0] - v[0].win[0]));
687
688 if (cull < vmesa->cull_zero /* -0.02f */) return;
689 #endif
690
691 (void)v; /* v[0]; v[1]; v[2]; */
692
693 SORT_VERT();
694 SET_VERT();
695
696 if (dy02 == 0) return;
697
698 SET_XY();
699 SET_DIR();
700 SET_Z();
701
702 #if (IND & S3V_RAST_TEX_BIT)
703 SET_TEX_VERT();
704 SET_UVWD();
705 #endif
706
707 #if (IND & S3V_RAST_FLAT_BIT)
708 SET_FLAT_COL();
709 #else
710 SET_GOURAUD_COL();
711 #endif
712
713 #if (IND & S3V_RAST_TEX_BIT)
714 DMAOUT_CHECK(3DTRI_BASEV, 31);
715 SEND_UVWD();
716 SEND_COL();
717 SEND_VERT();
718 DMAFINISH();
719 #else
720 DMAOUT_CHECK(3DTRI_GBX, 17);
721 SEND_COL();
722 SEND_VERT();
723 DMAFINISH();
724 #endif
725 }
726
727 static void TAG(s3v_quad)( s3vContextPtr vmesa,
728 const s3vVertex *_v0,
729 const s3vVertex *_v1,
730 const s3vVertex *_v2,
731 const s3vVertex *_v3 )
732 {
733 GLcontext *ctx = vmesa->glCtx;
734 __DRIdrawablePrivate *dPriv = vmesa->driDrawable;
735
736 SWvertex temp_v[4];
737 VERT_VARS;
738 #if (IND & S3v_RAST_FLAT_BIT)
739 FLAT_VARS;
740 #else
741 GOURAUD_VARS;
742 #endif
743 #if (IND & S3V_RAST_TEX_BIT)
744 TEX_VARS;
745 #endif
746 #if (IND & S3V_RAST_CULL_BIT)
747 GLfloat cull;
748 #endif
749
750 DEBUG(("*** s3v_quad: "));
751 #if (IND & S3V_RAST_CULL_BIT)
752 DEBUG(("cull "));
753 /* printf(""); */ /* speed trick */
754 #endif
755 #if (IND & S3V_RAST_FLAT_BIT)
756 DEBUG(("flat "));
757 #endif
758 #if (IND & S3V_RAST_TEX_BIT)
759 DEBUG(("tex "));
760 #endif
761
762 DEBUG(("***\n"));
763
764 #if 0
765 s3v_print_vertex(ctx, _v0);
766 s3v_print_vertex(ctx, _v1);
767 s3v_print_vertex(ctx, _v2);
768 s3v_print_vertex(ctx, _v3);
769 #endif
770 s3v_translate_vertex( ctx, _v0, &temp_v[0] );
771 s3v_translate_vertex( ctx, _v1, &temp_v[1] );
772 s3v_translate_vertex( ctx, _v2, &temp_v[2] );
773 s3v_translate_vertex( ctx, _v3, &temp_v[3] );
774
775 /* FIRST TRI (0,1,2) */
776
777 /* ROMEO */
778 /* printf(""); */ /* speed trick (a) [turn on if (a) is return]*/
779
780 v[0] = temp_v[0];
781 v[1] = temp_v[1];
782 v[2] = temp_v[2];
783
784 #if (IND & S3V_RAST_CULL_BIT)
785 cull = vmesa->backface_sign *
786 ((v[1].win[0] - v[0].win[0]) * (v[0].win[1] - v[2].win[1]) +
787 (v[1].win[1] - v[0].win[1]) * (v[2].win[0] - v[0].win[0]));
788
789 if (cull < vmesa->cull_zero /* -0.02f */) goto second; /* return; */ /* (a) */
790 #endif
791
792 #if 0
793 v[0] = temp_v[0];
794 v[1] = temp_v[1];
795 v[2] = temp_v[2];
796 #else
797 (void) v;
798 #endif
799 SORT_VERT();
800 SET_VERT();
801
802 if (dy02 == 0) goto second;
803
804 SET_XY();
805 SET_DIR();
806 SET_Z();
807
808 #if (IND & S3V_RAST_TEX_BIT)
809 SET_TEX_VERT();
810 SET_UVWD();
811 #endif
812
813 #if (IND & S3V_RAST_FLAT_BIT)
814 SET_FLAT_COL();
815 #else
816 SET_GOURAUD_COL();
817 #endif
818
819 #if (IND & S3V_RAST_TEX_BIT)
820 DMAOUT_CHECK(3DTRI_BASEV, 31);
821 SEND_UVWD();
822 SEND_COL();
823 SEND_VERT();
824 DMAFINISH();
825 #else
826 DMAOUT_CHECK(3DTRI_GBX, 17);
827 SEND_COL();
828 SEND_VERT();
829 DMAFINISH();
830 #endif
831
832 /* SECOND TRI (0,2,3) */
833
834 second:
835 v[0] = temp_v[0];
836 v[1] = temp_v[2];
837 v[2] = temp_v[3];
838
839 #if (IND & S3V_RAST_CULL_BIT)
840 cull = vmesa->backface_sign *
841 ((v[1].win[0] - v[0].win[0]) * (v[0].win[1] - v[2].win[1]) +
842 (v[1].win[1] - v[0].win[1]) * (v[2].win[0] - v[0].win[0]));
843
844 if (cull < /* -0.02f */ vmesa->cull_zero) return;
845 #endif
846
847 /* second: */
848
849 /* ROMEO */
850 /* printf(""); */ /* speed trick */
851
852 v[0] = temp_v[0];
853 v[1] = temp_v[2];
854 v[2] = temp_v[3];
855
856 SORT_VERT();
857 SET_VERT();
858
859 if (dy02 == 0) return;
860
861 SET_XY();
862 SET_DIR();
863 SET_Z();
864
865 #if (IND & S3V_RAST_TEX_BIT)
866 SET_TEX_VERT();
867 SET_UVWD();
868 #endif
869
870 #if (IND & S3V_RAST_FLAT_BIT)
871 SET_FLAT_COL();
872 #else
873 SET_GOURAUD_COL();
874 #endif
875
876 #if (IND & S3V_RAST_TEX_BIT)
877 DMAOUT_CHECK(3DTRI_BASEV, 31);
878 SEND_UVWD();
879 SEND_COL();
880 SEND_VERT();
881 DMAFINISH();
882 #else
883 DMAOUT_CHECK(3DTRI_GBX, 17);
884 SEND_COL();
885 SEND_VERT();
886 DMAFINISH();
887 #endif
888 }
889
890 static void TAG(s3v_init)(void)
891 {
892 s3v_point_tab[IND] = TAG(s3v_point);
893 s3v_line_tab[IND] = TAG(s3v_line);
894 s3v_tri_tab[IND] = TAG(s3v_triangle);
895 s3v_quad_tab[IND] = TAG(s3v_quad);
896 }
897
898 #undef IND
899 #undef TAG