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