fix span->facing computation and gl_FrontFacing initialization
authorBrian <brian.paul@tungstengraphics.com>
Tue, 4 Dec 2007 21:06:10 +0000 (14:06 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Tue, 4 Dec 2007 21:07:08 +0000 (14:07 -0700)
src/mesa/swrast/s_fragprog.c
src/mesa/swrast/s_tritemp.h

index 767e485ede20ea9c93560ec64dab9891dddf6479..76c79eb0d81694da840b242af1e907890a669bf4 100644 (file)
@@ -120,7 +120,7 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine,
    /* if running a GLSL program (not ARB_fragment_program) */
    if (ctx->Shader.CurrentProgram) {
       /* Store front/back facing value in register FOGC.Y */
-      machine->Attribs[FRAG_ATTRIB_FOGC][col][1] = (GLfloat) span->facing;
+      machine->Attribs[FRAG_ATTRIB_FOGC][col][1] = 1.0 - span->facing;
    }
 
    machine->CurElement = col;
index c609210c0ec9f7bc0ee33edce200dddd901ff872..8e3c5b5eebb189d9cedf353ae0ff0628bb905251 100644 (file)
@@ -136,7 +136,7 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
    EdgeT eMaj, eTop, eBot;
    GLfloat oneOverArea;
    const SWvertex *vMin, *vMid, *vMax;  /* Y(vMin)<=Y(vMid)<=Y(vMax) */
-   GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceCullSign;
+   GLfloat bf = SWRAST_CONTEXT(ctx)->_BackfaceSign;
    const GLint snapMask = ~((FIXED_ONE / (1 << SUB_PIXEL_BITS)) - 1); /* for x/y coord snapping */
    GLfixed vMin_fx, vMin_fy, vMid_fx, vMid_fy, vMax_fx, vMax_fy;
 
@@ -234,18 +234,17 @@ static void NAME(GLcontext *ctx, const SWvertex *v0,
    /* compute area, oneOverArea and perform backface culling */
    {
       const GLfloat area = eMaj.dx * eBot.dy - eBot.dx * eMaj.dy;
-      /* Do backface culling */
 
-      if (area * bf < 0.0)
+      if (IS_INF_OR_NAN(area) || area == 0.0F)
          return;
 
-      if (IS_INF_OR_NAN(area) || area == 0.0F)
+      if (area * bf * swrast->_BackfaceCullSign < 0.0)
          return;
 
       oneOverArea = 1.0F / area;
 
       /* 0 = front, 1 = back */
-      span.facing = oneOverArea * swrast->_BackfaceSign > 0.0F;
+      span.facing = oneOverArea * bf > 0.0F;
    }
 
    /* Edge setup.  For a triangle strip these could be reused... */