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