blob: 2321bd414ff141153c6e295a052ef950f08953ae [file] [log] [blame]
/*
* Author: Max Lingua <sunmax@libero.it>
*/
/**** MACROS start ****/
/* point/line macros */
#define LINE_VERT_VARS \
SWvertex v[3]; \
s3vVertex* vvv[2]; \
int x[3], y[3], z[3]; \
int idx[3]; \
int dx01, dy01; \
int delt02; \
int deltzy, zstart; \
int start02, end01; \
int ystart, y01y12; \
int i, tmp, tmp2, tmp3; \
GLfloat ydiff, fy[3]
#define LINE_VERT_VARS_VOIDS \
(void) v; (void) vvv; (void) x; (void) y; (void) z; (void) idx; \
(void) dx01; (void) dy01; (void) delt02; (void) deltzy; \
(void) zstart; (void) start02; (void) ystart; (void) y01y12; \
(void) i; (void) tmp; (void) tmp2; (void) tmp3; (void) ydiff; (void) fy
#define LINE_FLAT_VARS \
int arstart, gbstart; \
int deltarx, deltgbx, deltary, deltgby; \
GLubyte *(col)[3]
#define LINE_FLAT_VARS_VOIDS \
(void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \
(void) deltary; (void) deltgby; (void) col
#define LINE_GOURAUD_VARS \
int arstart, gbstart; \
int deltary, deltgby; \
int ctmp, ctmp2, ctmp3, ctmp4; \
GLubyte *(col)[3]
#define LINE_GOURAUD_VARS_VOIDS \
(void) arstart; (void) gbstart; (void) deltary; (void) deltgby; \
(void) ctmp; (void) ctmp2; (void) ctmp3; (void) ctmp4; (void) col
#define SORT_LINE_VERT() \
do { \
if(v[0].attrib[FRAG_ATTRIB_WPOS][1] <= v[1].attrib[FRAG_ATTRIB_WPOS][1]) { \
\
idx[0] = 0; \
idx[1] = 1; \
\
} else if (v[0].attrib[FRAG_ATTRIB_WPOS][1] > v[1].attrib[FRAG_ATTRIB_WPOS][1]) { \
\
idx[0] = 1; \
idx[1] = 0; \
\
} \
} while(0)
#define SET_LINE_VERT() \
do { \
x[0] = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][0] * 1024.0f * 1024.0f); /* 0x100000 */ \
y[0] = fy[0] = dPriv->h - v[idx[0]].attrib[FRAG_ATTRIB_WPOS][1]; \
z[0] = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][2]) * 1024.0f * 32.0f; /* 0x8000; */ \
\
x[1] = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][0] * 1024.0f * 1024.0f); /* 0x100000 */ \
y[1] = dPriv->h - v[idx[1]].attrib[FRAG_ATTRIB_WPOS][1]; \
z[1] = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][2]) * 1024.0f * 32.0f; /* 0x8000 */ \
} while(0)
#define SET_LINE_XY() \
do { \
tmp = v[idx[0]].attrib[FRAG_ATTRIB_WPOS][0]; \
tmp2 = v[idx[1]].attrib[FRAG_ATTRIB_WPOS][0]; \
\
dx01 = x[0] - x[1]; \
dy01 = y[0] - y[1]; \
\
ydiff = fy[0] - (float)y[0]; \
ystart = y[0]; \
y01y12 = dy01 + 1; \
} while (0)
#define SET_LINE_DIR() \
do { \
if (tmp2 > tmp) { \
y01y12 |= 0x80000000; \
tmp3 = tmp2-tmp; \
} else { \
tmp3 = tmp-tmp2; \
} \
\
end01 = ((tmp << 16) | tmp2); \
\
if (dy01) \
delt02 = -(dx01/dy01); \
else \
delt02 = 0; \
\
if (dy01 > tmp3) { /* Y MAJ */ \
/* NOTE: tmp3 always >=0 */ \
start02 = x[0]; \
} else if (delt02 >= 0){ /* X MAJ - positive delta */ \
start02 = x[0] + delt02/2; \
dy01 = tmp3; /* could be 0 */ \
} else { /* X MAJ - negative delta */ \
start02 = x[0] + delt02/2 + ((1 << 20) - 1); \
dy01 = tmp3; /* could be 0 */ \
} \
} while(0)
#define SET_LINE_Z() \
do { \
zstart = z[0]; \
\
if (dy01) { \
deltzy = (z[1] - z[0])/dy01; \
} else { \
deltzy = 0; /* dy01 = tmp3 = 0 (it's a point)*/ \
} \
} while (0)
#define SET_LINE_FLAT_COL() \
do { \
col[0] = &(v[idx[0]].color[0]); \
deltarx = deltary = deltgbx = deltgby = 0; \
gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \
arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \
} while(0)
#define SET_LINE_GOURAUD_COL() \
do { \
col[0] = &(v[idx[0]].color[0]); \
col[1] = &(v[idx[1]].color[0]); \
\
vvv[0] = _v0; \
vvv[1] = _v1; \
\
for (i=0; i<2; i++) { \
/* FIXME: swapped ! */ \
col[i][0] = vvv[!idx[i]]->v.color.red; \
col[i][1] = vvv[!idx[i]]->v.color.green; \
col[i][2] = vvv[!idx[i]]->v.color.blue; \
col[i][3] = vvv[!idx[i]]->v.color.alpha; \
} \
\
if (dy01) { \
\
ctmp = ((col[0][1] - col[1][1]) << 7) / dy01; \
ctmp2 = ((col[0][2] - col[1][2]) << 7) / dy01; \
deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
\
ctmp3 = ((col[0][3] - col[1][3]) << 7) / dy01; \
ctmp4 = ((col[0][0] - col[1][0]) << 7) / dy01; \
deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
} else { \
ctmp = ((col[1][1] - col[0][1]) << 7); \
ctmp2 = ((col[1][2] - col[0][2]) << 7); \
deltgby = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
\
ctmp3 = ((col[1][3] - col[0][3]) << 7); \
ctmp4 = ((col[1][0] - col[0][0]) << 7); \
deltary = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
deltgby = deltary = 0; \
} \
\
idx[0] = 1; /* FIXME: swapped */ \
\
gbstart = \
(((int)((ydiff * ctmp) + (col[idx[0]][1] << 7)) << 16) & 0x7FFF0000) \
| ((int)((ydiff * ctmp2) + (col[idx[0]][2] << 7)) & 0x7FFF); \
arstart = \
(((int)((ydiff * ctmp3) + (col[idx[0]][3] << 7)) << 16) & 0x7FFF0000) \
| ((int)((ydiff * ctmp4) + (col[idx[0]][0] << 7)) & 0x7FFF); \
} while(0)
#define SEND_LINE_COL() \
do { \
DMAOUT(deltgby); \
DMAOUT(deltary); \
DMAOUT(gbstart); \
DMAOUT(arstart); \
} while (0)
#define SEND_LINE_VERT() \
do { \
DMAOUT(deltzy); \
DMAOUT(zstart); \
DMAOUT(0); \
DMAOUT(0); \
DMAOUT(0); \
DMAOUT(end01); \
DMAOUT(delt02); \
DMAOUT(start02); \
DMAOUT(ystart); \
DMAOUT(y01y12); \
} while (0)
/* tri macros (mostly stolen from utah-glx...) */
#define VERT_VARS \
SWvertex v[3]; \
int x[3], y[3], z[3]; \
int idx[3]; \
int dx01, dy01; \
int dx02, dy02; \
int dx12, dy12; \
int delt01, delt02, delt12; \
int deltzx, deltzy, zstart; \
int start02, end01, end12; \
int ystart, y01y12; \
int i, tmp, lr; \
GLfloat ydiff, fy[3]
#define VERT_VARS_VOIDS \
(void) v; (void) x; (void) y; (void) z; (void) idx; (void) dx01; \
(void) dy01; (void) dx02; (void) dy02; (void) dx12; (void) dy12; \
(void) delt01; (void) delt02; (void) delt12; (void) deltzx; \
(void) deltzy; (void) zstart; (void) start02; (void) end01; \
(void) end12; (void) ystart; (void) y01y12; (void) i; (void) tmp; \
(void) lr; (void) ydiff; (void) fy
#define GOURAUD_VARS \
int arstart, gbstart; \
int deltarx, deltgbx, deltary, deltgby; \
int ctmp, ctmp2, ctmp3, ctmp4; \
GLubyte *(col)[3]
#define GOURAUD_VARS_VOIDS \
(void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \
(void) deltary; (void) deltgby; (void) ctmp; (void) ctmp2; \
(void) ctmp3; (void) ctmp4; (void) col
#define FLAT_VARS \
int arstart, gbstart; \
int deltarx, deltgbx, deltary, deltgby; \
GLubyte *(col)[3]
#define FLAT_VARS_VOIDS \
(void) arstart; (void) gbstart; (void) deltarx; (void) deltgbx; \
(void) deltary; (void) deltgby; (void) col
#define TEX_VARS \
int u0, u1, u2; \
GLfloat ru0, ru1, ru2; \
int v0, v1, v2; \
GLfloat rv0, rv1, rv2; \
GLfloat w0, w1, w2; \
GLfloat rw0, rw1, rw2; \
int baseu, basev; \
int d0, d1, d2; \
int deltdx, deltvx, deltux, deltdy, deltvy, deltuy; \
int deltwx, deltwy; \
int rbaseu, rbasev; \
int dstart, ustart, wstart, vstart; \
static int stmp = 0; \
s3vTextureObjectPtr t
#define TEX_VARS_VOIDS \
(void) u0; (void) u1; (void) u2; (void) ru0; (void) ru1; (void) ru2; \
(void) v0; (void) v1; (void) v2; (void) rv0; (void) rv1; (void) rv2; \
(void) w0; (void) w1; (void) w2; (void) rw0; (void) rw1; (void) rw2; \
(void) baseu; (void) basev; (void) d0; (void) d1; (void) d2; \
(void) deltdx; (void) deltvx; (void) deltux; (void) deltdy; \
(void) deltuy; (void) deltwx; (void) deltwy; (void) rbaseu; \
(void) rbasev; (void) dstart; (void) ustart; (void) wstart; \
(void) vstart; (void) stmp; (void) t
#define SORT_VERT() \
do { \
for (i=0; i<3; i++) \
fy[i] = v[i].attrib[FRAG_ATTRIB_WPOS][1]; \
\
if (fy[1] > fy[0]) { /* (fy[1] > fy[0]) */ \
\
if (fy[2] > fy[0]) { \
idx[0] = 0; \
if (fy[1] > fy[2]) { \
idx[1] = 2; \
idx[2] = 1; \
} else { \
idx[1] = 1; \
idx[2] = 2; \
} \
} else { \
idx[0] = 2; \
idx[1] = 0; \
idx[2] = 1; \
} \
} else { /* (fy[1] < y[0]) */ \
if (fy[2] > fy[0]) { \
idx[0] = 1; \
idx[1] = 0; \
idx[2] = 2; \
} else { \
idx[2] = 0; \
if (fy[2] > fy[1]) { \
idx[0] = 1; \
idx[1] = 2; \
} else { \
idx[0] = 2; \
idx[1] = 1; \
} \
} \
} \
} while(0)
#define SET_VERT() \
do { \
for (i=0; i<3; i++) \
{ \
x[i] = ((v[idx[i]].attrib[FRAG_ATTRIB_WPOS][0]) * /* 0x100000*/ 1024.0 * 1024.0); \
y[i] = fy[i] = (dPriv->h - v[idx[i]].attrib[FRAG_ATTRIB_WPOS][1]); \
z[i] = ((v[idx[i]].attrib[FRAG_ATTRIB_WPOS][2]) * /* 0x8000 */ 1024.0 * 32.0); \
} \
\
ydiff = fy[0] - (float)y[0]; \
\
ystart = y[0]; \
\
dx12 = x[2] - x[1]; \
dy12 = y[1] - y[2]; \
dx01 = x[1] - x[0]; \
dy01 = y[0] - y[1]; \
dx02 = x[2] - x[0]; \
dy02 = y[0] - y[2]; \
\
delt01 = delt02 = delt12 = 0; \
} while (0)
#define SET_XY() \
do { \
if (dy01) delt01 = dx01 / dy01; \
if (dy12) delt12 = dx12 / dy12; \
delt02 = dx02 / dy02; \
\
start02 = x[0] + (ydiff * delt02); \
end01 = x[0] + (ydiff * delt01); \
end12 = x[1] + ((fy[1] - (GLfloat)y[1]) * delt12); \
} while (0)
#define SET_DIR() \
do { \
tmp = x[1] - (dy01 * delt02 + x[0]); \
if (tmp > 0) { \
lr = 0x80000000; \
} else { \
tmp *= -1; \
lr = 0; \
} \
tmp >>= 20; \
\
y01y12 = ((((y[0] - y[1]) & 0x7FF) << 16) \
| ((y[1] - y[2]) & 0x7FF) | lr); \
} while (0)
#define SET_Z() \
do { \
deltzy = (z[2] - z[0]) / dy02; \
if (tmp) { \
deltzx = (z[1] - (dy01 * deltzy + z[0])) / tmp; \
} else { \
deltzx = 0; \
} \
zstart = (deltzy * ydiff) + z[0]; \
} while (0)
#define SET_FLAT_COL() \
do { \
col[0] = &(v[0].color[0]); \
deltarx = deltary = deltgbx = deltgby = 0; \
gbstart = (((col[0][1]) << 23) | ((col[0][2]) << 7)); \
arstart = (((col[0][3]) << 23) | ((col[0][0]) << 7)); \
} while(0)
#define SET_GOURAUD_COL() \
do { \
col[0] = &(v[idx[0]].color[0]); \
col[1] = &(v[idx[1]].color[0]); \
col[2] = &(v[idx[2]].color[0]); \
\
ctmp = ((col[2][3] - col[0][3]) << 7) / dy02; \
ctmp2 = ((col[2][0] - col[0][0]) << 7) / dy02; \
deltary = ((ctmp << 16) & 0xFFFF0000) | (ctmp2 & 0xFFFF); \
ctmp3 = ((col[2][1] - col[0][1]) << 7) / dy02; \
ctmp4 = ((col[2][2] - col[0][2]) << 7) / dy02; \
deltgby = ((ctmp3 << 16) & 0xFFFF0000) | (ctmp4 & 0xFFFF); \
gbstart = \
(((int)((ydiff * ctmp3) + (col[0][1] << 7)) << 16) & 0x7FFF0000) \
| ((int)((ydiff * ctmp4) + (col[0][2] << 7)) & 0x7FFF); \
arstart = \
(((int)((ydiff * ctmp) + (col[0][3] << 7)) << 16) & 0x7FFF0000) \
| ((int)((ydiff * ctmp2) + (col[0][0] << 7)) & 0x7FFF); \
if (tmp) { \
int ax, rx, gx, bx; \
ax = ((col[1][3] << 7) - (dy01 * ctmp + (col[0][3] << 7))) / tmp; \
rx = ((col[1][0] << 7) - (dy01 * ctmp2 + (col[0][0] << 7))) / tmp; \
gx = ((col[1][1] << 7) - (dy01 * ctmp3 + (col[0][1] << 7))) / tmp; \
bx = ((col[1][2] << 7) - (dy01 * ctmp4 + (col[0][2] << 7))) / tmp; \
deltarx = ((ax << 16) & 0xFFFF0000) | (rx & 0xFFFF); \
deltgbx = ((gx << 16) & 0xFFFF0000) | (bx & 0xFFFF); \
} else { \
deltgbx = deltarx = 0; \
} \
} while (0)
#define SET_TEX_VERT() \
do { \
t = ((s3vTextureObjectPtr) \
ctx->Texture.Unit[0]._Current->DriverData); \
deltwx = deltwy = wstart = deltdx = deltdy = dstart = 0; \
\
u0 = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] \
* (GLfloat)(t->image[0].image->Width) * 256.0); \
u1 = (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] \
* (GLfloat)(t->globj->Image[0][0]->Width) * 256.0); \
u2 = (v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0] \
* (GLfloat)(t->globj->Image[0][0]->Width) * 256.0); \
v0 = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] \
* (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \
v1 = (v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] \
* (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \
v2 = (v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1] \
* (GLfloat)(t->globj->Image[0][0]->Height) * 256.0); \
\
w0 = (v[idx[0]].attrib[FRAG_ATTRIB_WPOS][3]); \
w1 = (v[idx[1]].attrib[FRAG_ATTRIB_WPOS][3]); \
w2 = (v[idx[2]].attrib[FRAG_ATTRIB_WPOS][3]); \
} while (0)
#define SET_BASEUV() \
do { \
if (u0 < u1) { \
if (u0 < u2) { \
baseu = u0; \
} else { \
baseu = u2; \
} \
} else { \
if (u1 < u2) { \
baseu = u1; \
} else { \
baseu = u2; \
} \
} \
\
if (v0 < v1) { \
if (v0 < v2) { \
basev = v0; \
} else { \
basev = v2; \
} \
} else { \
if (v1 < v2) { \
basev = v1; \
} else { \
basev = v2; \
} \
} \
} while (0)
#define SET_RW() \
do { \
/* GLfloat minW; \
\
if (w0 < w1) { \
if (w0 < w2) { \
minW = w0; \
} else { \
minW = w2; \
} \
} else { \
if (w1 < w2) { \
minW = w1; \
} else { \
minW = w2; \
} \
} */ \
\
rw0 = (512.0 * w0); \
rw1 = (512.0 * w1); \
rw2 = (512.0 * w2); \
} while (0)
#define SET_D() \
do { \
GLfloat sxy, suv; \
int lev; \
\
suv = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
(v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1]) - \
(v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
(v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][2]); \
\
sxy = (v[idx[0]].attrib[FRAG_ATTRIB_TEX0][0] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
(v[idx[1]].attrib[FRAG_ATTRIB_TEX0][1] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][1]) - \
(v[idx[1]].attrib[FRAG_ATTRIB_TEX0][0] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][0]) * \
(v[idx[0]].attrib[FRAG_ATTRIB_TEX0][1] - \
v[idx[2]].attrib[FRAG_ATTRIB_TEX0][2]); \
\
if (sxy < 0) sxy *= -1.0; \
if (suv < 0) suv *= -1.0; \
\
lev = *(int*)&suv - *(int *)&sxy; \
if (lev < 0) \
lev = 0; \
else \
lev >>=23; \
dstart = (lev << 27); \
} while (0)
#define SET_UVWD() \
do { \
SET_BASEUV(); \
SET_RW(); \
SET_D(); \
ru0 = (((u0 - baseu) * rw0)); \
ru1 = (((u1 - baseu) * rw1)); \
ru2 = (((u2 - baseu) * rw2)); \
rv0 = (((v0 - basev) * rw0)); \
rv1 = (((v1 - basev) * rw1)); \
rv2 = (((v2 - basev) * rw2)); \
\
while (baseu < 0) { baseu += (t->globj->Image[0][0]->Width << 8); } \
while (basev < 0) { basev += (t->globj->Image[0][0]->Height << 8); } \
\
if (!(baseu & 0xFF)) \
{ baseu = (baseu >> 8); } \
else \
{ baseu = (baseu >> 8) + 1; } \
\
if ((basev & 0x80) || !(basev & 0xFF)) \
{ basev = (basev >> 8); } \
else \
{ basev = (basev >> 8) - 1; } \
\
rbaseu = (baseu) << (16 - t->globj->Image[0][0]->WidthLog2); \
rbasev = (basev) << (16 - t->globj->Image[0][0]->WidthLog2); \
deltuy = (((ru2 - ru0) / dy02)); \
deltvy = (((rv2 - rv0) / dy02)); \
rw0 *= (1024.0 * 512.0); \
rw1 *= (1024.0 * 512.0); \
rw2 *= (1024.0 * 512.0); \
deltwy = ((rw2 - rw0) / dy02); \
if (tmp) { \
deltux = ((ru1 - (dy01 * deltuy + ru0)) / tmp); \
deltvx = ((rv1 - (dy01 * deltvy + rv0)) / tmp); \
deltwx = ((rw1 - (dy01 * deltwy + rw0)) / tmp); \
} else { deltux = deltvx = deltwx = 0; } \
ustart = (deltuy * ydiff) + (ru0); \
vstart = (deltvy * ydiff) + (rv0); \
wstart = (deltwy * ydiff) + (rw0); \
} while (0)
#define SEND_UVWD() \
do { \
DMAOUT((rbasev & 0xFFFF)); \
DMAOUT((0xa0000000 | (rbaseu & 0xFFFF))); \
DMAOUT(deltwx); \
DMAOUT(deltwy); \
DMAOUT(wstart); \
DMAOUT(deltdx); \
DMAOUT(deltvx); \
DMAOUT(deltux); \
DMAOUT(deltdy); \
DMAOUT(deltvy); \
DMAOUT(deltuy); \
DMAOUT(dstart); \
DMAOUT(vstart); \
DMAOUT(ustart); \
} while (0)
#define SEND_VERT() \
do { \
DMAOUT(deltzx); \
DMAOUT(deltzy); \
DMAOUT(zstart); \
DMAOUT(delt12); \
DMAOUT(end12); \
DMAOUT(delt01); \
DMAOUT(end01); \
DMAOUT(delt02); \
DMAOUT(start02); \
DMAOUT(ystart); \
DMAOUT(y01y12); \
} while (0)
#define SEND_COL() \
do { \
DMAOUT(deltgbx); \
DMAOUT(deltarx); \
DMAOUT(deltgby); \
DMAOUT(deltary); \
DMAOUT(gbstart); \
DMAOUT(arstart); \
} while (0)
/**** MACROS end ****/
static void TAG(s3v_point)( s3vContextPtr vmesa,
const s3vVertex *_v0 )
{
}
static void TAG(s3v_line)( s3vContextPtr vmesa,
const s3vVertex *_v0,
const s3vVertex *_v1 )
{
GLcontext *ctx = vmesa->glCtx;
__DRIdrawablePrivate *dPriv = vmesa->driDrawable;
LINE_VERT_VARS;
#if (IND & S3V_RAST_FLAT_BIT)
LINE_FLAT_VARS;
#else
LINE_GOURAUD_VARS;
#endif
#if (IND & S3V_RAST_CULL_BIT)
GLfloat cull;
(void) cull;
#endif
LINE_VERT_VARS_VOIDS;
#if (IND & S3V_RAST_FLAT_BIT)
LINE_FLAT_VARS_VOIDS;
#else
LINE_GOURAUD_VARS_VOIDS;
#endif
DEBUG(("*** s3v_line: "));
#if (IND & S3V_RAST_CULL_BIT)
DEBUG(("cull "));
#endif
#if (IND & S3V_RAST_FLAT_BIT)
DEBUG(("flat "));
#endif
DEBUG(("***\n"));
#if 0
s3v_print_vertex(ctx, _v0);
s3v_print_vertex(ctx, _v1);
#endif
s3v_translate_vertex( ctx, _v0, &v[0] );
s3v_translate_vertex( ctx, _v1, &v[1] );
#if (IND & S3V_RAST_CULL_BIT)
/* FIXME: should we cull lines too? */
#endif
(void)v; /* v[0]; v[1]; */
SORT_LINE_VERT();
SET_LINE_VERT();
SET_LINE_XY();
SET_LINE_DIR();
SET_LINE_Z();
#if (IND & S3V_RAST_FLAT_BIT)
SET_LINE_FLAT_COL();
#else
SET_LINE_GOURAUD_COL();
#endif
DMAOUT_CHECK(3DLINE_GBD, 15);
SEND_LINE_COL();
DMAOUT(0);
SEND_LINE_VERT();
DMAFINISH();
}
static void TAG(s3v_triangle)( s3vContextPtr vmesa,
const s3vVertex *_v0,
const s3vVertex *_v1,
const s3vVertex *_v2 )
{
GLcontext *ctx = vmesa->glCtx;
__DRIdrawablePrivate *dPriv = vmesa->driDrawable;
VERT_VARS;
#if (IND & S3v_RAST_FLAT_BIT)
FLAT_VARS;
#else
GOURAUD_VARS;
#endif
#if (IND & S3V_RAST_TEX_BIT)
TEX_VARS;
#endif
#if (IND & S3V_RAST_CULL_BIT)
GLfloat cull;
#endif
VERT_VARS_VOIDS;
#if (IND & S3v_RAST_FLAT_BIT)
FLAT_VARS_VOIDS;
#else
GOURAUD_VARS_VOIDS;
#endif
#if (IND & S3V_RAST_TEX_BIT)
TEX_VARS_VOIDS;
#endif
DEBUG(("*** s3v_triangle: "));
#if (IND & S3V_RAST_CULL_BIT)
DEBUG(("cull "));
#endif
#if (IND & S3V_RAST_FLAT_BIT)
DEBUG(("flat "));
#endif
#if (IND & S3V_RAST_TEX_BIT)
DEBUG(("tex "));
#endif
DEBUG(("***\n"));
#if 0
s3v_print_vertex(ctx, _v0);
s3v_print_vertex(ctx, _v1);
s3v_print_vertex(ctx, _v2);
#endif
s3v_translate_vertex( ctx, _v0, &v[0] );
s3v_translate_vertex( ctx, _v1, &v[1] );
s3v_translate_vertex( ctx, _v2, &v[2] );
#if (IND & S3V_RAST_CULL_BIT)
cull = vmesa->backface_sign *
((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]) +
(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]));
if (cull < vmesa->cull_zero /* -0.02f */) return;
#endif
(void)v; /* v[0]; v[1]; v[2]; */
SORT_VERT();
SET_VERT();
if (dy02 == 0) return;
SET_XY();
SET_DIR();
SET_Z();
#if (IND & S3V_RAST_TEX_BIT)
SET_TEX_VERT();
SET_UVWD();
#endif
#if (IND & S3V_RAST_FLAT_BIT)
SET_FLAT_COL();
#else
SET_GOURAUD_COL();
#endif
#if (IND & S3V_RAST_TEX_BIT)
DMAOUT_CHECK(3DTRI_BASEV, 31);
SEND_UVWD();
SEND_COL();
SEND_VERT();
DMAFINISH();
#else
DMAOUT_CHECK(3DTRI_GBX, 17);
SEND_COL();
SEND_VERT();
DMAFINISH();
#endif
}
static void TAG(s3v_quad)( s3vContextPtr vmesa,
const s3vVertex *_v0,
const s3vVertex *_v1,
const s3vVertex *_v2,
const s3vVertex *_v3 )
{
GLcontext *ctx = vmesa->glCtx;
__DRIdrawablePrivate *dPriv = vmesa->driDrawable;
SWvertex temp_v[4];
VERT_VARS;
#if (IND & S3v_RAST_FLAT_BIT)
FLAT_VARS;
#else
GOURAUD_VARS;
#endif
#if (IND & S3V_RAST_TEX_BIT)
TEX_VARS;
#endif
#if (IND & S3V_RAST_CULL_BIT)
GLfloat cull;
#endif
VERT_VARS_VOIDS;
#if (IND & S3v_RAST_FLAT_BIT)
FLAT_VARS_VOIDS;
#else
GOURAUD_VARS_VOIDS;
#endif
#if (IND & S3V_RAST_TEX_BIT)
TEX_VARS_VOIDS;
#endif
DEBUG(("*** s3v_quad: "));
#if (IND & S3V_RAST_CULL_BIT)
DEBUG(("cull "));
/* printf(""); */ /* speed trick */
#endif
#if (IND & S3V_RAST_FLAT_BIT)
DEBUG(("flat "));
#endif
#if (IND & S3V_RAST_TEX_BIT)
DEBUG(("tex "));
#endif
DEBUG(("***\n"));
#if 0
s3v_print_vertex(ctx, _v0);
s3v_print_vertex(ctx, _v1);
s3v_print_vertex(ctx, _v2);
s3v_print_vertex(ctx, _v3);
#endif
s3v_translate_vertex( ctx, _v0, &temp_v[0] );
s3v_translate_vertex( ctx, _v1, &temp_v[1] );
s3v_translate_vertex( ctx, _v2, &temp_v[2] );
s3v_translate_vertex( ctx, _v3, &temp_v[3] );
/* FIRST TRI (0,1,2) */
/* ROMEO */
/* printf(""); */ /* speed trick (a) [turn on if (a) is return]*/
v[0] = temp_v[0];
v[1] = temp_v[1];
v[2] = temp_v[2];
#if (IND & S3V_RAST_CULL_BIT)
cull = vmesa->backface_sign *
((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]) +
(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]));
if (cull < vmesa->cull_zero /* -0.02f */) goto second; /* return; */ /* (a) */
#endif
#if 0
v[0] = temp_v[0];
v[1] = temp_v[1];
v[2] = temp_v[2];
#else
(void) v;
#endif
SORT_VERT();
SET_VERT();
if (dy02 == 0) goto second;
SET_XY();
SET_DIR();
SET_Z();
#if (IND & S3V_RAST_TEX_BIT)
SET_TEX_VERT();
SET_UVWD();
#endif
#if (IND & S3V_RAST_FLAT_BIT)
SET_FLAT_COL();
#else
SET_GOURAUD_COL();
#endif
#if (IND & S3V_RAST_TEX_BIT)
DMAOUT_CHECK(3DTRI_BASEV, 31);
SEND_UVWD();
SEND_COL();
SEND_VERT();
DMAFINISH();
#else
DMAOUT_CHECK(3DTRI_GBX, 17);
SEND_COL();
SEND_VERT();
DMAFINISH();
#endif
/* SECOND TRI (0,2,3) */
second:
v[0] = temp_v[0];
v[1] = temp_v[2];
v[2] = temp_v[3];
#if (IND & S3V_RAST_CULL_BIT)
cull = vmesa->backface_sign *
((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]) +
(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]));
if (cull < /* -0.02f */ vmesa->cull_zero) return;
#endif
/* second: */
/* ROMEO */
/* printf(""); */ /* speed trick */
v[0] = temp_v[0];
v[1] = temp_v[2];
v[2] = temp_v[3];
SORT_VERT();
SET_VERT();
if (dy02 == 0) return;
SET_XY();
SET_DIR();
SET_Z();
#if (IND & S3V_RAST_TEX_BIT)
SET_TEX_VERT();
SET_UVWD();
#endif
#if (IND & S3V_RAST_FLAT_BIT)
SET_FLAT_COL();
#else
SET_GOURAUD_COL();
#endif
#if (IND & S3V_RAST_TEX_BIT)
DMAOUT_CHECK(3DTRI_BASEV, 31);
SEND_UVWD();
SEND_COL();
SEND_VERT();
DMAFINISH();
#else
DMAOUT_CHECK(3DTRI_GBX, 17);
SEND_COL();
SEND_VERT();
DMAFINISH();
#endif
}
static void TAG(s3v_init)(void)
{
s3v_point_tab[IND] = TAG(s3v_point);
s3v_line_tab[IND] = TAG(s3v_line);
s3v_tri_tab[IND] = TAG(s3v_triangle);
s3v_quad_tab[IND] = TAG(s3v_quad);
}
#undef IND
#undef TAG