Remove GetMSC DriverAPI function.
[mesa.git] / src / mesa / drivers / dri / s3v / s3virgetri.h
1 /*
2 * Author: Max Lingua <sunmax@libero.it>
3 */
4
5 #define LOCAL_VARS \
6 int vert0, vert1, vert2; \
7 GLfloat y0, y1, y2, ydiff; \
8 int iy0, iy1, iy2; \
9 int x0, x1, x2, z0, z1, z2; \
10 int dy01, dy02, dy12, dx01, dx02, dx12; \
11 int delt02, delt01, delt12, end01, end12, start02; \
12 int zstart, arstart, gbstart; \
13 int deltzy, deltzx, deltarx, deltgbx, deltary, deltgby; \
14 GLubyte (*colours)[4]; \
15 GLubyte (*scolours)[4]; \
16 static int tp = 0; \
17 int tmp, lr
18
19 #define LOCAL_TEX_VARS \
20 int u0, u1, u2; \
21 GLfloat ru0, ru1, ru2; \
22 int v0, v1, v2; \
23 GLfloat rv0, rv1, rv2; \
24 GLfloat w0, w1, w2; \
25 GLfloat rw0, rw1, rw2; \
26 int baseu, basev; \
27 int d0, d1, d2; \
28 int deltdx, deltvx, deltux, deltdy, deltvy, deltuy; \
29 int deltwx, deltwy; \
30 int rbaseu, rbasev; \
31 int dstart, ustart, wstart, vstart; \
32 static int stmp = 0; \
33 s3virgeTextureObject_t *t
34
35 #define CULL_BACKFACE() \
36 do { \
37 GLfloat *w0 = VB->Win.data[e0]; \
38 GLfloat *w1 = VB->Win.data[e1]; \
39 GLfloat *w2 = VB->Win.data[e2]; \
40 float cull; \
41 cull = ctx->backface_sign * ((w1[0] - w0[0]) * (w0[1] - w2[1]) + \
42 (w1[1] - w0[1]) * (w2[0] - w0[0])); \
43 if (cull < 0) \
44 return; \
45 } while (0)
46
47 #define SORT_VERTICES() \
48 do { \
49 y0 = VB->Win.data[e0][1]; \
50 y1 = VB->Win.data[e1][1]; \
51 y2 = VB->Win.data[e2][1]; \
52 if (y1 > y0) { \
53 if (y2 > y0) { \
54 vert0 = e0; \
55 if (y1 > y2) { vert2 = e1; vert1 = e2; } else { vert2 = e2; vert1 = e1; } \
56 } else { vert0 = e2; vert1 = e0; vert2 = e1; } \
57 } else { \
58 if (y2 > y0) { vert0 = e1; vert1 = e0; vert2 = e2; } else { \
59 vert2 = e0; \
60 if (y2 > y1) { vert0 = e1; vert1 = e2; } else { vert0 = e2; vert1 = e1; } \
61 } \
62 } \
63 } while (0)
64
65 #define SET_VARIABLES() \
66 do { \
67 iy0 = y0 = ((s3virgeDB->height - (VB->Win.data[vert0][1]))); \
68 iy1 = y1 = ((s3virgeDB->height - (VB->Win.data[vert1][1]))); \
69 iy2 = y2 = ((s3virgeDB->height - (VB->Win.data[vert2][1]))); \
70 if (iy0 == iy2) { return; } \
71 ydiff = y0 - (float)iy0; \
72 x0 = ((VB->Win.data[vert0][0]) * 1024.0 * 1024.0); \
73 x1 = ((VB->Win.data[vert1][0]) * 1024.0 * 1024.0); \
74 x2 = ((VB->Win.data[vert2][0]) * 1024.0 * 1024.0); \
75 z0 = (VB->Win.data[vert0][2] * 1024.0 * 32.0); \
76 z1 = (VB->Win.data[vert1][2] * 1024.0 * 32.0); \
77 z2 = (VB->Win.data[vert2][2] * 1024.0 * 32.0); \
78 dx12 = x2 - x1; \
79 dy12 = iy1 - iy2; \
80 dx01 = x1 - x0; \
81 dy01 = iy0 - iy1; \
82 dx02 = x2 - x0; \
83 dy02 = iy0 - iy2; \
84 delt12 = delt02 = delt01 = 0; \
85 } while (0)
86
87 #define SET_TEX_VARIABLES() \
88 do { \
89 t = ((s3virgeTextureObject_t *)ctx->Texture.Unit[0].Current->DriverData); \
90 deltwx = deltwy = wstart = deltdx = deltdy = dstart = 0; \
91 u0 = (VB->TexCoordPtr[0]->data[vert0][0] * (GLfloat)(t->tObj->Image[0]->Width) * 256.0); \
92 u1 = (VB->TexCoordPtr[0]->data[vert1][0] * (GLfloat)(t->tObj->Image[0]->Width) * 256.0); \
93 u2 = (VB->TexCoordPtr[0]->data[vert2][0] * (GLfloat)(t->tObj->Image[0]->Width) * 256.0); \
94 v0 = (VB->TexCoordPtr[0]->data[vert0][1] * (GLfloat)(t->tObj->Image[0]->Height) * 256.0); \
95 v1 = (VB->TexCoordPtr[0]->data[vert1][1] * (GLfloat)(t->tObj->Image[0]->Height) * 256.0); \
96 v2 = (VB->TexCoordPtr[0]->data[vert2][1] * (GLfloat)(t->tObj->Image[0]->Height) * 256.0); \
97 w0 = (VB->Win.data[vert0][3]); \
98 w1 = (VB->Win.data[vert1][3]); \
99 w2 = (VB->Win.data[vert2][3]); \
100 } while (0)
101
102 #define FLATSHADE_COLORS() \
103 do { \
104 GLubyte *col = &(colours[pv][0]); \
105 deltarx = deltary = deltgbx = deltgby = 0; \
106 gbstart = (((col[1]) << 23) | ((col[2]) << 7)); \
107 arstart = (((col[3]) << 23) | ((col[0]) << 7)); \
108 } while (0)
109
110 #define GOURAUD_COLORS() \
111 do { \
112 int ctmp, ctmp2, ctmp3, ctmp4; \
113 GLubyte *col0, *col1, *col2; \
114 col0 = &(colours[vert0][0]); \
115 col1 = &(colours[vert1][0]); \
116 col2 = &(colours[vert2][0]); \
117 ctmp = ((col2[3] - col0[3]) << 7) / dy02; \
118 ctmp2 = ((col2[0] - col0[0]) << 7) / dy02; \
119 deltary = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
120 ctmp3 = ((col2[1] - col0[1]) << 7) / dy02; \
121 ctmp4 = ((col2[2] - col0[2]) << 7) / dy02; \
122 deltgby = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
123 gbstart = (((int)((ydiff * ctmp3) + (col0[1] << 7)) << 16) & 0x7FFF0000) | \
124 ((int)((ydiff * ctmp4) + (col0[2] << 7)) & 0x7FFF); \
125 arstart = (((int)((ydiff * ctmp) + (col0[3] << 7)) << 16) & 0x7FFF0000) | \
126 ((int)((ydiff * ctmp2) + (col0[0] << 7)) & 0x7FFF); \
127 if (tmp) { \
128 int ax, rx, gx, bx; \
129 ax = ((col1[3] << 7) - (dy01 * ctmp + (col0[3] << 7))) / tmp; \
130 rx = ((col1[0] << 7) - (dy01 * ctmp2 + (col0[0] << 7))) / tmp; \
131 gx = ((col1[1] << 7) - (dy01 * ctmp3 + (col0[1] << 7))) / tmp; \
132 bx = ((col1[2] << 7) - (dy01 * ctmp4 + (col0[2] << 7))) / tmp; \
133 deltarx = ((ax << 16) & 0xFFFF0000) | (rx & 0xFFFF); \
134 deltgbx = ((gx << 16) & 0xFFFF0000) | (bx & 0xFFFF); \
135 } else { \
136 deltgbx = deltarx = 0; \
137 } \
138 } while (0)
139
140 #define SET_XY() \
141 do { \
142 delt02 = dx02 / dy02; \
143 if (dy12) delt12 = dx12 / dy12; \
144 if (dy01) delt01 = dx01 / dy01; \
145 start02 = (ydiff * delt02) + x0; \
146 end01 = (ydiff * delt01) + x0; \
147 end12 = ((y1 - (GLfloat)iy1) * delt12) + x1; \
148 } while (0)
149
150 #define SET_DIR() \
151 do { \
152 tmp = x1 - (dy01 * delt02 + x0); \
153 if (tmp > 0) { \
154 lr = 0x80000000; \
155 } else { \
156 tmp *= -1; \
157 lr = 0; \
158 } \
159 tmp >>= 20; \
160 } while (0)
161
162 #define SET_Z() \
163 do { \
164 deltzy = (z2 - z0) / dy02; \
165 if (tmp) { \
166 deltzx = (z1 - (dy01 * deltzy + z0)) / tmp; \
167 } else { deltzx = 0; } \
168 zstart = (deltzy * ydiff) + z0; \
169 } while (0)
170
171 #define SET_BASEUV() \
172 do { \
173 if (u0 < u1) { \
174 if (u0 < u2) { \
175 baseu = u0; \
176 } else { \
177 baseu = u2; \
178 } \
179 } else { \
180 if (u1 < u2) { \
181 baseu = u1; \
182 } else { \
183 baseu = u2; \
184 } \
185 } \
186 if (v0 < v1) { \
187 if (v0 < v2) { \
188 basev = v0; \
189 } else { \
190 basev = v2; \
191 } \
192 } else { \
193 if (v1 < v2) { \
194 basev = v1; \
195 } else { \
196 basev = v2; \
197 } \
198 } \
199 } while (0)
200
201 #define SET_RW() \
202 do { \
203 /* GLfloat minW; \
204 if (w0 < w1) { \
205 if (w0 < w2) { \
206 minW = w0; \
207 } else { \
208 minW = w2; \
209 } \
210 } else { \
211 if (w1 < w2) { \
212 minW = w1; \
213 } else { \
214 minW = w2; \
215 } \
216 } */ \
217 rw0 = (512.0 * w0); \
218 rw1 = (512.0 * w1); \
219 rw2 = (512.0 * w2); \
220 } while (0)
221
222
223 #define SET_D() \
224 do { \
225 GLfloat sxy, suv; \
226 int lev; \
227 suv = (VB->TexCoordPtr[0]->data[vert0][0] - \
228 VB->TexCoordPtr[0]->data[vert2][0]) * \
229 (VB->TexCoordPtr[0]->data[vert1][1] - \
230 VB->TexCoordPtr[0]->data[vert2][1]) - \
231 (VB->TexCoordPtr[0]->data[vert1][0] - \
232 VB->TexCoordPtr[0]->data[vert2][0]) * \
233 (VB->TexCoordPtr[0]->data[vert0][1] - \
234 VB->TexCoordPtr[0]->data[vert2][2]); \
235 sxy = (VB->Win.data[vert0][0] - \
236 VB->Win.data[vert2][0]) * \
237 (VB->Win.data[vert1][1] - \
238 VB->Win.data[vert2][1]) - \
239 (VB->Win.data[vert1][0] - \
240 VB->Win.data[vert2][0]) * \
241 (VB->Win.data[vert0][1] - \
242 VB->Win.data[vert2][2]); \
243 if (sxy < 0) sxy *= -1.0; \
244 if (suv < 0) suv *= -1.0; \
245 lev = *(int*)&suv - *(int *)&sxy; \
246 if (lev < 0) \
247 lev = 0; \
248 else \
249 lev >>=23; \
250 dstart = (lev << 27); \
251 } while (0)
252
253
254
255 #define SET_UVWD() \
256 do { \
257 SET_BASEUV(); \
258 SET_RW(); \
259 SET_D(); \
260 ru0 = (((u0 - baseu) * rw0)); \
261 ru1 = (((u1 - baseu) * rw1)); \
262 ru2 = (((u2 - baseu) * rw2)); \
263 rv0 = (((v0 - basev) * rw0)); \
264 rv1 = (((v1 - basev) * rw1)); \
265 rv2 = (((v2 - basev) * rw2)); \
266 while (baseu < 0) { baseu += (t->tObj->Image[0]->Width << 8); } \
267 while (basev < 0) { basev += (t->tObj->Image[0]->Height << 8); } \
268 if (!(baseu & 0xFF)) { baseu = (baseu >> 8); } else { baseu = (baseu >> 8) + 1; } \
269 if ((basev & 0x80) || !(basev & 0xFF)) { basev = (basev >> 8); } else { basev = (basev >> 8) - 1; } \
270 rbaseu = (baseu) << (16 - t->widthLog2); \
271 rbasev = (basev) << (16 - t->widthLog2); \
272 deltuy = (((ru2 - ru0) / dy02)); \
273 deltvy = (((rv2 - rv0) / dy02)); \
274 rw0 *= (1024.0 * 512.0); \
275 rw1 *= (1024.0 * 512.0); \
276 rw2 *= (1024.0 * 512.0); \
277 deltwy = ((rw2 - rw0) / dy02); \
278 if (tmp) { \
279 deltux = ((ru1 - (dy01 * deltuy + ru0)) / tmp); \
280 deltvx = ((rv1 - (dy01 * deltvy + rv0)) / tmp); \
281 deltwx = ((rw1 - (dy01 * deltwy + rw0)) / tmp); \
282 } else { deltux = deltvx = deltwx = 0; } \
283 ustart = (deltuy * ydiff) + (ru0); \
284 vstart = (deltvy * ydiff) + (rv0); \
285 wstart = (deltwy * ydiff) + (rw0); \
286 } while (0)
287
288
289 #define SEND_COLORS() \
290 do { \
291 WAITFIFOEMPTY(6); \
292 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_GBX), deltgbx); \
293 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_ARX), deltarx); \
294 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_GBY), deltgby); \
295 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_ARY), deltary); \
296 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_GS_BS), gbstart); \
297 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_AS_RS), arstart); \
298 } while (0)
299
300 #define SEND_VERTICES() \
301 do { \
302 WAITFIFOEMPTY(6); \
303 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_ZSTART), zstart); \
304 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_ZXD), deltzx); \
305 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_ZYD), deltzy); \
306 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TXDELTA12), delt12); \
307 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TXEND12), end12); \
308 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TXDELTA01), delt01); \
309 WAITFIFOEMPTY(5); \
310 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TXEND01), end01); \
311 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TXDELTA02), delt02); \
312 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TXSTART02), start02); \
313 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TYS), iy0); \
314 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_TY01_Y12), \
315 ((((iy0 - iy1) & 0x7FF) << 16) | \
316 ((iy1 - iy2) & 0x7FF) | lr)); \
317 } while (0)
318
319 #define SEND_UVWD() \
320 do { \
321 WAITFIFOEMPTY(7); \
322 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_BASEV), (rbasev & 0xFFFF)); \
323 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_BASEU), (0xa0000000 | (rbaseu & 0xFFFF))); \
324 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_WXD), deltwx); \
325 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_WYD), deltwy); \
326 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_WSTART), wstart); \
327 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_DXD), deltdx); \
328 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_VXD), deltvx); \
329 WAITFIFOEMPTY(7); \
330 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_UXD), deltux); \
331 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_DYD), deltdy); \
332 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_VYD), deltvy); \
333 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_UYD), deltuy); \
334 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_DSTART), dstart); \
335 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_VSTART), vstart); \
336 OUTREG( (S3VIRGE_3DTRI_REG | S3VIRGE_3DTRI_USTART), ustart); \
337 } while (0)
338
339 #define DMA_SEND_UVWD() \
340 do { \
341 DMAOUT((rbasev & 0xFFFF)); \
342 DMAOUT((0xa0000000 | (rbaseu & 0xFFFF))); \
343 DMAOUT(deltwx); \
344 DMAOUT(deltwy); \
345 DMAOUT(wstart); \
346 DMAOUT(deltdx); \
347 DMAOUT(deltvx); \
348 DMAOUT(deltux); \
349 DMAOUT(deltdy); \
350 DMAOUT(deltvy); \
351 DMAOUT(deltuy); \
352 DMAOUT(dstart); \
353 DMAOUT(vstart); \
354 DMAOUT(ustart); \
355 } while (0)
356
357
358 #define DMA_SEND_COLORS() \
359 do { \
360 DMAOUT(deltgbx); \
361 DMAOUT(deltarx); \
362 DMAOUT(deltgby); \
363 DMAOUT(deltary); \
364 DMAOUT(gbstart); \
365 DMAOUT(arstart); \
366 } while (0)
367
368 #define DMA_SEND_VERTICES() \
369 do { \
370 DMAOUT(deltzx); \
371 DMAOUT(deltzy); \
372 DMAOUT(zstart); \
373 DMAOUT(delt12); \
374 DMAOUT(end12); \
375 DMAOUT(delt01); \
376 DMAOUT(end01); \
377 DMAOUT(delt02); \
378 DMAOUT(start02); \
379 DMAOUT(iy0); \
380 DMAOUT(((((iy0 - iy1) & 0x7FF) << 16) | \
381 ((iy1 - iy2) & 0x7FF) | lr)); \
382 } while (0)
383