/* * Author: Max Lingua */ /**** 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