added dispatch override mechanism, used by trace extension
[mesa.git] / src / mesa / swrast / s_tritemp.h
index a87b24c40c69fe634e81060bf82ac6e45f2ae3f8..7abb933f6cb49913ce9dce52c53182774707535e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_tritemp.h,v 1.2 2000/11/05 18:24:41 keithw Exp $ */
+/* $Id: s_tritemp.h,v 1.6 2000/12/08 00:09:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -76,7 +76,7 @@
 /*void triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 )*/
 {
    typedef struct {
-        SWvertex *v0, *v1;   /* Y(v0) < Y(v1) */
+        const SWvertex *v0, *v1;   /* Y(v0) < Y(v1) */
        GLfloat dx;     /* X(v1) - X(v0) */
        GLfloat dy;     /* Y(v1) - Y(v0) */
        GLfixed fdxdy;  /* dx/dy in fixed-point */
@@ -95,8 +95,8 @@
 #endif
    EdgeT eMaj, eTop, eBot;
    GLfloat oneOverArea;
-   SWvertex *vMin, *vMid, *vMax;  /* Y(vMin)<=Y(vMid)<=Y(vMax) */
-   float bf = ctx->_backface_sign;
+   const SWvertex *vMin, *vMid, *vMax;  /* Y(vMin)<=Y(vMid)<=Y(vMax) */
+   float bf = SWRAST_CONTEXT(ctx)->_backface_sign;
 
    /* find the order of the 3 vertices along the Y axis */
    {
          return;
 
       /* check for very tiny triangle */
-      if (area * area < 0.0025F)  /* square it to ensure positive value */
-         oneOverArea = 1.0F / 0.0025F;  /* a close-enough value */
+      if (area * area < (0.05F * 0.05F))  /* square to ensure positive value */
+         oneOverArea = 1.0F / 0.05F;  /* a close-enough value */
       else
          oneOverArea = 1.0F / area;
    }
       GLfixed vMax_fy = FloatToFixed(vMax->win[1] - 0.5F);
 
       eMaj.fsy = FixedCeil(vMin_fy);
-      eMaj.lines = FixedToInt(vMax_fy + FIXED_ONE - FIXED_EPSILON - eMaj.fsy);
+      eMaj.lines = FixedToInt(FixedCeil(vMax_fy - eMaj.fsy));
       if (eMaj.lines > 0) {
          GLfloat dxdy = eMaj.dx / eMaj.dy;
          eMaj.fdxdy = SignedFloatToFixed(dxdy);
       }
 
       eTop.fsy = FixedCeil(vMid_fy);
-      eTop.lines = FixedToInt(vMax_fy + FIXED_ONE - FIXED_EPSILON - eTop.fsy);
+      eTop.lines = FixedToInt(FixedCeil(vMax_fy - eTop.fsy));
       if (eTop.lines > 0) {
          GLfloat dxdy = eTop.dx / eTop.dy;
          eTop.fdxdy = SignedFloatToFixed(dxdy);
       }
 
       eBot.fsy = FixedCeil(vMin_fy);
-      eBot.lines = FixedToInt(vMid_fy + FIXED_ONE - FIXED_EPSILON - eBot.fsy);
+      eBot.lines = FixedToInt(FixedCeil(vMid_fy - eBot.fsy));
       if (eBot.lines > 0) {
          GLfloat dxdy = eBot.dx / eBot.dy;
          eBot.fdxdy = SignedFloatToFixed(dxdy);
          dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
          dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
 
-
         eMaj_dt = vMax->texcoord[0][1] * wMax - vMin->texcoord[0][1] * wMin;
         eBot_dt = vMid->texcoord[0][1] * wMid - vMin->texcoord[0][1] * wMin;
         dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
                dsdy[u] = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
 
               eMaj_dt = vMax->texcoord[u][1] * wMax
-                 - vMin->texcoord[u][1] * wMin;
+                      - vMin->texcoord[u][1] * wMin;
               eBot_dt = vMid->texcoord[u][1] * wMid
-                 - vMin->texcoord[u][1] * wMin;
+                      - vMin->texcoord[u][1] * wMin;
               dtdx[u] = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
               dtdy[u] = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
               
               eMaj_du = vMax->texcoord[u][2] * wMax
-                 - vMin->texcoord[u][2] * wMin;
+                       - vMin->texcoord[u][2] * wMin;
               eBot_du = vMid->texcoord[u][2] * wMid
-                 - vMin->texcoord[u][2] * wMin;
+                       - vMin->texcoord[u][2] * wMin;
               dudx[u] = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);
               dudy[u] = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);
               
               eMaj_dv = vMax->texcoord[u][3] * wMax
-                 - vMin->texcoord[u][3] * wMin;
+                       - vMin->texcoord[u][3] * wMin;
               eBot_dv = vMid->texcoord[u][3] * wMid
-                 - vMin->texcoord[u][3] * wMin;
+                       - vMin->texcoord[u][3] * wMin;
               dvdx[u] = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
               dvdy[u] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
             }
             }
 
             if (setupLeft && eLeft->lines > 0) {
-               SWvertex *vLower;
+               const SWvertex *vLower;
                GLfixed fsx = eLeft->fsx;
                fx = FixedCeil(fsx);
                fError = fx - fsx - FIXED_ONE;
                   dZRowOuter = (ctx->DrawBuffer->Width + idxOuter) * sizeof(DEPTH_TYPE);
 #  endif
                }
-               ffog = FloatToFixed(vLower->fog) * 256 + dfogdx * adjx + dfogdy * adjy + FIXED_HALF;
-               fdfogOuter = SignedFloatToFixed(dfogdy + dxOuter * dfogdx);
+              {
+                 ffog = FloatToFixed(vLower->fog) * 256 + dfogdx * adjx + dfogdy * adjy + FIXED_HALF;
+                 fdfogOuter = SignedFloatToFixed(dfogdy + dxOuter * dfogdx);
+              }
 #endif
 #ifdef INTERP_RGB
                fr = (GLfixed)(IntToFixed(vLower->color[0])
                   zRow = (DEPTH_TYPE *) ((GLubyte*)zRow + dZRowOuter);
 #  endif
                   fz += fdzOuter;
-                  ffog += fdfogOuter;
+                  ffog += fdfogOuter; 
 #endif
 #ifdef INTERP_RGB
                   fr += fdrOuter;   fg += fdgOuter;   fb += fdbOuter;