Reorganized software rasterizer as a module which manages its own state,
authorKeith Whitwell <keith@tungstengraphics.com>
Sun, 5 Nov 2000 18:24:40 +0000 (18:24 +0000)
committerKeith Whitwell <keith@tungstengraphics.com>
Sun, 5 Nov 2000 18:24:40 +0000 (18:24 +0000)
with tighter interfaces with the rest of the world.

Proper documentation to come.

33 files changed:
src/mesa/swrast/s_aatriangle.c
src/mesa/swrast/s_aatritemp.h
src/mesa/swrast/s_accum.c
src/mesa/swrast/s_bitmap.c
src/mesa/swrast/s_blend.c
src/mesa/swrast/s_blend.h
src/mesa/swrast/s_context.c
src/mesa/swrast/s_context.h [new file with mode: 0644]
src/mesa/swrast/s_copypix.c
src/mesa/swrast/s_depth.c
src/mesa/swrast/s_drawpix.c
src/mesa/swrast/s_feedback.c [new file with mode: 0644]
src/mesa/swrast/s_feedback.h [new file with mode: 0644]
src/mesa/swrast/s_fog.c
src/mesa/swrast/s_imaging.c
src/mesa/swrast/s_lines.c
src/mesa/swrast/s_lines.h [new file with mode: 0644]
src/mesa/swrast/s_linetemp.h
src/mesa/swrast/s_logic.c
src/mesa/swrast/s_masking.c
src/mesa/swrast/s_pixeltex.c
src/mesa/swrast/s_points.c
src/mesa/swrast/s_points.h [new file with mode: 0644]
src/mesa/swrast/s_readpix.c
src/mesa/swrast/s_span.c
src/mesa/swrast/s_stencil.c
src/mesa/swrast/s_texture.c
src/mesa/swrast/s_texture.h
src/mesa/swrast/s_triangle.c
src/mesa/swrast/s_triangle.h
src/mesa/swrast/s_tritemp.h
src/mesa/swrast/s_zoom.c
src/mesa/swrast/swrast.h

index 347322cf65e5ba43cb11b36a99d98c09e0554503..c8f321c0c6003be63d6eb647aa27e65ff48cace7 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_aatriangle.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_aatriangle.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -31,6 +31,7 @@
 
 
 #include "s_aatriangle.h"
+#include "s_context.h"
 #include "s_span.h"
 
 
@@ -297,7 +298,10 @@ compute_coveragei(const GLfloat v0[3], const GLfloat v1[3],
 
 
 static void
-rgba_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
+rgba_aa_tri(GLcontext *ctx,
+           SWvertex *v0,
+           SWvertex *v1,
+           SWvertex *v2)
 {
 #define DO_Z
 #define DO_RGBA
@@ -306,7 +310,10 @@ rgba_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
 
 
 static void
-index_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
+index_aa_tri(GLcontext *ctx,
+            SWvertex *v0,
+            SWvertex *v1,
+            SWvertex *v2)
 {
 #define DO_Z
 #define DO_INDEX
@@ -334,7 +341,10 @@ compute_lambda(const GLfloat sPlane[4], const GLfloat tPlane[4],
 
 
 static void
-tex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
+tex_aa_tri(GLcontext *ctx,
+          SWvertex *v0,
+          SWvertex *v1,
+          SWvertex *v2)
 {
 #define DO_Z
 #define DO_RGBA
@@ -344,7 +354,10 @@ tex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
 
 
 static void
-spec_tex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
+spec_tex_aa_tri(GLcontext *ctx,
+               SWvertex *v0,
+               SWvertex *v1,
+               SWvertex *v2)
 {
 #define DO_Z
 #define DO_RGBA
@@ -355,7 +368,10 @@ spec_tex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
 
 
 static void
-multitex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
+multitex_aa_tri(GLcontext *ctx,
+               SWvertex *v0,
+               SWvertex *v1,
+               SWvertex *v2)
 {
 #define DO_Z
 #define DO_RGBA
@@ -364,7 +380,10 @@ multitex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
 }
 
 static void
-spec_multitex_aa_tri(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv)
+spec_multitex_aa_tri(GLcontext *ctx,
+                    SWvertex *v0,
+                    SWvertex *v1,
+                    SWvertex *v2)
 {
 #define DO_Z
 #define DO_RGBA
@@ -382,32 +401,34 @@ void
 _mesa_set_aa_triangle_function(GLcontext *ctx)
 {
    ASSERT(ctx->Polygon.SmoothFlag);
-   if (ctx->Texture.ReallyEnabled) {
+
+   if (ctx->Texture._ReallyEnabled) {
       if (ctx->Light.Enabled &&
-          ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR) {
-         if (ctx->Texture.MultiTextureEnabled) {
-            ctx->Driver.TriangleFunc = spec_multitex_aa_tri;
+          (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR ||
+          ctx->Fog.ColorSumEnabled)) {
+         if (ctx->Texture._MultiTextureEnabled) {
+            SWRAST_CONTEXT(ctx)->Triangle = spec_multitex_aa_tri;
          }
          else {
-            ctx->Driver.TriangleFunc = spec_tex_aa_tri;
+            SWRAST_CONTEXT(ctx)->Triangle = spec_tex_aa_tri;
          }
       }
       else {
-         if (ctx->Texture.MultiTextureEnabled) {
-            ctx->Driver.TriangleFunc = multitex_aa_tri;
+         if (ctx->Texture._MultiTextureEnabled) {
+            SWRAST_CONTEXT(ctx)->Triangle = multitex_aa_tri;
          }
          else {
-            ctx->Driver.TriangleFunc = tex_aa_tri;
+            SWRAST_CONTEXT(ctx)->Triangle = tex_aa_tri;
          }
       }
    }
    else {
       if (ctx->Visual.RGBAflag) {
-         ctx->Driver.TriangleFunc = rgba_aa_tri;
+         SWRAST_CONTEXT(ctx)->Triangle = rgba_aa_tri;
       }
       else {
-         ctx->Driver.TriangleFunc = index_aa_tri;
+         SWRAST_CONTEXT(ctx)->Triangle = index_aa_tri;
       }
    }
-   ASSERT(ctx->Driver.TriangleFunc);
+   ASSERT(SWRAST_CONTEXT(ctx)->Triangle);
 }
index 30cc1647c728d13655883c31be040a6f2f9e5ffe..bc4fe744976e78dce9dc224f0a34536eeb3b4dba 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_aatritemp.h,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_aatritemp.h,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
 
 /*void triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv )*/
 {
-   const struct vertex_buffer *VB = ctx->VB;
-   const GLfloat *p0 = VB->Win.data[v0];
-   const GLfloat *p1 = VB->Win.data[v1];
-   const GLfloat *p2 = VB->Win.data[v2];
-   GLint vMin, vMid, vMax;
+   const GLfloat *p0 = v0->win;
+   const GLfloat *p1 = v1->win;
+   const GLfloat *p2 = v2->win;
+   SWvertex *vMin, *vMid, *vMax;
    GLint iyMin, iyMax;
    GLfloat yMin, yMax;
    GLboolean ltor;
    GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH];
    GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH];
 #endif
-   GLfloat bf = ctx->backface_sign;
+   GLfloat bf = ctx->_backface_sign;
 
    /* determine bottom to top order of vertices */
    {
-      GLfloat y0 = VB->Win.data[v0][1];
-      GLfloat y1 = VB->Win.data[v1][1];
-      GLfloat y2 = VB->Win.data[v2][1];
+      GLfloat y0 = v0->win[1];
+      GLfloat y1 = v1->win[1];
+      GLfloat y2 = v2->win[1];
       if (y0 <= y1) {
         if (y1 <= y2) {
            vMin = v0;   vMid = v1;   vMax = v2;   /* y0<=y1<=y2 */
       }
    }
 
-   majDx = VB->Win.data[vMax][0] - VB->Win.data[vMin][0];
-   majDy = VB->Win.data[vMax][1] - VB->Win.data[vMin][1];
+   majDx = vMax->win[0] - vMin->win[0];
+   majDy = vMax->win[1] - vMin->win[1];
 
    {
-      const GLfloat botDx = VB->Win.data[vMid][0] - VB->Win.data[vMin][0];
-      const GLfloat botDy = VB->Win.data[vMid][1] - VB->Win.data[vMin][1];
+      const GLfloat botDx = vMid->win[0] - vMin->win[0];
+      const GLfloat botDy = vMid->win[1] - vMin->win[1];
       const GLfloat area = majDx * botDy - botDx * majDy;
       ltor = (GLboolean) (area < 0.0F);
       /* Do backface culling */
 #ifdef DO_Z
    compute_plane(p0, p1, p2, p0[2], p1[2], p2[2], zPlane);
    compute_plane(p0, p1, p2, 
-                VB->FogCoordPtr->data[v0]
-                VB->FogCoordPtr->data[v1]
-                VB->FogCoordPtr->data[v2]
+                v0->fog
+                v1->fog
+                v2->fog
                 fogPlane);
 #endif
 #ifdef DO_RGBA
    if (ctx->Light.ShadeModel == GL_SMOOTH) {
-      GLchan (*rgba)[4] = VB->ColorPtr->data;
-      compute_plane(p0, p1, p2, rgba[v0][0], rgba[v1][0], rgba[v2][0], rPlane);
-      compute_plane(p0, p1, p2, rgba[v0][1], rgba[v1][1], rgba[v2][1], gPlane);
-      compute_plane(p0, p1, p2, rgba[v0][2], rgba[v1][2], rgba[v2][2], bPlane);
-      compute_plane(p0, p1, p2, rgba[v0][3], rgba[v1][3], rgba[v2][3], aPlane);
+      compute_plane(p0, p1, p2, v0->color[0], v1->color[0], v2->color[0], rPlane);
+      compute_plane(p0, p1, p2, v0->color[1], v1->color[1], v2->color[1], gPlane);
+      compute_plane(p0, p1, p2, v0->color[2], v1->color[2], v2->color[2], bPlane);
+      compute_plane(p0, p1, p2, v0->color[3], v1->color[3], v2->color[3], aPlane);
    }
    else {
-      constant_plane(VB->ColorPtr->data[pv][RCOMP], rPlane);
-      constant_plane(VB->ColorPtr->data[pv][GCOMP], gPlane);
-      constant_plane(VB->ColorPtr->data[pv][BCOMP], bPlane);
-      constant_plane(VB->ColorPtr->data[pv][ACOMP], aPlane);
+      constant_plane(v0->color[RCOMP], rPlane);
+      constant_plane(v0->color[GCOMP], gPlane);
+      constant_plane(v0->color[BCOMP], bPlane);
+      constant_plane(v0->color[ACOMP], aPlane);
    }
 #endif
 #ifdef DO_INDEX
    if (ctx->Light.ShadeModel == GL_SMOOTH) {
-      compute_plane(p0, p1, p2, VB->IndexPtr->data[v0],
-                    VB->IndexPtr->data[v1], VB->IndexPtr->data[v2], iPlane);
+      compute_plane(p0, p1, p2, v0->index,
+                    v1->index, v2->index, iPlane);
    }
    else {
-      constant_plane(VB->IndexPtr->data[pv], iPlane);
+      constant_plane(v0->index, iPlane);
    }
 #endif
 #ifdef DO_SPEC
    {
-      GLchan (*spec)[4] = VB->SecondaryColorPtr->data;
-      compute_plane(p0, p1, p2, spec[v0][0], spec[v1][0], spec[v2][0],srPlane);
-      compute_plane(p0, p1, p2, spec[v0][1], spec[v1][1], spec[v2][1],sgPlane);
-      compute_plane(p0, p1, p2, spec[v0][2], spec[v1][2], spec[v2][2],sbPlane);
+      compute_plane(p0, p1, p2, v0->specular[0], v1->specular[0], v2->specular[0],srPlane);
+      compute_plane(p0, p1, p2, v0->specular[1], v1->specular[1], v2->specular[1],sgPlane);
+      compute_plane(p0, p1, p2, v0->specular[2], v1->specular[2], v2->specular[2],sbPlane);
    }
 #endif
 #ifdef DO_TEX
    {
-      const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;
+      const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;
       const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];
-      const GLint tSize = 3;
-      const GLfloat invW0 = VB->Win.data[v0][3];
-      const GLfloat invW1 = VB->Win.data[v1][3];
-      const GLfloat invW2 = VB->Win.data[v2][3];
-      GLfloat (*texCoord)[4] = VB->TexCoordPtr[0]->data;
-      const GLfloat s0 = texCoord[v0][0] * invW0;
-      const GLfloat s1 = texCoord[v1][0] * invW1;
-      const GLfloat s2 = texCoord[v2][0] * invW2;
-      const GLfloat t0 = (tSize > 1) ? texCoord[v0][1] * invW0 : 0.0F;
-      const GLfloat t1 = (tSize > 1) ? texCoord[v1][1] * invW1 : 0.0F;
-      const GLfloat t2 = (tSize > 1) ? texCoord[v2][1] * invW2 : 0.0F;
-      const GLfloat r0 = (tSize > 2) ? texCoord[v0][2] * invW0 : 0.0F;
-      const GLfloat r1 = (tSize > 2) ? texCoord[v1][2] * invW1 : 0.0F;
-      const GLfloat r2 = (tSize > 2) ? texCoord[v2][2] * invW2 : 0.0F;
-      const GLfloat q0 = (tSize > 3) ? texCoord[v0][3] * invW0 : invW0;
-      const GLfloat q1 = (tSize > 3) ? texCoord[v1][3] * invW1 : invW1;
-      const GLfloat q2 = (tSize > 3) ? texCoord[v2][3] * invW2 : invW2;
+      const GLfloat invW0 = v0->win[3];
+      const GLfloat invW1 = v1->win[3];
+      const GLfloat invW2 = v2->win[3];
+      const GLfloat s0 = v0->texcoord[0][0] * invW0;
+      const GLfloat s1 = v1->texcoord[0][0] * invW1;
+      const GLfloat s2 = v2->texcoord[0][0] * invW2;
+      const GLfloat t0 = v0->texcoord[0][1] * invW0;
+      const GLfloat t1 = v1->texcoord[0][1] * invW1;
+      const GLfloat t2 = v2->texcoord[0][1] * invW2;
+      const GLfloat r0 = v0->texcoord[0][2] * invW0;
+      const GLfloat r1 = v1->texcoord[0][2] * invW1;
+      const GLfloat r2 = v2->texcoord[0][2] * invW2;
+      const GLfloat q0 = v0->texcoord[0][3] * invW0;
+      const GLfloat q1 = v1->texcoord[0][3] * invW1;
+      const GLfloat q2 = v2->texcoord[0][3] * invW2;
       compute_plane(p0, p1, p2, s0, s1, s2, sPlane);
       compute_plane(p0, p1, p2, t0, t1, t2, tPlane);
       compute_plane(p0, p1, p2, r0, r1, r2, uPlane);
    {
       GLuint u;
       for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-         if (ctx->Texture.Unit[u].ReallyEnabled) {
-            const struct gl_texture_object *obj = ctx->Texture.Unit[u].Current;
+         if (ctx->Texture.Unit[u]._ReallyEnabled) {
+            const struct gl_texture_object *obj = ctx->Texture.Unit[u]._Current;
             const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];
-            const GLint tSize = VB->TexCoordPtr[u]->size;
-            const GLfloat invW0 = VB->Win.data[v0][3];
-            const GLfloat invW1 = VB->Win.data[v1][3];
-            const GLfloat invW2 = VB->Win.data[v2][3];
-            GLfloat (*texCoord)[4] = VB->TexCoordPtr[u]->data;
-            const GLfloat s0 = texCoord[v0][0] * invW0;
-            const GLfloat s1 = texCoord[v1][0] * invW1;
-            const GLfloat s2 = texCoord[v2][0] * invW2;
-            const GLfloat t0 = (tSize > 1) ? texCoord[v0][1] * invW0 : 0.0F;
-            const GLfloat t1 = (tSize > 1) ? texCoord[v1][1] * invW1 : 0.0F;
-            const GLfloat t2 = (tSize > 1) ? texCoord[v2][1] * invW2 : 0.0F;
-            const GLfloat r0 = (tSize > 2) ? texCoord[v0][2] * invW0 : 0.0F;
-            const GLfloat r1 = (tSize > 2) ? texCoord[v1][2] * invW1 : 0.0F;
-            const GLfloat r2 = (tSize > 2) ? texCoord[v2][2] * invW2 : 0.0F;
-            const GLfloat q0 = (tSize > 3) ? texCoord[v0][3] * invW0 : invW0;
-            const GLfloat q1 = (tSize > 3) ? texCoord[v1][3] * invW1 : invW1;
-            const GLfloat q2 = (tSize > 3) ? texCoord[v2][3] * invW2 : invW2;
+            const GLfloat invW0 = v0->win[3];
+            const GLfloat invW1 = v1->win[3];
+            const GLfloat invW2 = v2->win[3];
+            const GLfloat s0 = v0->texcoord[u][0] * invW0;
+            const GLfloat s1 = v1->texcoord[u][0] * invW1;
+            const GLfloat s2 = v2->texcoord[u][0] * invW2;
+            const GLfloat t0 = v0->texcoord[u][1] * invW0;
+            const GLfloat t1 = v1->texcoord[u][1] * invW1;
+            const GLfloat t2 = v2->texcoord[u][1] * invW2;
+            const GLfloat r0 = v0->texcoord[u][2] * invW0;
+            const GLfloat r1 = v1->texcoord[u][2] * invW1;
+            const GLfloat r2 = v2->texcoord[u][2] * invW2;
+            const GLfloat q0 = v0->texcoord[u][3] * invW0;
+            const GLfloat q1 = v1->texcoord[u][3] * invW1;
+            const GLfloat q2 = v2->texcoord[u][3] * invW2;
             compute_plane(p0, p1, p2, s0, s1, s2, sPlane[u]);
             compute_plane(p0, p1, p2, t0, t1, t2, tPlane[u]);
             compute_plane(p0, p1, p2, r0, r1, r2, uPlane[u]);
    }
 #endif
 
-   yMin = VB->Win.data[vMin][1];
-   yMax = VB->Win.data[vMax][1];
+   yMin = vMin->win[1];
+   yMax = vMax->win[1];
    iyMin = (int) yMin;
    iyMax = (int) yMax + 1;
 
    if (ltor) {
       /* scan left to right */
-      const float *pMin = VB->Win.data[vMin];
-      const float *pMid = VB->Win.data[vMid];
-      const float *pMax = VB->Win.data[vMax];
+      const float *pMin = vMin->win;
+      const float *pMid = vMid->win;
+      const float *pMax = vMax->win;
       const float dxdy = majDx / majDy;
       const float xAdj = dxdy < 0.0F ? -dxdy : 0.0F;
-      float x = VB->Win.data[vMin][0] - (yMin - iyMin) * dxdy;
+      float x = vMin->win[0] - (yMin - iyMin) * dxdy;
       int iy;
       for (iy = iyMin; iy < iyMax; iy++, x += dxdy) {
          GLint ix, startX = (GLint) (x - xAdj);
             {
                GLuint unit;
                for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
-                  if (ctx->Texture.Unit[unit].ReallyEnabled) {
+                  if (ctx->Texture.Unit[unit]._ReallyEnabled) {
                      GLfloat invQ = solve_plane_recip(ix, iy, vPlane[unit]);
                      s[unit][count] = solve_plane(ix, iy, sPlane[unit]) * invQ;
                      t[unit][count] = solve_plane(ix, iy, tPlane[unit]) * invQ;
    }
    else {
       /* scan right to left */
-      const GLfloat *pMin = VB->Win.data[vMin];
-      const GLfloat *pMid = VB->Win.data[vMid];
-      const GLfloat *pMax = VB->Win.data[vMax];
+      const GLfloat *pMin = vMin->win;
+      const GLfloat *pMid = vMid->win;
+      const GLfloat *pMax = vMax->win;
       const GLfloat dxdy = majDx / majDy;
       const GLfloat xAdj = dxdy > 0 ? dxdy : 0.0F;
-      GLfloat x = VB->Win.data[vMin][0] - (yMin - iyMin) * dxdy;
+      GLfloat x = vMin->win[0] - (yMin - iyMin) * dxdy;
       GLint iy;
       for (iy = iyMin; iy < iyMax; iy++, x += dxdy) {
          GLint ix, left, startX = (GLint) (x + xAdj);
             {
                GLuint unit;
                for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
-                  if (ctx->Texture.Unit[unit].ReallyEnabled) {
+                  if (ctx->Texture.Unit[unit]._ReallyEnabled) {
                      GLfloat invQ = solve_plane_recip(ix, iy, vPlane[unit]);
                      s[unit][ix] = solve_plane(ix, iy, sPlane[unit]) * invQ;
                      t[unit][ix] = solve_plane(ix, iy, tPlane[unit]) * invQ;
          {
             GLuint unit;
             for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
-               if (ctx->Texture.Unit[unit].ReallyEnabled) {
+               if (ctx->Texture.Unit[unit]._ReallyEnabled) {
                   GLint j;
                   for (j = 0; j < n; j++) {
                      s[unit][j] = s[unit][j + left];
index 21ac29153c2657af3b549fb10db1bdfdc6a76a3e..ff12c5305032259a2b2c3ad8200070272e2d148b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_accum.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_accum.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -30,6 +30,7 @@
 #include "mem.h"
 
 #include "s_accum.h"
+#include "s_context.h"
 #include "s_masking.h"
 #include "s_span.h"
 
@@ -119,6 +120,116 @@ static void rescale_accum( GLcontext *ctx )
 
 
 
+
+
+
+/*
+ * Clear the accumulation Buffer.
+ */
+void
+_mesa_clear_accum_buffer( GLcontext *ctx )
+{
+   GLuint buffersize;
+   GLfloat acc_scale;
+
+   if (ctx->Visual.AccumRedBits==0) {
+      /* No accumulation buffer! */
+      return;
+   }
+
+   if (sizeof(GLaccum)==1) {
+      acc_scale = 127.0;
+   }
+   else if (sizeof(GLaccum)==2) {
+      acc_scale = 32767.0;
+   }
+   else {
+      /* sizeof(GLaccum) > 2 (Cray) */
+      acc_scale = (float) SHRT_MAX;
+   }
+
+   /* number of pixels */
+   buffersize = ctx->DrawBuffer->Width * ctx->DrawBuffer->Height;
+
+   if (!ctx->DrawBuffer->Accum) {
+      /* try to alloc accumulation buffer */
+      ctx->DrawBuffer->Accum = (GLaccum *)
+                          MALLOC( buffersize * 4 * sizeof(GLaccum) );
+   }
+
+   if (ctx->DrawBuffer->Accum) {
+      if (ctx->Scissor.Enabled) {
+        /* Limit clear to scissor box */
+        GLaccum r, g, b, a;
+        GLint i, j;
+         GLint width, height;
+         GLaccum *row;
+        r = (GLaccum) (ctx->Accum.ClearColor[0] * acc_scale);
+        g = (GLaccum) (ctx->Accum.ClearColor[1] * acc_scale);
+        b = (GLaccum) (ctx->Accum.ClearColor[2] * acc_scale);
+        a = (GLaccum) (ctx->Accum.ClearColor[3] * acc_scale);
+         /* size of region to clear */
+         width = 4 * (ctx->DrawBuffer->Xmax - ctx->DrawBuffer->Xmin);
+         height = ctx->DrawBuffer->Ymax - ctx->DrawBuffer->Ymin;
+         /* ptr to first element to clear */
+         row = ctx->DrawBuffer->Accum
+               + 4 * (ctx->DrawBuffer->Ymin * ctx->DrawBuffer->Width
+                      + ctx->DrawBuffer->Xmin);
+         for (j=0;j<height;j++) {
+            for (i=0;i<width;i+=4) {
+               row[i+0] = r;
+               row[i+1] = g;
+               row[i+2] = b;
+               row[i+3] = a;
+           }
+            row += 4 * ctx->DrawBuffer->Width;
+        }
+      }
+      else {
+        /* clear whole buffer */
+        if (ctx->Accum.ClearColor[0]==0.0 &&
+            ctx->Accum.ClearColor[1]==0.0 &&
+            ctx->Accum.ClearColor[2]==0.0 &&
+            ctx->Accum.ClearColor[3]==0.0) {
+           /* Black */
+           BZERO( ctx->DrawBuffer->Accum, buffersize * 4 * sizeof(GLaccum) );
+        }
+        else {
+           /* Not black */
+           GLaccum *acc, r, g, b, a;
+           GLuint i;
+
+           acc = ctx->DrawBuffer->Accum;
+           r = (GLaccum) (ctx->Accum.ClearColor[0] * acc_scale);
+           g = (GLaccum) (ctx->Accum.ClearColor[1] * acc_scale);
+           b = (GLaccum) (ctx->Accum.ClearColor[2] * acc_scale);
+           a = (GLaccum) (ctx->Accum.ClearColor[3] * acc_scale);
+           for (i=0;i<buffersize;i++) {
+              *acc++ = r;
+              *acc++ = g;
+              *acc++ = b;
+              *acc++ = a;
+           }
+        }
+      }
+
+      /* update optimized accum state vars */
+      if (ctx->Accum.ClearColor[0] == 0.0 && ctx->Accum.ClearColor[1] == 0.0 &&
+          ctx->Accum.ClearColor[2] == 0.0 && ctx->Accum.ClearColor[3] == 0.0) {
+#ifdef USE_OPTIMIZED_ACCUM
+         ctx->IntegerAccumMode = GL_TRUE;
+#else
+         ctx->IntegerAccumMode = GL_FALSE;
+#endif
+         ctx->IntegerAccumScaler = 0.0;  /* denotes empty accum buffer */
+      }
+      else {
+         ctx->IntegerAccumMode = GL_FALSE;
+      }
+   }
+}
+
+
 void
 _swrast_Accum( GLcontext *ctx, GLenum op, GLfloat value,
               GLint xpos, GLint ypos, 
@@ -133,8 +244,13 @@ _swrast_Accum( GLcontext *ctx, GLenum op, GLfloat value,
    const GLfloat fChanMax = (1 << (sizeof(GLchan) * 8)) - 1;
    
 
+   if (SWRAST_CONTEXT(ctx)->NewState)
+      _swrast_validate_derived( ctx );
+
    if (!ctx->DrawBuffer->Accum) {
-      _mesa_warning(ctx, "Calling glAccum() without an accumulation buffer (low memory?)");
+      _mesa_warning(ctx, 
+                   "Calling glAccum() without an accumulation "
+                   "buffer (low memory?)");
       return;
    }
 
@@ -389,111 +505,3 @@ _swrast_Accum( GLcontext *ctx, GLenum op, GLfloat value,
          gl_error( ctx, GL_INVALID_ENUM, "glAccum" );
    }
 }
-
-
-
-/*
- * Clear the accumulation Buffer.
- */
-void
-_mesa_clear_accum_buffer( GLcontext *ctx )
-{
-   GLuint buffersize;
-   GLfloat acc_scale;
-
-   if (ctx->Visual.AccumRedBits==0) {
-      /* No accumulation buffer! */
-      return;
-   }
-
-   if (sizeof(GLaccum)==1) {
-      acc_scale = 127.0;
-   }
-   else if (sizeof(GLaccum)==2) {
-      acc_scale = 32767.0;
-   }
-   else {
-      /* sizeof(GLaccum) > 2 (Cray) */
-      acc_scale = (float) SHRT_MAX;
-   }
-
-   /* number of pixels */
-   buffersize = ctx->DrawBuffer->Width * ctx->DrawBuffer->Height;
-
-   if (!ctx->DrawBuffer->Accum) {
-      /* try to alloc accumulation buffer */
-      ctx->DrawBuffer->Accum = (GLaccum *)
-                          MALLOC( buffersize * 4 * sizeof(GLaccum) );
-   }
-
-   if (ctx->DrawBuffer->Accum) {
-      if (ctx->Scissor.Enabled) {
-        /* Limit clear to scissor box */
-        GLaccum r, g, b, a;
-        GLint i, j;
-         GLint width, height;
-         GLaccum *row;
-        r = (GLaccum) (ctx->Accum.ClearColor[0] * acc_scale);
-        g = (GLaccum) (ctx->Accum.ClearColor[1] * acc_scale);
-        b = (GLaccum) (ctx->Accum.ClearColor[2] * acc_scale);
-        a = (GLaccum) (ctx->Accum.ClearColor[3] * acc_scale);
-         /* size of region to clear */
-         width = 4 * (ctx->DrawBuffer->Xmax - ctx->DrawBuffer->Xmin);
-         height = ctx->DrawBuffer->Ymax - ctx->DrawBuffer->Ymin;
-         /* ptr to first element to clear */
-         row = ctx->DrawBuffer->Accum
-               + 4 * (ctx->DrawBuffer->Ymin * ctx->DrawBuffer->Width
-                      + ctx->DrawBuffer->Xmin);
-         for (j=0;j<height;j++) {
-            for (i=0;i<width;i+=4) {
-               row[i+0] = r;
-               row[i+1] = g;
-               row[i+2] = b;
-               row[i+3] = a;
-           }
-            row += 4 * ctx->DrawBuffer->Width;
-        }
-      }
-      else {
-        /* clear whole buffer */
-        if (ctx->Accum.ClearColor[0]==0.0 &&
-            ctx->Accum.ClearColor[1]==0.0 &&
-            ctx->Accum.ClearColor[2]==0.0 &&
-            ctx->Accum.ClearColor[3]==0.0) {
-           /* Black */
-           BZERO( ctx->DrawBuffer->Accum, buffersize * 4 * sizeof(GLaccum) );
-        }
-        else {
-           /* Not black */
-           GLaccum *acc, r, g, b, a;
-           GLuint i;
-
-           acc = ctx->DrawBuffer->Accum;
-           r = (GLaccum) (ctx->Accum.ClearColor[0] * acc_scale);
-           g = (GLaccum) (ctx->Accum.ClearColor[1] * acc_scale);
-           b = (GLaccum) (ctx->Accum.ClearColor[2] * acc_scale);
-           a = (GLaccum) (ctx->Accum.ClearColor[3] * acc_scale);
-           for (i=0;i<buffersize;i++) {
-              *acc++ = r;
-              *acc++ = g;
-              *acc++ = b;
-              *acc++ = a;
-           }
-        }
-      }
-
-      /* update optimized accum state vars */
-      if (ctx->Accum.ClearColor[0] == 0.0 && ctx->Accum.ClearColor[1] == 0.0 &&
-          ctx->Accum.ClearColor[2] == 0.0 && ctx->Accum.ClearColor[3] == 0.0) {
-#ifdef USE_OPTIMIZED_ACCUM
-         ctx->IntegerAccumMode = GL_TRUE;
-#else
-         ctx->IntegerAccumMode = GL_FALSE;
-#endif
-         ctx->IntegerAccumScaler = 0.0;  /* denotes empty accum buffer */
-      }
-      else {
-         ctx->IntegerAccumMode = GL_FALSE;
-      }
-   }
-}
index 646081b83e1a1abf7ccaad39975ce4b3e489d440..f11186baedf618b525dd96a05bc2052fc8ac984b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_bitmap.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_bitmap.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -30,6 +30,7 @@
 #include "macros.h"
 #include "pixel.h"
 
+#include "s_context.h"
 #include "s_fog.h"
 #include "s_pb.h"
 
@@ -44,7 +45,7 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
                const struct gl_pixelstore_attrib *unpack,
                const GLubyte *bitmap )
 {
-   struct pixel_buffer *PB = ctx->PB;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    GLint row, col;
    GLdepth fragZ;
    GLfixed fogCoord;
@@ -52,9 +53,12 @@ _swrast_Bitmap( GLcontext *ctx, GLint px, GLint py,
    ASSERT(ctx->RenderMode == GL_RENDER);
    ASSERT(bitmap);
 
-   if (ctx->PB->primitive != GL_BITMAP) {
+   if (SWRAST_CONTEXT(ctx)->NewState)
+      _swrast_validate_derived( ctx );
+
+   if (PB->primitive != GL_BITMAP) {
       gl_flush_pb( ctx );
-      ctx->PB->primitive = GL_BITMAP;
+      PB->primitive = GL_BITMAP;
    }
 
    /* Set bitmap drawing color */
index 0e65229c4a2242cb267c0c2ce64be088473d5761..9b13a10903d77a5d5d89b4b4da4680f8e76b7621 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_blend.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_blend.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
 
 #include "s_alphabuf.h"
 #include "s_blend.h"
+#include "s_context.h"
 #include "s_pb.h"
 #include "s_span.h"
 
 
-#ifdef USE_MMX_ASM
+#if defined(USE_MMX_ASM)
+#include "X86/mmx.h"
+#include "X86/common_x86_asm.h"
 #define _BLENDAPI _ASMAPI
 #else
 #define _BLENDAPI
 #endif
 
+
 /*
  * Common transparency blending mode.
  */
@@ -547,17 +551,13 @@ blend_general( GLcontext *ctx, GLuint n, const GLubyte mask[],
 
 
 
-#if defined(USE_MMX_ASM)
-#include "X86/mmx.h"
-#include "X86/common_x86_asm.h"
-#endif
 
 
 /*
  * Analyze current blending parameters to pick fastest blending function.
  * Result: the ctx->Color.BlendFunc pointer is updated.
  */
-static void set_blend_function( GLcontext *ctx )
+void _swrast_choose_blend_func( GLcontext *ctx )
 {
    const GLenum eq = ctx->Color.BlendEquation;
    const GLenum srcRGB = ctx->Color.BlendSrcRGB;
@@ -565,40 +565,38 @@ static void set_blend_function( GLcontext *ctx )
    const GLenum srcA = ctx->Color.BlendSrcA;
    const GLenum dstA = ctx->Color.BlendDstA;
 
-#if defined(USE_MMX_ASM)
-   /* Hmm.  A table here would have 12^4 == way too many entries.
-    * Provide a hook for MMX instead.
-    */
-   if ( cpu_has_mmx ) {
-      gl_mmx_set_blend_function( ctx );
-   }
-   else
-#endif
    if (srcRGB != srcA || dstRGB != dstA) {
-      ctx->Color.BlendFunc = blend_general;
+      SWRAST_CONTEXT(ctx)->BlendFunc = blend_general;
    }
    else if (eq==GL_FUNC_ADD_EXT && srcRGB==GL_SRC_ALPHA
-       && dstRGB==GL_ONE_MINUS_SRC_ALPHA) {
-      ctx->Color.BlendFunc = blend_transparency;
+           && dstRGB==GL_ONE_MINUS_SRC_ALPHA) 
+   {
+#if defined(USE_MMX_ASM)
+      if ( cpu_has_mmx ) {
+        SWRAST_CONTEXT(ctx)->BlendFunc = gl_mmx_blend_transparency;
+      }
+      else
+#endif
+        SWRAST_CONTEXT(ctx)->BlendFunc = blend_transparency;
    }
    else if (eq==GL_FUNC_ADD_EXT && srcRGB==GL_ONE && dstRGB==GL_ONE) {
-      ctx->Color.BlendFunc = blend_add;
+      SWRAST_CONTEXT(ctx)->BlendFunc = blend_add;
    }
    else if (((eq==GL_FUNC_ADD_EXT || eq==GL_FUNC_REVERSE_SUBTRACT_EXT)
-             && (srcRGB==GL_ZERO && dstRGB==GL_SRC_COLOR))
-            ||
-            ((eq==GL_FUNC_ADD_EXT || eq==GL_FUNC_SUBTRACT_EXT)
-             && (srcRGB==GL_DST_COLOR && dstRGB==GL_ZERO))) {
-      ctx->Color.BlendFunc = blend_modulate;
+            && (srcRGB==GL_ZERO && dstRGB==GL_SRC_COLOR))
+           ||
+           ((eq==GL_FUNC_ADD_EXT || eq==GL_FUNC_SUBTRACT_EXT)
+            && (srcRGB==GL_DST_COLOR && dstRGB==GL_ZERO))) {
+      SWRAST_CONTEXT(ctx)->BlendFunc = blend_modulate;
    }
    else if (eq==GL_MIN_EXT) {
-      ctx->Color.BlendFunc = blend_min;
+      SWRAST_CONTEXT(ctx)->BlendFunc = blend_min;
    }
    else if (eq==GL_MAX_EXT) {
-      ctx->Color.BlendFunc = blend_max;
+      SWRAST_CONTEXT(ctx)->BlendFunc = blend_max;
    }
    else {
-      ctx->Color.BlendFunc = blend_general;
+      SWRAST_CONTEXT(ctx)->BlendFunc = blend_general;
    }
 }
 
@@ -626,10 +624,8 @@ _mesa_blend_span( GLcontext *ctx, GLuint n, GLint x, GLint y,
    /* Read span of current frame buffer pixels */
    gl_read_rgba_span( ctx, ctx->DrawBuffer, n, x, y, dest );
 
-   if (!ctx->Color.BlendFunc)
-      set_blend_function(ctx);
-
-   (*ctx->Color.BlendFunc)( ctx, n, mask, rgba, (const GLchan (*)[4])dest );
+   SWRAST_CONTEXT(ctx)->BlendFunc( ctx, n, mask, rgba, 
+                                  (const GLchan (*)[4])dest );
 }
 
 
@@ -646,6 +642,7 @@ _mesa_blend_pixels( GLcontext *ctx,
                     GLuint n, const GLint x[], const GLint y[],
                     GLchan rgba[][4], const GLubyte mask[] )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLchan dest[PB_SIZE][4];
 
    /* Check if device driver can do the work */
@@ -656,12 +653,11 @@ _mesa_blend_pixels( GLcontext *ctx,
 
    /* Read pixels from current color buffer */
    (*ctx->Driver.ReadRGBAPixels)( ctx, n, x, y, dest, mask );
-   if (ctx->RasterMask & ALPHABUF_BIT) {
+   if (swrast->_RasterMask & ALPHABUF_BIT) {
       _mesa_read_alpha_pixels( ctx, n, x, y, dest, mask );
    }
 
-   if (!ctx->Color.BlendFunc)
-      set_blend_function(ctx);
-
-   (*ctx->Color.BlendFunc)( ctx, n, mask, rgba, (const GLchan (*)[4])dest );
+   swrast->BlendFunc( ctx, n, mask, rgba, (const GLchan (*)[4])dest );
 }
+
+
index 45c32f9088932bd2308141e48266951ec00c33c3..1323ed15dcb96e56f4ad0635a925ecf56b29431b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_blend.h,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_blend.h,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -44,6 +44,8 @@ _mesa_blend_pixels( GLcontext *ctx,
                     GLuint n, const GLint x[], const GLint y[],
                     GLchan rgba[][4], const GLubyte mask[] );
 
+extern void
+_swrast_choose_blend_func( GLcontext *ctx );
 
 
 #endif
index 87a20018498901cad4190eb1c54c7a2624cfd45a..b17b6052db71541af997346314710d4c4a034dff 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_context.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_context.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Keith Whitwell <keithw@valinux.com>
  */
 
-
 #include "glheader.h"
+#include "types.h"
+#include "mem.h"
 
 #include "s_pb.h"
+#include "s_points.h"
+#include "s_lines.h"
+#include "s_triangle.h"
+#include "s_quads.h"
+#include "s_blend.h"
+#include "s_context.h"
+#include "s_texture.h"
 
 
-GLboolean
-_swrast_create_context( GLcontext *ctx )
+
+
+
+/*
+ * Recompute the value of swrast->_RasterMask, etc. according to
+ * the current context.
+ */
+static void 
+_swrast_update_rasterflags( GLcontext *ctx )
 {
-   ctx->PB = gl_alloc_pb();
-   if (!ctx->PB) return GL_FALSE;
+   GLuint RasterMask = 0;
 
-   return GL_TRUE;
+   if (ctx->Color.AlphaEnabled)           RasterMask |= ALPHATEST_BIT;
+   if (ctx->Color.BlendEnabled)           RasterMask |= BLEND_BIT;
+   if (ctx->Depth.Test)                   RasterMask |= DEPTH_BIT;
+   if (ctx->Fog.Enabled)                  RasterMask |= FOG_BIT;
+   if (ctx->Scissor.Enabled)              RasterMask |= SCISSOR_BIT;
+   if (ctx->Stencil.Enabled)              RasterMask |= STENCIL_BIT;
+   if (ctx->Visual.RGBAflag) {
+      const GLuint colorMask = *((GLuint *) &ctx->Color.ColorMask);
+      if (colorMask != 0xffffffff)        RasterMask |= MASKING_BIT;
+      if (ctx->Color.ColorLogicOpEnabled) RasterMask |= LOGIC_OP_BIT;
+      if (ctx->Texture._ReallyEnabled)     RasterMask |= TEXTURE_BIT;
+   }
+   else {
+      if (ctx->Color.IndexMask != 0xffffffff) RasterMask |= MASKING_BIT;
+      if (ctx->Color.IndexLogicOpEnabled)     RasterMask |= LOGIC_OP_BIT;
+   }
+
+   if (ctx->DrawBuffer->UseSoftwareAlphaBuffers
+       && ctx->Color.ColorMask[ACOMP]
+       && ctx->Color.DrawBuffer != GL_NONE)
+      RasterMask |= ALPHABUF_BIT;
+
+   if (   ctx->Viewport.X < 0
+       || ctx->Viewport.X + ctx->Viewport.Width > ctx->DrawBuffer->Width
+       || ctx->Viewport.Y < 0
+       || ctx->Viewport.Y + ctx->Viewport.Height > ctx->DrawBuffer->Height) {
+      RasterMask |= WINCLIP_BIT;
+   }
+
+   if (ctx->Depth.OcclusionTest)
+      RasterMask |= OCCLUSION_BIT;
+
+
+   /* If we're not drawing to exactly one color buffer set the
+    * MULTI_DRAW_BIT flag.  Also set it if we're drawing to no
+    * buffers or the RGBA or CI mask disables all writes.
+    */
+   if (ctx->Color.MultiDrawBuffer) {
+      RasterMask |= MULTI_DRAW_BIT;
+   }
+   else if (ctx->Color.DrawBuffer==GL_NONE) {
+      RasterMask |= MULTI_DRAW_BIT;
+   }
+   else if (ctx->Visual.RGBAflag && *((GLuint *) ctx->Color.ColorMask) == 0) {
+      RasterMask |= MULTI_DRAW_BIT; /* all RGBA channels disabled */
+   }
+   else if (!ctx->Visual.RGBAflag && ctx->Color.IndexMask==0) {
+      RasterMask |= MULTI_DRAW_BIT; /* all color index bits disabled */
+   }
+
+   if (   ctx->Viewport.X<0
+       || ctx->Viewport.X + ctx->Viewport.Width > ctx->DrawBuffer->Width
+       || ctx->Viewport.Y<0
+       || ctx->Viewport.Y + ctx->Viewport.Height > ctx->DrawBuffer->Height) {
+      RasterMask |= WINCLIP_BIT;
+   }
+
+   SWRAST_CONTEXT(ctx)->_RasterMask = RasterMask;
+}
+
+
+
+#define _SWRAST_NEW_TRIANGLE (_NEW_RENDERMODE|         \
+                              _NEW_POLYGON|            \
+                              _NEW_DEPTH|              \
+                              _NEW_STENCIL|            \
+                              _NEW_COLOR|              \
+                              _NEW_TEXTURE|            \
+                              _NEW_HINT|               \
+                              _SWRAST_NEW_RASTERMASK|  \
+                              _NEW_LIGHT|              \
+                              _NEW_FOG)
+
+#define _SWRAST_NEW_LINE (_NEW_RENDERMODE|     \
+                          _NEW_LINE|           \
+                          _NEW_TEXTURE|                \
+                          _NEW_LIGHT|          \
+                          _NEW_FOG|            \
+                          _NEW_DEPTH)
+
+#define _SWRAST_NEW_POINT (_NEW_RENDERMODE |   \
+                          _NEW_POINT |         \
+                          _NEW_TEXTURE |       \
+                          _NEW_LIGHT |         \
+                          _NEW_FOG)
+
+#define _SWRAST_NEW_QUAD  0
+
+#define _SWRAST_NEW_TEXTURE_SAMPLE_FUNC _NEW_TEXTURE
+
+#define _SWRAST_NEW_BLEND_FUNC _NEW_COLOR
+
+
+
+/* Stub for swrast->Triangle to select a true triangle function 
+ * after a state change.
+ */
+static void
+_swrast_validate_quad( GLcontext *ctx, 
+                      SWvertex *v0, SWvertex *v1, SWvertex *v2, SWvertex *v3 )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   _swrast_validate_derived( ctx );
+   swrast->choose_quad( ctx );
+
+   swrast->Quad( ctx, v0, v1, v2, v3 );
+}
+
+static void
+_swrast_validate_triangle( GLcontext *ctx, 
+                          SWvertex *v0, SWvertex *v1, SWvertex *v2 )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   _swrast_validate_derived( ctx );
+   swrast->choose_triangle( ctx );
+
+   swrast->Triangle( ctx, v0, v1, v2 );
 }
 
+static void
+_swrast_validate_line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   _swrast_validate_derived( ctx );
+   swrast->choose_line( ctx );
+
+   swrast->Line( ctx, v0, v1 );
+}
+
+static void
+_swrast_validate_point( GLcontext *ctx, SWvertex *v0 )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   _swrast_validate_derived( ctx );
+   swrast->choose_point( ctx );
+
+   swrast->Point( ctx, v0 );
+}
+
+void 
+_swrast_validate_blend_func( GLcontext *ctx, GLuint n,
+                            const GLubyte mask[],
+                            GLchan src[][4], 
+                            CONST GLchan dst[][4] )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   _swrast_validate_derived( ctx );
+   _swrast_choose_blend_func( ctx );
+
+   swrast->BlendFunc( ctx, n, mask, src, dst );
+}
+
+
+void 
+_swrast_validate_texture_sample( GLcontext *ctx, GLuint texUnit,
+                                const struct gl_texture_object *tObj,
+                                GLuint n,
+                                const GLfloat s[], const GLfloat t[],
+                                const GLfloat u[], const GLfloat lambda[],
+                                GLchan rgba[][4] )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   _swrast_validate_derived( ctx );
+   _swrast_choose_texture_sample_func( ctx, texUnit, tObj );
+
+   swrast->TextureSample[texUnit]( ctx, texUnit, tObj, n, s, t, u, 
+                                  lambda, rgba );
+}
+
+
+static void
+_swrast_sleep( GLcontext *ctx, GLuint new_state )
+{
+}
+
+
+static void
+_swrast_invalidate_state( GLcontext *ctx, GLuint new_state )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+   GLuint i;
+
+   swrast->NewState |= new_state;
+
+   /* After 10 statechanges without any swrast functions being called,
+    * put the module to sleep. 
+    */
+   if (++swrast->StateChanges > 10) {
+      swrast->InvalidateState = _swrast_sleep;
+      swrast->NewState = ~0;
+      new_state = ~0;
+   }
+   
+   if (new_state & swrast->invalidate_triangle)
+      swrast->Triangle = _swrast_validate_triangle;
+
+   if (new_state & swrast->invalidate_line)
+      swrast->Line = _swrast_validate_line;
+
+   if (new_state & swrast->invalidate_point)
+      swrast->Point = _swrast_validate_point;
+
+   if (new_state & swrast->invalidate_quad)
+      swrast->Quad = _swrast_validate_quad;
+
+   if (new_state & _SWRAST_NEW_BLEND_FUNC)
+      swrast->BlendFunc = _swrast_validate_blend_func;
+   
+   if (new_state & _SWRAST_NEW_TEXTURE_SAMPLE_FUNC) 
+      for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++)
+        swrast->TextureSample[i] = _swrast_validate_texture_sample;
+}
+
+
+
 void
-_swrast_destroy_context( GLcontext *ctx )
+_swrast_validate_derived( GLcontext *ctx )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   if (swrast->NewState) 
+   {
+      if (swrast->NewState & _SWRAST_NEW_RASTERMASK) 
+        _swrast_update_rasterflags( ctx );
+
+      swrast->NewState = 0;
+      swrast->StateChanges = 0;
+      swrast->InvalidateState = _swrast_invalidate_state;
+   }
 }
 
 
 
+/* Public entrypoints:  See also s_accum.c, s_bitmap.c, etc.
+ */
+void
+_swrast_Quad( GLcontext *ctx, 
+             SWvertex *v0, SWvertex *v1, SWvertex *v2, SWvertex *v3 )
+{
+   SWRAST_CONTEXT(ctx)->Quad( ctx, v0, v1, v2, v3 );
+}
+
+void
+_swrast_Triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 )
+{
+   SWRAST_CONTEXT(ctx)->Triangle( ctx, v0, v1, v2 );
+}
+
+void
+_swrast_Line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 )
+{
+   SWRAST_CONTEXT(ctx)->Line( ctx, v0, v1 );
+}
+
+void
+_swrast_Point( GLcontext *ctx, SWvertex *v0 )
+{
+   SWRAST_CONTEXT(ctx)->Point( ctx, v0 );
+}
+
+void
+_swrast_InvalidateState( GLcontext *ctx, GLuint new_state )
+{
+   SWRAST_CONTEXT(ctx)->InvalidateState( ctx, new_state );
+}
+
+
+GLuint *
+_swrast_get_stipple_counter_ref( GLcontext *ctx )
+{
+   return &SWRAST_CONTEXT(ctx)->StippleCounter;
+}
+
+
+GLboolean
+_swrast_CreateContext( GLcontext *ctx )
+{
+   GLuint i;
+   SWcontext *swrast = (SWcontext *)CALLOC(sizeof(SWcontext));
+   if (!swrast)
+      return GL_FALSE;
+
+   swrast->PB = gl_alloc_pb();
+   if (!swrast->PB) {
+      FREE(swrast);
+      return GL_FALSE;
+   }
+
+   swrast->NewState = ~0;
+   
+   swrast->choose_point = _swrast_choose_point;
+   swrast->choose_line = _swrast_choose_line;
+   swrast->choose_triangle = _swrast_choose_triangle;
+   swrast->choose_quad = _swrast_choose_quad;
+
+   swrast->invalidate_point = _SWRAST_NEW_POINT;
+   swrast->invalidate_line = _SWRAST_NEW_LINE;
+   swrast->invalidate_triangle = _SWRAST_NEW_TRIANGLE;
+   swrast->invalidate_quad = _SWRAST_NEW_QUAD;
+
+   swrast->Point = _swrast_validate_point;
+   swrast->Line = _swrast_validate_line;
+   swrast->Triangle = _swrast_validate_triangle;
+   swrast->Quad = _swrast_validate_quad;
+   swrast->InvalidateState = _swrast_sleep;
+   swrast->BlendFunc = _swrast_validate_blend_func;
+
+   for (i = 0 ; i < MAX_TEXTURE_UNITS ; i++)
+      swrast->TextureSample[i] = _swrast_validate_texture_sample;
+   
+   ctx->swrast_context = swrast;
+   return GL_TRUE;
+}
+
+void
+_swrast_DestroyContext( GLcontext *ctx )
+{
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   FREE( swrast->PB );
+   FREE( swrast );
+   
+   ctx->swrast_context = 0;
+}
 
diff --git a/src/mesa/swrast/s_context.h b/src/mesa/swrast/s_context.h
new file mode 100644 (file)
index 0000000..493758a
--- /dev/null
@@ -0,0 +1,145 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  3.5
+ * 
+ * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Keith Whitwell <keithw@valinux.com>
+ */
+
+#ifndef S_CONTEXT_H
+#define S_CONTEXT_H
+
+#include "types.h"
+#include "swrast.h"
+
+/*
+ * For texture sampling:
+ */
+typedef void (*TextureSampleFunc)( GLcontext *ctx, GLuint texUnit,
+                                  const struct gl_texture_object *tObj,
+                                   GLuint n,
+                                   const GLfloat s[], const GLfloat t[],
+                                   const GLfloat u[], const GLfloat lambda[],
+                                   GLchan rgba[][4] );
+
+
+
+/*
+ * Blending function
+ */
+#ifdef USE_MMX_ASM
+typedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n,
+                                    const GLubyte mask[],
+                                    GLchan src[][4], CONST GLchan dst[][4] );
+#else
+typedef void (*blend_func)( GLcontext *ctx, GLuint n, const GLubyte mask[],
+                            GLchan src[][4], CONST GLchan dst[][4] );
+#endif
+
+typedef void (*swrast_tri_func)( GLcontext *ctx, 
+                                SWvertex *, SWvertex *, SWvertex *);
+typedef void (*swrast_line_func)( GLcontext *ctx, SWvertex *, SWvertex *);
+typedef void (*swrast_point_func)( GLcontext *ctx, SWvertex *);
+
+/*
+ * Bitmasks to indicate which rasterization options are enabled (RasterMask)
+ */
+#define ALPHATEST_BIT          0x001   /* Alpha-test pixels */
+#define BLEND_BIT              0x002   /* Blend pixels */
+#define DEPTH_BIT              0x004   /* Depth-test pixels */
+#define FOG_BIT                        0x008   /* Fog pixels */
+#define LOGIC_OP_BIT           0x010   /* Apply logic op in software */
+#define SCISSOR_BIT            0x020   /* Scissor pixels */
+#define STENCIL_BIT            0x040   /* Stencil pixels */
+#define MASKING_BIT            0x080   /* Do glColorMask or glIndexMask */
+#define ALPHABUF_BIT           0x100   /* Using software alpha buffer */
+#define WINCLIP_BIT            0x200   /* Clip pixels/primitives to window */
+#define MULTI_DRAW_BIT         0x400   /* Write to more than one color- */
+                                        /* buffer or no buffers. */
+#define OCCLUSION_BIT           0x800   /* GL_HP_occlusion_test enabled */
+#define TEXTURE_BIT            0x1000  /* Texturing really enabled */
+
+
+#define _SWRAST_NEW_RASTERMASK (_NEW_BUFFERS|  \
+                               _NEW_SCISSOR|   \
+                               _NEW_COLOR|     \
+                               _NEW_DEPTH|     \
+                               _NEW_FOG|       \
+                               _NEW_STENCIL|   \
+                               _NEW_TEXTURE|   \
+                               _NEW_VIEWPORT|  \
+                               _NEW_DEPTH)
+
+
+
+typedef struct
+{
+   GLuint NewState;
+   GLuint StateChanges;
+
+   GLuint _RasterMask;
+   GLuint _MinMagThresh[MAX_TEXTURE_UNITS];
+
+   struct pixel_buffer* PB;
+   GLuint StippleCounter;    /* Line stipple counter */
+
+
+   /* Mechanism to allow driver (like X11) to register further
+    * software rasterization routines.
+    */
+   void (*choose_point)( GLcontext * );
+   void (*choose_line)( GLcontext * );
+   void (*choose_triangle)( GLcontext * );
+   void (*choose_quad)( GLcontext * );
+
+   GLuint invalidate_point;
+   GLuint invalidate_line;
+   GLuint invalidate_triangle;
+   GLuint invalidate_quad;
+
+
+   /* Function pointers for dispatch behind public entrypoints.
+    */
+   void (*InvalidateState)( GLcontext *ctx, GLuint new_state );
+   void (*Point)( GLcontext *ctx, SWvertex *v );
+   void (*Line)( GLcontext *ctx, SWvertex *v0, SWvertex *v1 );
+   void (*Triangle)( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 );
+   void (*Quad)( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2, 
+                SWvertex *v3);
+
+   /* Internal hooks, kept uptodate by the same mechanism as above.
+    */
+   blend_func BlendFunc;
+   TextureSampleFunc TextureSample[MAX_TEXTURE_UNITS];
+
+} SWcontext;
+
+
+void
+_swrast_validate_derived( GLcontext *ctx );
+
+
+#define SWRAST_CONTEXT(ctx) ((SWcontext *)ctx->swrast_context)
+
+
+
+#endif
index baa9b0454d91cc058adc8c696daf67037b92ae94..a379cf0d5ce736a171eed6633a9d4bada9b93b96 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_copypix.c,v 1.2 2000/10/31 23:11:06 brianp Exp $ */
+/* $Id: s_copypix.c,v 1.3 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -35,6 +35,7 @@
 #include "mmath.h"
 #include "pixel.h"
 
+#include "s_context.h"
 #include "s_depth.h"
 #include "s_imaging.h"
 #include "s_pixeltex.h"
@@ -81,7 +82,7 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
    GLboolean changeBuffer;
    GLchan *saveReadAlpha;
    const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
-   const GLuint transferOps = ctx->ImageTransferState;
+   const GLuint transferOps = ctx->_ImageTransferState;
    GLfloat *dest, *tmpImage, *convImage;
 
    if (ctx->Depth.Test || ctx->Fog.Enabled) {
@@ -94,7 +95,7 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
       }
    }
 
-   if (ctx->RasterMask == 0
+   if (SWRAST_CONTEXT(ctx)->_RasterMask == 0
        && !zoom
        && destx >= 0
        && destx + width <= ctx->DrawBuffer->Width) {
@@ -231,7 +232,7 @@ copy_conv_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
          rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
       }
 
-      if (ctx->Texture.ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
+      if (ctx->Texture._ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
          GLfloat s[MAX_WIDTH], t[MAX_WIDTH], r[MAX_WIDTH], q[MAX_WIDTH];
          GLchan primary_rgba[MAX_WIDTH][4];
          GLuint unit;
@@ -284,7 +285,7 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
    GLchan *saveReadAlpha;
    const GLboolean zoom = ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F;
    GLint overlapping;
-   const GLuint transferOps = ctx->ImageTransferState;
+   const GLuint transferOps = ctx->_ImageTransferState;
 
    if (ctx->Pixel.Convolution2DEnabled || ctx->Pixel.Separable2DEnabled) {
       copy_conv_rgba_pixels(ctx, srcx, srcy, width, height, destx, desty);
@@ -316,7 +317,7 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
       }
    }
 
-   if (ctx->RasterMask == 0
+   if (SWRAST_CONTEXT(ctx)->_RasterMask == 0
        && !zoom
        && destx >= 0
        && destx + width <= ctx->DrawBuffer->Width) {
@@ -461,7 +462,7 @@ copy_rgba_pixels(GLcontext *ctx, GLint srcx, GLint srcy,
          }
       }
 
-      if (ctx->Texture.ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
+      if (ctx->Texture._ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
          GLfloat s[MAX_WIDTH], t[MAX_WIDTH], r[MAX_WIDTH], q[MAX_WIDTH];
          GLchan primary_rgba[MAX_WIDTH][4];
          GLuint unit;
@@ -817,6 +818,9 @@ _swrast_CopyPixels( GLcontext *ctx,
                    GLint destx, GLint desty,
                    GLenum type )
 {
+   if (SWRAST_CONTEXT(ctx)->NewState)
+      _swrast_validate_derived( ctx );
+
    if (type == GL_COLOR && ctx->Visual.RGBAflag) {
       copy_rgba_pixels( ctx, srcx, srcy, width, height, destx, desty );
    }
index e9dd63093c248484c54a899e6ee007fa927d3d1e..3186f8ea27c217475eaecd18da644d422f09a73f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_depth.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_depth.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -31,6 +31,7 @@
 #include "mem.h"
 
 #include "s_depth.h"
+#include "s_context.h"
 #include "s_pb.h"
 
 
index ba6ea07e540243508c217d406a0155bf7bf1a378..4d119eff1e341ac5c99843dc7742aa651b95029d 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_drawpix.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_drawpix.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -35,6 +35,7 @@
 #include "mmath.h"
 #include "pixel.h"
 
+#include "s_context.h"
 #include "s_pixeltex.h"
 #include "s_span.h"
 #include "s_stencil.h"
@@ -110,8 +111,8 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
       return GL_TRUE;      /* no-op */
    }
 
-   if ((ctx->RasterMask&(~(SCISSOR_BIT|WINCLIP_BIT)))==0
-       && ctx->Texture.ReallyEnabled == 0
+   if ((SWRAST_CONTEXT(ctx)->_RasterMask&(~(SCISSOR_BIT|WINCLIP_BIT)))==0
+       && ctx->Texture._ReallyEnabled == 0
        && unpack->Alignment == 1
        && !unpack->SwapBytes
        && !unpack->LsbFirst) {
@@ -204,7 +205,7 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
        */
 
       if (format == GL_RGBA && type == CHAN_TYPE
-          && ctx->ImageTransferState==0) {
+          && ctx->_ImageTransferState==0) {
          if (ctx->Visual.RGBAflag) {
             GLchan *src = (GLchan *) pixels
                + (skipRows * rowLength + skipPixels) * 4;
@@ -242,7 +243,7 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
          return GL_TRUE;
       }
       else if (format == GL_RGB && type == CHAN_TYPE
-               && ctx->ImageTransferState == 0) {
+               && ctx->_ImageTransferState == 0) {
          if (ctx->Visual.RGBAflag) {
             GLchan *src = (GLchan *) pixels
                + (skipRows * rowLength + skipPixels) * 3;
@@ -279,7 +280,7 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
          return GL_TRUE;
       }
       else if (format == GL_LUMINANCE && type == CHAN_TYPE
-               && ctx->ImageTransferState==0) {
+               && ctx->_ImageTransferState==0) {
          if (ctx->Visual.RGBAflag) {
             GLchan *src = (GLchan *) pixels
                + (skipRows * rowLength + skipPixels);
@@ -338,7 +339,7 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
          return GL_TRUE;
       }
       else if (format == GL_LUMINANCE_ALPHA && type == CHAN_TYPE
-               && ctx->ImageTransferState == 0) {
+               && ctx->_ImageTransferState == 0) {
          if (ctx->Visual.RGBAflag) {
             GLchan *src = (GLchan *) pixels
                + (skipRows * rowLength + skipPixels)*2;
@@ -448,7 +449,7 @@ fast_draw_pixels(GLcontext *ctx, GLint x, GLint y,
                return GL_TRUE;
             }
          }
-         else if (ctx->ImageTransferState==0) {
+         else if (ctx->_ImageTransferState==0) {
             /* write CI data to CI frame buffer */
             GLint row;
             if (ctx->Pixel.ZoomX==1.0F && ctx->Pixel.ZoomY==1.0F) {
@@ -512,7 +513,7 @@ draw_index_pixels( GLcontext *ctx, GLint x, GLint y,
                     pixels, width, height, GL_COLOR_INDEX, type, 0, row, 0);
       _mesa_unpack_index_span(ctx, drawWidth, GL_UNSIGNED_INT, indexes,
                               type, source, &ctx->Unpack,
-                              ctx->ImageTransferState);
+                              ctx->_ImageTransferState);
       if (zoom) {
          gl_write_zoomed_index_span(ctx, drawWidth, x, y, zspan, 0, indexes, desty);
       }
@@ -559,8 +560,8 @@ draw_stencil_pixels( GLcontext *ctx, GLint x, GLint y,
                     pixels, width, height, GL_COLOR_INDEX, type, 0, row, 0);
       _mesa_unpack_index_span(ctx, drawWidth, destType, values,
                               type, source, &ctx->Unpack,
-                              ctx->ImageTransferState);
-      if (ctx->ImageTransferState & IMAGE_SHIFT_OFFSET_BIT) {
+                              ctx->_ImageTransferState);
+      if (ctx->_ImageTransferState & IMAGE_SHIFT_OFFSET_BIT) {
          _mesa_shift_and_offset_stencil( ctx, drawWidth, values );
       }
       if (ctx->Pixel.MapStencilFlag) {
@@ -658,7 +659,7 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
          const GLvoid *src = _mesa_image_address(&ctx->Unpack,
                 pixels, width, height, GL_DEPTH_COMPONENT, type, 0, row, 0);
          _mesa_unpack_depth_span( ctx, drawWidth, zspan, type, src,
-                                  &ctx->Unpack, ctx->ImageTransferState );
+                                  &ctx->Unpack, ctx->_ImageTransferState );
          if (ctx->Visual.RGBAflag) {
             if (zoom) {
                gl_write_zoomed_rgba_span(ctx, width, x, y, zspan, 0,
@@ -698,7 +699,7 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
    GLdepth zspan[MAX_WIDTH];
    GLboolean quickDraw;
    GLfloat *convImage = NULL;
-   GLuint transferOps = ctx->ImageTransferState;
+   GLuint transferOps = ctx->_ImageTransferState;
 
    if (!_mesa_is_legal_format_and_type(format, type)) {
       gl_error(ctx, GL_INVALID_ENUM, "glDrawPixels(format or type)");
@@ -720,7 +721,7 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
    }
 
 
-   if (ctx->RasterMask == 0 && !zoom && x >= 0 && y >= 0
+   if (SWRAST_CONTEXT(ctx)->_RasterMask == 0 && !zoom && x >= 0 && y >= 0
        && x + width <= ctx->DrawBuffer->Width
        && y + height <= ctx->DrawBuffer->Height) {
       quickDraw = GL_TRUE;
@@ -799,7 +800,7 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
              (ctx->Pixel.HistogramEnabled && ctx->Histogram.Sink))
             continue;
 
-         if (ctx->Texture.ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
+         if (ctx->Texture._ReallyEnabled && ctx->Pixel.PixelTextureEnabled) {
             GLfloat s[MAX_WIDTH], t[MAX_WIDTH], r[MAX_WIDTH], q[MAX_WIDTH];
             GLchan primary_rgba[MAX_WIDTH][4];
             GLuint unit;
@@ -808,7 +809,7 @@ draw_rgba_pixels( GLcontext *ctx, GLint x, GLint y,
             MEMCPY(primary_rgba, rgba, 4 * width * sizeof(GLchan));
 
             for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
-               if (ctx->Texture.Unit[unit].ReallyEnabled) {
+               if (ctx->Texture.Unit[unit]._ReallyEnabled) {
                   _mesa_pixeltexgen(ctx, width, (const GLchan (*)[4]) rgba,
                                     s, t, r, q);
                   gl_texture_pixels(ctx, unit, width, s, t, r, NULL,
@@ -852,6 +853,9 @@ _swrast_DrawPixels( GLcontext *ctx,
 {
    (void) unpack;
 
+   if (SWRAST_CONTEXT(ctx)->NewState)
+      _swrast_validate_derived( ctx );
+
    switch (format) {
    case GL_STENCIL_INDEX:
       draw_stencil_pixels( ctx, x, y, width, height, type, pixels );
diff --git a/src/mesa/swrast/s_feedback.c b/src/mesa/swrast/s_feedback.c
new file mode 100644 (file)
index 0000000..501f372
--- /dev/null
@@ -0,0 +1,153 @@
+/* $Id: s_feedback.c,v 1.1 2000/11/05 18:24:40 keithw Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  3.3
+ * 
+ * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#include "glheader.h"
+#include "colormac.h"
+#include "context.h"
+#include "enums.h"
+#include "feedback.h"
+#include "macros.h"
+#include "mmath.h"
+
+#include "s_context.h"
+#include "s_feedback.h"
+#include "s_triangle.h"
+
+
+#define FB_3D          0x01
+#define FB_4D          0x02
+#define FB_INDEX       0x04
+#define FB_COLOR       0x08
+#define FB_TEXTURE     0X10
+
+
+
+
+static void feedback_vertex( GLcontext *ctx, SWvertex *v )
+{
+   GLfloat win[4];
+   GLfloat color[4];
+   GLfloat tc[4];
+   GLuint texUnit = ctx->Texture.CurrentTransformUnit;
+   GLuint index;
+
+   win[0] = v->win[0];
+   win[1] = v->win[1];
+   win[2] = v->win[2] / ctx->Visual.DepthMaxF;
+   win[3] = 1.0 / v->win[3];
+
+   color[0] = CHAN_TO_FLOAT(v->color[0]);
+   color[1] = CHAN_TO_FLOAT(v->color[1]);
+   color[2] = CHAN_TO_FLOAT(v->color[2]);
+   color[3] = CHAN_TO_FLOAT(v->color[3]);
+
+   if (v->texcoord[texUnit][3] != 1.0 &&
+       v->texcoord[texUnit][3] != 0.0) {
+      GLfloat invq = 1.0F / v->texcoord[texUnit][3];
+      tc[0] = v->texcoord[texUnit][0] * invq;
+      tc[1] = v->texcoord[texUnit][1] * invq;
+      tc[2] = v->texcoord[texUnit][2] * invq;
+      tc[3] = v->texcoord[texUnit][3];
+   }
+   else {
+      COPY_4V(tc, v->texcoord[texUnit]);
+   }
+
+   index = v->index;
+
+   gl_feedback_vertex( ctx, win, color, index, tc );
+}
+
+
+/*
+ * Put triangle in feedback buffer.
+ */
+void gl_feedback_triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1,
+                          SWvertex *v2)
+{
+   if (gl_cull_triangle( ctx, v0, v1, v2 )) {
+      FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN );
+      FEEDBACK_TOKEN( ctx, (GLfloat) 3 );        /* three vertices */
+      
+      feedback_vertex( ctx, v0 );
+      feedback_vertex( ctx, v1 );
+      feedback_vertex( ctx, v2 );
+   }
+}
+
+
+void gl_feedback_line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 )
+{
+   GLenum token = GL_LINE_TOKEN;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+   if (swrast->StippleCounter==0) 
+      token = GL_LINE_RESET_TOKEN;
+
+   FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) token );
+
+   feedback_vertex( ctx, v0 );
+   feedback_vertex( ctx, v1 );
+
+   swrast->StippleCounter++;
+}
+
+
+void gl_feedback_point( GLcontext *ctx, SWvertex *v )
+{
+   FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POINT_TOKEN );
+   feedback_vertex( ctx, v );
+}
+
+
+void gl_select_triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1,
+                        SWvertex *v2)
+{
+   if (gl_cull_triangle( ctx, v0, v1, v2 )) {
+      const GLfloat zs = 1.0F / ctx->Visual.DepthMaxF;
+      gl_update_hitflag( ctx, v0->win[2] * zs );
+      gl_update_hitflag( ctx, v1->win[2] * zs );
+      gl_update_hitflag( ctx, v2->win[2] * zs );
+   }
+}
+
+
+void gl_select_line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 )
+{
+   const GLfloat zs = 1.0F / ctx->Visual.DepthMaxF;
+   gl_update_hitflag( ctx, v0->win[2] * zs );
+   gl_update_hitflag( ctx, v1->win[2] * zs );
+}
+
+
+void gl_select_point( GLcontext *ctx, SWvertex *v )
+{
+   const GLfloat zs = 1.0F / ctx->Visual.DepthMaxF;
+   gl_update_hitflag( ctx, v->win[2] * zs );
+}
+
+
+
diff --git a/src/mesa/swrast/s_feedback.h b/src/mesa/swrast/s_feedback.h
new file mode 100644 (file)
index 0000000..f32dcc8
--- /dev/null
@@ -0,0 +1,47 @@
+/* $Id: s_feedback.h,v 1.1 2000/11/05 18:24:40 keithw Exp $ */
+
+/*
+ * Mesa 3-D graphics library
+ * Version:  3.3
+ * 
+ * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef S_FEEDBACK_H
+#define S_FEEDBACK_H
+
+
+#include "types.h"
+#include "swrast.h"
+
+
+extern void gl_feedback_point( GLcontext *ctx, SWvertex *v );
+extern void gl_feedback_line( GLcontext *ctx, SWvertex *v1, SWvertex *v2 );
+extern void gl_feedback_triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1,
+                                 SWvertex *v2 );
+
+extern void gl_select_point( GLcontext *ctx, SWvertex *v );
+extern void gl_select_line( GLcontext *ctx, SWvertex *v1, SWvertex *v2 );
+extern void gl_select_triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1,
+                               SWvertex *v2 );
+
+#endif
+
index 32fafe617c88fd49e6acc749bab9087f450db562..4cfea675d6ec95c7fc3593db147f887bb7037661 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_fog.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_fog.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -31,6 +31,7 @@
 #include "macros.h"
 #include "mmath.h"
 
+#include "s_context.h"
 #include "s_fog.h"
 
 
@@ -105,8 +106,8 @@ _mesa_win_fog_coords_from_z( const GLcontext *ctx,
    GLfloat d = ctx->ProjectionMatrix.m[14];
    GLuint i;
 
-   GLfloat tz = ctx->Viewport.WindowMap.m[MAT_TZ];
-   GLfloat szInv = 1.0F / ctx->Viewport.WindowMap.m[MAT_SZ];
+   GLfloat tz = ctx->Viewport._WindowMap.m[MAT_TZ];
+   GLfloat szInv = 1.0F / ctx->Viewport._WindowMap.m[MAT_SZ];
 
    switch (ctx->Fog.Mode) {
       case GL_LINEAR:
index 672d163d8cf33a7dd778fae34616e7ea22a4a8cd..1b83a3c54c201e63a4403773c88af9000291e583 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_imaging.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_imaging.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -36,6 +36,7 @@
 #include "image.h"
 #include "mmath.h"
 
+#include "s_context.h"
 #include "s_imaging.h"
 #include "s_span.h"
 
index 75a01cf12eb8bf47b59dda496339dc643088dd26..eaf4e8a2faf47ea994ffeb091cc82a93cf1513fe 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_lines.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_lines.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
 
 
 #include "glheader.h"
-#include "feedback.h"
 #include "macros.h"
 #include "mmath.h"
 #include "vb.h"
 
 #include "s_pb.h"
+#include "s_context.h"
 #include "s_depth.h"
+#include "s_lines.h"
+#include "s_feedback.h"
 
 
 
@@ -53,7 +55,6 @@
 /*
  * All line drawing functions have the same arguments:
  * v1, v2 - indexes of first and second endpoints into vertex buffer arrays
- * pv     - provoking vertex: which vertex color/index to use for flat shading.
  */
 
 
 
 /* Flat, color index line */
 static void flat_ci_line( GLcontext *ctx,
-                          GLuint vert0, GLuint vert1, GLuint pvert )
+                          SWvertex *vert0,
+                         SWvertex *vert1 )
 {
-   PB_SET_INDEX( ctx->PB, ctx->VB->IndexPtr->data[pvert] );
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+
+   PB_SET_INDEX( PB, vert0->index );
 
 #define INTERP_XY 1
-#define PLOT(X,Y)  PB_WRITE_PIXEL(ctx->PB, X, Y, 0, 0);
+#define PLOT(X,Y)  PB_WRITE_PIXEL(PB, X, Y, 0, 0);
 
 #include "s_linetemp.h"
 
@@ -86,13 +90,15 @@ static void flat_ci_line( GLcontext *ctx,
 
 /* Flat, color index line with Z interpolation/testing */
 static void flat_ci_z_line( GLcontext *ctx,
-                            GLuint vert0, GLuint vert1, GLuint pvert )
+                            SWvertex *vert0,
+                           SWvertex *vert1 )
 {
-   PB_SET_INDEX( ctx->PB, ctx->VB->IndexPtr->data[pvert] );
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   PB_SET_INDEX( PB, vert0->index );
 
 #define INTERP_XY 1
 #define INTERP_Z 1
-#define PLOT(X,Y)  PB_WRITE_PIXEL(ctx->PB, X, Y, Z, fog0);
+#define PLOT(X,Y)  PB_WRITE_PIXEL(PB, X, Y, Z, fog0);
 
 #include "s_linetemp.h"
 
@@ -103,13 +109,15 @@ static void flat_ci_z_line( GLcontext *ctx,
 
 /* Flat-shaded, RGBA line */
 static void flat_rgba_line( GLcontext *ctx,
-                            GLuint vert0, GLuint vert1, GLuint pvert )
+                            SWvertex *vert0,
+                           SWvertex *vert1 )
 {
-   const GLchan *color = ctx->VB->ColorPtr->data[pvert];
-   PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
+   const GLchan *color = vert0->color;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   PB_SET_COLOR( PB, color[0], color[1], color[2], color[3] );
 
 #define INTERP_XY 1
-#define PLOT(X,Y)   PB_WRITE_PIXEL(ctx->PB, X, Y, 0, 0);
+#define PLOT(X,Y)   PB_WRITE_PIXEL(PB, X, Y, 0, 0);
 
 #include "s_linetemp.h"
 
@@ -120,14 +128,16 @@ static void flat_rgba_line( GLcontext *ctx,
 
 /* Flat-shaded, RGBA line with Z interpolation/testing */
 static void flat_rgba_z_line( GLcontext *ctx,
-                              GLuint vert0, GLuint vert1, GLuint pvert )
+                              SWvertex *vert0,
+                             SWvertex *vert1 )
 {
-   const GLchan *color = ctx->VB->ColorPtr->data[pvert];
-   PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
+   const GLchan *color = vert0->color;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   PB_SET_COLOR( PB, color[0], color[1], color[2], color[3] );
 
 #define INTERP_XY 1
 #define INTERP_Z 1
-#define PLOT(X,Y)   PB_WRITE_PIXEL(ctx->PB, X, Y, Z, fog0);
+#define PLOT(X,Y)   PB_WRITE_PIXEL(PB, X, Y, Z, fog0);
 
 #include "s_linetemp.h"
 
@@ -138,15 +148,16 @@ static void flat_rgba_z_line( GLcontext *ctx,
 
 /* Smooth shaded, color index line */
 static void smooth_ci_line( GLcontext *ctx,
-                            GLuint vert0, GLuint vert1, GLuint pvert )
+                            SWvertex *vert0,
+                           SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLuint *pbi = ctx->PB->index;
-   (void) pvert;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLuint *pbi = PB->index;
 
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
 #define INTERP_XY 1
 #define INTERP_INDEX 1
@@ -159,7 +170,7 @@ static void smooth_ci_line( GLcontext *ctx,
 
 #include "s_linetemp.h"
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -167,16 +178,17 @@ static void smooth_ci_line( GLcontext *ctx,
 
 /* Smooth shaded, color index line with Z interpolation/testing */
 static void smooth_ci_z_line( GLcontext *ctx,
-                              GLuint vert0, GLuint vert1, GLuint pvert )
+                              SWvertex *vert0,
+                             SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLuint *pbi = ctx->PB->index;
-   (void) pvert;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLuint *pbi = PB->index;
 
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
 #define INTERP_XY 1
 #define INTERP_Z 1
@@ -191,7 +203,7 @@ static void smooth_ci_z_line( GLcontext *ctx,
 
 #include "s_linetemp.h"
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -199,15 +211,16 @@ static void smooth_ci_z_line( GLcontext *ctx,
 
 /* Smooth-shaded, RGBA line */
 static void smooth_rgba_line( GLcontext *ctx,
-                                     GLuint vert0, GLuint vert1, GLuint pvert )
+                                     SWvertex *vert0,
+                             SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLchan (*pbrgba)[4] = ctx->PB->rgba;
-   (void) pvert;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLchan (*pbrgba)[4] = PB->rgba;
 
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
 #define INTERP_XY 1
 #define INTERP_RGB 1
@@ -224,7 +237,7 @@ static void smooth_rgba_line( GLcontext *ctx,
 
 #include "s_linetemp.h"
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -232,18 +245,19 @@ static void smooth_rgba_line( GLcontext *ctx,
 
 /* Smooth-shaded, RGBA line with Z interpolation/testing */
 static void smooth_rgba_z_line( GLcontext *ctx,
-                                       GLuint vert0, GLuint vert1, GLuint pvert )
+                                       SWvertex *vert0,
+                               SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLchan (*pbrgba)[4] = ctx->PB->rgba;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLchan (*pbrgba)[4] = PB->rgba;
 
-   (void) pvert;
 
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
 #define INTERP_XY 1
 #define INTERP_Z 1
@@ -263,33 +277,34 @@ static void smooth_rgba_z_line( GLcontext *ctx,
 
 #include "s_linetemp.h"
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
 
 #define CHECK_FULL(count)                      \
        if (count >= PB_SIZE-MAX_WIDTH) {       \
-          ctx->PB->count = count;              \
+          PB->count = count;           \
           gl_flush_pb(ctx);                    \
-          count = ctx->PB->count;              \
+          count = PB->count;           \
        }
 
 
 
 /* Smooth shaded, color index, any width, maybe stippled */
 static void general_smooth_ci_line( GLcontext *ctx,
-                                   GLuint vert0, GLuint vert1, GLuint pvert )
+                                   SWvertex *vert0,
+                                   SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLuint *pbi = ctx->PB->index;
-   (void) pvert;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLuint *pbi = PB->index;
 
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -351,22 +366,24 @@ static void general_smooth_ci_line( GLcontext *ctx,
       }
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
 
 /* Flat shaded, color index, any width, maybe stippled */
 static void general_flat_ci_line( GLcontext *ctx,
-                                  GLuint vert0, GLuint vert1, GLuint pvert )
+                                  SWvertex *vert0,
+                                 SWvertex *vert1 )
 {
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    GLint count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   PB_SET_INDEX( ctx->PB, ctx->VB->IndexPtr->data[pvert] );
-   count = ctx->PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   PB_SET_INDEX( PB, vert0->index );
+   count = PB->count;
 
    if (ctx->Line.StippleFlag) {
       /* stippled, any width */
@@ -421,25 +438,25 @@ static void general_flat_ci_line( GLcontext *ctx,
       }
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
 
 
 static void general_smooth_rgba_line( GLcontext *ctx,
-                                      GLuint vert0, GLuint vert1, GLuint pvert)
+                                      SWvertex *vert0,
+                                     SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLchan (*pbrgba)[4] = ctx->PB->rgba;
-
-   (void) pvert;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLchan (*pbrgba)[4] = PB->rgba;
 
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -524,16 +541,18 @@ static void general_smooth_rgba_line( GLcontext *ctx,
       }
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
 
 static void general_flat_rgba_line( GLcontext *ctx,
-                                    GLuint vert0, GLuint vert1, GLuint pvert )
+                                    SWvertex *vert0,
+                                   SWvertex *vert1 )
 {
-   const GLchan *color = ctx->VB->ColorPtr->data[pvert];
-   PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   const GLchan *color = vert0->color;
+   PB_SET_COLOR( PB, color[0], color[1], color[2], color[3] );
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -541,7 +560,7 @@ static void general_flat_rgba_line( GLcontext *ctx,
 #define INTERP_Z 1
 #define WIDE 1
 #define STIPPLE 1
-#define PLOT(X,Y)  PB_WRITE_PIXEL(ctx->PB, X, Y, Z, fog0);
+#define PLOT(X,Y)  PB_WRITE_PIXEL(PB, X, Y, Z, fog0);
 #include "s_linetemp.h"
    }
    else {
@@ -550,10 +569,10 @@ static void general_flat_rgba_line( GLcontext *ctx,
          /* special case: unstippled and width=2 */
 #define INTERP_XY 1
 #define INTERP_Z 1
-#define XMAJOR_PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z, fog0); \
-                         PB_WRITE_PIXEL(ctx->PB, X, Y+1, Z, fog0);
-#define YMAJOR_PLOT(X,Y)  PB_WRITE_PIXEL(ctx->PB, X, Y, Z, fog0); \
-                          PB_WRITE_PIXEL(ctx->PB, X+1, Y, Z, fog0);
+#define XMAJOR_PLOT(X,Y) PB_WRITE_PIXEL(PB, X, Y, Z, fog0); \
+                         PB_WRITE_PIXEL(PB, X, Y+1, Z, fog0);
+#define YMAJOR_PLOT(X,Y)  PB_WRITE_PIXEL(PB, X, Y, Z, fog0); \
+                          PB_WRITE_PIXEL(PB, X+1, Y, Z, fog0);
 #include "s_linetemp.h"
       }
       else {
@@ -561,7 +580,7 @@ static void general_flat_rgba_line( GLcontext *ctx,
 #define INTERP_XY 1
 #define INTERP_Z 1
 #define WIDE 1
-#define PLOT(X,Y) PB_WRITE_PIXEL(ctx->PB, X, Y, Z, fog0);
+#define PLOT(X,Y) PB_WRITE_PIXEL(PB, X, Y, Z, fog0);
 #include "s_linetemp.h"
       }
    }
@@ -572,19 +591,21 @@ static void general_flat_rgba_line( GLcontext *ctx,
 
 /* Flat-shaded, textured, any width, maybe stippled */
 static void flat_textured_line( GLcontext *ctx,
-                                GLuint vert0, GLuint vert1, GLuint pv )
+                                SWvertex *vert0,
+                               SWvertex *vert1 )
 {
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    GLint count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLfloat *pbs = ctx->PB->s[0];
-   GLfloat *pbt = ctx->PB->t[0];
-   GLfloat *pbu = ctx->PB->u[0];
-   GLchan *color = ctx->VB->ColorPtr->data[pv];
-   PB_SET_COLOR( ctx->PB, color[0], color[1], color[2], color[3] );
-   count = ctx->PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLfloat *pbs = PB->s[0];
+   GLfloat *pbt = PB->t[0];
+   GLfloat *pbu = PB->u[0];
+   GLchan *color = vert0->color;
+   PB_SET_COLOR( PB, color[0], color[1], color[2], color[3] );
+   count = PB->count;
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -628,7 +649,7 @@ static void flat_textured_line( GLcontext *ctx,
 #include "s_linetemp.h"
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -636,20 +657,21 @@ static void flat_textured_line( GLcontext *ctx,
 
 /* Smooth-shaded, textured, any width, maybe stippled */
 static void smooth_textured_line( GLcontext *ctx,
-                                  GLuint vert0, GLuint vert1, GLuint pvert )
+                                  SWvertex *vert0,
+                                 SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLfloat *pbs = ctx->PB->s[0];
-   GLfloat *pbt = ctx->PB->t[0];
-   GLfloat *pbu = ctx->PB->u[0];
-   GLchan (*pbrgba)[4] = ctx->PB->rgba;
-   (void) pvert;
-
-   ctx->PB->mono = GL_FALSE;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLfloat *pbs = PB->s[0];
+   GLfloat *pbt = PB->t[0];
+   GLfloat *pbu = PB->u[0];
+   GLchan (*pbrgba)[4] = PB->rgba;
+
+   PB->mono = GL_FALSE;
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -705,7 +727,7 @@ static void smooth_textured_line( GLcontext *ctx,
 #include "s_linetemp.h"
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -714,19 +736,19 @@ static void smooth_textured_line( GLcontext *ctx,
  * color interpolation.
  */
 static void smooth_multitextured_line( GLcontext *ctx,
-                                   GLuint vert0, GLuint vert1, GLuint pvert )
+                                      SWvertex *vert0,
+                                      SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLchan (*pbrgba)[4] = ctx->PB->rgba;
-   GLchan (*pbspec)[3] = ctx->PB->spec;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLchan (*pbrgba)[4] = PB->rgba;
+   GLchan (*pbspec)[3] = PB->spec;
 
-   (void) pvert;
-
-   ctx->PB->mono = GL_FALSE;
+   PB->mono = GL_FALSE;
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -753,11 +775,11 @@ static void smooth_multitextured_line( GLcontext *ctx,
           pbspec[count][GCOMP] = FixedToInt(sg0);              \
           pbspec[count][BCOMP] = FixedToInt(sb0);              \
           for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {   \
-             if (ctx->Texture.Unit[u].ReallyEnabled) {         \
-                ctx->PB->s[u][0] = fragTexcoord[u][0];         \
-                ctx->PB->s[u][1] = fragTexcoord[u][1];         \
-                ctx->PB->s[u][2] = fragTexcoord[u][2];         \
-                ctx->PB->s[u][3] = fragTexcoord[u][3];         \
+             if (ctx->Texture.Unit[u]._ReallyEnabled) {                \
+                PB->s[u][0] = fragTexcoord[u][0];              \
+                PB->s[u][1] = fragTexcoord[u][1];              \
+                PB->s[u][2] = fragTexcoord[u][2];              \
+                PB->s[u][3] = fragTexcoord[u][3];              \
              }                                                 \
           }                                                    \
           count++;                                             \
@@ -789,11 +811,11 @@ static void smooth_multitextured_line( GLcontext *ctx,
           pbspec[count][GCOMP] = FixedToInt(sg0);              \
           pbspec[count][BCOMP] = FixedToInt(sb0);              \
           for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {   \
-             if (ctx->Texture.Unit[u].ReallyEnabled) {         \
-                ctx->PB->s[u][0] = fragTexcoord[u][0];         \
-                ctx->PB->s[u][1] = fragTexcoord[u][1];         \
-                ctx->PB->s[u][2] = fragTexcoord[u][2];         \
-                ctx->PB->s[u][3] = fragTexcoord[u][3];         \
+             if (ctx->Texture.Unit[u]._ReallyEnabled) {                \
+                PB->s[u][0] = fragTexcoord[u][0];              \
+                PB->s[u][1] = fragTexcoord[u][1];              \
+                PB->s[u][2] = fragTexcoord[u][2];              \
+                PB->s[u][3] = fragTexcoord[u][3];              \
              }                                                 \
           }                                                    \
           count++;                                             \
@@ -802,7 +824,7 @@ static void smooth_multitextured_line( GLcontext *ctx,
 #include "s_linetemp.h"
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -811,23 +833,23 @@ static void smooth_multitextured_line( GLcontext *ctx,
  * color interpolation.
  */
 static void flat_multitextured_line( GLcontext *ctx,
-                                     GLuint vert0, GLuint vert1, GLuint pvert )
+                                     SWvertex *vert0,
+                                    SWvertex *vert1 )
 {
-   GLint count = ctx->PB->count;
-   GLint *pbx = ctx->PB->x;
-   GLint *pby = ctx->PB->y;
-   GLdepth *pbz = ctx->PB->z;
-   GLfixed *pbfog = ctx->PB->fog;
-   GLchan (*pbrgba)[4] = ctx->PB->rgba;
-   GLchan (*pbspec)[3] = ctx->PB->spec;
-   GLchan *color = ctx->VB->ColorPtr->data[pvert];
-   GLchan sRed   = ctx->VB->SecondaryColorPtr->data ? ctx->VB->SecondaryColorPtr->data[pvert][0] : 0;
-   GLchan sGreen = ctx->VB->SecondaryColorPtr->data ? ctx->VB->SecondaryColorPtr->data[pvert][1] : 0;
-   GLchan sBlue  = ctx->VB->SecondaryColorPtr->data ? ctx->VB->SecondaryColorPtr->data[pvert][2] : 0;
-
-   (void) pvert;
-
-   ctx->PB->mono = GL_FALSE;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+   GLint count = PB->count;
+   GLint *pbx = PB->x;
+   GLint *pby = PB->y;
+   GLdepth *pbz = PB->z;
+   GLfixed *pbfog = PB->fog;
+   GLchan (*pbrgba)[4] = PB->rgba;
+   GLchan (*pbspec)[3] = PB->spec;
+   GLchan *color = vert0->color;
+   GLchan sRed   = vert0->specular[0];
+   GLchan sGreen = vert0->specular[1];
+   GLchan sBlue  = vert0->specular[2];
+
+   PB->mono = GL_FALSE;
 
    if (ctx->Line.StippleFlag) {
       /* stippled */
@@ -852,11 +874,11 @@ static void flat_multitextured_line( GLcontext *ctx,
           pbspec[count][GCOMP] = sGreen;                       \
           pbspec[count][BCOMP] = sBlue;                        \
           for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {   \
-             if (ctx->Texture.Unit[u].ReallyEnabled) {         \
-                ctx->PB->s[u][0] = fragTexcoord[u][0];         \
-                ctx->PB->s[u][1] = fragTexcoord[u][1];         \
-                ctx->PB->s[u][2] = fragTexcoord[u][2];         \
-                ctx->PB->s[u][3] = fragTexcoord[u][3];         \
+             if (ctx->Texture.Unit[u]._ReallyEnabled) {                \
+                PB->s[u][0] = fragTexcoord[u][0];              \
+                PB->s[u][1] = fragTexcoord[u][1];              \
+                PB->s[u][2] = fragTexcoord[u][2];              \
+                PB->s[u][3] = fragTexcoord[u][3];              \
              }                                                 \
           }                                                    \
           count++;                                             \
@@ -886,11 +908,11 @@ static void flat_multitextured_line( GLcontext *ctx,
           pbspec[count][GCOMP] = sGreen;                       \
           pbspec[count][BCOMP] = sBlue;                        \
           for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {   \
-             if (ctx->Texture.Unit[u].ReallyEnabled) {         \
-                ctx->PB->s[u][0] = fragTexcoord[u][0];         \
-                ctx->PB->s[u][1] = fragTexcoord[u][1];         \
-                ctx->PB->s[u][2] = fragTexcoord[u][2];         \
-                ctx->PB->s[u][3] = fragTexcoord[u][3];         \
+             if (ctx->Texture.Unit[u]._ReallyEnabled) {                \
+                PB->s[u][0] = fragTexcoord[u][0];              \
+                PB->s[u][1] = fragTexcoord[u][1];              \
+                PB->s[u][2] = fragTexcoord[u][2];              \
+                PB->s[u][3] = fragTexcoord[u][3];              \
              }                                                 \
           }                                                    \
           count++;                                             \
@@ -899,7 +921,7 @@ static void flat_multitextured_line( GLcontext *ctx,
 #include "s_linetemp.h"
    }
 
-   ctx->PB->count = count;
+   PB->count = count;
    gl_flush_pb(ctx);
 }
 
@@ -914,7 +936,8 @@ static void flat_multitextured_line( GLcontext *ctx,
  * to the specification.
  */
 static void aa_rgba_line( GLcontext *ctx,
-                          GLuint vert0, GLuint vert1, GLuint pvert )
+                          SWvertex *vert0,
+                         SWvertex *vert1 )
 {
 #define INTERP_RGBA 1
 #define PLOT(x, y)                                             \
@@ -933,7 +956,8 @@ static void aa_rgba_line( GLcontext *ctx,
  * to the specification.
  */
 static void aa_tex_rgba_line( GLcontext *ctx,
-                              GLuint vert0, GLuint vert1, GLuint pvert )
+                              SWvertex *vert0,
+                             SWvertex *vert1 )
 {
 #define INTERP_RGBA 1
 #define INTERP_TEX 1
@@ -955,7 +979,8 @@ static void aa_tex_rgba_line( GLcontext *ctx,
  * to the specification.
  */
 static void aa_multitex_rgba_line( GLcontext *ctx,
-                                   GLuint vert0, GLuint vert1, GLuint pvert )
+                                   SWvertex *vert0,
+                                  SWvertex *vert1 )
 {
 #define INTERP_RGBA 1
 #define INTERP_SPEC 1
@@ -974,7 +999,8 @@ static void aa_multitex_rgba_line( GLcontext *ctx,
  * Antialiased CI line.  Same comments for RGBA antialiased lines apply.
  */
 static void aa_ci_line( GLcontext *ctx,
-                        GLuint vert0, GLuint vert1, GLuint pvert )
+                        SWvertex *vert0,
+                       SWvertex *vert1 )
 {
 #define INTERP_INDEX 1
 #define PLOT(x, y)                                             \
@@ -985,68 +1011,56 @@ static void aa_ci_line( GLcontext *ctx,
 }
 
 
-/*
- * Null rasterizer for measuring transformation speed.
- */
-static void null_line( GLcontext *ctx, GLuint v1, GLuint v2, GLuint pv )
-{
-   (void) ctx;
-   (void) v1;
-   (void) v2;
-   (void) pv;
-}
-
-
 
 #ifdef DEBUG
 void
 _mesa_print_line_function(GLcontext *ctx)
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
    printf("Line Func == ");
-   if (ctx->Driver.LineFunc == flat_ci_line)
+   if (swrast->Line == flat_ci_line)
       printf("flat_ci_line\n");
-   else if (ctx->Driver.LineFunc == flat_ci_z_line)
+   else if (swrast->Line == flat_ci_z_line)
       printf("flat_ci_z_line\n");
-   else if (ctx->Driver.LineFunc == flat_rgba_line)
+   else if (swrast->Line == flat_rgba_line)
       printf("flat_rgba_line\n");
-   else if (ctx->Driver.LineFunc == flat_rgba_z_line)
+   else if (swrast->Line == flat_rgba_z_line)
       printf("flat_rgba_z_line\n");
-   else if (ctx->Driver.LineFunc == smooth_ci_line)
+   else if (swrast->Line == smooth_ci_line)
       printf("smooth_ci_line\n");
-   else if (ctx->Driver.LineFunc == smooth_ci_z_line)
+   else if (swrast->Line == smooth_ci_z_line)
       printf("smooth_ci_z_line\n");
-   else if (ctx->Driver.LineFunc == smooth_rgba_line)
+   else if (swrast->Line == smooth_rgba_line)
       printf("smooth_rgba_line\n");
-   else if (ctx->Driver.LineFunc == smooth_rgba_z_line)
+   else if (swrast->Line == smooth_rgba_z_line)
       printf("smooth_rgba_z_line\n");
-   else if (ctx->Driver.LineFunc == general_smooth_ci_line)
+   else if (swrast->Line == general_smooth_ci_line)
       printf("general_smooth_ci_line\n");
-   else if (ctx->Driver.LineFunc == general_flat_ci_line)
+   else if (swrast->Line == general_flat_ci_line)
       printf("general_flat_ci_line\n");
-   else if (ctx->Driver.LineFunc == general_smooth_rgba_line)
+   else if (swrast->Line == general_smooth_rgba_line)
       printf("general_smooth_rgba_line\n");
-   else if (ctx->Driver.LineFunc == general_flat_rgba_line)
+   else if (swrast->Line == general_flat_rgba_line)
       printf("general_flat_rgba_line\n");
-   else if (ctx->Driver.LineFunc == flat_textured_line)
+   else if (swrast->Line == flat_textured_line)
       printf("flat_textured_line\n");
-   else if (ctx->Driver.LineFunc == smooth_textured_line)
+   else if (swrast->Line == smooth_textured_line)
       printf("smooth_textured_line\n");
-   else if (ctx->Driver.LineFunc == smooth_multitextured_line)
+   else if (swrast->Line == smooth_multitextured_line)
       printf("smooth_multitextured_line\n");
-   else if (ctx->Driver.LineFunc == flat_multitextured_line)
+   else if (swrast->Line == flat_multitextured_line)
       printf("flat_multitextured_line\n");
-   else if (ctx->Driver.LineFunc == aa_rgba_line)
+   else if (swrast->Line == aa_rgba_line)
       printf("aa_rgba_line\n");
-   else if (ctx->Driver.LineFunc == aa_tex_rgba_line)
+   else if (swrast->Line == aa_tex_rgba_line)
       printf("aa_tex_rgba_line\n");
-   else if (ctx->Driver.LineFunc == aa_multitex_rgba_line)
+   else if (swrast->Line == aa_multitex_rgba_line)
       printf("aa_multitex_rgba_line\n");
-   else if (ctx->Driver.LineFunc == aa_ci_line)
+   else if (swrast->Line == aa_ci_line)
       printf("aa_ci_line\n");
-   else if (ctx->Driver.LineFunc == null_line)
-      printf("null_line\n");
    else
-      printf("Driver func %p\n", ctx->Driver.LineFunc);
+      printf("Driver func %p\n", swrast->Line);
 }
 #endif
 
@@ -1060,56 +1074,49 @@ _mesa_print_line_function(GLcontext *ctx)
  * tests to this code.
  */
 void
-_swrast_set_line_function( GLcontext *ctx )
+_swrast_choose_line( GLcontext *ctx )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
    GLboolean rgbmode = ctx->Visual.RGBAflag;
    /* TODO: antialiased lines */
 
    if (ctx->RenderMode==GL_RENDER) {
-      if (ctx->NoRaster) {
-         ctx->Driver.LineFunc = null_line;
-         return;
-      }
-      if (ctx->Driver.LineFunc) {
-         /* Device driver will draw lines. */
-        return;
-      }
-
       if (ctx->Line.SmoothFlag) {
          /* antialiased lines */
          if (rgbmode) {
-            if (ctx->Texture.ReallyEnabled) {
-               if (ctx->Texture.MultiTextureEnabled
+            if (ctx->Texture._ReallyEnabled) {
+               if (ctx->Texture._MultiTextureEnabled
                   || ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR
                  || ctx->Fog.ColorSumEnabled)
                   /* Multitextured! */
-                  ctx->Driver.LineFunc = aa_multitex_rgba_line;
+                  swrast->Line = aa_multitex_rgba_line;
                else
-                  ctx->Driver.LineFunc = aa_tex_rgba_line;
+                  swrast->Line = aa_tex_rgba_line;
             } else {
-               ctx->Driver.LineFunc = aa_rgba_line;
+               swrast->Line = aa_rgba_line;
             }
          }
          else {
-            ctx->Driver.LineFunc = aa_ci_line;
+            swrast->Line = aa_ci_line;
          }
       }
-      else if (ctx->Texture.ReallyEnabled) {
-         if (ctx->Texture.MultiTextureEnabled
+      else if (ctx->Texture._ReallyEnabled) {
+         if (ctx->Texture._MultiTextureEnabled
              || ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR
             || ctx->Fog.ColorSumEnabled) {
             /* multi-texture and/or separate specular color */
             if (ctx->Light.ShadeModel==GL_SMOOTH)
-               ctx->Driver.LineFunc = smooth_multitextured_line;
+               swrast->Line = smooth_multitextured_line;
             else
-               ctx->Driver.LineFunc = flat_multitextured_line;
+               swrast->Line = flat_multitextured_line;
          }
          else {
             if (ctx->Light.ShadeModel==GL_SMOOTH) {
-                ctx->Driver.LineFunc = smooth_textured_line;
+                swrast->Line = smooth_textured_line;
             }
             else {
-                ctx->Driver.LineFunc = flat_textured_line;
+                swrast->Line = flat_textured_line;
             }
          }
       }
@@ -1117,15 +1124,15 @@ _swrast_set_line_function( GLcontext *ctx )
                || ctx->Line.SmoothFlag) {
          if (ctx->Light.ShadeModel==GL_SMOOTH) {
             if (rgbmode)
-               ctx->Driver.LineFunc = general_smooth_rgba_line;
+               swrast->Line = general_smooth_rgba_line;
             else
-               ctx->Driver.LineFunc = general_smooth_ci_line;
+               swrast->Line = general_smooth_ci_line;
          }
          else {
             if (rgbmode)
-               ctx->Driver.LineFunc = general_flat_rgba_line;
+               swrast->Line = general_flat_rgba_line;
             else
-               ctx->Driver.LineFunc = general_flat_ci_line;
+               swrast->Line = general_flat_ci_line;
          }
       }
       else {
@@ -1133,41 +1140,43 @@ _swrast_set_line_function( GLcontext *ctx )
            /* Width==1, non-stippled, smooth-shaded */
             if (ctx->Depth.Test || ctx->Fog.Enabled) {
                if (rgbmode)
-                  ctx->Driver.LineFunc = smooth_rgba_z_line;
+                  swrast->Line = smooth_rgba_z_line;
                else
-                  ctx->Driver.LineFunc = smooth_ci_z_line;
+                  swrast->Line = smooth_ci_z_line;
             }
             else {
                if (rgbmode)
-                  ctx->Driver.LineFunc = smooth_rgba_line;
+                  swrast->Line = smooth_rgba_line;
                else
-                  ctx->Driver.LineFunc = smooth_ci_line;
+                  swrast->Line = smooth_ci_line;
             }
         }
          else {
            /* Width==1, non-stippled, flat-shaded */
             if (ctx->Depth.Test || ctx->Fog.Enabled) {
                if (rgbmode)
-                  ctx->Driver.LineFunc = flat_rgba_z_line;
+                  swrast->Line = flat_rgba_z_line;
                else
-                  ctx->Driver.LineFunc = flat_ci_z_line;
+                  swrast->Line = flat_ci_z_line;
             }
             else {
                if (rgbmode)
-                  ctx->Driver.LineFunc = flat_rgba_line;
+                  swrast->Line = flat_rgba_line;
                else
-                  ctx->Driver.LineFunc = flat_ci_line;
+                  swrast->Line = flat_ci_line;
             }
          }
       }
    }
    else if (ctx->RenderMode==GL_FEEDBACK) {
-      ctx->Driver.LineFunc = gl_feedback_line;
+      swrast->Line = gl_feedback_line;
    }
    else {
       /* GL_SELECT mode */
-      ctx->Driver.LineFunc = gl_select_line;
+      swrast->Line = gl_select_line;
    }
 
    /*_mesa_print_line_function(ctx);*/
 }
+
+
diff --git a/src/mesa/swrast/s_lines.h b/src/mesa/swrast/s_lines.h
new file mode 100644 (file)
index 0000000..efbb59d
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef S_LINES_H
+#define S_LINES_H
+
+#include "types.h"
+
+void 
+_swrast_choose_line( GLcontext *ctx );
+
+
+#endif
index a79badbff19b6e9a97844b7ba4d45ed4c4e3d178..1605f880a11a6b261065d95b778de6bca82db053 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_linetemp.h,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_linetemp.h,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
  */
 
 
-/*void line( GLcontext *ctx, GLuint vert0, GLuint vert1, GLuint pvert )*/
+/*void line( GLcontext *ctx, SWvertex *vert0, SWvertex *vert1 )*/
 {
-   const struct vertex_buffer *VB = ctx->VB;
-   GLint x0 = (GLint) VB->Win.data[vert0][0];
-   GLint x1 = (GLint) VB->Win.data[vert1][0];
-   GLint y0 = (GLint) VB->Win.data[vert0][1];
-   GLint y1 = (GLint) VB->Win.data[vert1][1];
+   GLint x0 = (GLint) vert0->win[0];
+   GLint x1 = (GLint) vert1->win[0];
+   GLint y0 = (GLint) vert0->win[1];
+   GLint y1 = (GLint) vert1->win[1];
    GLint dx, dy;
 #ifdef INTERP_XY
    GLint xstep, ystep;
    const GLint fixedToDepthShift = depthBits <= 16 ? FIXED_SHIFT : 0;
 #  define FixedToDepth(F)  ((F) >> fixedToDepthShift)
 #  ifdef DEPTH_TYPE
-     GLint zPtrXstep, zPtrYstep;
-     DEPTH_TYPE *zPtr;
+   GLint zPtrXstep, zPtrYstep;
+   DEPTH_TYPE *zPtr;
 #  endif
-   GLfixed fog0 = FloatToFixed(VB->FogCoordPtr->data[vert0]);
-   GLfixed dfog = FloatToFixed(VB->FogCoordPtr->data[vert1]) - fog0;   
+   GLfixed fog0 = FloatToFixed(vert0->fog);
+   GLfixed dfog = FloatToFixed(vert1->fog) - fog0;   
 #endif
 #ifdef INTERP_RGB
-   GLfixed r0 = IntToFixed(VB->ColorPtr->data[vert0][0]);
-   GLfixed dr = IntToFixed(VB->ColorPtr->data[vert1][0]) - r0;
-   GLfixed g0 = IntToFixed(VB->ColorPtr->data[vert0][1]);
-   GLfixed dg = IntToFixed(VB->ColorPtr->data[vert1][1]) - g0;
-   GLfixed b0 = IntToFixed(VB->ColorPtr->data[vert0][2]);
-   GLfixed db = IntToFixed(VB->ColorPtr->data[vert1][2]) - b0;
+   GLfixed r0 = IntToFixed(vert0->color[0]);
+   GLfixed dr = IntToFixed(vert1->color[0]) - r0;
+   GLfixed g0 = IntToFixed(vert0->color[1]);
+   GLfixed dg = IntToFixed(vert1->color[1]) - g0;
+   GLfixed b0 = IntToFixed(vert0->color[2]);
+   GLfixed db = IntToFixed(vert1->color[2]) - b0;
 #endif
 #ifdef INTERP_SPEC
-   GLfixed sr0 = VB->SecondaryColorPtr->data ? IntToFixed(VB->SecondaryColorPtr->data[vert0][0]) : 0;
-   GLfixed dsr = VB->SecondaryColorPtr->data ? IntToFixed(VB->SecondaryColorPtr->data[vert1][0]) - sr0 : 0;
-   GLfixed sg0 = VB->SecondaryColorPtr->data ? IntToFixed(VB->SecondaryColorPtr->data[vert0][1]) : 0;
-   GLfixed dsg = VB->SecondaryColorPtr->data ? IntToFixed(VB->SecondaryColorPtr->data[vert1][1]) - sg0 : 0;
-   GLfixed sb0 = VB->SecondaryColorPtr->data ? IntToFixed(VB->SecondaryColorPtr->data[vert0][2]) : 0;
-   GLfixed dsb = VB->SecondaryColorPtr->data ? IntToFixed(VB->SecondaryColorPtr->data[vert1][2]) - sb0 : 0;
+   GLfixed sr0 = IntToFixed(vert0->specular[0]);
+   GLfixed dsr = IntToFixed(vert1->specular[0]) - sr0;
+   GLfixed sg0 = IntToFixed(vert0->specular[1]);
+   GLfixed dsg = IntToFixed(vert1->specular[1]) - sg0;
+   GLfixed sb0 = IntToFixed(vert0->specular[2]);
+   GLfixed dsb = IntToFixed(vert1->specular[2]) - sb0;
 #endif
 #ifdef INTERP_ALPHA
-   GLfixed a0 = IntToFixed(VB->ColorPtr->data[vert0][3]);
-   GLfixed da = IntToFixed(VB->ColorPtr->data[vert1][3]) - a0;
+   GLfixed a0 = IntToFixed(vert0->color[3]);
+   GLfixed da = IntToFixed(vert1->color[3]) - a0;
 #endif
 #ifdef INTERP_INDEX
-   GLint i0 = VB->IndexPtr->data[vert0] << 8;
-   GLint di = (GLint) (VB->IndexPtr->data[vert1] << 8) - i0;
+   GLint i0 = vert0->index << 8;
+   GLint di = (GLint) (vert1->index << 8) - i0;
 #endif
 #ifdef INTERP_TEX
-   const GLfloat invw0 = VB->Win.data[vert0][3];
-   const GLfloat invw1 = VB->Win.data[vert1][3];
+   const GLfloat invw0 = vert0->win[3];
+   const GLfloat invw1 = vert1->win[3];
    GLfloat tex[4];
    GLfloat dtex[4];
    GLfloat fragTexcoord[4];
 #endif
 #ifdef INTERP_MULTITEX
-   const GLfloat invw0 = VB->Win.data[vert0][3];
-   const GLfloat invw1 = VB->Win.data[vert1][3];
+   const GLfloat invw0 = vert0->win[3];
+   const GLfloat invw1 = vert1->win[3];
    GLfloat tex[MAX_TEXTURE_UNITS][4];
    GLfloat dtex[MAX_TEXTURE_UNITS][4];
    GLfloat fragTexcoord[MAX_TEXTURE_UNITS][4];
    PIXEL_TYPE *pixelPtr;
    GLint pixelXstep, pixelYstep;
 #endif
+#ifdef STIPPLE
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+#endif
 #ifdef WIDE
    /* for wide lines, draw all X in [x+min, x+max] or Y in [y+min, y+max] */
    GLint width, min, max;
 #endif
 #ifdef INTERP_TEX
    {
-      tex[0]  = invw0 * VB->TexCoordPtr[0]->data[vert0][0];
-      dtex[0] = invw1 * VB->TexCoordPtr[0]->data[vert1][0] - tex[0];
-      if (VB->TexCoordPtr[0]->size > 1) {
-         tex[1]  = invw0 * VB->TexCoordPtr[0]->data[vert0][1];
-         dtex[1] = invw1 * VB->TexCoordPtr[0]->data[vert1][1] - tex[1];
-      }
-      else {
-         tex[1]  = 0.0;
-         dtex[1] = 0.0;
-      }
-      if (VB->TexCoordPtr[0]->size > 2) {
-         tex[2]  = invw0 * VB->TexCoordPtr[0]->data[vert0][2];
-         dtex[2] = invw1 * VB->TexCoordPtr[0]->data[vert1][2] - tex[2];
-      }
-      else {
-         tex[2]  = 0.0;
-         dtex[2] = 0.0;
-      }
-      if (VB->TexCoordPtr[0]->size > 3) {
-         tex[3]  = invw0 * VB->TexCoordPtr[0]->data[vert0][3];
-         dtex[3] = invw1 * VB->TexCoordPtr[0]->data[vert1][3] - tex[3];
-      }
-      else {
-         tex[3]  = invw0;
-         dtex[3] = invw1 - invw0;
-      }
+      tex[0]  = invw0 * vert0->texcoord[0][0];
+      dtex[0] = invw1 * vert1->texcoord[0][0] - tex[0];
+      tex[1]  = invw0 * vert0->texcoord[0][1];
+      dtex[1] = invw1 * vert1->texcoord[0][1] - tex[1];
+      tex[2]  = invw0 * vert0->texcoord[0][2];
+      dtex[2] = invw1 * vert1->texcoord[0][2] - tex[2];
+      tex[3]  = invw0 * vert0->texcoord[0][3];
+      dtex[3] = invw1 * vert1->texcoord[0][3] - tex[3];
    }
 #endif
 #ifdef INTERP_MULTITEX
    {
       GLuint u;
       for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-         if (ctx->Texture.Unit[u].ReallyEnabled) {
-            tex[u][0]  = invw0 * VB->TexCoordPtr[u]->data[vert0][0];
-            dtex[u][0] = invw1 * VB->TexCoordPtr[u]->data[vert1][0] - tex[u][0];
-            if (VB->TexCoordPtr[u]->size > 1) {
-               tex[u][1]  = invw0 * VB->TexCoordPtr[u]->data[vert0][1];
-               dtex[u][1] = invw1 * VB->TexCoordPtr[u]->data[vert1][1] - tex[u][1];
-            }
-            else {
-               tex[u][1]  = 0.0;
-               dtex[u][1] = 0.0;
-            }
-            if (VB->TexCoordPtr[u]->size > 2) {
-               tex[u][2]  = invw0 * VB->TexCoordPtr[u]->data[vert0][2];
-               dtex[u][2] = invw1 * VB->TexCoordPtr[u]->data[vert1][2] - tex[u][2];
-            }
-            else {
-               tex[u][2]  = 0.0;
-               dtex[u][2] = 0.0;
-            }
-            if (VB->TexCoordPtr[u]->size > 3) {
-               tex[u][3]  = invw0 * VB->TexCoordPtr[u]->data[vert0][3];
-               dtex[u][3] = invw1 * VB->TexCoordPtr[u]->data[vert1][3] - tex[u][3];
-            }
-            else {
-               tex[u][3]  = invw0;
-               dtex[u][3] = invw1 - invw0;
-            }
-         }
+         if (ctx->Texture.Unit[u]._ReallyEnabled) {
+            tex[u][0]  = invw0 * vert0->texcoord[u][0];
+            dtex[u][0] = invw1 * vert1->texcoord[u][0] - tex[u][0];
+           tex[u][1]  = invw0 * vert0->texcoord[u][1];
+           dtex[u][1] = invw1 * vert1->texcoord[u][1] - tex[u][1];
+           tex[u][2]  = invw0 * vert0->texcoord[u][2];
+           dtex[u][2] = invw1 * vert1->texcoord[u][2] - tex[u][2];
+           tex[u][3]  = invw0 * vert0->texcoord[u][3];
+           dtex[u][3] = invw1 * vert1->texcoord[u][3] - tex[u][3];
+        }
       }
    }
 #endif
      zPtr = (DEPTH_TYPE *) _mesa_zbuffer_address(ctx, x0, y0);
 #  endif
    if (depthBits <= 16) {
-      z0 = FloatToFixed(VB->Win.data[vert0][2] + ctx->LineZoffset);
-      z1 = FloatToFixed(VB->Win.data[vert1][2] + ctx->LineZoffset);
+      z0 = FloatToFixed(vert0->win[2]);
+      z1 = FloatToFixed(vert1->win[2]);
    }
    else {
-      z0 = (int) VB->Win.data[vert0][2] + ctx->LineZoffset;
-      z1 = (int) VB->Win.data[vert1][2] + ctx->LineZoffset;
+      z0 = (int) vert0->win[2];
+      z1 = (int) vert1->win[2];
    }
 #endif
 #ifdef PIXEL_ADDRESS
          const GLfloat invDx = 1.0F / (GLfloat) dx;
          GLuint u;
          for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-            if (ctx->Texture.Unit[u].ReallyEnabled) {
+            if (ctx->Texture.Unit[u]._ReallyEnabled) {
                dtex[u][0] *= invDx;
                dtex[u][1] *= invDx;
                dtex[u][2] *= invDx;
       for (i=0;i<dx;i++) {
 #ifdef STIPPLE
          GLushort m;
-         m = 1 << ((ctx->StippleCounter/ctx->Line.StippleFactor) & 0xf);
+         m = 1 << ((swrast->StippleCounter/ctx->Line.StippleFactor) & 0xf);
          if (ctx->Line.StipplePattern & m) {
 #endif
 #ifdef INTERP_Z
             {
                GLuint u;
                for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                  if (ctx->Texture.Unit[u].ReallyEnabled) {
+                  if (ctx->Texture.Unit[u]._ReallyEnabled) {
                      const GLfloat invQ = 1.0F / tex[u][3];
                      fragTexcoord[u][0] = tex[u][0] * invQ;
                      fragTexcoord[u][1] = tex[u][1] * invQ;
 #endif /*WIDE*/
 #ifdef STIPPLE
         }
-       ctx->StippleCounter++;
+       swrast->StippleCounter++;
 #endif
 #ifdef INTERP_XY
          x0 += xstep;
          {
             GLuint u;
             for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-               if (ctx->Texture.Unit[u].ReallyEnabled) {
+               if (ctx->Texture.Unit[u]._ReallyEnabled) {
                   tex[u][0] += dtex[u][0];
                   tex[u][1] += dtex[u][1];
                   tex[u][2] += dtex[u][2];
          const GLfloat invDy = 1.0F / (GLfloat) dy;
          GLuint u;
          for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-            if (ctx->Texture.Unit[u].ReallyEnabled) {
+            if (ctx->Texture.Unit[u]._ReallyEnabled) {
                dtex[u][0] *= invDy;
                dtex[u][1] *= invDy;
                dtex[u][2] *= invDy;
       for (i=0;i<dy;i++) {
 #ifdef STIPPLE
          GLushort m;
-         m = 1 << ((ctx->StippleCounter/ctx->Line.StippleFactor) & 0xf);
+         m = 1 << ((swrast->StippleCounter/ctx->Line.StippleFactor) & 0xf);
          if (ctx->Line.StipplePattern & m) {
 #endif
 #ifdef INTERP_Z
             {
                GLuint u;
                for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                  if (ctx->Texture.Unit[u].ReallyEnabled) {
+                  if (ctx->Texture.Unit[u]._ReallyEnabled) {
                      const GLfloat invQ = 1.0F / tex[u][3];
                      fragTexcoord[u][0] = tex[u][0] * invQ;
                      fragTexcoord[u][1] = tex[u][1] * invQ;
 #endif /*WIDE*/
 #ifdef STIPPLE
         }
-       ctx->StippleCounter++;
+       swrast->StippleCounter++;
 #endif
 #ifdef INTERP_XY
          y0 += ystep;
          {
             GLuint u;
             for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-               if (ctx->Texture.Unit[u].ReallyEnabled) {
+               if (ctx->Texture.Unit[u]._ReallyEnabled) {
                   tex[u][0] += dtex[u][0];
                   tex[u][1] += dtex[u][1];
                   tex[u][2] += dtex[u][2];
index 760d7e7065d38488b288a24b53674510cfd81ade..0e801597633b40157bd5e2222accb8e5a22c3c31 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_logic.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_logic.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -30,6 +30,7 @@
 #include "macros.h"
 
 #include "s_alphabuf.h"
+#include "s_context.h"
 #include "s_logic.h"
 #include "s_pb.h"
 #include "s_span.h"
@@ -353,7 +354,7 @@ _mesa_logicop_rgba_pixels( GLcontext *ctx,
 {
    GLchan dest[PB_SIZE][4];
    (*ctx->Driver.ReadRGBAPixels)( ctx, n, x, y, dest, mask );
-   if (ctx->RasterMask & ALPHABUF_BIT) {
+   if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
       _mesa_read_alpha_pixels( ctx, n, x, y, dest, mask );
    }
    rgba_logicop( ctx, n, mask, (GLuint *) rgba, (const GLuint *) dest );
index 5831edf9c01fe432f7e06f28d4fb4cc0f22fd263..b246da2053c1e2114f32aab32e5e2ad80be6d2bb 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_masking.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_masking.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -35,6 +35,7 @@
 #include "macros.h"
 
 #include "s_alphabuf.h"
+#include "s_context.h"
 #include "s_masking.h"
 #include "s_pb.h"
 #include "s_span.h"
@@ -101,7 +102,7 @@ _mesa_mask_rgba_pixels( GLcontext *ctx,
    GLuint *dest32 = (GLuint *) dest;
 
    (*ctx->Driver.ReadRGBAPixels)( ctx, n, x, y, dest, mask );
-   if (ctx->RasterMask & ALPHABUF_BIT) {
+   if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
       _mesa_read_alpha_pixels( ctx, n, x, y, dest, mask );
    }
 
@@ -117,7 +118,7 @@ _mesa_mask_rgba_pixels( GLcontext *ctx,
    const GLint aMask = ctx->Color.ColorMask[ACOMP];
 
    (*ctx->Driver.ReadRGBAPixels)( ctx, n, x, y, dest, mask );
-   if (ctx->RasterMask & ALPHABUF_BIT) {
+   if (SWRAST_CONTEXT(ctx)->_RasterMask & ALPHABUF_BIT) {
       _mesa_read_alpha_pixels( ctx, n, x, y, dest, mask );
    }
 
index 854482a25161a9618aa15352488d3c79f54c7059..a9cf425ffbdf189737cccd727bc035d4de2f6b31 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_pixeltex.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_pixeltex.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -36,6 +36,7 @@
 #include "glheader.h"
 #include "colormac.h"
 
+#include "s_context.h"
 #include "s_pixeltex.h"
 
 
index b24fc642ac1ebc3f6dc85da778eeaae666a9943d..a4a889e2ddfb2f248b571c2ed3170a8c1e49de3c 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_points.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_points.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
 
 #include "glheader.h"
 #include "context.h"
-#include "feedback.h"
 #include "macros.h"
 #include "mmath.h"
 #include "texstate.h"
 #include "vb.h"
 
+#include "s_context.h"
+#include "s_feedback.h"
 #include "s_pb.h"
+#include "s_points.h"
 #include "s_span.h"
 
 
@@ -48,9 +50,6 @@
  *   2. size1:  size=1 and any rasterization functions
  *   3. general:  any size and rasterization functions (slowest)
  *
- * All point rendering functions take the same two arguments: first and
- * last which specify that the points specified by VB[first] through
- * VB[last] are to be rendered.
  */
 
 
  * CI points with size == 1.0
  */
 static void
-size1_ci_points( GLcontext *ctx, GLuint first, GLuint last )
+size1_ci_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLfloat *win, *fog;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    GLint *pbx = PB->x, *pby = PB->y;
    GLdepth *pbz = PB->z;
    GLfixed *pbfog = PB->fog;
    GLuint *pbi = PB->index;
    GLuint pbcount = PB->count;
-   GLuint i;
-
-   win = &VB->Win.data[first][0];
-   fog = &VB->FogCoordPtr->data[first];
-
-   for (i = first; i <= last; i++) {
-      if (VB->ClipMask[i] == 0) {
-         pbx[pbcount] = (GLint)  win[0];
-         pby[pbcount] = (GLint)  win[1];
-         pbz[pbcount] = (GLint) (win[2] + ctx->PointZoffset);
-        pbfog[pbcount] = FloatToFixed(fog[i]);
-         pbi[pbcount] = VB->IndexPtr->data[i];
-         pbcount++;
-      }
-      win += 3;
-   }
-   PB->count = pbcount;
+
+   pbx[pbcount] = (GLint) vert->win[0];
+   pby[pbcount] = (GLint) vert->win[1];
+   pbz[pbcount] = (GLint) vert->win[2];
+   pbfog[pbcount] = FloatToFixed(vert->fog);
+   pbi[pbcount] = vert->index;
+
+   PB->count++;
    PB_CHECK_FLUSH(ctx, PB);
 }
 
@@ -97,32 +85,20 @@ size1_ci_points( GLcontext *ctx, GLuint first, GLuint last )
  * RGBA points with size == 1.0
  */
 static void
-size1_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+size1_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLuint i;
-
-   for (i = first; i <= last; i++) {
-      if (VB->ClipMask[i] == 0) {
-         GLint x, y, z;
-        GLint fog;
-         GLint red, green, blue, alpha;
-
-         x = (GLint)  VB->Win.data[i][0];
-         y = (GLint)  VB->Win.data[i][1];
-         z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-
-        fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-         red   = VB->ColorPtr->data[i][0];
-         green = VB->ColorPtr->data[i][1];
-         blue  = VB->ColorPtr->data[i][2];
-         alpha = VB->ColorPtr->data[i][3];
-
-         PB_WRITE_RGBA_PIXEL( PB, x, y, z, fog, red, green, blue, alpha );
-      }
-   }
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+
+   GLint x = (GLint)  vert->win[0];
+   GLint y = (GLint)  vert->win[1];
+   GLint z = (GLint) (vert->win[2]);
+   GLfixed fog = FloatToFixed( vert->fog );
+   GLubyte red   = vert->color[0];
+   GLubyte green = vert->color[1];
+   GLubyte blue  = vert->color[2];
+   GLubyte alpha = vert->color[3];
+
+   PB_WRITE_RGBA_PIXEL( PB, x, y, z, fog, red, green, blue, alpha );
    PB_CHECK_FLUSH(ctx, PB);
 }
 
@@ -132,50 +108,44 @@ size1_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
  * General CI points.
  */
 static void
-general_ci_points( GLcontext *ctx, GLuint first, GLuint last )
+general_ci_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    const GLint isize = (GLint) (ctx->Point.Size + 0.5F);
    GLint radius = isize >> 1;
-   GLuint i;
 
-   for (i = first; i <= last; i++) {
-      if (VB->ClipMask[i] == 0) {
-         GLint x0, x1, y0, y1;
-         GLint ix, iy;
+   GLint x0, x1, y0, y1;
+   GLint ix, iy;
 
-         GLint x = (GLint)  VB->Win.data[i][0];
-         GLint y = (GLint)  VB->Win.data[i][1];
-         GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
+   GLint x = (GLint)  vert->win[0];
+   GLint y = (GLint)  vert->win[1];
+   GLint z = (GLint) (vert->win[2]);
 
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
+   GLfixed fog = FloatToFixed( vert->fog );
 
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
 
-         PB_SET_INDEX( PB, VB->IndexPtr->data[i] );
+   PB_SET_INDEX( PB, vert->index );
 
-         for (iy = y0; iy <= y1; iy++) {
-            for (ix = x0; ix <= x1; ix++) {
-               PB_WRITE_PIXEL( PB, ix, iy, z, fog );
-            }
-         }
-         PB_CHECK_FLUSH(ctx,PB);
+   for (iy = y0; iy <= y1; iy++) {
+      for (ix = x0; ix <= x1; ix++) {
+        PB_WRITE_PIXEL( PB, ix, iy, z, fog );
       }
    }
+   PB_CHECK_FLUSH(ctx,PB);
 }
 
 
@@ -183,54 +153,48 @@ general_ci_points( GLcontext *ctx, GLuint first, GLuint last )
  * General RGBA points.
  */
 static void
-general_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+general_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    GLint isize = (GLint) (ctx->Point.Size + 0.5F);
    GLint radius = isize >> 1;
-   GLuint i;
 
-   for (i = first; i <= last; i++) {
-      if (VB->ClipMask[i] == 0) {
-         GLint x0, x1, y0, y1;
-         GLint ix, iy;
+   GLint x0, x1, y0, y1;
+   GLint ix, iy;
 
-         GLint x = (GLint)  VB->Win.data[i][0];
-         GLint y = (GLint)  VB->Win.data[i][1];
-         GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
+   GLint x = (GLint)  vert->win[0];
+   GLint y = (GLint)  vert->win[1];
+   GLint z = (GLint) (vert->win[2]);
 
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
+   GLfixed fog = FloatToFixed( vert->fog );
 
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
 
-         PB_SET_COLOR( PB,
-                       VB->ColorPtr->data[i][0],
-                       VB->ColorPtr->data[i][1],
-                       VB->ColorPtr->data[i][2],
-                       VB->ColorPtr->data[i][3] );
+   PB_SET_COLOR( PB,
+                vert->color[0],
+                vert->color[1],
+                vert->color[2],
+                vert->color[3] );
 
-         for (iy = y0; iy <= y1; iy++) {
-            for (ix = x0; ix <= x1; ix++) {
-               PB_WRITE_PIXEL( PB, ix, iy, z, fog );
-            }
-         }
-         PB_CHECK_FLUSH(ctx,PB);
+   for (iy = y0; iy <= y1; iy++) {
+      for (ix = x0; ix <= x1; ix++) {
+        PB_WRITE_PIXEL( PB, ix, iy, z, fog );
       }
    }
+   PB_CHECK_FLUSH(ctx,PB);
 }
 
 
@@ -240,185 +204,142 @@ general_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
  * Textured RGBA points.
  */
 static void
-textured_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+textured_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLuint i;
-
-   for (i = first; i <= last; i++) {
-      if (VB->ClipMask[i] == 0) {
-         GLint x0, x1, y0, y1;
-         GLint ix, iy, radius;
-         GLint red, green, blue, alpha;
-         GLfloat s, t, u;
-
-         GLint x = (GLint)  VB->Win.data[i][0];
-         GLint y = (GLint)  VB->Win.data[i][1];
-         GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-         GLint isize = (GLint) (ctx->Point.Size + 0.5F);
-
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-         if (isize < 1) {
-            isize = 1;
-         }
-         radius = isize >> 1;
-
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
 
-         red   = VB->ColorPtr->data[i][0];
-         green = VB->ColorPtr->data[i][1];
-         blue  = VB->ColorPtr->data[i][2];
-         alpha = VB->ColorPtr->data[i][3];
-
-        switch (VB->TexCoordPtr[0]->size) {
-        case 4:
-           s = VB->TexCoordPtr[0]->data[i][0]/VB->TexCoordPtr[0]->data[i][3];
-           t = VB->TexCoordPtr[0]->data[i][1]/VB->TexCoordPtr[0]->data[i][3];
-           u = VB->TexCoordPtr[0]->data[i][2]/VB->TexCoordPtr[0]->data[i][3];
-           break;
-        case 3:
-           s = VB->TexCoordPtr[0]->data[i][0];
-           t = VB->TexCoordPtr[0]->data[i][1];
-           u = VB->TexCoordPtr[0]->data[i][2];
-           break;
-        case 2:
-           s = VB->TexCoordPtr[0]->data[i][0];
-           t = VB->TexCoordPtr[0]->data[i][1];
-           u = 0.0;
-           break;
-        case 1:
-           s = VB->TexCoordPtr[0]->data[i][0];
-           t = 0.0;
-           u = 0.0;
-           break;
-         default:
-            /* should never get here */
-            s = t = u = 0.0;
-            gl_problem(ctx, "unexpected texcoord size in textured_rgba_points()");
-        }
+   GLint x0, x1, y0, y1;
+   GLint ix, iy, radius;
+   GLint red, green, blue, alpha;
+   GLfloat s, t, u;
 
-         for (iy = y0; iy <= y1; iy++) {
-            for (ix = x0; ix <= x1; ix++) {
-               PB_WRITE_TEX_PIXEL( PB, ix, iy, z, fog, red, green, blue, alpha,
-                                   s, t, u );
-            }
-         }
+   GLint x = (GLint)  vert->win[0];
+   GLint y = (GLint)  vert->win[1];
+   GLint z = (GLint) (vert->win[2]);
+   GLint isize = (GLint) (ctx->Point.Size + 0.5F);
+
+   GLfixed fog = FloatToFixed( vert->fog );
 
-         PB_CHECK_FLUSH(ctx, PB);
+   if (isize < 1) {
+      isize = 1;
+   }
+   radius = isize >> 1;
+
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
+
+   red   = vert->color[0];
+   green = vert->color[1];
+   blue  = vert->color[2];
+   alpha = vert->color[3];
+
+   if (vert->texcoord[0][3] != 1.0) {
+      s = vert->texcoord[0][0]/vert->texcoord[0][3];
+      t = vert->texcoord[0][1]/vert->texcoord[0][3];
+      u = vert->texcoord[0][2]/vert->texcoord[0][3];
+   } else {
+      s = vert->texcoord[0][0];
+      t = vert->texcoord[0][1];
+      u = vert->texcoord[0][2];
+   }
+
+   for (iy = y0; iy <= y1; iy++) {
+      for (ix = x0; ix <= x1; ix++) {
+        PB_WRITE_TEX_PIXEL( PB, ix, iy, z, fog, red, green, blue, alpha,
+                            s, t, u );
       }
    }
+
+   PB_CHECK_FLUSH(ctx, PB);
 }
 
 
+
 /*
  * Multitextured RGBA points.
  */
 static void
-multitextured_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+multitextured_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLuint i;
-
-   for (i = first; i <= last; i++) {
-      if (VB->ClipMask[i] == 0) {
-         const GLint red   = VB->ColorPtr->data[i][0];
-         const GLint green = VB->ColorPtr->data[i][1];
-         const GLint blue  = VB->ColorPtr->data[i][2];
-         const GLint alpha = VB->ColorPtr->data[i][3];
-        const GLint sRed   = VB->SecondaryColorPtr->data ? VB->SecondaryColorPtr->data[i][0] : 0;
-        const GLint sGreen = VB->SecondaryColorPtr->data ? VB->SecondaryColorPtr->data[i][1] : 0;
-        const GLint sBlue  = VB->SecondaryColorPtr->data ? VB->SecondaryColorPtr->data[i][2] : 0;
-         const GLint x = (GLint)  VB->Win.data[i][0];
-         const GLint y = (GLint)  VB->Win.data[i][1];
-         const GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-         GLint x0, x1, y0, y1;
-         GLint ix, iy;
-         GLfloat texcoord[MAX_TEXTURE_UNITS][4];
-         GLint radius, u;
-         GLint isize = (GLint) (ctx->Point.Size + 0.5F);
-
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-         if (isize < 1) {
-            isize = 1;
-         }
-         radius = isize >> 1;
-
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
+
+   const GLint red   = vert->color[0];
+   const GLint green = vert->color[1];
+   const GLint blue  = vert->color[2];
+   const GLint alpha = vert->color[3];
+   const GLint sRed   = vert->specular[0];
+   const GLint sGreen = vert->specular[1];
+   const GLint sBlue  = vert->specular[2];
+   const GLint x = (GLint)  vert->win[0];
+   const GLint y = (GLint)  vert->win[1];
+   const GLint z = (GLint) (vert->win[2]);
+   GLint x0, x1, y0, y1;
+   GLint ix, iy;
+   GLfloat texcoord[MAX_TEXTURE_UNITS][4];
+   GLint radius, u;
+   GLint isize = (GLint) (ctx->Point.Size + 0.5F);
 
-         for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-            if (ctx->Texture.Unit[u].ReallyEnabled) {
-               switch (VB->TexCoordPtr[0]->size) {
-               case 4:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0] /
-                                   VB->TexCoordPtr[u]->data[i][3];
-                  texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1] /
-                                   VB->TexCoordPtr[u]->data[i][3];
-                  texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2] /
-                                   VB->TexCoordPtr[u]->data[i][3];
-                  break;
-               case 3:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                  texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                  texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2];
-                  break;
-               case 2:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                  texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                  texcoord[u][2] = 0.0;
-                  break;
-               case 1:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                  texcoord[u][1] = 0.0;
-                  texcoord[u][2] = 0.0;
-                  break;
-               default:
-                  /* should never get here */
-                  gl_problem(ctx, "unexpected texcoord size");
-               }
-            }
-         }
+   GLfixed fog = FloatToFixed( vert->fog );
 
-         for (iy = y0; iy <= y1; iy++) {
-            for (ix = x0; ix <= x1; ix++) {
-               PB_WRITE_MULTITEX_SPEC_PIXEL( PB, ix, iy, z, fog,
-                                             red, green, blue, alpha,
-                                             sRed, sGreen, sBlue,
-                                             texcoord );
-            }
-         }
-         PB_CHECK_FLUSH(ctx, PB);
+   if (isize < 1) {
+      isize = 1;
+   }
+   radius = isize >> 1;
+
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
+
+   for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
+      if (ctx->Texture.Unit[u]._ReallyEnabled) {
+        if (vert->texcoord[u][3] != 1.0) {
+           texcoord[u][0] = vert->texcoord[u][0] /
+              vert->texcoord[u][3];
+           texcoord[u][1] = vert->texcoord[u][1] /
+              vert->texcoord[u][3];
+           texcoord[u][2] = vert->texcoord[u][2] /
+              vert->texcoord[u][3];
+        }
+        else {
+           texcoord[u][0] = vert->texcoord[u][0];
+           texcoord[u][1] = vert->texcoord[u][1];
+           texcoord[u][2] = vert->texcoord[u][2];
+        }
       }
    }
+
+   for (iy = y0; iy <= y1; iy++) {
+      for (ix = x0; ix <= x1; ix++) {
+        PB_WRITE_MULTITEX_SPEC_PIXEL( PB, ix, iy, z, fog,
+                                      red, green, blue, alpha,
+                                      sRed, sGreen, sBlue,
+                                      texcoord );
+      }
+   }
+   PB_CHECK_FLUSH(ctx, PB);
 }
 
 
@@ -439,214 +360,140 @@ multitextured_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
  * Antialiased points with or without texture mapping.
  */
 static void
-antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+antialiased_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    const GLfloat radius = ctx->Point.Size * 0.5F;
    const GLfloat rmin = radius - 0.7071F;  /* 0.7071 = sqrt(2)/2 */
    const GLfloat rmax = radius + 0.7071F;
    const GLfloat rmin2 = MAX2(0.0, rmin * rmin);
    const GLfloat rmax2 = rmax * rmax;
    const GLfloat cscale = 256.0F / (rmax2 - rmin2);
-   GLuint i;
-
-   if (ctx->Texture.ReallyEnabled) {
-      for (i = first; i <= last; i++) {
-         if (VB->ClipMask[i] == 0) {
-            GLint x, y;
-            GLfloat vx = VB->Win.data[i][0];
-            GLfloat vy = VB->Win.data[i][1];
-            const GLint xmin = (GLint) (vx - radius);
-            const GLint xmax = (GLint) (vx + radius);
-            const GLint ymin = (GLint) (vy - radius);
-            const GLint ymax = (GLint) (vy + radius);
-            const GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-            const GLint red   = VB->ColorPtr->data[i][0];
-            const GLint green = VB->ColorPtr->data[i][1];
-            const GLint blue  = VB->ColorPtr->data[i][2];
-            GLfloat texcoord[MAX_TEXTURE_UNITS][4];
-            GLint u, alpha;
-
-           GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-            for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-               if (ctx->Texture.Unit[u].ReallyEnabled) {
-                  switch (VB->TexCoordPtr[0]->size) {
-                  case 4:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0] /
-                                      VB->TexCoordPtr[u]->data[i][3];
-                     texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1] /
-                                      VB->TexCoordPtr[u]->data[i][3];
-                     texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2] /
-                                      VB->TexCoordPtr[u]->data[i][3];
-                     break;
-                  case 3:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                     texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                     texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2];
-                     break;
-                  case 2:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                     texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                     texcoord[u][2] = 0.0;
-                     break;
-                  case 1:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                     texcoord[u][1] = 0.0;
-                     texcoord[u][2] = 0.0;
-                     break;
-                  default:
-                     /* should never get here */
-                     gl_problem(ctx, "unexpected texcoord size in antialiased_rgba_points()");
-                  }
-               }
-            }
 
-            /* translate by a half pixel to simplify math below */
-            vx -= 0.5F;
-            vx -= 0.5F;
-
-            for (y = ymin; y <= ymax; y++) {
-               for (x = xmin; x <= xmax; x++) {
-                  const GLfloat dx = x - vx;
-                  const GLfloat dy = y - vy;
-                  const GLfloat dist2 = dx*dx + dy*dy;
-                  if (dist2 < rmax2) {
-                     alpha = VB->ColorPtr->data[i][3];
-                     if (dist2 >= rmin2) {
-                        GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
-                        /* coverage is in [0,256] */
-                        alpha = (alpha * coverage) >> 8;
-                     }
-                     if (ctx->Texture.MultiTextureEnabled) {
-                        PB_WRITE_MULTITEX_PIXEL( PB, x,y,z, fog,
-                                                red, green, blue, 
-                                                alpha, texcoord );
-                     }
-                     else {
-                        PB_WRITE_TEX_PIXEL( PB, x,y,z, fog,
-                                           red, green, blue, alpha,
-                                            texcoord[0][0],
-                                            texcoord[0][1],
-                                            texcoord[0][2] );
-                     }
-                  }
-               }
-            }
+   if (ctx->Texture._ReallyEnabled) {
+      GLint x, y;
+      GLfloat vx = vert->win[0];
+      GLfloat vy = vert->win[1];
+      const GLint xmin = (GLint) (vx - radius);
+      const GLint xmax = (GLint) (vx + radius);
+      const GLint ymin = (GLint) (vy - radius);
+      const GLint ymax = (GLint) (vy + radius);
+      const GLint z = (GLint) (vert->win[2]);
+      const GLint red   = vert->color[0];
+      const GLint green = vert->color[1];
+      const GLint blue  = vert->color[2];
+      GLfloat texcoord[MAX_TEXTURE_UNITS][4];
+      GLint u, alpha;
+
+      GLfixed fog = FloatToFixed( vert->fog );
+
+      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
+        if (ctx->Texture.Unit[u]._ReallyEnabled) {
+           if (texcoord[u][3] != 1.0) {
+              texcoord[u][0] = (vert->texcoord[u][0] /
+                                vert->texcoord[u][3]);
+              texcoord[u][1] = (vert->texcoord[u][1] /
+                                vert->texcoord[u][3]);
+              texcoord[u][2] = (vert->texcoord[u][2] /
+                                vert->texcoord[u][3]);
+           } 
+           else {
+              texcoord[u][0] = vert->texcoord[u][0];
+              texcoord[u][1] = vert->texcoord[u][1];
+              texcoord[u][2] = vert->texcoord[u][2];
+           }
+        }
+      }
 
-            PB_CHECK_FLUSH(ctx,PB);
-         }
+      /* translate by a half pixel to simplify math below */
+      vx -= 0.5F;
+      vx -= 0.5F;
+
+      for (y = ymin; y <= ymax; y++) {
+        for (x = xmin; x <= xmax; x++) {
+           const GLfloat dx = x - vx;
+           const GLfloat dy = y - vy;
+           const GLfloat dist2 = dx*dx + dy*dy;
+           if (dist2 < rmax2) {
+              alpha = vert->color[3];
+              if (dist2 >= rmin2) {
+                 GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
+                 /* coverage is in [0,256] */
+                 alpha = (alpha * coverage) >> 8;
+              }
+              if (ctx->Texture._MultiTextureEnabled) {
+                 PB_WRITE_MULTITEX_PIXEL( PB, x,y,z, fog,
+                                          red, green, blue, 
+                                          alpha, texcoord );
+              }
+              else {
+                 PB_WRITE_TEX_PIXEL( PB, x,y,z, fog,
+                                     red, green, blue, alpha,
+                                     texcoord[0][0],
+                                     texcoord[0][1],
+                                     texcoord[0][2] );
+              }
+           }
+        }
       }
+
+      PB_CHECK_FLUSH(ctx,PB);
    }
    else {
       /* Not texture mapped */
-      for (i=first;i<=last;i++) {
-         if (VB->ClipMask[i]==0) {
-            const GLint xmin = (GLint) (VB->Win.data[i][0] - 0.0 - radius);
-            const GLint xmax = (GLint) (VB->Win.data[i][0] - 0.0 + radius);
-            const GLint ymin = (GLint) (VB->Win.data[i][1] - 0.0 - radius);
-            const GLint ymax = (GLint) (VB->Win.data[i][1] - 0.0 + radius);
-            const GLint red   = VB->ColorPtr->data[i][0];
-            const GLint green = VB->ColorPtr->data[i][1];
-            const GLint blue  = VB->ColorPtr->data[i][2];
-            const GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-            GLint x, y;
-
-           GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-            /*
-            printf("point %g, %g\n", VB->Win.data[i][0], VB->Win.data[i][1]);
-            printf("%d..%d X %d..%d\n", xmin, xmax, ymin, ymax);
-            */
-            for (y = ymin; y <= ymax; y++) {
-               for (x = xmin; x <= xmax; x++) {
-                  const GLfloat dx = x + 0.5F - VB->Win.data[i][0];
-                  const GLfloat dy = y + 0.5F - VB->Win.data[i][1];
-                  const GLfloat dist2 = dx*dx + dy*dy;
-                  if (dist2 < rmax2) {
-                     GLint alpha = VB->ColorPtr->data[i][3];
-                     if (dist2 >= rmin2) {
-                        GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
-                        /* coverage is in [0,256] */
-                        alpha = (alpha * coverage) >> 8;
-                     }
-                     PB_WRITE_RGBA_PIXEL(PB, x, y, z, fog,
-                                        red, green, blue, alpha);
-                  }
-               }
-            }
-            PB_CHECK_FLUSH(ctx,PB);
+      const GLint xmin = (GLint) (vert->win[0] - 0.0 - radius);
+      const GLint xmax = (GLint) (vert->win[0] - 0.0 + radius);
+      const GLint ymin = (GLint) (vert->win[1] - 0.0 - radius);
+      const GLint ymax = (GLint) (vert->win[1] - 0.0 + radius);
+      const GLint red   = vert->color[0];
+      const GLint green = vert->color[1];
+      const GLint blue  = vert->color[2];
+      const GLint z = (GLint) (vert->win[2]);
+      GLint x, y;
+
+      GLfixed fog = FloatToFixed( vert->fog );
+
+      /*
+       printf("point %g, %g\n", vert->win[0], vert->win[1]);
+       printf("%d..%d X %d..%d\n", xmin, xmax, ymin, ymax);
+      */
+      for (y = ymin; y <= ymax; y++) {
+        for (x = xmin; x <= xmax; x++) {
+           const GLfloat dx = x + 0.5F - vert->win[0];
+           const GLfloat dy = y + 0.5F - vert->win[1];
+           const GLfloat dist2 = dx*dx + dy*dy;
+           if (dist2 < rmax2) {
+              GLint alpha = vert->color[3];
+              if (dist2 >= rmin2) {
+                 GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
+                 /* coverage is in [0,256] */
+                 alpha = (alpha * coverage) >> 8;
+              }
+              PB_WRITE_RGBA_PIXEL(PB, x, y, z, fog,
+                                  red, green, blue, alpha);
+           }
         }
       }
+      PB_CHECK_FLUSH(ctx,PB);
    }
 }
 
 
 
-/*
- * Null rasterizer for measuring transformation speed.
- */
-static void
-null_points( GLcontext *ctx, GLuint first, GLuint last )
-{
-   (void) ctx;
-   (void) first;
-   (void) last;
-}
-
-
-
 /* Definition of the functions for GL_EXT_point_parameters */
 
 /* Calculates the distance attenuation formula of a vector of points in
  * eye space coordinates 
  */
-static void
-dist3(GLfloat *out, GLuint first, GLuint last,
-      const GLcontext *ctx, const GLvector4f *v)
-{
-   GLuint stride = v->stride;
-   const GLfloat *p = VEC_ELT(v, GLfloat, first);
-   GLuint i;
-
-   for (i = first ; i <= last ; i++, STRIDE_F(p, stride) ) {
-      GLfloat dist = GL_SQRT(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]);
-      out[i] = 1.0F / (ctx->Point.Params[0] +
-                       dist * (ctx->Point.Params[1] +
-                               dist * ctx->Point.Params[2]));
-   }
-}
-
-
-static void
-dist2(GLfloat *out, GLuint first, GLuint last,
-      const GLcontext *ctx, const GLvector4f *v)
+static GLfloat attenuation_distance(const GLcontext *ctx, const GLfloat *pos)
 {
-   GLuint stride = v->stride;
-   const GLfloat *p = VEC_ELT(v, GLfloat, first);
-   GLuint i;
-
-   for (i = first ; i <= last ; i++, STRIDE_F(p, stride) ) {
-      GLfloat dist = GL_SQRT(p[0]*p[0]+p[1]*p[1]);
-      out[i] = 1.0F / (ctx->Point.Params[0] +
-                       dist * (ctx->Point.Params[1] +
-                               dist * ctx->Point.Params[2]));
-   }
+   GLfloat dist = GL_SQRT(pos[0]*pos[0]+pos[1]*pos[1]+pos[2]*pos[2]);
+   return 1.0F / (ctx->Point.Params[0] +
+                 dist * (ctx->Point.Params[1] +
+                         dist * ctx->Point.Params[2]));
 }
 
 
-typedef void (*dist_func)(GLfloat *out, GLuint first, GLuint last,
-                            const GLcontext *ctx, const GLvector4f *v);
-
-
-static dist_func eye_dist_tab[5] = {
-   0,
-   0,
-   dist2,
-   dist3,
-   dist3
-};
 
 
 
@@ -654,465 +501,389 @@ static dist_func eye_dist_tab[5] = {
  * Distance Attenuated General CI points.
  */
 static void
-dist_atten_general_ci_points( GLcontext *ctx, GLuint first, GLuint last )
+dist_atten_general_ci_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLfloat dist[VB_SIZE];
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    const GLfloat psize = ctx->Point.Size;
-   GLuint i;
-
-   ASSERT(ctx->NeedEyeCoords);
-   (eye_dist_tab[VB->EyePtr->size])( dist, first, last, ctx, VB->EyePtr );
-
-
-   for (i=first;i<=last;i++) {
-      if (VB->ClipMask[i]==0) {
-         GLint x0, x1, y0, y1;
-         GLint ix, iy;
-         GLint isize, radius;
-         GLint x = (GLint)  VB->Win.data[i][0];
-         GLint y = (GLint)  VB->Win.data[i][1];
-         GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-         GLfloat dsize = psize * dist[i];
-
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-         if (dsize >= ctx->Point.Threshold) {
-            isize = (GLint) (MIN2(dsize, ctx->Point.MaxSize) + 0.5F);
-         }
-         else {
-            isize = (GLint) (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) + 0.5F);
-         }
-         radius = isize >> 1;
-
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   GLfloat dist = attenuation_distance( ctx, vert->eye );
+   GLint x0, x1, y0, y1;
+   GLint ix, iy;
+   GLint isize, radius;
+   GLint x = (GLint)  vert->win[0];
+   GLint y = (GLint)  vert->win[1];
+   GLint z = (GLint) (vert->win[2]);
+   GLfloat dsize = psize * dist;
+
+   GLfixed fog = FloatToFixed( vert->fog );
+
+   if (dsize >= ctx->Point.Threshold) {
+      isize = (GLint) (MIN2(dsize, ctx->Point.MaxSize) + 0.5F);
+   }
+   else {
+      isize = (GLint) (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) + 0.5F);
+   }
+   radius = isize >> 1;
+
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
 
-         PB_SET_INDEX( PB, VB->IndexPtr->data[i] );
+   PB_SET_INDEX( PB, vert->index );
 
-         for (iy=y0;iy<=y1;iy++) {
-            for (ix=x0;ix<=x1;ix++) {
-               PB_WRITE_PIXEL( PB, ix, iy, z, fog );
-            }
-         }
-         PB_CHECK_FLUSH(ctx,PB);
+   for (iy=y0;iy<=y1;iy++) {
+      for (ix=x0;ix<=x1;ix++) {
+        PB_WRITE_PIXEL( PB, ix, iy, z, fog );
       }
    }
+   PB_CHECK_FLUSH(ctx,PB);
 }
 
 /*
  * Distance Attenuated General RGBA points.
  */
 static void
-dist_atten_general_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+dist_atten_general_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLfloat dist[VB_SIZE];
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    const GLfloat psize = ctx->Point.Size;
-   GLuint i;
-
-   ASSERT (ctx->NeedEyeCoords);
-   (eye_dist_tab[VB->EyePtr->size])( dist, first, last, ctx, VB->EyePtr );
-
-   for (i=first;i<=last;i++) {
-      if (VB->ClipMask[i]==0) {
-         GLint x0, x1, y0, y1;
-         GLint ix, iy;
-         GLint isize, radius;
-         GLint x = (GLint)  VB->Win.data[i][0];
-         GLint y = (GLint)  VB->Win.data[i][1];
-         GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-         GLfloat dsize=psize*dist[i];
-         GLchan alpha;
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-         if (dsize >= ctx->Point.Threshold) {
-            isize = (GLint) (MIN2(dsize,ctx->Point.MaxSize)+0.5F);
-            alpha = VB->ColorPtr->data[i][3];
-         }
-         else {
-            isize = (GLint) (MAX2(ctx->Point.Threshold,ctx->Point.MinSize)+0.5F);
-            dsize /= ctx->Point.Threshold;
-            alpha = (GLint) (VB->ColorPtr->data[i][3]* (dsize*dsize));
-         }
-         radius = isize >> 1;
-
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   GLfloat dist = attenuation_distance( ctx, vert->eye );
+   GLint x0, x1, y0, y1;
+   GLint ix, iy;
+   GLint isize, radius;
+   GLint x = (GLint)  vert->win[0];
+   GLint y = (GLint)  vert->win[1];
+   GLint z = (GLint) (vert->win[2]);
+   GLfloat dsize=psize*dist;
+   GLchan alpha;
+   GLfixed fog = FloatToFixed( vert->fog );
+
+   if (dsize >= ctx->Point.Threshold) {
+      isize = (GLint) (MIN2(dsize,ctx->Point.MaxSize)+0.5F);
+      alpha = vert->color[3];
+   }
+   else {
+      isize = (GLint) (MAX2(ctx->Point.Threshold,ctx->Point.MinSize)+0.5F);
+      dsize /= ctx->Point.Threshold;
+      alpha = (GLint) (vert->color[3]* (dsize*dsize));
+   }
+   radius = isize >> 1;
+
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
 
-         PB_SET_COLOR( PB,
-                       VB->ColorPtr->data[i][0],
-                       VB->ColorPtr->data[i][1],
-                       VB->ColorPtr->data[i][2],
-                       alpha );
+   PB_SET_COLOR( PB,
+                vert->color[0],
+                vert->color[1],
+                vert->color[2],
+                alpha );
 
-         for (iy = y0; iy <= y1; iy++) {
-            for (ix = x0; ix <= x1; ix++) {
-               PB_WRITE_PIXEL( PB, ix, iy, z, fog );
-            }
-         }
-         PB_CHECK_FLUSH(ctx,PB);
+   for (iy = y0; iy <= y1; iy++) {
+      for (ix = x0; ix <= x1; ix++) {
+        PB_WRITE_PIXEL( PB, ix, iy, z, fog );
       }
    }
+   PB_CHECK_FLUSH(ctx,PB);
 }
 
 /*
  *  Distance Attenuated Textured RGBA points.
  */
 static void
-dist_atten_textured_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+dist_atten_textured_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLfloat dist[VB_SIZE];
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    const GLfloat psize = ctx->Point.Size;
-   GLuint i;
-
-   ASSERT(ctx->NeedEyeCoords);
-   (eye_dist_tab[VB->EyePtr->size])( dist, first, last, ctx, VB->EyePtr );
-
-   for (i=first;i<=last;i++) {
-      if (VB->ClipMask[i]==0) {
-         const GLint x = (GLint)  VB->Win.data[i][0];
-         const GLint y = (GLint)  VB->Win.data[i][1];
-         const GLint z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-        const GLint red   = VB->ColorPtr->data[i][0];
-        const GLint green = VB->ColorPtr->data[i][1];
-        const GLint blue  = VB->ColorPtr->data[i][2];
-         GLfloat texcoord[MAX_TEXTURE_UNITS][4];
-         GLint x0, x1, y0, y1;
-         GLint ix, iy, alpha, u;
-         GLint isize, radius;
-         GLfloat dsize = psize*dist[i];
-
-        GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-         /* compute point size and alpha */
-         if (dsize >= ctx->Point.Threshold) {
-            isize = (GLint) (MIN2(dsize, ctx->Point.MaxSize) + 0.5F);
-            alpha = VB->ColorPtr->data[i][3];
-         }
-         else {
-            isize = (GLint) (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) + 0.5F);
-            dsize /= ctx->Point.Threshold;
-            alpha = (GLint) (VB->ColorPtr->data[i][3] * (dsize * dsize));
-         }
-         if (isize < 1) {
-            isize = 1;
-         }
-         radius = isize >> 1;
-
-         if (isize & 1) {
-            /* odd size */
-            x0 = x - radius;
-            x1 = x + radius;
-            y0 = y - radius;
-            y1 = y + radius;
-         }
-         else {
-            /* even size */
-            x0 = (GLint) (x + 1.5F) - radius;
-            x1 = x0 + isize - 1;
-            y0 = (GLint) (y + 1.5F) - radius;
-            y1 = y0 + isize - 1;
-         }
+   GLfloat dist = attenuation_distance( ctx, vert->eye );
+
+   const GLint x = (GLint)  vert->win[0];
+   const GLint y = (GLint)  vert->win[1];
+   const GLint z = (GLint) (vert->win[2]);
+   const GLint red   = vert->color[0];
+   const GLint green = vert->color[1];
+   const GLint blue  = vert->color[2];
+   GLfloat texcoord[MAX_TEXTURE_UNITS][4];
+   GLint x0, x1, y0, y1;
+   GLint ix, iy, alpha, u;
+   GLint isize, radius;
+   GLfloat dsize = psize*dist;
+
+   GLfixed fog = FloatToFixed( vert->fog );
+
+   /* compute point size and alpha */
+   if (dsize >= ctx->Point.Threshold) {
+      isize = (GLint) (MIN2(dsize, ctx->Point.MaxSize) + 0.5F);
+      alpha = vert->color[3];
+   }
+   else {
+      isize = (GLint) (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) + 0.5F);
+      dsize /= ctx->Point.Threshold;
+      alpha = (GLint) (vert->color[3] * (dsize * dsize));
+   }
+   if (isize < 1) {
+      isize = 1;
+   }
+   radius = isize >> 1;
+
+   if (isize & 1) {
+      /* odd size */
+      x0 = x - radius;
+      x1 = x + radius;
+      y0 = y - radius;
+      y1 = y + radius;
+   }
+   else {
+      /* even size */
+      x0 = (GLint) (x + 1.5F) - radius;
+      x1 = x0 + isize - 1;
+      y0 = (GLint) (y + 1.5F) - radius;
+      y1 = y0 + isize - 1;
+   }
 
-         /* get texture coordinates */
-         for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-            if (ctx->Texture.Unit[u].ReallyEnabled) {
-               switch (VB->TexCoordPtr[0]->size) {
-               case 4:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0] /
-                                   VB->TexCoordPtr[u]->data[i][3];
-                  texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1] /
-                                   VB->TexCoordPtr[u]->data[i][3];
-                  texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2] /
-                                   VB->TexCoordPtr[u]->data[i][3];
-                  break;
-               case 3:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                  texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                  texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2];
-                  break;
-               case 2:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                  texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                  texcoord[u][2] = 0.0;
-                  break;
-               case 1:
-                  texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                  texcoord[u][1] = 0.0;
-                  texcoord[u][2] = 0.0;
-                  break;
-               default:
-                  /* should never get here */
-                  gl_problem(ctx, "unexpected texcoord size");
-               }
-            }
-         }
+   /* get texture coordinates */
+   for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
+      if (ctx->Texture.Unit[u]._ReallyEnabled) {
+        if (texcoord[u][3] != 1.0) {
+           texcoord[u][0] = vert->texcoord[u][0] /
+              vert->texcoord[u][3];
+           texcoord[u][1] = vert->texcoord[u][1] /
+              vert->texcoord[u][3];
+           texcoord[u][2] = vert->texcoord[u][2] /
+              vert->texcoord[u][3];
+        } 
+        else {
+           texcoord[u][0] = vert->texcoord[u][0];
+           texcoord[u][1] = vert->texcoord[u][1];
+           texcoord[u][2] = vert->texcoord[u][2];
+        }
+      }
+   }
 
-         for (iy = y0; iy <= y1; iy++) {
-            for (ix = x0; ix <= x1; ix++) {
-               if (ctx->Texture.MultiTextureEnabled) {
-                  PB_WRITE_MULTITEX_PIXEL( PB, ix, iy, z, fog,
-                                           red, green, blue, alpha,
-                                           texcoord );
-               }
-               else {
-                  PB_WRITE_TEX_PIXEL( PB, ix, iy, z, fog,
-                                     red, green, blue, alpha,
-                                      texcoord[0][0],
-                                      texcoord[0][1],
-                                      texcoord[0][2] );
-               }
-            }
-         }
-         PB_CHECK_FLUSH(ctx,PB);
+   for (iy = y0; iy <= y1; iy++) {
+      for (ix = x0; ix <= x1; ix++) {
+        if (ctx->Texture._MultiTextureEnabled) {
+           PB_WRITE_MULTITEX_PIXEL( PB, ix, iy, z, fog,
+                                    red, green, blue, alpha,
+                                    texcoord );
+        }
+        else {
+           PB_WRITE_TEX_PIXEL( PB, ix, iy, z, fog,
+                               red, green, blue, alpha,
+                               texcoord[0][0],
+                               texcoord[0][1],
+                               texcoord[0][2] );
+        }
       }
    }
+   PB_CHECK_FLUSH(ctx,PB);
 }
 
 /*
  * Distance Attenuated Antialiased points with or without texture mapping.
  */
 static void
-dist_atten_antialiased_rgba_points( GLcontext *ctx, GLuint first, GLuint last )
+dist_atten_antialiased_rgba_point( GLcontext *ctx, SWvertex *vert )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   struct pixel_buffer *PB = ctx->PB;
-   GLfloat dist[VB_SIZE];
+   struct pixel_buffer *PB = SWRAST_CONTEXT(ctx)->PB;
    const GLfloat psize = ctx->Point.Size;
-   GLuint i;
-
-   ASSERT(ctx->NeedEyeCoords);
-   (eye_dist_tab[VB->EyePtr->size])( dist, first, last, ctx, VB->EyePtr );
-
-   if (ctx->Texture.ReallyEnabled) {
-      for (i=first;i<=last;i++) {
-         if (VB->ClipMask[i]==0) {
-            GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaf;
-            GLint xmin, ymin, xmax, ymax;
-            GLint x, y, z;
-            GLint red, green, blue, alpha;
-            GLfloat texcoord[MAX_TEXTURE_UNITS][4];
-            GLfloat dsize = psize * dist[i];
-            GLint u;
-
-           GLfixed fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-            if (dsize >= ctx->Point.Threshold) {
-               radius = MIN2(dsize, ctx->Point.MaxSize) * 0.5F;
-               alphaf = 1.0F;
-            }
-            else {
-               radius = (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) * 0.5F);
-               dsize /= ctx->Point.Threshold;
-               alphaf = (dsize*dsize);
-            }
-            rmin = radius - 0.7071F;  /* 0.7071 = sqrt(2)/2 */
-            rmax = radius + 0.7071F;
-            rmin2 = MAX2(0.0, rmin * rmin);
-            rmax2 = rmax * rmax;
-            cscale = 256.0F / (rmax2 - rmin2);
-
-            xmin = (GLint) (VB->Win.data[i][0] - radius);
-            xmax = (GLint) (VB->Win.data[i][0] + radius);
-            ymin = (GLint) (VB->Win.data[i][1] - radius);
-            ymax = (GLint) (VB->Win.data[i][1] + radius);
-            z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-
-           red   = VB->ColorPtr->data[i][0];
-           green = VB->ColorPtr->data[i][1];
-           blue  = VB->ColorPtr->data[i][2];
+   GLfloat dist = attenuation_distance( ctx, vert->eye );
+
+   if (ctx->Texture._ReallyEnabled) {
+      GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaf;
+      GLint xmin, ymin, xmax, ymax;
+      GLint x, y, z;
+      GLint red, green, blue, alpha;
+      GLfloat texcoord[MAX_TEXTURE_UNITS][4];
+      GLfloat dsize = psize * dist;
+      GLint u;
+
+      GLfixed fog = FloatToFixed( vert->fog );
+
+      if (dsize >= ctx->Point.Threshold) {
+        radius = MIN2(dsize, ctx->Point.MaxSize) * 0.5F;
+        alphaf = 1.0F;
+      }
+      else {
+        radius = (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) * 0.5F);
+        dsize /= ctx->Point.Threshold;
+        alphaf = (dsize*dsize);
+      }
+      rmin = radius - 0.7071F;  /* 0.7071 = sqrt(2)/2 */
+      rmax = radius + 0.7071F;
+      rmin2 = MAX2(0.0, rmin * rmin);
+      rmax2 = rmax * rmax;
+      cscale = 256.0F / (rmax2 - rmin2);
+
+      xmin = (GLint) (vert->win[0] - radius);
+      xmax = (GLint) (vert->win[0] + radius);
+      ymin = (GLint) (vert->win[1] - radius);
+      ymax = (GLint) (vert->win[1] + radius);
+      z = (GLint) (vert->win[2]);
+
+      red   = vert->color[0];
+      green = vert->color[1];
+      blue  = vert->color[2];
         
-            /* get texture coordinates */
-            for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-               if (ctx->Texture.Unit[u].ReallyEnabled) {
-                  switch (VB->TexCoordPtr[0]->size) {
-                  case 4:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0] /
-                                      VB->TexCoordPtr[u]->data[i][3];
-                     texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1] /
-                                      VB->TexCoordPtr[u]->data[i][3];
-                     texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2] /
-                                      VB->TexCoordPtr[u]->data[i][3];
-                     break;
-                  case 3:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                     texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                     texcoord[u][2] = VB->TexCoordPtr[u]->data[i][2];
-                     break;
-                  case 2:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                     texcoord[u][1] = VB->TexCoordPtr[u]->data[i][1];
-                     texcoord[u][2] = 0.0;
-                     break;
-                  case 1:
-                     texcoord[u][0] = VB->TexCoordPtr[u]->data[i][0];
-                     texcoord[u][1] = 0.0;
-                     texcoord[u][2] = 0.0;
-                     break;
-                  default:
-                     /* should never get here */
-                     gl_problem(ctx, "unexpected texcoord size");
-                  }
-               }
-            }
+      /* get texture coordinates */
+      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
+        if (ctx->Texture.Unit[u]._ReallyEnabled) {
+           if (vert->texcoord[u][3] != 1.0 && vert->texcoord[u][3] != 0.0) {
+              texcoord[u][0] = vert->texcoord[u][0] / vert->texcoord[u][3];
+              texcoord[u][1] = vert->texcoord[u][1] / vert->texcoord[u][3];
+              texcoord[u][2] = vert->texcoord[u][2] / vert->texcoord[u][3];
+           } 
+           else {
+              texcoord[u][0] = vert->texcoord[u][0];
+              texcoord[u][1] = vert->texcoord[u][1];
+              texcoord[u][2] = vert->texcoord[u][2];
+           }
+        }
+      }
 
-            for (y = ymin; y <= ymax; y++) {
-               for (x = xmin; x <= xmax; x++) {
-                  const GLfloat dx = x + 0.5F - VB->Win.data[i][0];
-                  const GLfloat dy = y + 0.5F - VB->Win.data[i][1];
-                  const GLfloat dist2 = dx*dx + dy*dy;
-                  if (dist2 < rmax2) {
-                     alpha = VB->ColorPtr->data[i][3];
-                     if (dist2 >= rmin2) {
-                        GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
-                        /* coverage is in [0,256] */
-                        alpha = (alpha * coverage) >> 8;
-                     }
-                     alpha = (GLint) (alpha * alphaf);
-                     if (ctx->Texture.MultiTextureEnabled) {
-                        PB_WRITE_MULTITEX_PIXEL( PB, x, y, z, fog,
-                                                 red, green, blue, alpha,
-                                                 texcoord );
-                     }
-                     else {
-                        PB_WRITE_TEX_PIXEL( PB, x,y,z, fog,
-                                           red, green, blue, alpha,
-                                            texcoord[0][0],
-                                            texcoord[0][1],
-                                            texcoord[0][2] );
-                     }
-                  }
-               }
-            }
-            PB_CHECK_FLUSH(ctx,PB);
-         }
+      for (y = ymin; y <= ymax; y++) {
+        for (x = xmin; x <= xmax; x++) {
+           const GLfloat dx = x + 0.5F - vert->win[0];
+           const GLfloat dy = y + 0.5F - vert->win[1];
+           const GLfloat dist2 = dx*dx + dy*dy;
+           if (dist2 < rmax2) {
+              alpha = vert->color[3];
+              if (dist2 >= rmin2) {
+                 GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
+                 /* coverage is in [0,256] */
+                 alpha = (alpha * coverage) >> 8;
+              }
+              alpha = (GLint) (alpha * alphaf);
+              if (ctx->Texture._MultiTextureEnabled) {
+                 PB_WRITE_MULTITEX_PIXEL( PB, x, y, z, fog,
+                                          red, green, blue, alpha,
+                                          texcoord );
+              }
+              else {
+                 PB_WRITE_TEX_PIXEL( PB, x,y,z, fog,
+                                     red, green, blue, alpha,
+                                     texcoord[0][0],
+                                     texcoord[0][1],
+                                     texcoord[0][2] );
+              }
+           }
+        }
       }
+      PB_CHECK_FLUSH(ctx,PB);
    }
    else {
       /* Not texture mapped */
-      for (i = first; i <= last; i++) {
-         if (VB->ClipMask[i] == 0) {
-            GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaf;
-            GLint xmin, ymin, xmax, ymax;
-            GLint x, y, z;
-           GLfixed fog;
-            GLint red, green, blue, alpha;
-            GLfloat dsize = psize * dist[i];
-
-            if (dsize >= ctx->Point.Threshold) {
-               radius = MIN2(dsize, ctx->Point.MaxSize) * 0.5F;
-               alphaf = 1.0F;
-            }
-            else {
-               radius = (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) * 0.5F);
-               dsize /= ctx->Point.Threshold;
-               alphaf = dsize * dsize;
-            }
-            rmin = radius - 0.7071F;  /* 0.7071 = sqrt(2)/2 */
-            rmax = radius + 0.7071F;
-            rmin2 = MAX2(0.0, rmin * rmin);
-            rmax2 = rmax * rmax;
-            cscale = 256.0F / (rmax2 - rmin2);
-
-            xmin = (GLint) (VB->Win.data[i][0] - radius);
-            xmax = (GLint) (VB->Win.data[i][0] + radius);
-            ymin = (GLint) (VB->Win.data[i][1] - radius);
-            ymax = (GLint) (VB->Win.data[i][1] + radius);
-            z = (GLint) (VB->Win.data[i][2] + ctx->PointZoffset);
-
-           fog = FloatToFixed( VB->FogCoordPtr->data[i] );
-
-            red   = VB->ColorPtr->data[i][0];
-            green = VB->ColorPtr->data[i][1];
-            blue  = VB->ColorPtr->data[i][2];
-
-            for (y = ymin; y <= ymax; y++) {
-               for (x = xmin; x <= xmax; x++) {
-                  const GLfloat dx = x + 0.5F - VB->Win.data[i][0];
-                  const GLfloat dy = y + 0.5F - VB->Win.data[i][1];
-                  const GLfloat dist2 = dx * dx + dy * dy;
-                  if (dist2 < rmax2) {
-                    alpha = VB->ColorPtr->data[i][3];
-                     if (dist2 >= rmin2) {
-                        GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
-                        /* coverage is in [0,256] */
-                        alpha = (alpha * coverage) >> 8;
-                     }
-                     alpha = (GLint) (alpha * alphaf);
-                     PB_WRITE_RGBA_PIXEL(PB, x, y, z, fog, 
-                                        red, green, blue, alpha);
-                  }
-               }
-            }
-            PB_CHECK_FLUSH(ctx,PB);
+      GLfloat radius, rmin, rmax, rmin2, rmax2, cscale, alphaf;
+      GLint xmin, ymin, xmax, ymax;
+      GLint x, y, z;
+      GLfixed fog;
+      GLint red, green, blue, alpha;
+      GLfloat dsize = psize * dist;
+
+      if (dsize >= ctx->Point.Threshold) {
+        radius = MIN2(dsize, ctx->Point.MaxSize) * 0.5F;
+        alphaf = 1.0F;
+      }
+      else {
+        radius = (MAX2(ctx->Point.Threshold, ctx->Point.MinSize) * 0.5F);
+        dsize /= ctx->Point.Threshold;
+        alphaf = dsize * dsize;
+      }
+      rmin = radius - 0.7071F;  /* 0.7071 = sqrt(2)/2 */
+      rmax = radius + 0.7071F;
+      rmin2 = MAX2(0.0, rmin * rmin);
+      rmax2 = rmax * rmax;
+      cscale = 256.0F / (rmax2 - rmin2);
+
+      xmin = (GLint) (vert->win[0] - radius);
+      xmax = (GLint) (vert->win[0] + radius);
+      ymin = (GLint) (vert->win[1] - radius);
+      ymax = (GLint) (vert->win[1] + radius);
+      z = (GLint) (vert->win[2]);
+
+      fog = FloatToFixed( vert->fog );
+
+      red   = vert->color[0];
+      green = vert->color[1];
+      blue  = vert->color[2];
+
+      for (y = ymin; y <= ymax; y++) {
+        for (x = xmin; x <= xmax; x++) {
+           const GLfloat dx = x + 0.5F - vert->win[0];
+           const GLfloat dy = y + 0.5F - vert->win[1];
+           const GLfloat dist2 = dx * dx + dy * dy;
+           if (dist2 < rmax2) {
+              alpha = vert->color[3];
+              if (dist2 >= rmin2) {
+                 GLint coverage = (GLint) (256.0F - (dist2 - rmin2) * cscale);
+                 /* coverage is in [0,256] */
+                 alpha = (alpha * coverage) >> 8;
+              }
+              alpha = (GLint) (alpha * alphaf);
+              PB_WRITE_RGBA_PIXEL(PB, x, y, z, fog, 
+                                  red, green, blue, alpha);
+           }
         }
       }
+      PB_CHECK_FLUSH(ctx,PB);
    }
 }
 
 
 #ifdef DEBUG
 void
-_mesa_print_points_function(GLcontext *ctx)
+_mesa_print_point_function(GLcontext *ctx)
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
    printf("Point Func == ");
-   if (ctx->Driver.PointsFunc == size1_ci_points)
-      printf("size1_ci_points\n");
-   else if (ctx->Driver.PointsFunc == size1_rgba_points)
-      printf("size1_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == general_ci_points)
-      printf("general_ci_points\n");
-   else if (ctx->Driver.PointsFunc == general_rgba_points)
-      printf("general_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == textured_rgba_points)
-      printf("textured_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == multitextured_rgba_points)
-      printf("multitextured_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == antialiased_rgba_points)
-      printf("antialiased_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == null_points)
-      printf("null_points\n");
-   else if (ctx->Driver.PointsFunc == dist_atten_general_ci_points)
-      printf("dist_atten_general_ci_points\n");
-   else if (ctx->Driver.PointsFunc == dist_atten_general_rgba_points)
-      printf("dist_atten_general_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == dist_atten_textured_rgba_points)
-      printf("dist_atten_textured_rgba_points\n");
-   else if (ctx->Driver.PointsFunc == dist_atten_antialiased_rgba_points)
-      printf("dist_atten_antialiased_rgba_points\n");
-   else if (!ctx->Driver.PointsFunc)
+   if (swrast->Point == size1_ci_point)
+      printf("size1_ci_point\n");
+   else if (swrast->Point == size1_rgba_point)
+      printf("size1_rgba_point\n");
+   else if (swrast->Point == general_ci_point)
+      printf("general_ci_point\n");
+   else if (swrast->Point == general_rgba_point)
+      printf("general_rgba_point\n");
+   else if (swrast->Point == textured_rgba_point)
+      printf("textured_rgba_point\n");
+   else if (swrast->Point == multitextured_rgba_point)
+      printf("multitextured_rgba_point\n");
+   else if (swrast->Point == antialiased_rgba_point)
+      printf("antialiased_rgba_point\n");
+   else if (swrast->Point == dist_atten_general_ci_point)
+      printf("dist_atten_general_ci_point\n");
+   else if (swrast->Point == dist_atten_general_rgba_point)
+      printf("dist_atten_general_rgba_point\n");
+   else if (swrast->Point == dist_atten_textured_rgba_point)
+      printf("dist_atten_textured_rgba_point\n");
+   else if (swrast->Point == dist_atten_antialiased_rgba_point)
+      printf("dist_atten_antialiased_rgba_point\n");
+   else if (!swrast->Point)
       printf("NULL\n");
    else
-      printf("Driver func %p\n", ctx->Driver.PointsFunc);
+      printf("Driver func %p\n", swrast->Point);
 }
 #endif
 
@@ -1122,70 +893,61 @@ _mesa_print_points_function(GLcontext *ctx)
  * should be used.
  */
 void 
-_swrast_set_point_function( GLcontext *ctx )
+_swrast_choose_point( GLcontext *ctx )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLboolean rgbmode = ctx->Visual.RGBAflag;
 
    if (ctx->RenderMode==GL_RENDER) {
-      if (ctx->NoRaster) {
-         ctx->Driver.PointsFunc = null_points;
-         return;
-      }
-      if (ctx->Driver.PointsFunc) {
-         /* Device driver will draw points. */
-        ctx->IndirectTriangles &= ~DD_POINT_SW_RASTERIZE;
-        return;
-      }
-
-      if (!ctx->Point.Attenuated) {
+      if (!ctx->Point._Attenuated) {
          if (ctx->Point.SmoothFlag && rgbmode) {
-            ctx->Driver.PointsFunc = antialiased_rgba_points;
+            swrast->Point = antialiased_rgba_point;
          }
-         else if (ctx->Texture.ReallyEnabled) {
-            if (ctx->Texture.MultiTextureEnabled ||
+         else if (ctx->Texture._ReallyEnabled) {
+            if (ctx->Texture._MultiTextureEnabled ||
                 ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR ||
                ctx->Fog.ColorSumEnabled) {
-              ctx->Driver.PointsFunc = multitextured_rgba_points;
+              swrast->Point = multitextured_rgba_point;
             }
             else {
-               ctx->Driver.PointsFunc = textured_rgba_points;
+               swrast->Point = textured_rgba_point;
             }
          }
          else if (ctx->Point.Size==1.0) {
             /* size=1, any raster ops */
             if (rgbmode)
-               ctx->Driver.PointsFunc = size1_rgba_points;
+               swrast->Point = size1_rgba_point;
             else
-               ctx->Driver.PointsFunc = size1_ci_points;
+               swrast->Point = size1_ci_point;
          }
          else {
            /* every other kind of point rendering */
             if (rgbmode)
-               ctx->Driver.PointsFunc = general_rgba_points;
+               swrast->Point = general_rgba_point;
             else
-               ctx->Driver.PointsFunc = general_ci_points;
+               swrast->Point = general_ci_point;
          }
       } 
       else if(ctx->Point.SmoothFlag && rgbmode) {
-         ctx->Driver.PointsFunc = dist_atten_antialiased_rgba_points;
+         swrast->Point = dist_atten_antialiased_rgba_point;
       }
-      else if (ctx->Texture.ReallyEnabled) {
-         ctx->Driver.PointsFunc = dist_atten_textured_rgba_points;
+      else if (ctx->Texture._ReallyEnabled) {
+         swrast->Point = dist_atten_textured_rgba_point;
       } 
       else {
          /* every other kind of point rendering */
          if (rgbmode)
-            ctx->Driver.PointsFunc = dist_atten_general_rgba_points;
+            swrast->Point = dist_atten_general_rgba_point;
          else
-            ctx->Driver.PointsFunc = dist_atten_general_ci_points;
+            swrast->Point = dist_atten_general_ci_point;
      }
    }
    else if (ctx->RenderMode==GL_FEEDBACK) {
-      ctx->Driver.PointsFunc = gl_feedback_points;
+      swrast->Point = gl_feedback_point;
    }
    else {
       /* GL_SELECT mode */
-      ctx->Driver.PointsFunc = gl_select_points;
+      swrast->Point = gl_select_point;
    }
 
    /*_mesa_print_points_function(ctx);*/
diff --git a/src/mesa/swrast/s_points.h b/src/mesa/swrast/s_points.h
new file mode 100644 (file)
index 0000000..1c1af1a
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef S_POINTS_H
+#define S_POINTS_H
+
+#include "types.h"
+
+void 
+_swrast_choose_point( GLcontext *ctx );
+
+
+#endif
index 74a4d6826616d69b2013f233d25fbfe34e6bc0f3..ba3aca53927d55a789d3cc32ad2b01f781e164c2 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_readpix.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_readpix.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -36,6 +36,7 @@
 #include "pixel.h"
 
 #include "s_alphabuf.h"
+#include "s_context.h"
 #include "s_depth.h"
 #include "s_span.h"
 #include "s_stencil.h"
@@ -497,7 +498,7 @@ read_fast_rgba_pixels( GLcontext *ctx,
                        const struct gl_pixelstore_attrib *packing )
 {
    /* can't do scale, bias, mapping, etc */
-   if (ctx->ImageTransferState)
+   if (ctx->_ImageTransferState)
        return GL_FALSE;
 
    /* can't do fancy pixel packing */
@@ -636,7 +637,7 @@ static void read_rgba_pixels( GLcontext *ctx,
    }
 
    if (ctx->Pixel.Convolution2DEnabled || ctx->Pixel.Separable2DEnabled) {
-      const GLuint transferOps = ctx->ImageTransferState;
+      const GLuint transferOps = ctx->_ImageTransferState;
       GLfloat *dest, *src, *tmpImage, *convImage;
       GLint row;
 
@@ -717,7 +718,7 @@ static void read_rgba_pixels( GLcontext *ctx,
                                    format, type, 0, row, 0);
          _mesa_pack_rgba_span(ctx, readWidth, (const GLchan (*)[4]) rgba,
                               format, type, dst, packing,
-                              ctx->ImageTransferState);
+                              ctx->_ImageTransferState);
       }
    }
 
@@ -735,6 +736,9 @@ _swrast_ReadPixels( GLcontext *ctx,
 {
    (void) pack;
 
+   if (SWRAST_CONTEXT(ctx)->NewState)
+      _swrast_validate_derived( ctx );
+
    switch (format) {
       case GL_COLOR_INDEX:
          read_index_pixels(ctx, x, y, width, height, type, pixels, &ctx->Pack);
index ca02802ceb72876977168fe5753f9d68d9b42153..a115199ab8236c14b4e45eecc86eca6fa8f46f68 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_span.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_span.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -39,6 +39,7 @@
 #include "s_alpha.h"
 #include "s_alphabuf.h"
 #include "s_blend.h"
+#include "s_context.h"
 #include "s_depth.h"
 #include "s_fog.h"
 #include "s_logic.h"
@@ -182,18 +183,19 @@ void gl_write_index_span( GLcontext *ctx,
    GLubyte mask[MAX_WIDTH];
    GLuint indexBackup[MAX_WIDTH];
    GLuint *index;  /* points to indexIn or indexBackup */
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* init mask to 1's (all pixels are to be written) */
    MEMSET(mask, 1, n);
 
-   if ((ctx->RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
       if (clip_span(ctx,n,x,y,mask)==0) {
         return;
       }
    }
 
-   if ((primitive==GL_BITMAP && (ctx->RasterMask & modBits))
-       || (ctx->RasterMask & MULTI_DRAW_BIT)) {
+   if ((primitive==GL_BITMAP && (swrast->_RasterMask & modBits))
+       || (swrast->_RasterMask & MULTI_DRAW_BIT)) {
       /* Make copy of color indexes */
       MEMCPY( indexBackup, indexIn, n * sizeof(GLuint) );
       index = indexBackup;
@@ -236,7 +238,7 @@ void gl_write_index_span( GLcontext *ctx,
    /* if we get here, something passed the depth test */
    ctx->OcclusionResult = GL_TRUE;
 
-   if (ctx->RasterMask & MULTI_DRAW_BIT) {
+   if (swrast->_RasterMask & MULTI_DRAW_BIT) {
       /* draw to zero or two or more buffers */
       multi_write_index_span( ctx, n, x, y, index, mask );
    }
@@ -267,13 +269,14 @@ void gl_write_monoindex_span( GLcontext *ctx,
                              const GLfixed fog[],
                              GLuint index, GLenum primitive )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    GLubyte mask[MAX_WIDTH];
    GLuint i;
 
    /* init mask to 1's (all pixels are to be written) */
    MEMSET(mask, 1, n);
 
-   if ((ctx->RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
       if (clip_span( ctx, n, x, y, mask)==0) {
         return;
       }
@@ -330,7 +333,7 @@ void gl_write_monoindex_span( GLcontext *ctx,
         _mesa_logicop_ci_span( ctx, n, x, y, indexes, mask );
       }
 
-      if (ctx->RasterMask & MULTI_DRAW_BIT) {
+      if (swrast->_RasterMask & MULTI_DRAW_BIT) {
          /* draw to zero or two or more buffers */
          multi_write_index_span( ctx, n, x, y, indexes, mask );
       }
@@ -352,7 +355,7 @@ void gl_write_monoindex_span( GLcontext *ctx,
       /* same color index for all pixels */
       ASSERT(!ctx->Color.IndexLogicOpEnabled);
       ASSERT(ctx->Color.IndexMask == 0xffffffff);
-      if (ctx->RasterMask & MULTI_DRAW_BIT) {
+      if (swrast->_RasterMask & MULTI_DRAW_BIT) {
          /* draw to zero or two or more buffers */
          GLuint indexes[MAX_WIDTH];
          for (i=0;i<n;i++)
@@ -377,6 +380,7 @@ static void multi_write_rgba_span( GLcontext *ctx, GLuint n,
 {
    const GLuint colorMask = *((GLuint *) ctx->Color.ColorMask);
    GLuint bufferBit;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    if (ctx->Color.DrawBuffer == GL_NONE)
       return;
@@ -422,7 +426,7 @@ static void multi_write_rgba_span( GLcontext *ctx, GLuint n,
 
          (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, 
                                       (const GLchan (*)[4]) rgbaTmp, mask );
-         if (ctx->RasterMask & ALPHABUF_BIT) {
+         if (swrast->_RasterMask & ALPHABUF_BIT) {
             _mesa_write_alpha_span( ctx, n, x, y, 
                                     (const GLchan (*)[4])rgbaTmp, mask );
          }
@@ -448,19 +452,20 @@ void gl_write_rgba_span( GLcontext *ctx,
    GLchan rgbaBackup[MAX_WIDTH][4];
    GLchan (*rgba)[4];
    const GLubyte *Null = 0;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* init mask to 1's (all pixels are to be written) */
    MEMSET(mask, 1, n);
 
-   if ((ctx->RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
       if (clip_span( ctx,n,x,y,mask)==0) {
         return;
       }
       write_all = GL_FALSE;
    }
 
-   if ((primitive==GL_BITMAP && (ctx->RasterMask & modBits))
-       || (ctx->RasterMask & MULTI_DRAW_BIT)) {
+   if ((primitive==GL_BITMAP && (swrast->_RasterMask & modBits))
+       || (swrast->_RasterMask & MULTI_DRAW_BIT)) {
       /* must make a copy of the colors since they may be modified */
       MEMCPY( rgbaBackup, rgbaIn, 4 * n * sizeof(GLchan) );
       rgba = rgbaBackup;
@@ -520,7 +525,7 @@ void gl_write_rgba_span( GLcontext *ctx,
    /* if we get here, something passed the depth test */
    ctx->OcclusionResult = GL_TRUE;
 
-   if (ctx->RasterMask & MULTI_DRAW_BIT) {
+   if (swrast->_RasterMask & MULTI_DRAW_BIT) {
       multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask );
    }
    else {
@@ -548,7 +553,7 @@ void gl_write_rgba_span( GLcontext *ctx,
                                    (const GLchan (*)[4]) rgba, 
                                    write_all ? Null : mask );
 
-      if (ctx->RasterMask & ALPHABUF_BIT) {
+      if (swrast->_RasterMask & ALPHABUF_BIT) {
          _mesa_write_alpha_span( ctx, n, x, y, 
                                  (const GLchan (*)[4]) rgba, 
                                  write_all ? Null : mask );
@@ -581,11 +586,12 @@ void gl_write_monocolor_span( GLcontext *ctx,
    GLboolean write_all = GL_TRUE;
    GLchan rgba[MAX_WIDTH][4];
    const GLubyte *Null = 0;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* init mask to 1's (all pixels are to be written) */
    MEMSET(mask, 1, n);
 
-   if ((ctx->RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
       if (clip_span( ctx,n,x,y,mask)==0) {
         return;
       }
@@ -644,7 +650,7 @@ void gl_write_monocolor_span( GLcontext *ctx,
    }
 
    if (ctx->Color.ColorLogicOpEnabled || colorMask != 0xffffffff ||
-       (ctx->RasterMask & (BLEND_BIT | FOG_BIT))) {
+       (swrast->_RasterMask & (BLEND_BIT | FOG_BIT))) {
       /* assign same color to each pixel */
       for (i=0;i<n;i++) {
         if (mask[i]) {
@@ -660,7 +666,7 @@ void gl_write_monocolor_span( GLcontext *ctx,
            _mesa_depth_fog_rgba_pixels( ctx, n, z, rgba );
       }
 
-      if (ctx->RasterMask & MULTI_DRAW_BIT) {
+      if (swrast->_RasterMask & MULTI_DRAW_BIT) {
          multi_write_rgba_span( ctx, n, x, y,
                                 (const GLchan (*)[4]) rgba, mask );
       }
@@ -685,7 +691,7 @@ void gl_write_monocolor_span( GLcontext *ctx,
          (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, 
                                       (const GLchan (*)[4]) rgba, 
                                       write_all ? Null : mask );
-         if (ctx->RasterMask & ALPHABUF_BIT) {
+         if (swrast->_RasterMask & ALPHABUF_BIT) {
             _mesa_write_alpha_span( ctx, n, x, y, 
                                     (const GLchan (*)[4]) rgba, 
                                     write_all ? Null : mask );
@@ -697,7 +703,7 @@ void gl_write_monocolor_span( GLcontext *ctx,
       ASSERT(!ctx->Color.BlendEnabled);
       ASSERT(!ctx->Color.ColorLogicOpEnabled);
 
-      if (ctx->RasterMask & MULTI_DRAW_BIT) {
+      if (swrast->_RasterMask & MULTI_DRAW_BIT) {
          for (i=0;i<n;i++) {
             if (mask[i]) {
                COPY_CHAN4(rgba[i], color);
@@ -708,7 +714,7 @@ void gl_write_monocolor_span( GLcontext *ctx,
       }
       else {
          (*ctx->Driver.WriteMonoRGBASpan)( ctx, n, x, y, mask );
-         if (ctx->RasterMask & ALPHABUF_BIT) {
+         if (swrast->_RasterMask & ALPHABUF_BIT) {
             _mesa_write_mono_alpha_span( ctx, n, x, y, (GLchan) color[ACOMP],
                                          write_all ? Null : mask );
          }
@@ -763,11 +769,12 @@ void gl_write_texture_span( GLcontext *ctx,
    GLchan rgbaBackup[MAX_WIDTH][4];
    GLchan (*rgba)[4];   /* points to either rgbaIn or rgbaBackup */
    const GLubyte *Null = 0;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* init mask to 1's (all pixels are to be written) */
    MEMSET(mask, 1, n);
 
-   if ((ctx->RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
       if (clip_span(ctx, n, x, y, mask)==0) {
         return;
       }
@@ -775,7 +782,7 @@ void gl_write_texture_span( GLcontext *ctx,
    }
 
 
-   if (primitive==GL_BITMAP || (ctx->RasterMask & MULTI_DRAW_BIT)) {
+   if (primitive==GL_BITMAP || (swrast->_RasterMask & MULTI_DRAW_BIT)) {
       /* must make a copy of the colors since they may be modified */
       MEMCPY(rgbaBackup, rgbaIn, 4 * n * sizeof(GLchan));
       rgba = rgbaBackup;
@@ -785,7 +792,7 @@ void gl_write_texture_span( GLcontext *ctx,
    }
 
    /* Texture */
-   ASSERT(ctx->Texture.ReallyEnabled);
+   ASSERT(ctx->Texture._ReallyEnabled);
    gl_texture_pixels( ctx, 0, n, s, t, u, lambda, rgba, rgba );
 
    /* Add base and specular colors */
@@ -844,7 +851,7 @@ void gl_write_texture_span( GLcontext *ctx,
    /* if we get here, something passed the depth test */
    ctx->OcclusionResult = GL_TRUE;
 
-   if (ctx->RasterMask & MULTI_DRAW_BIT) {
+   if (swrast->_RasterMask & MULTI_DRAW_BIT) {
       multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask );
    }
    else {
@@ -864,7 +871,7 @@ void gl_write_texture_span( GLcontext *ctx,
 
       (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, (const GLchan (*)[4])rgba,
                                    write_all ? Null : mask );
-      if (ctx->RasterMask & ALPHABUF_BIT) {
+      if (swrast->_RasterMask & ALPHABUF_BIT) {
          _mesa_write_alpha_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, 
                                  write_all ? Null : mask );
       }
@@ -896,11 +903,12 @@ gl_write_multitexture_span( GLcontext *ctx,
    GLuint i;
    const GLubyte *Null = 0;
    const GLuint texUnits = ctx->Const.MaxTextureUnits;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* init mask to 1's (all pixels are to be written) */
    MEMSET(mask, 1, n);
 
-   if ((ctx->RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
+   if ((swrast->_RasterMask & WINCLIP_BIT) || primitive==GL_BITMAP) {
       if (clip_span(ctx, n, x, y, mask)==0) {
         return;
       }
@@ -908,7 +916,7 @@ gl_write_multitexture_span( GLcontext *ctx,
    }
 
 
-   if (primitive==GL_BITMAP || (ctx->RasterMask & MULTI_DRAW_BIT)
+   if (primitive==GL_BITMAP || (swrast->_RasterMask & MULTI_DRAW_BIT)
                             || texUnits > 1) {
       /* must make a copy of the colors since they may be modified */
       MEMCPY(rgbaBackup, rgbaIn, 4 * n * sizeof(GLchan));
@@ -919,7 +927,7 @@ gl_write_multitexture_span( GLcontext *ctx,
    }
 
    /* Texture */
-   ASSERT(ctx->Texture.ReallyEnabled);
+   ASSERT(ctx->Texture._ReallyEnabled);
    for (i = 0; i < texUnits; i++)
       gl_texture_pixels( ctx, i, n, s[i], t[i], u[i], lambda[i], rgbaIn, rgba );
 
@@ -979,7 +987,7 @@ gl_write_multitexture_span( GLcontext *ctx,
    /* if we get here, something passed the depth test */
    ctx->OcclusionResult = GL_TRUE;
 
-   if (ctx->RasterMask & MULTI_DRAW_BIT) {
+   if (swrast->_RasterMask & MULTI_DRAW_BIT) {
       multi_write_rgba_span( ctx, n, x, y, (const GLchan (*)[4]) rgba, mask );
    }
    else {
@@ -1001,7 +1009,7 @@ gl_write_multitexture_span( GLcontext *ctx,
       }
 
       (*ctx->Driver.WriteRGBASpan)( ctx, n, x, y, (const GLchan (*)[4])rgba, write_all ? Null : mask );
-      if (ctx->RasterMask & ALPHABUF_BIT) {
+      if (swrast->_RasterMask & ALPHABUF_BIT) {
          _mesa_write_alpha_span( ctx, n, x, y, (const GLchan (*)[4])rgba,
                                  write_all ? Null : mask );
       }
index c957a683a16bc2695b71070fb364bf988fc26ed8..80839451cba28a5bd70b8a14a0a61a522a78151e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_stencil.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_stencil.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -30,6 +30,7 @@
 #include "macros.h"
 #include "mem.h"
 
+#include "s_context.h"
 #include "s_depth.h"
 #include "s_pb.h"
 #include "s_stencil.h"
index 04f8645b97fc81dca6f0712871c22e6b95940a39..e2fa4214922afad17dd2a4f2de9b209fc8ced393 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_texture.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_texture.c,v 1.2 2000/11/05 18:24:40 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -33,6 +33,7 @@
 #include "mem.h"
 #include "teximage.h"
 
+#include "s_context.h"
 #include "s_pb.h"
 #include "s_texture.h"
 
@@ -174,8 +175,8 @@ static void palette_sample(const struct gl_texture_object *tObj,
 {                                                              \
    if (lambda < 0.0F)                                          \
       lambda = 0.0F;                                           \
-   else if (lambda > tObj->M)                                  \
-      lambda = tObj->M;                                                \
+   else if (lambda > tObj->_M)                                 \
+      lambda = tObj->_M;                                       \
    level = (GLint) (tObj->BaseLevel + lambda);                 \
 }
 
@@ -187,11 +188,11 @@ static void palette_sample(const struct gl_texture_object *tObj,
 {                                                              \
    if (lambda <= 0.5F)                                         \
       lambda = 0.0F;                                           \
-   else if (lambda > tObj->M + 0.4999F)                                \
-      lambda = tObj->M + 0.4999F;                              \
+   else if (lambda > tObj->_M + 0.4999F)                       \
+      lambda = tObj->_M + 0.4999F;                             \
    level = (GLint) (tObj->BaseLevel + lambda + 0.5F);          \
-   if (level > tObj->P)                                                \
-      level = tObj->P;                                         \
+   if (level > tObj->_P)                                       \
+      level = tObj->_P;                                                \
 }
 
 
@@ -432,8 +433,8 @@ sample_1d_nearest_mipmap_linear( const struct gl_texture_object *tObj,
 
    COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level);
 
-   if (level >= tObj->P) {
-      sample_1d_nearest( tObj, tObj->Image[tObj->P], s, rgba );
+   if (level >= tObj->_P) {
+      sample_1d_nearest( tObj, tObj->Image[tObj->_P], s, rgba );
    }
    else {
       GLchan t0[4], t1[4];
@@ -458,8 +459,8 @@ sample_1d_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
    COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level);
 
-   if (level >= tObj->P) {
-      sample_1d_linear( tObj, tObj->Image[tObj->P], s, rgba );
+   if (level >= tObj->_P) {
+      sample_1d_linear( tObj, tObj->Image[tObj->_P], s, rgba );
    }
    else {
       GLchan t0[4], t1[4];
@@ -475,7 +476,8 @@ sample_1d_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
 
 
-static void sample_nearest_1d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_nearest_1d( GLcontext *ctx, GLuint texUnit,
+                              const struct gl_texture_object *tObj, GLuint n,
                                const GLfloat s[], const GLfloat t[],
                                const GLfloat u[], const GLfloat lambda[],
                                GLchan rgba[][4] )
@@ -492,7 +494,8 @@ static void sample_nearest_1d( const struct gl_texture_object *tObj, GLuint n,
 
 
 
-static void sample_linear_1d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_linear_1d( GLcontext *ctx, GLuint texUnit,
+                             const struct gl_texture_object *tObj, GLuint n,
                               const GLfloat s[], const GLfloat t[],
                               const GLfloat u[], const GLfloat lambda[],
                               GLchan rgba[][4] )
@@ -513,18 +516,20 @@ static void sample_linear_1d( const struct gl_texture_object *tObj, GLuint n,
  * return a texture sample.
  *
  */
-static void sample_lambda_1d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_lambda_1d( GLcontext *ctx, GLuint texUnit,
+                             const struct gl_texture_object *tObj, GLuint n,
                               const GLfloat s[], const GLfloat t[],
                               const GLfloat u[], const GLfloat lambda[],
                               GLchan rgba[][4] )
 {
+   GLfloat MinMagThresh = SWRAST_CONTEXT(ctx)->_MinMagThresh[texUnit];
    GLuint i;
 
    (void) t;
    (void) u;
 
    for (i=0;i<n;i++) {
-      if (lambda[i] > tObj->MinMagThresh) {
+      if (lambda[i] > MinMagThresh) {
          /* minification */
          switch (tObj->MinFilter) {
             case GL_NEAREST:
@@ -806,8 +811,8 @@ sample_2d_nearest_mipmap_linear( const struct gl_texture_object *tObj,
 
    COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level);
 
-   if (level >= tObj->P) {
-      sample_2d_nearest( tObj, tObj->Image[tObj->P], s, t, rgba );
+   if (level >= tObj->_P) {
+      sample_2d_nearest( tObj, tObj->Image[tObj->_P], s, t, rgba );
    }
    else {
       GLchan t0[4], t1[4];  /* texels */
@@ -832,8 +837,8 @@ sample_2d_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
    COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level);
 
-   if (level >= tObj->P) {
-      sample_2d_linear( tObj, tObj->Image[tObj->P], s, t, rgba );
+   if (level >= tObj->_P) {
+      sample_2d_linear( tObj, tObj->Image[tObj->_P], s, t, rgba );
    }
    else {
       GLchan t0[4], t1[4];  /* texels */
@@ -849,7 +854,8 @@ sample_2d_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
 
 
-static void sample_nearest_2d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_nearest_2d( GLcontext *ctx, GLuint texUnit,
+                              const struct gl_texture_object *tObj, GLuint n,
                                const GLfloat s[], const GLfloat t[],
                                const GLfloat u[], const GLfloat lambda[],
                                GLchan rgba[][4] )
@@ -865,7 +871,8 @@ static void sample_nearest_2d( const struct gl_texture_object *tObj, GLuint n,
 
 
 
-static void sample_linear_2d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_linear_2d( GLcontext *ctx, GLuint texUnit,
+                             const struct gl_texture_object *tObj, GLuint n,
                               const GLfloat s[], const GLfloat t[],
                               const GLfloat u[], const GLfloat lambda[],
                               GLchan rgba[][4] )
@@ -884,16 +891,18 @@ static void sample_linear_2d( const struct gl_texture_object *tObj, GLuint n,
  * Given an (s,t) texture coordinate and lambda (level of detail) value,
  * return a texture sample.
  */
-static void sample_lambda_2d( const struct gl_texture_object *tObj,
+static void sample_lambda_2d( GLcontext *ctx, GLuint texUnit,
+                             const struct gl_texture_object *tObj,
                               GLuint n,
                               const GLfloat s[], const GLfloat t[],
                               const GLfloat u[], const GLfloat lambda[],
                               GLchan rgba[][4] )
 {
+   GLfloat MinMagThresh = SWRAST_CONTEXT(ctx)->_MinMagThresh[texUnit];
    GLuint i;
    (void) u;
    for (i=0;i<n;i++) {
-      if (lambda[i] > tObj->MinMagThresh) {
+      if (lambda[i] > MinMagThresh) {
          /* minification */
          switch (tObj->MinFilter) {
             case GL_NEAREST:
@@ -943,7 +952,8 @@ static void sample_lambda_2d( const struct gl_texture_object *tObj,
  *    No border
  *    Format = GL_RGB
  */
-static void opt_sample_rgb_2d( const struct gl_texture_object *tObj,
+static void opt_sample_rgb_2d( GLcontext *ctx, GLuint texUnit,
+                              const struct gl_texture_object *tObj,
                                GLuint n, const GLfloat s[], const GLfloat t[],
                                const GLfloat u[], const GLfloat lambda[],
                                GLchan rgba[][4] )
@@ -984,7 +994,8 @@ static void opt_sample_rgb_2d( const struct gl_texture_object *tObj,
  *    No border
  *    Format = GL_RGBA
  */
-static void opt_sample_rgba_2d( const struct gl_texture_object *tObj,
+static void opt_sample_rgba_2d( GLcontext *ctx, GLuint texUnit,
+                               const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat s[], const GLfloat t[],
                                 const GLfloat u[], const GLfloat lambda[],
                                 GLchan rgba[][4] )
@@ -1303,8 +1314,8 @@ sample_3d_nearest_mipmap_linear( const struct gl_texture_object *tObj,
 
    COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level);
 
-   if (level >= tObj->P) {
-      sample_3d_nearest( tObj, tObj->Image[tObj->P], s, t, r, rgba );
+   if (level >= tObj->_P) {
+      sample_3d_nearest( tObj, tObj->Image[tObj->_P], s, t, r, rgba );
    }
    else {
       GLchan t0[4], t1[4];  /* texels */
@@ -1328,8 +1339,8 @@ sample_3d_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
    COMPUTE_LINEAR_MIPMAP_LEVEL(tObj, lambda, level);
 
-   if (level >= tObj->P) {
-      sample_3d_linear( tObj, tObj->Image[tObj->P], s, t, r, rgba );
+   if (level >= tObj->_P) {
+      sample_3d_linear( tObj, tObj->Image[tObj->_P], s, t, r, rgba );
    }
    else {
       GLchan t0[4], t1[4];  /* texels */
@@ -1344,7 +1355,8 @@ sample_3d_linear_mipmap_linear( const struct gl_texture_object *tObj,
 }
 
 
-static void sample_nearest_3d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_nearest_3d( GLcontext *ctx, GLuint texUnit,
+                              const struct gl_texture_object *tObj, GLuint n,
                                const GLfloat s[], const GLfloat t[],
                                const GLfloat u[], const GLfloat lambda[],
                                GLchan rgba[][4] )
@@ -1359,7 +1371,8 @@ static void sample_nearest_3d( const struct gl_texture_object *tObj, GLuint n,
 
 
 
-static void sample_linear_3d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_linear_3d( GLcontext *ctx, GLuint texUnit,
+                             const struct gl_texture_object *tObj, GLuint n,
                               const GLfloat s[], const GLfloat t[],
                               const GLfloat u[], const GLfloat lambda[],
                               GLchan rgba[][4] )
@@ -1377,16 +1390,18 @@ static void sample_linear_3d( const struct gl_texture_object *tObj, GLuint n,
  * Given an (s,t,r) texture coordinate and lambda (level of detail) value,
  * return a texture sample.
  */
-static void sample_lambda_3d( const struct gl_texture_object *tObj, GLuint n,
+static void sample_lambda_3d( GLcontext *ctx, GLuint texUnit,
+                             const struct gl_texture_object *tObj, GLuint n,
                               const GLfloat s[], const GLfloat t[],
                               const GLfloat u[], const GLfloat lambda[],
                               GLchan rgba[][4] )
 {
    GLuint i;
+   GLfloat MinMagThresh = SWRAST_CONTEXT(ctx)->_MinMagThresh[texUnit];
 
    for (i=0;i<n;i++) {
 
-      if (lambda[i] > tObj->MinMagThresh) {
+      if (lambda[i] > MinMagThresh) {
          /* minification */
          switch (tObj->MinFilter) {
             case GL_NEAREST:
@@ -1507,7 +1522,8 @@ choose_cube_face(const struct gl_texture_object *texObj,
 
 
 static void
-sample_nearest_cube(const struct gl_texture_object *tObj, GLuint n,
+sample_nearest_cube(GLcontext *ctx, GLuint texUnit,
+                   const struct gl_texture_object *tObj, GLuint n,
                     const GLfloat s[], const GLfloat t[],
                     const GLfloat u[], const GLfloat lambda[],
                     GLchan rgba[][4])
@@ -1524,7 +1540,8 @@ sample_nearest_cube(const struct gl_texture_object *tObj, GLuint n,
 
 
 static void
-sample_linear_cube(const struct gl_texture_object *tObj, GLuint n,
+sample_linear_cube(GLcontext *ctx, GLuint texUnit,
+                  const struct gl_texture_object *tObj, GLuint n,
                    const GLfloat s[], const GLfloat t[],
                    const GLfloat u[], const GLfloat lambda[],
                    GLchan rgba[][4])
@@ -1585,8 +1602,8 @@ sample_cube_nearest_mipmap_linear( const struct gl_texture_object *tObj,
 
    images = choose_cube_face(tObj, s, t, u, &newS, &newT);
 
-   if (level >= tObj->P) {
-      sample_2d_nearest( tObj, images[tObj->P], newS, newT, rgba );
+   if (level >= tObj->_P) {
+      sample_2d_nearest( tObj, images[tObj->_P], newS, newT, rgba );
    }
    else {
       GLchan t0[4], t1[4];  /* texels */
@@ -1614,8 +1631,8 @@ sample_cube_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
    images = choose_cube_face(tObj, s, t, u, &newS, &newT);
 
-   if (level >= tObj->P) {
-      sample_2d_linear( tObj, images[tObj->P], newS, newT, rgba );
+   if (level >= tObj->_P) {
+      sample_2d_linear( tObj, images[tObj->_P], newS, newT, rgba );
    }
    else {
       GLchan t0[4], t1[4];
@@ -1631,15 +1648,17 @@ sample_cube_linear_mipmap_linear( const struct gl_texture_object *tObj,
 
 
 static void
-sample_lambda_cube(const struct gl_texture_object *tObj, GLuint n,
-                   const GLfloat s[], const GLfloat t[],
-                   const GLfloat u[], const GLfloat lambda[],
-                   GLchan rgba[][4])
+sample_lambda_cube( GLcontext *ctx, GLuint texUnit,
+                   const struct gl_texture_object *tObj, GLuint n,
+                   const GLfloat s[], const GLfloat t[],
+                   const GLfloat u[], const GLfloat lambda[],
+                   GLchan rgba[][4])
 {
+   GLfloat MinMagThresh = SWRAST_CONTEXT(ctx)->_MinMagThresh[texUnit];
    GLuint i;
 
    for (i = 0; i < n; i++) {
-      if (lambda[i] > tObj->MinMagThresh) {
+      if (lambda[i] > MinMagThresh) {
          /* minification */
          switch (tObj->MinFilter) {
             case GL_NEAREST:
@@ -1704,6 +1723,14 @@ sample_lambda_cube(const struct gl_texture_object *tObj, GLuint n,
    }
 }
 
+static void
+null_sample_func( GLcontext *ctx, GLuint texUnit,
+                 const struct gl_texture_object *tObj, GLuint n,
+                 const GLfloat s[], const GLfloat t[],
+                 const GLfloat u[], const GLfloat lambda[],
+                 GLchan rgba[][4])
+{
+}
 
 /**********************************************************************/
 /*                       Texture Sampling Setup                       */
@@ -1714,10 +1741,13 @@ sample_lambda_cube(const struct gl_texture_object *tObj, GLuint n,
  * Setup the texture sampling function for this texture object.
  */
 void
-_swrast_set_texture_sampler( struct gl_texture_object *t )
+_swrast_choose_texture_sample_func( GLcontext *ctx, GLuint texUnit,
+                                   const struct gl_texture_object *t )
 {
-   if (!t->Complete) {
-      t->SampleFunc = NULL;
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
+
+  if (!t->Complete) {
+     swrast->TextureSample[texUnit] = null_sample_func;
    }
    else {
       GLboolean needLambda = (GLboolean) (t->MinFilter != t->MagFilter);
@@ -1727,69 +1757,69 @@ _swrast_set_texture_sampler( struct gl_texture_object *t )
          if (t->MagFilter==GL_LINEAR
              && (t->MinFilter==GL_NEAREST_MIPMAP_NEAREST ||
                  t->MinFilter==GL_LINEAR_MIPMAP_NEAREST)) {
-            t->MinMagThresh = 0.5F;
+            swrast->_MinMagThresh[texUnit] = 0.5F;
          }
          else {
-            t->MinMagThresh = 0.0F;
+            swrast->_MinMagThresh[texUnit] = 0.0F;
          }
       }
 
       switch (t->Dimensions) {
          case 1:
             if (needLambda) {
-               t->SampleFunc = sample_lambda_1d;
+               swrast->TextureSample[texUnit] = sample_lambda_1d;
             }
             else if (t->MinFilter==GL_LINEAR) {
-               t->SampleFunc = sample_linear_1d;
+               swrast->TextureSample[texUnit] = sample_linear_1d;
             }
             else {
                ASSERT(t->MinFilter==GL_NEAREST);
-               t->SampleFunc = sample_nearest_1d;
+               swrast->TextureSample[texUnit] = sample_nearest_1d;
             }
             break;
          case 2:
             if (needLambda) {
-               t->SampleFunc = sample_lambda_2d;
+               swrast->TextureSample[texUnit] = sample_lambda_2d;
             }
             else if (t->MinFilter==GL_LINEAR) {
-               t->SampleFunc = sample_linear_2d;
+               swrast->TextureSample[texUnit] = sample_linear_2d;
             }
             else {
                ASSERT(t->MinFilter==GL_NEAREST);
                if (t->WrapS==GL_REPEAT && t->WrapT==GL_REPEAT
                    && t->Image[0]->Border==0 && t->Image[0]->Format==GL_RGB) {
-                  t->SampleFunc = opt_sample_rgb_2d;
+                  swrast->TextureSample[texUnit] = opt_sample_rgb_2d;
                }
                else if (t->WrapS==GL_REPEAT && t->WrapT==GL_REPEAT
                    && t->Image[0]->Border==0 && t->Image[0]->Format==GL_RGBA) {
-                  t->SampleFunc = opt_sample_rgba_2d;
+                  swrast->TextureSample[texUnit] = opt_sample_rgba_2d;
                }
                else
-                  t->SampleFunc = sample_nearest_2d;
+                  swrast->TextureSample[texUnit] = sample_nearest_2d;
             }
             break;
          case 3:
             if (needLambda) {
-               t->SampleFunc = sample_lambda_3d;
+               swrast->TextureSample[texUnit] = sample_lambda_3d;
             }
             else if (t->MinFilter==GL_LINEAR) {
-               t->SampleFunc = sample_linear_3d;
+               swrast->TextureSample[texUnit] = sample_linear_3d;
             }
             else {
                ASSERT(t->MinFilter==GL_NEAREST);
-               t->SampleFunc = sample_nearest_3d;
+               swrast->TextureSample[texUnit] = sample_nearest_3d;
             }
             break;
          case 6: /* cube map */
             if (needLambda) {
-               t->SampleFunc = sample_lambda_cube;
+               swrast->TextureSample[texUnit] = sample_lambda_cube;
             }
             else if (t->MinFilter==GL_LINEAR) {
-               t->SampleFunc = sample_linear_cube;
+               swrast->TextureSample[texUnit] = sample_linear_cube;
             }
             else {
                ASSERT(t->MinFilter==GL_NEAREST);
-               t->SampleFunc = sample_nearest_cube;
+               swrast->TextureSample[texUnit] = sample_nearest_cube;
             }
             break;
          default:
@@ -2116,12 +2146,12 @@ apply_texture( const GLcontext *ctx,
    GLenum format;
 
    ASSERT(texUnit);
-   ASSERT(texUnit->Current);
+   ASSERT(texUnit->_Current);
 
-   baseLevel = texUnit->Current->BaseLevel;
-   ASSERT(texUnit->Current->Image[baseLevel]);
+   baseLevel = texUnit->_Current->BaseLevel;
+   ASSERT(texUnit->_Current->Image[baseLevel]);
 
-   format = texUnit->Current->Image[baseLevel]->Format;
+   format = texUnit->_Current->Image[baseLevel]->Format;
 
    if (format==GL_COLOR_INDEX) {
       format = GL_RGBA;  /* XXXX a hack! */
@@ -2496,10 +2526,10 @@ void gl_texture_pixels( GLcontext *ctx, GLuint texUnit, GLuint n,
 {
    const GLuint mask = TEXTURE0_ANY << (texUnit * 4);
 
-   if (ctx->Texture.ReallyEnabled & mask) {
+   if (ctx->Texture._ReallyEnabled & mask) {
       const struct gl_texture_unit *textureUnit = &ctx->Texture.Unit[texUnit];
 
-      if (textureUnit->Current && textureUnit->Current->SampleFunc) {
+      if (textureUnit->_Current) {
          GLchan texel[PB_SIZE][4];
 
         if (textureUnit->LodBias != 0.0F) {
@@ -2510,11 +2540,11 @@ void gl_texture_pixels( GLcontext *ctx, GLuint texUnit, GLuint n,
            }
         }
 
-         if (textureUnit->Current->MinLod != -1000.0
-             || textureUnit->Current->MaxLod != 1000.0) {
+         if (textureUnit->_Current->MinLod != -1000.0
+             || textureUnit->_Current->MaxLod != 1000.0) {
             /* apply LOD clamping to lambda */
-            GLfloat min = textureUnit->Current->MinLod;
-            GLfloat max = textureUnit->Current->MaxLod;
+            GLfloat min = textureUnit->_Current->MinLod;
+            GLfloat max = textureUnit->_Current->MaxLod;
             GLuint i;
             for (i=0;i<n;i++) {
                GLfloat l = lambda[i];
@@ -2524,14 +2554,16 @@ void gl_texture_pixels( GLcontext *ctx, GLuint texUnit, GLuint n,
 
          /* fetch texture images from device driver, if needed */
          if (ctx->Driver.GetTexImage) {
-            if (!_mesa_get_teximages_from_driver(ctx, textureUnit->Current)) {
+            if (!_mesa_get_teximages_from_driver(ctx, textureUnit->_Current)) {
                return;
             }
          }
 
          /* Sample the texture. */
-         (*textureUnit->Current->SampleFunc)( textureUnit->Current, n,
-                                             s, t, r, lambda, texel );
+         SWRAST_CONTEXT(ctx)->TextureSample[texUnit]( ctx, texUnit,
+                                                     textureUnit->_Current, 
+                                                     n, s, t, r, 
+                                                     lambda, texel );
 
          apply_texture( ctx, textureUnit, n, primary_rgba, texel, rgba );
       }
index 8bb5662333c02d508bf1de81cfbd90bcf267a72e..f22f08a1e617a663d0b3752a37eadabded99aafd 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_texture.h,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_texture.h,v 1.2 2000/11/05 18:24:41 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -41,6 +41,10 @@ extern void gl_texture_pixels( GLcontext *ctx, GLuint texSet, GLuint n,
                                const GLfloat r[], GLfloat lambda[],
                                GLchan primary_rgba[][4], GLchan rgba[][4] );
 
+extern void
+_swrast_choose_texture_sample_func( GLcontext *ctx,
+                                   GLuint texUnit,
+                                   const struct gl_texture_object *tObj );
 
 #endif
 
index 4b00d8aff9a785f8325b6a43686fbf6968a3d6f7..267a0f2c8e50e20901c527898c615dfe7b70a210 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_triangle.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_triangle.c,v 1.2 2000/11/05 18:24:41 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -34,7 +34,6 @@
 
 #include "glheader.h"
 #include "context.h"
-#include "feedback.h"
 #include "macros.h"
 #include "mem.h"
 #include "mmath.h"
 #include "texstate.h"
 
 #include "s_aatriangle.h"
+#include "s_context.h"
 #include "s_depth.h"
+#include "s_feedback.h"
 #include "s_span.h"
-
-static GLboolean cull_triangle( GLcontext *ctx,
-                           GLuint v0, GLuint v1, GLuint v2, GLuint pv )
+#include "s_triangle.h"
+GLboolean gl_cull_triangle( GLcontext *ctx,
+                           SWvertex *v0, 
+                           SWvertex *v1, 
+                           SWvertex *v2 )
 {
-   struct vertex_buffer *VB = ctx->VB;
-   GLfloat (*win)[4] = VB->Win.data;
-   GLfloat ex = win[v1][0] - win[v0][0];
-   GLfloat ey = win[v1][1] - win[v0][1];
-   GLfloat fx = win[v2][0] - win[v0][0];
-   GLfloat fy = win[v2][1] - win[v0][1];
+   GLfloat ex = v1->win[0] - v0->win[0];
+   GLfloat ey = v1->win[1] - v0->win[1];
+   GLfloat fx = v2->win[0] - v0->win[0];
+   GLfloat fy = v2->win[1] - v0->win[1];
    GLfloat c = ex*fy-ey*fx;
 
-   if (c * ctx->backface_sign > 0)
+   if (c * ctx->_backface_sign > 0)
       return 0;
    
    return 1;
@@ -67,11 +69,13 @@ static GLboolean cull_triangle( GLcontext *ctx,
  * Render a flat-shaded color index triangle.
  */
 static void flat_ci_triangle( GLcontext *ctx,
-                              GLuint v0, GLuint v1, GLuint v2, GLuint pv )
+                             SWvertex *v0, 
+                             SWvertex *v1, 
+                             SWvertex *v2 )
 {
 #define INTERP_Z 1
 #define SETUP_CODE                             \
-   GLuint index = VB->IndexPtr->data[pv];      \
+   GLuint index = v0->index;   \
    if (1) {                                    \
       /* set the color index */                        \
       (*ctx->Driver.Index)( ctx, index );      \
@@ -104,9 +108,10 @@ static void flat_ci_triangle( GLcontext *ctx,
  * Render a smooth-shaded color index triangle.
  */
 static void smooth_ci_triangle( GLcontext *ctx,
-                                GLuint v0, GLuint v1, GLuint v2, GLuint pv )
+                               SWvertex *v0, 
+                               SWvertex *v1, 
+                               SWvertex *v2 )
 {
-   (void) pv;
 #define INTERP_Z 1
 #define INTERP_INDEX 1
 
@@ -140,7 +145,9 @@ static void smooth_ci_triangle( GLcontext *ctx,
  * Render a flat-shaded RGBA triangle.
  */
 static void flat_rgba_triangle( GLcontext *ctx,
-                                GLuint v0, GLuint v1, GLuint v2, GLuint pv )
+                               SWvertex *v0,
+                               SWvertex *v1,
+                               SWvertex *v2 )
 {
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
@@ -148,10 +155,10 @@ static void flat_rgba_triangle( GLcontext *ctx,
 #define SETUP_CODE                             \
    if (1) {                                    \
       /* set the color */                      \
-      GLchan r = VB->ColorPtr->data[pv][0];    \
-      GLchan g = VB->ColorPtr->data[pv][1];    \
-      GLchan b = VB->ColorPtr->data[pv][2];    \
-      GLchan a = VB->ColorPtr->data[pv][3];    \
+      GLchan r = v0->color[0]; \
+      GLchan g = v0->color[1]; \
+      GLchan b = v0->color[2]; \
+      GLchan a = v0->color[3]; \
       (*ctx->Driver.Color)( ctx, r, g, b, a ); \
    }
 
@@ -170,14 +177,14 @@ static void flat_rgba_triangle( GLcontext *ctx,
              }                                                 \
               gl_write_monocolor_span( ctx, n, LEFT, Y, zspan, \
                                        fogspan, \
-                                       VB->ColorPtr->data[pv], \
+                                       v0->color,      \
                                       GL_POLYGON );            \
           }                                                    \
        }
 
 #include "s_tritemp.h"
 
-   ASSERT(!ctx->Texture.ReallyEnabled);  /* texturing must be off */
+   ASSERT(!ctx->Texture._ReallyEnabled);  /* texturing must be off */
    ASSERT(ctx->Light.ShadeModel==GL_FLAT);
 }
 
@@ -187,9 +194,11 @@ static void flat_rgba_triangle( GLcontext *ctx,
  * Render a smooth-shaded RGBA triangle.
  */
 static void smooth_rgba_triangle( GLcontext *ctx,
-                                  GLuint v0, GLuint v1, GLuint v2, GLuint pv )
+                                 SWvertex *v0,
+                                 SWvertex *v1,
+                                 SWvertex *v2 )
 {
-   (void) pv;
+
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
 #define INTERP_RGB 1
@@ -226,7 +235,7 @@ static void smooth_rgba_triangle( GLcontext *ctx,
 
 #include "s_tritemp.h"
 
-   ASSERT(!ctx->Texture.ReallyEnabled);  /* texturing must be off */
+   ASSERT(!ctx->Texture._ReallyEnabled);  /* texturing must be off */
    ASSERT(ctx->Light.ShadeModel==GL_SMOOTH);
 }
 
@@ -237,8 +246,10 @@ static void smooth_rgba_triangle( GLcontext *ctx,
  *
  * No fog.
  */
-static void simple_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                      GLuint v2, GLuint pv )
+static void simple_textured_triangle( GLcontext *ctx,
+                                     SWvertex *v0,
+                                     SWvertex *v1,
+                                     SWvertex *v2 )
 {
 #define INTERP_INT_TEX 1
 #define S_SCALE twidth
@@ -252,7 +263,6 @@ static void simple_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
    GLchan *texture = obj->Image[b]->Data;                              \
    GLint smask = obj->Image[b]->Width - 1;                             \
    GLint tmask = obj->Image[b]->Height - 1;                            \
-   (void) pv;                                                          \
    if (!texture) {                                                     \
       if (!_mesa_get_teximages_from_driver(ctx, obj))                  \
          return;                                                       \
@@ -295,8 +305,10 @@ static void simple_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
  * 
  * No fog.
  */
-static void simple_z_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                        GLuint v2, GLuint pv )
+static void simple_z_textured_triangle( GLcontext *ctx,
+                                       SWvertex *v0,
+                                       SWvertex *v1,
+                                       SWvertex *v2 )
 {
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
@@ -312,7 +324,6 @@ static void simple_z_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
    GLchan *texture = obj->Image[b]->Data;                              \
    GLint smask = obj->Image[b]->Width - 1;                             \
    GLint tmask = obj->Image[b]->Height - 1;                            \
-   (void) pv;                                                          \
    if (!texture) {                                                     \
       if (!_mesa_get_teximages_from_driver(ctx, obj))                  \
          return;                                                       \
@@ -363,8 +374,10 @@ static void simple_z_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
 /*
  * Render an RGB/RGBA textured triangle without perspective correction.
  */
-static void affine_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                     GLuint v2, GLuint pv )
+static void affine_textured_triangle( GLcontext *ctx,
+                                     SWvertex *v0,
+                                     SWvertex *v1,
+                                     SWvertex *v2 )
 {
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
@@ -423,7 +436,7 @@ static void affine_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
    }                                                                    \
    tbytesline = obj->Image[b]->Width * comp;                            \
    tsize = theight * tbytesline;
-   (void) pv;
+
 
   /* Instead of defining a function for each mode, a test is done 
    * between the outer and inner loops. This is to reduce code size
@@ -683,8 +696,10 @@ static void affine_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
  * This function written by Klaus Niederkrueger <klaus@math.leidenuniv.nl>
  * Send all questions and bug reports to him.
  */
-static void near_persp_textured_triangle(GLcontext *ctx, GLuint v0, GLuint v1,
-                                        GLuint v2, GLuint pv )
+static void near_persp_textured_triangle(GLcontext *ctx,
+                                        SWvertex *v0,
+                                        SWvertex *v1,
+                                        SWvertex *v2 )
 {
 /* The BIAS value is used to shift negative values into positive values.
  * Without this, negative texture values don't GL_REPEAT correctly at just
@@ -712,7 +727,6 @@ static void near_persp_textured_triangle(GLcontext *ctx, GLuint v0, GLuint v1,
    const GLint format = obj->Image[b]->Format;                          \
    const GLint envmode = unit->EnvMode;                                 \
    GLfloat sscale, tscale;                                              \
-   /*GLint comp, tbytesline, tsize; */                                  \
    GLfixed er, eg, eb, ea;                                              \
    GLint tr, tg, tb, ta;                                                \
    if (!texture) {                                                     \
@@ -727,30 +741,9 @@ static void near_persp_textured_triangle(GLcontext *ctx, GLuint v0, GLuint v1,
       eb = FloatToFixed(unit->EnvColor[2]);                             \
       ea = FloatToFixed(unit->EnvColor[3]);                             \
    }                                                                    \
-   /*switch (format) {                                                  \
-   case GL_ALPHA:                                                       \
-   case GL_LUMINANCE:                                                   \
-   case GL_INTENSITY:                                                   \
-      comp = 1;                                                         \
-      break;                                                            \
-   case GL_LUMINANCE_ALPHA:                                             \
-      comp = 2;                                                         \
-      break;                                                            \
-   case GL_RGB:                                                         \
-      comp = 3;                                                         \
-      break;                                                            \
-   case GL_RGBA:                                                        \
-      comp = 4;                                                         \
-      break;                                                            \
-   default:                                                             \
-      gl_problem(NULL, "Bad texture format in near_persp_texture_triangle"); \
-      return;                                                           \
-      } */                                                              \
    sscale = twidth;                                                     \
    tscale = theight;                                                    \
-   /*tbytesline = obj->Image[b]->Width * comp;                          \
-   tsize = theight * tbytesline;*/
-   (void) pv;
+
 
 #define OLD_SPAN(DO_TEX,COMP)                         \
    for (i=0;i<n;i++) {                                \
@@ -1443,8 +1436,10 @@ static void near_persp_textured_triangle(GLcontext *ctx, GLuint v0, GLuint v1,
  * This function written by Klaus Niederkrueger <klaus@math.leidenuniv.nl>
  * Send all questions and bug reports to him.
  */
-static void lin_persp_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                        GLuint v2, GLuint pv )
+static void lin_persp_textured_triangle( GLcontext *ctx,
+                                        SWvertex *v0,
+                                        SWvertex *v1,
+                                        SWvertex *v2 )
 {
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
@@ -1502,7 +1497,7 @@ static void lin_persp_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
    tscale = FIXED_SCALE * theight;                                      \
    tbytesline = obj->Image[b]->Width * comp;                            \
    tsize = theight * tbytesline;
-   (void) pv;
+
 
 #define SPAN(DO_TEX,COMP)                                  \
         for (i=0;i<n;i++) {                                \
@@ -1620,8 +1615,10 @@ static void lin_persp_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
  * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because
  * R is already used for red.
  */
-static void general_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                       GLuint v2, GLuint pv )
+static void general_textured_triangle( GLcontext *ctx,
+                                      SWvertex *v0,
+                                      SWvertex *v1,
+                                      SWvertex *v2 )
 {
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
@@ -1632,10 +1629,10 @@ static void general_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
    GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);    \
    GLint r, g, b, a;                                           \
    if (flat_shade) {                                           \
-      r = VB->ColorPtr->data[pv][0];                           \
-      g = VB->ColorPtr->data[pv][1];                           \
-      b = VB->ColorPtr->data[pv][2];                           \
-      a = VB->ColorPtr->data[pv][3];                           \
+      r = v0->color[0];                                \
+      g = v0->color[1];                                \
+      b = v0->color[2];                                \
+      a = v0->color[3];                                \
    }
 #define INNER_LOOP( LEFT, RIGHT, Y )                           \
        {                                                       \
@@ -1708,8 +1705,10 @@ static void general_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
  * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because
  * R is already used for red.
  */
-static void general_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
-                                             GLuint v1, GLuint v2, GLuint pv,
+static void general_textured_spec_triangle1( GLcontext *ctx,
+                                            SWvertex *v0,
+                                            SWvertex *v1,
+                                            SWvertex *v2,
                                              GLdepth zspan[MAX_WIDTH],
                                              GLfixed fogspan[MAX_WIDTH],
                                              GLchan rgba[MAX_WIDTH][4],
@@ -1725,13 +1724,13 @@ static void general_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
    GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);    \
    GLint r, g, b, a, sr, sg, sb;                               \
    if (flat_shade) {                                           \
-      r = VB->ColorPtr->data[pv][0];                           \
-      g = VB->ColorPtr->data[pv][1];                           \
-      b = VB->ColorPtr->data[pv][2];                           \
-      a = VB->ColorPtr->data[pv][3];                           \
-      sr = VB->SecondaryColorPtr->data[pv][0];                         \
-      sg = VB->SecondaryColorPtr->data[pv][1];                         \
-      sb = VB->SecondaryColorPtr->data[pv][2];                         \
+      r = v0->color[0];                                \
+      g = v0->color[1];                                \
+      b = v0->color[2];                                \
+      a = v0->color[3];                                \
+      sr = v0->specular[0];                    \
+      sg = v0->specular[1];                    \
+      sb = v0->specular[2];                    \
    }
 #define INNER_LOOP( LEFT, RIGHT, Y )                           \
        {                                                       \
@@ -1831,8 +1830,10 @@ compute_lambda( GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy,
  * minification or magnification filter.  If minification and using
  * mipmaps, lambda is also used to select the texture level of detail.
  */
-static void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1,
-                                       GLuint v2, GLuint pv,
+static void lambda_textured_triangle1( GLcontext *ctx,
+                                      SWvertex *v0,
+                                      SWvertex *v1,
+                                      SWvertex *v2, 
                                        GLfloat s[MAX_WIDTH],
                                        GLfloat t[MAX_WIDTH],
                                        GLfloat u[MAX_WIDTH] )
@@ -1844,7 +1845,7 @@ static void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1,
 #define INTERP_TEX 1
 
 #define SETUP_CODE                                                     \
-   const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current; \
+   const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;        \
    const GLint baseLevel = obj->BaseLevel;                             \
    const struct gl_texture_image *texImage = obj->Image[baseLevel];    \
    const GLfloat twidth = (GLfloat) texImage->Width;                   \
@@ -1852,10 +1853,10 @@ static void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1,
    const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);      \
    GLint r, g, b, a;                                                   \
    if (flat_shade) {                                                   \
-      r = VB->ColorPtr->data[pv][0];                                   \
-      g = VB->ColorPtr->data[pv][1];                                   \
-      b = VB->ColorPtr->data[pv][2];                                   \
-      a = VB->ColorPtr->data[pv][3];                                   \
+      r = v0->color[0];                                        \
+      g = v0->color[1];                                        \
+      b = v0->color[2];                                        \
+      a = v0->color[3];                                        \
    }
 
 #define INNER_LOOP( LEFT, RIGHT, Y )                                   \
@@ -1933,8 +1934,10 @@ static void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1,
  * minification or magnification filter.  If minification and using
  * mipmaps, lambda is also used to select the texture level of detail.
  */
-static void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
-                                            GLuint v1, GLuint v2, GLuint pv,
+static void lambda_textured_spec_triangle1( GLcontext *ctx,
+                                           SWvertex *v0,
+                                           SWvertex *v1,
+                                           SWvertex *v2,
                                             GLfloat s[MAX_WIDTH],
                                             GLfloat t[MAX_WIDTH],
                                             GLfloat u[MAX_WIDTH] )
@@ -1947,7 +1950,7 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
 #define INTERP_TEX 1
 
 #define SETUP_CODE                                                     \
-   const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current; \
+   const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;        \
    const GLint baseLevel = obj->BaseLevel;                             \
    const struct gl_texture_image *texImage = obj->Image[baseLevel];    \
    const GLfloat twidth = (GLfloat) texImage->Width;                   \
@@ -1955,13 +1958,13 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
    const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);      \
    GLint r, g, b, a, sr, sg, sb;                                       \
    if (flat_shade) {                                                   \
-      r = VB->ColorPtr->data[pv][0];                                   \
-      g = VB->ColorPtr->data[pv][1];                                   \
-      b = VB->ColorPtr->data[pv][2];                                   \
-      a = VB->ColorPtr->data[pv][3];                                   \
-      sr = VB->SecondaryColorPtr->data[pv][0];                         \
-      sg = VB->SecondaryColorPtr->data[pv][1];                         \
-      sb = VB->SecondaryColorPtr->data[pv][2];                         \
+      r = v0->color[0];                                        \
+      g = v0->color[1];                                        \
+      b = v0->color[2];                                        \
+      a = v0->color[3];                                        \
+      sr = v0->specular[0];                            \
+      sg = v0->specular[1];                            \
+      sb = v0->specular[2];                            \
    }
 
 #define INNER_LOOP( LEFT, RIGHT, Y )                                   \
@@ -2047,12 +2050,14 @@ static void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
  * Interpolate Z, RGB, Alpha, and two sets of texture coordinates.
  * Yup, it's slow.
  */
-static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
-                                      GLuint v1, GLuint v2, GLuint pv,
-                                      GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
-                                      GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
-                                      GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH]
-                                      )
+static void 
+lambda_multitextured_triangle1( GLcontext *ctx,
+                               SWvertex *v0,
+                               SWvertex *v1,
+                               SWvertex *v2,
+                               GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
+                               GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
+                               GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH])
 {
 #define INTERP_Z 1
 #define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
@@ -2066,16 +2071,16 @@ static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
    GLfloat twidth[MAX_TEXTURE_UNITS], theight[MAX_TEXTURE_UNITS];              \
    GLint r, g, b, a;                                                           \
    if (flat_shade) {                                                           \
-      r = VB->ColorPtr->data[pv][0];                                           \
-      g = VB->ColorPtr->data[pv][1];                                           \
-      b = VB->ColorPtr->data[pv][2];                                           \
-      a = VB->ColorPtr->data[pv][3];                                           \
+      r = v0->color[0];                                                \
+      g = v0->color[1];                                                \
+      b = v0->color[2];                                                \
+      a = v0->color[3];                                                \
    }                                                                           \
    {                                                                           \
       GLuint unit;                                                             \
       for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {              \
-         if (ctx->Texture.Unit[unit].ReallyEnabled) {                          \
-            const struct gl_texture_object *obj = ctx->Texture.Unit[unit].Current; \
+         if (ctx->Texture.Unit[unit]._ReallyEnabled) {                         \
+            const struct gl_texture_object *obj = ctx->Texture.Unit[unit]._Current; \
             const GLint baseLevel = obj->BaseLevel;                            \
             const struct gl_texture_image *texImage = obj->Image[baseLevel];   \
             twidth[unit] = (GLfloat) texImage->Width;                          \
@@ -2107,7 +2112,7 @@ static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
               {                                                                \
                  GLuint unit;                                                  \
                  for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {   \
-                    if (ctx->Texture.Unit[unit].ReallyEnabled) {               \
+                    if (ctx->Texture.Unit[unit]._ReallyEnabled) {              \
                        GLdouble invQ = 1.0 / vv[unit];                         \
                        s[unit][i] = ss[unit] * invQ;                           \
                        t[unit][i] = tt[unit] * invQ;                           \
@@ -2141,7 +2146,7 @@ static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
               {                                                                \
                  GLuint unit;                                                  \
                  for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {   \
-                    if (ctx->Texture.Unit[unit].ReallyEnabled) {               \
+                    if (ctx->Texture.Unit[unit]._ReallyEnabled) {              \
                        GLdouble invQ = 1.0 / vv[unit];                         \
                        s[unit][i] = ss[unit] * invQ;                           \
                        t[unit][i] = tt[unit] * invQ;                           \
@@ -2175,34 +2180,42 @@ static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
  * on Mac / PowerPC systems.
  */
 
-static void general_textured_spec_triangle(GLcontext *ctx, GLuint v0,
-                                           GLuint v1, GLuint v2, GLuint pv)
+static void general_textured_spec_triangle(GLcontext *ctx,
+                                          SWvertex *v0,
+                                          SWvertex *v1,
+                                          SWvertex *v2 )
 {
    GLdepth zspan[MAX_WIDTH];
    GLfixed fogspan[MAX_WIDTH];                    
    GLchan rgba[MAX_WIDTH][4], spec[MAX_WIDTH][4];
-   general_textured_spec_triangle1(ctx,v0,v1,v2,pv,zspan,fogspan,rgba,spec);
+   general_textured_spec_triangle1(ctx,v0,v1,v2,zspan,fogspan,rgba,spec);
 }
 
-static void lambda_textured_triangle( GLcontext *ctx, GLuint v0,
-                                      GLuint v1, GLuint v2, GLuint pv )
+static void lambda_textured_triangle( GLcontext *ctx,
+                                     SWvertex *v0,
+                                     SWvertex *v1,
+                                     SWvertex *v2 )
 {
    GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];
-   lambda_textured_triangle1(ctx,v0,v1,v2,pv,s,t,u);
+   lambda_textured_triangle1(ctx,v0,v1,v2,s,t,u);
 }
 
-static void lambda_textured_spec_triangle( GLcontext *ctx, GLuint v0,
-                                           GLuint v1, GLuint v2, GLuint pv )
+static void lambda_textured_spec_triangle( GLcontext *ctx,
+                                          SWvertex *v0,
+                                          SWvertex *v1,
+                                          SWvertex *v2 )
 {
    GLfloat s[MAX_WIDTH];
    GLfloat t[MAX_WIDTH];
    GLfloat u[MAX_WIDTH];
-   lambda_textured_spec_triangle1(ctx,v0,v1,v2,pv,s,t,u);
+   lambda_textured_spec_triangle1(ctx,v0,v1,v2,s,t,u);
 }
 
 
-static void lambda_multitextured_triangle( GLcontext *ctx, GLuint v0,
-                                           GLuint v1, GLuint v2, GLuint pv)
+static void lambda_multitextured_triangle( GLcontext *ctx,
+                                          SWvertex *v0,
+                                          SWvertex *v1,
+                                          SWvertex *v2 )
 {
 
    GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH];
@@ -2210,17 +2223,18 @@ static void lambda_multitextured_triangle( GLcontext *ctx, GLuint v0,
    DEFMARRAY(GLfloat,u,MAX_TEXTURE_UNITS,MAX_WIDTH);
    CHECKARRAY(u,return);
    
-   lambda_multitextured_triangle1(ctx,v0,v1,v2,pv,s,t,u);
+   lambda_multitextured_triangle1(ctx,v0,v1,v2,s,t,u);
    
    UNDEFARRAY(u);
 }
 
 
 
-static void occlusion_zless_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                                      GLuint v2, GLuint pv )
+static void occlusion_zless_triangle( GLcontext *ctx,
+                                     SWvertex *v0,
+                                     SWvertex *v1,
+                                     SWvertex *v2 )
 {
-   (void)pv;
    if (ctx->OcclusionResult) {
       return;
    }
@@ -2247,18 +2261,6 @@ static void occlusion_zless_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
 
 
 
-/*
- * Null rasterizer for measuring transformation speed.
- */
-static void null_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
-                           GLuint v2, GLuint pv )
-{
-   (void) ctx;
-   (void) v0;
-   (void) v1;
-   (void) v2;
-   (void) pv;
-}
 
 
 #if 0
@@ -2277,24 +2279,16 @@ static void null_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
  * remove tests to this code.
  */
 void 
-_swrast_set_triangle_function( GLcontext *ctx )
+_swrast_choose_triangle( GLcontext *ctx )
 {
+   SWcontext *swrast = SWRAST_CONTEXT(ctx);
    const GLboolean rgbmode = ctx->Visual.RGBAflag;
 
    if (ctx->RenderMode==GL_RENDER) {
-      if (ctx->NoRaster) {
-         ctx->Driver.TriangleFunc = null_triangle;
-         return;
-      }
-      if (ctx->Driver.TriangleFunc) {
-         /* Device driver will draw triangles. */
-         dputs("Driver triangle");
-        return;
-      }
 
       if (ctx->Polygon.SmoothFlag) {
          _mesa_set_aa_triangle_function(ctx);
-         ASSERT(ctx->Driver.TriangleFunc);
+         ASSERT(swrast->Triangle);
          return;
       }
 
@@ -2311,18 +2305,18 @@ _swrast_set_triangle_function( GLcontext *ctx )
              ||
              (!rgbmode && ctx->Color.IndexMask == 0)) {
             dputs("occlusion_test_triangle");
-            ctx->Driver.TriangleFunc = occlusion_zless_triangle;
+            swrast->Triangle = occlusion_zless_triangle;
             return;
          }
       }
 
-      if (ctx->Texture.ReallyEnabled) {
+      if (ctx->Texture._ReallyEnabled) {
          /* Ugh, we do a _lot_ of tests to pick the best textured tri func */
         GLint format, filter;
         const struct gl_texture_object *current2Dtex = ctx->Texture.Unit[0].CurrentD[2];
          const struct gl_texture_image *image;
          /* First see if we can used an optimized 2-D texture function */
-         if (ctx->Texture.ReallyEnabled==TEXTURE0_2D
+         if (ctx->Texture._ReallyEnabled==TEXTURE0_2D
              && current2Dtex->WrapS==GL_REPEAT
             && current2Dtex->WrapT==GL_REPEAT
              && ((image = current2Dtex->Image[current2Dtex->BaseLevel]) != 0)  /* correct! */
@@ -2338,39 +2332,39 @@ _swrast_set_triangle_function( GLcontext *ctx )
                   && format==GL_RGB
                   && (ctx->Texture.Unit[0].EnvMode==GL_REPLACE
                       || ctx->Texture.Unit[0].EnvMode==GL_DECAL)
-                  && ((ctx->RasterMask==DEPTH_BIT
+                  && ((swrast->_RasterMask==DEPTH_BIT
                        && ctx->Depth.Func==GL_LESS
                        && ctx->Depth.Mask==GL_TRUE)
-                      || ctx->RasterMask==0)
+                      || swrast->_RasterMask==0)
                   && ctx->Polygon.StippleFlag==GL_FALSE) {
 
-                 if (ctx->RasterMask==DEPTH_BIT) {
-                    ctx->Driver.TriangleFunc = simple_z_textured_triangle;
+                 if (swrast->_RasterMask==DEPTH_BIT) {
+                    swrast->Triangle = simple_z_textured_triangle;
                     dputs("simple_z_textured_triangle");
                  }
                  else {
-                    ctx->Driver.TriangleFunc = simple_textured_triangle;
+                    swrast->Triangle = simple_textured_triangle;
                     dputs("simple_textured_triangle");
                  }
               }
               else {
                   if (ctx->Texture.Unit[0].EnvMode==GL_ADD) {
-                     ctx->Driver.TriangleFunc = general_textured_triangle;
+                     swrast->Triangle = general_textured_triangle;
                      dputs("general_textured_triangle");
                   }
                   else {
-                     ctx->Driver.TriangleFunc = affine_textured_triangle;
+                     swrast->Triangle = affine_textured_triangle;
                      dputs("affine_textured_triangle");
                   }
               }
            }
            else {
               if (filter==GL_NEAREST) {
-                ctx->Driver.TriangleFunc = near_persp_textured_triangle;
+                swrast->Triangle = near_persp_textured_triangle;
                 dputs("near_persp_textured_triangle");
               }
               else {
-                ctx->Driver.TriangleFunc = lin_persp_textured_triangle;
+                swrast->Triangle = lin_persp_textured_triangle;
                 dputs("lin_persp_textured_triangle");
               }
            }
@@ -2379,13 +2373,13 @@ _swrast_set_triangle_function( GLcontext *ctx )
             /* More complicated textures (mipmap, multi-tex, sep specular) */
             GLboolean needLambda;
             /* if mag filter != min filter we need to compute lambda */
-            const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;
+            const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;
             if (obj && obj->MinFilter != obj->MagFilter)
                needLambda = GL_TRUE;
             else
                needLambda = GL_FALSE;
-            if (ctx->Texture.MultiTextureEnabled) {
-               ctx->Driver.TriangleFunc = lambda_multitextured_triangle;
+            if (ctx->Texture._MultiTextureEnabled) {
+               swrast->Triangle = lambda_multitextured_triangle;
               dputs("lambda_multitextured_triangle");
             }
             else if ((ctx->Light.Enabled &&
@@ -2393,21 +2387,21 @@ _swrast_set_triangle_function( GLcontext *ctx )
                     || ctx->Fog.ColorSumEnabled) {
                /* separate specular color interpolation */
                if (needLambda) {
-                  ctx->Driver.TriangleFunc = lambda_textured_spec_triangle;
+                  swrast->Triangle = lambda_textured_spec_triangle;
                  dputs("lambda_textured_spec_triangle");
               }
                else {
-                  ctx->Driver.TriangleFunc = general_textured_spec_triangle;
+                  swrast->Triangle = general_textured_spec_triangle;
                  dputs("general_textured_spec_triangle");
               }
             }
             else {
                if (needLambda) {
-                  ctx->Driver.TriangleFunc = lambda_textured_triangle;
+                  swrast->Triangle = lambda_textured_triangle;
                  dputs("lambda_textured_triangle");
               }
                else {
-                  ctx->Driver.TriangleFunc = general_textured_triangle;
+                  swrast->Triangle = general_textured_triangle;
                  dputs("general_textured_triangle");
               }
             }
@@ -2418,31 +2412,31 @@ _swrast_set_triangle_function( GLcontext *ctx )
            /* smooth shaded, no texturing, stippled or some raster ops */
             if (rgbmode) {
                dputs("smooth_rgba_triangle");
-               ctx->Driver.TriangleFunc = smooth_rgba_triangle;
+               swrast->Triangle = smooth_rgba_triangle;
             }
             else {
                dputs("smooth_ci_triangle");
-               ctx->Driver.TriangleFunc = smooth_ci_triangle;
+               swrast->Triangle = smooth_ci_triangle;
             }
         }
         else {
            /* flat shaded, no texturing, stippled or some raster ops */
             if (rgbmode) {
                dputs("flat_rgba_triangle");
-               ctx->Driver.TriangleFunc = flat_rgba_triangle;
+               swrast->Triangle = flat_rgba_triangle;
             }
             else {
                dputs("flat_ci_triangle");
-               ctx->Driver.TriangleFunc = flat_ci_triangle;
+               swrast->Triangle = flat_ci_triangle;
             }
         }
       }
    }
    else if (ctx->RenderMode==GL_FEEDBACK) {
-      ctx->Driver.TriangleFunc = gl_feedback_triangle;
+      swrast->Triangle = gl_feedback_triangle;
    }
    else {
       /* GL_SELECT mode */
-      ctx->Driver.TriangleFunc = gl_select_triangle;
+      swrast->Triangle = gl_select_triangle;
    }
 }
index 71c79a4a7c07dfaf5ea3df6c61268dc9ea55235f..eaff79532c9130a3735ef9799c58903934ee6e91 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_triangle.h,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_triangle.h,v 1.2 2000/11/05 18:24:41 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
 #include "swrast.h"
 
 
-void gl_set_triangle_function( GLcontext *ctx );
-GLboolean gl_cull_triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv );
+GLboolean gl_cull_triangle( GLcontext *ctx, 
+                           SWvertex *v0,
+                           SWvertex *v1,
+                           SWvertex *v2);
+
+
+void 
+_swrast_choose_triangle( GLcontext *ctx );
 
 
 #endif
index 21e7ceef5af35a0a60880aee2ffd5c5cfa17ce85..a87b24c40c69fe634e81060bf82ac6e45f2ae3f8 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_tritemp.h,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
+/* $Id: s_tritemp.h,v 1.2 2000/11/05 18:24:41 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
  */
 
 
-/*void triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv )*/
+/*void triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 )*/
 {
    typedef struct {
-        GLint v0, v1;   /* Y(v0) < Y(v1) */
+        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 */
    const GLfloat maxDepth = ctx->Visual.DepthMaxF;
 #define FixedToDepth(F)  ((F) >> fixedToDepthShift)
 #endif
-   const struct vertex_buffer *VB = ctx->VB;
    EdgeT eMaj, eTop, eBot;
    GLfloat oneOverArea;
-   int vMin, vMid, vMax;       /* vertex indexes:  Y(vMin)<=Y(vMid)<=Y(vMax) */
-   float bf = ctx->backface_sign;
+   SWvertex *vMin, *vMid, *vMax;  /* Y(vMin)<=Y(vMid)<=Y(vMax) */
+   float bf = ctx->_backface_sign;
 
    /* find the order of the 3 vertices along the Y axis */
    {
-      GLfloat y0 = VB->Win.data[v0][1];
-      GLfloat y1 = VB->Win.data[v1][1];
-      GLfloat y2 = VB->Win.data[v2][1];
+      GLfloat y0 = v0->win[1];
+      GLfloat y1 = v1->win[1];
+      GLfloat y2 = v2->win[1];
 
       if (y0<=y1) {
         if (y1<=y2) {
    eBot.v0 = vMin;   eBot.v1 = vMid;
 
    /* compute deltas for each edge:  vertex[v1] - vertex[v0] */
-   eMaj.dx = VB->Win.data[vMax][0] - VB->Win.data[vMin][0];
-   eMaj.dy = VB->Win.data[vMax][1] - VB->Win.data[vMin][1];
-   eTop.dx = VB->Win.data[vMax][0] - VB->Win.data[vMid][0];
-   eTop.dy = VB->Win.data[vMax][1] - VB->Win.data[vMid][1];
-   eBot.dx = VB->Win.data[vMid][0] - VB->Win.data[vMin][0];
-   eBot.dy = VB->Win.data[vMid][1] - VB->Win.data[vMin][1];
+   eMaj.dx = vMax->win[0] - vMin->win[0];
+   eMaj.dy = vMax->win[1] - vMin->win[1];
+   eTop.dx = vMax->win[0] - vMid->win[0];
+   eTop.dy = vMax->win[1] - vMid->win[1];
+   eBot.dx = vMid->win[0] - vMin->win[0];
+   eBot.dy = vMid->win[1] - vMin->win[1];
 
    /* compute oneOverArea */
    {
    /* Edge setup.  For a triangle strip these could be reused... */
    {
       /* fixed point Y coordinates */
-      GLfixed vMin_fx = FloatToFixed(VB->Win.data[vMin][0] + 0.5F);
-      GLfixed vMin_fy = FloatToFixed(VB->Win.data[vMin][1] - 0.5F);
-      GLfixed vMid_fx = FloatToFixed(VB->Win.data[vMid][0] + 0.5F);
-      GLfixed vMid_fy = FloatToFixed(VB->Win.data[vMid][1] - 0.5F);
-      GLfixed vMax_fy = FloatToFixed(VB->Win.data[vMax][1] - 0.5F);
+      GLfixed vMin_fx = FloatToFixed(vMin->win[0] + 0.5F);
+      GLfixed vMin_fy = FloatToFixed(vMin->win[1] - 0.5F);
+      GLfixed vMid_fx = FloatToFixed(vMid->win[0] + 0.5F);
+      GLfixed vMid_fy = FloatToFixed(vMid->win[1] - 0.5F);
+      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);
 #ifdef INTERP_Z
       {
          GLfloat eMaj_dz, eBot_dz;
-         eMaj_dz = VB->Win.data[vMax][2] - VB->Win.data[vMin][2];
-         eBot_dz = VB->Win.data[vMid][2] - VB->Win.data[vMin][2];
+         eMaj_dz = vMax->win[2] - vMin->win[2];
+         eBot_dz = vMid->win[2] - vMin->win[2];
          dzdx = oneOverArea * (eMaj_dz * eBot.dy - eMaj.dy * eBot_dz);
          if (dzdx > maxDepth || dzdx < -maxDepth) {
             /* probably a sliver triangle */
       }
       {
          GLfloat eMaj_dfog, eBot_dfog;
-         eMaj_dfog = (VB->FogCoordPtr->data[vMax] - VB->FogCoordPtr->data[vMin]) * 256;
-         eBot_dfog = (VB->FogCoordPtr->data[vMid] - VB->FogCoordPtr->data[vMin]) * 256;
+         eMaj_dfog = (vMax->fog - vMin->fog) * 256;
+         eBot_dfog = (vMid->fog - vMin->fog) * 256;
          dfogdx = oneOverArea * (eMaj_dfog * eBot.dy - eMaj.dy * eBot_dfog);
          fdfogdx = SignedFloatToFixed(dfogdx);
          dfogdy = oneOverArea * (eMaj.dx * eBot_dfog - eMaj_dfog * eBot.dx);
 #ifdef INTERP_RGB
       {
          GLfloat eMaj_dr, eBot_dr;
-         eMaj_dr = (GLint) VB->ColorPtr->data[vMax][0]
-                 - (GLint) VB->ColorPtr->data[vMin][0];
-         eBot_dr = (GLint) VB->ColorPtr->data[vMid][0]
-                 - (GLint) VB->ColorPtr->data[vMin][0];
+         eMaj_dr = (GLint) vMax->color[0]
+                 - (GLint) vMin->color[0];
+         eBot_dr = (GLint) vMid->color[0]
+                 - (GLint) vMin->color[0];
          drdx = oneOverArea * (eMaj_dr * eBot.dy - eMaj.dy * eBot_dr);
          fdrdx = SignedFloatToFixed(drdx);
          drdy = oneOverArea * (eMaj.dx * eBot_dr - eMaj_dr * eBot.dx);
       }
       {
          GLfloat eMaj_dg, eBot_dg;
-         eMaj_dg = (GLint) VB->ColorPtr->data[vMax][1]
-                 - (GLint) VB->ColorPtr->data[vMin][1];
-        eBot_dg = (GLint) VB->ColorPtr->data[vMid][1]
-                 - (GLint) VB->ColorPtr->data[vMin][1];
+         eMaj_dg = (GLint) vMax->color[1]
+                 - (GLint) vMin->color[1];
+        eBot_dg = (GLint) vMid->color[1]
+                 - (GLint) vMin->color[1];
          dgdx = oneOverArea * (eMaj_dg * eBot.dy - eMaj.dy * eBot_dg);
          fdgdx = SignedFloatToFixed(dgdx);
          dgdy = oneOverArea * (eMaj.dx * eBot_dg - eMaj_dg * eBot.dx);
       }
       {
          GLfloat eMaj_db, eBot_db;
-         eMaj_db = (GLint) VB->ColorPtr->data[vMax][2]
-                 - (GLint) VB->ColorPtr->data[vMin][2];
-         eBot_db = (GLint) VB->ColorPtr->data[vMid][2]
-                 - (GLint) VB->ColorPtr->data[vMin][2];
+         eMaj_db = (GLint) vMax->color[2]
+                 - (GLint) vMin->color[2];
+         eBot_db = (GLint) vMid->color[2]
+                 - (GLint) vMin->color[2];
          dbdx = oneOverArea * (eMaj_db * eBot.dy - eMaj.dy * eBot_db);
          fdbdx = SignedFloatToFixed(dbdx);
         dbdy = oneOverArea * (eMaj.dx * eBot_db - eMaj_db * eBot.dx);
 #ifdef INTERP_SPEC
       {
          GLfloat eMaj_dsr, eBot_dsr;
-         eMaj_dsr = (GLint) VB->SecondaryColorPtr->data[vMax][0]
-                  - (GLint) VB->SecondaryColorPtr->data[vMin][0];
-         eBot_dsr = (GLint) VB->SecondaryColorPtr->data[vMid][0]
-                  - (GLint) VB->SecondaryColorPtr->data[vMin][0];
+         eMaj_dsr = (GLint) vMax->specular[0]
+                  - (GLint) vMin->specular[0];
+         eBot_dsr = (GLint) vMid->specular[0]
+                  - (GLint) vMin->specular[0];
          dsrdx = oneOverArea * (eMaj_dsr * eBot.dy - eMaj.dy * eBot_dsr);
          fdsrdx = SignedFloatToFixed(dsrdx);
          dsrdy = oneOverArea * (eMaj.dx * eBot_dsr - eMaj_dsr * eBot.dx);
       }
       {
          GLfloat eMaj_dsg, eBot_dsg;
-         eMaj_dsg = (GLint) VB->SecondaryColorPtr->data[vMax][1]
-                  - (GLint) VB->SecondaryColorPtr->data[vMin][1];
-        eBot_dsg = (GLint) VB->SecondaryColorPtr->data[vMid][1]
-                  - (GLint) VB->SecondaryColorPtr->data[vMin][1];
+         eMaj_dsg = (GLint) vMax->specular[1]
+                  - (GLint) vMin->specular[1];
+        eBot_dsg = (GLint) vMid->specular[1]
+                  - (GLint) vMin->specular[1];
          dsgdx = oneOverArea * (eMaj_dsg * eBot.dy - eMaj.dy * eBot_dsg);
          fdsgdx = SignedFloatToFixed(dsgdx);
          dsgdy = oneOverArea * (eMaj.dx * eBot_dsg - eMaj_dsg * eBot.dx);
       }
       {
          GLfloat eMaj_dsb, eBot_dsb;
-         eMaj_dsb = (GLint) VB->SecondaryColorPtr->data[vMax][2]
-                  - (GLint) VB->SecondaryColorPtr->data[vMin][2];
-         eBot_dsb = (GLint) VB->SecondaryColorPtr->data[vMid][2]
-                  - (GLint) VB->SecondaryColorPtr->data[vMin][2];
+         eMaj_dsb = (GLint) vMax->specular[2]
+                  - (GLint) vMin->specular[2];
+         eBot_dsb = (GLint) vMid->specular[2]
+                  - (GLint) vMin->specular[2];
          dsbdx = oneOverArea * (eMaj_dsb * eBot.dy - eMaj.dy * eBot_dsb);
          fdsbdx = SignedFloatToFixed(dsbdx);
         dsbdy = oneOverArea * (eMaj.dx * eBot_dsb - eMaj_dsb * eBot.dx);
 #ifdef INTERP_ALPHA
       {
          GLfloat eMaj_da, eBot_da;
-         eMaj_da = (GLint) VB->ColorPtr->data[vMax][3]
-                 - (GLint) VB->ColorPtr->data[vMin][3];
-         eBot_da = (GLint) VB->ColorPtr->data[vMid][3]
-                 - (GLint) VB->ColorPtr->data[vMin][3];
+         eMaj_da = (GLint) vMax->color[3]
+                 - (GLint) vMin->color[3];
+         eBot_da = (GLint) vMid->color[3]
+                 - (GLint) vMin->color[3];
          dadx = oneOverArea * (eMaj_da * eBot.dy - eMaj.dy * eBot_da);
          fdadx = SignedFloatToFixed(dadx);
          dady = oneOverArea * (eMaj.dx * eBot_da - eMaj_da * eBot.dx);
 #ifdef INTERP_INDEX
       {
          GLfloat eMaj_di, eBot_di;
-         eMaj_di = (GLint) VB->IndexPtr->data[vMax]
-                 - (GLint) VB->IndexPtr->data[vMin];
-         eBot_di = (GLint) VB->IndexPtr->data[vMid]
-                 - (GLint) VB->IndexPtr->data[vMin];
+         eMaj_di = (GLint) vMax->index
+                 - (GLint) vMin->index;
+         eBot_di = (GLint) vMid->index
+                 - (GLint) vMin->index;
          didx = oneOverArea * (eMaj_di * eBot.dy - eMaj.dy * eBot_di);
          fdidx = SignedFloatToFixed(didx);
          didy = oneOverArea * (eMaj.dx * eBot_di - eMaj_di * eBot.dx);
 #ifdef INTERP_INT_TEX
       {
          GLfloat eMaj_ds, eBot_ds;
-         eMaj_ds = (VB->TexCoordPtr[0]->data[vMax][0]
-                  - VB->TexCoordPtr[0]->data[vMin][0]) * S_SCALE;
-         eBot_ds = (VB->TexCoordPtr[0]->data[vMid][0]
-                  - VB->TexCoordPtr[0]->data[vMin][0]) * S_SCALE;
+         eMaj_ds = (vMax->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE;
+         eBot_ds = (vMid->texcoord[0][0] - vMin->texcoord[0][0]) * S_SCALE;
          dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
          fdsdx = SignedFloatToFixed(dsdx);
          dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
       }
-      if (VB->TexCoordPtr[0]->size > 1) {
+      {
          GLfloat eMaj_dt, eBot_dt;
-         eMaj_dt = (VB->TexCoordPtr[0]->data[vMax][1]
-                  - VB->TexCoordPtr[0]->data[vMin][1]) * T_SCALE;
-         eBot_dt = (VB->TexCoordPtr[0]->data[vMid][1]
-                  - VB->TexCoordPtr[0]->data[vMin][1]) * T_SCALE;
+         eMaj_dt = (vMax->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE;
+         eBot_dt = (vMid->texcoord[0][1] - vMin->texcoord[0][1]) * T_SCALE;
          dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
          fdtdx = SignedFloatToFixed(dtdx);
          dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
       }
-      else {
-         dtdx = 0;
-         fdtdx = SignedFloatToFixed(dtdx);
-         dtdy = 0;
-      }
 
 #endif
 #ifdef INTERP_TEX
       {
-         GLfloat wMax = VB->Win.data[vMax][3];
-         GLfloat wMin = VB->Win.data[vMin][3];
-         GLfloat wMid = VB->Win.data[vMid][3];
+         GLfloat wMax = vMax->win[3];
+         GLfloat wMin = vMin->win[3];
+         GLfloat wMid = vMid->win[3];
          GLfloat eMaj_ds, eBot_ds;
          GLfloat eMaj_dt, eBot_dt;
          GLfloat eMaj_du, eBot_du;
          GLfloat eMaj_dv, eBot_dv;
 
-         eMaj_ds = VB->TexCoordPtr[0]->data[vMax][0] * wMax
-                 - VB->TexCoordPtr[0]->data[vMin][0] * wMin;
-         eBot_ds = VB->TexCoordPtr[0]->data[vMid][0] * wMid
-                 - VB->TexCoordPtr[0]->data[vMin][0] * wMin;
+         eMaj_ds = vMax->texcoord[0][0] * wMax - vMin->texcoord[0][0] * wMin;
+         eBot_ds = vMid->texcoord[0][0] * wMid - vMin->texcoord[0][0] * wMin;
          dsdx = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
          dsdy = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
 
 
-        if (VB->TexCoordPtr[0]->size > 1) {
-           eMaj_dt = VB->TexCoordPtr[0]->data[vMax][1] * wMax
-                    - VB->TexCoordPtr[0]->data[vMin][1] * wMin;
-           eBot_dt = VB->TexCoordPtr[0]->data[vMid][1] * wMid
-                    - VB->TexCoordPtr[0]->data[vMin][1] * wMin;
-           dtdx = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
-           dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
-        }
-         else {
-           dtdx = 0;
-           dtdy = 0; 
-        }
+        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);
+        dtdy = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
+        
+        eMaj_du = vMax->texcoord[0][2] * wMax - vMin->texcoord[0][2] * wMin;
+        eBot_du = vMid->texcoord[0][2] * wMid - vMin->texcoord[0][2] * wMin;
+        dudx = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);
+        dudy = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);
 
-        if (VB->TexCoordPtr[0]->size > 2) {
-           eMaj_du = VB->TexCoordPtr[0]->data[vMax][2] * wMax
-                    - VB->TexCoordPtr[0]->data[vMin][2] * wMin;
-           eBot_du = VB->TexCoordPtr[0]->data[vMid][2] * wMid
-                    - VB->TexCoordPtr[0]->data[vMin][2] * wMin;
-           dudx = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);
-           dudy = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);
-        }
-         else {
-           dudx = 0;
-           dudy = 0;
-        }
 
-        if (VB->TexCoordPtr[0]->size > 3) {
-           eMaj_dv = VB->TexCoordPtr[0]->data[vMax][3] * wMax
-                    - VB->TexCoordPtr[0]->data[vMin][3] * wMin;
-           eBot_dv = VB->TexCoordPtr[0]->data[vMid][3] * wMid
-                    - VB->TexCoordPtr[0]->data[vMin][3] * wMin;
-           dvdx = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
-           dvdy = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
-        }
-         else {
-           eMaj_dv = wMax - wMin;
-           eBot_dv = wMid - wMin;
-           dvdx = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
-           dvdy = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
-        }
+        eMaj_dv = vMax->texcoord[0][3] * wMax - vMin->texcoord[0][3] * wMin;
+        eBot_dv = vMid->texcoord[0][3] * wMid - vMin->texcoord[0][3] * wMin;
+        dvdx = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
+        dvdy = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
       }
 #endif
 #ifdef INTERP_MULTITEX
       {
-         GLfloat wMax = VB->Win.data[vMax][3];
-         GLfloat wMin = VB->Win.data[vMin][3];
-         GLfloat wMid = VB->Win.data[vMid][3];
+         GLfloat wMax = vMax->win[3];
+         GLfloat wMin = vMin->win[3];
+         GLfloat wMid = vMid->win[3];
          GLuint u;
          for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-            if (ctx->Texture.Unit[u].ReallyEnabled) {
+            if (ctx->Texture.Unit[u]._ReallyEnabled) {
                GLfloat eMaj_ds, eBot_ds;
                GLfloat eMaj_dt, eBot_dt;
                GLfloat eMaj_du, eBot_du;
                GLfloat eMaj_dv, eBot_dv;
-               eMaj_ds = VB->TexCoordPtr[u]->data[vMax][0] * wMax
-                       - VB->TexCoordPtr[u]->data[vMin][0] * wMin;
-               eBot_ds = VB->TexCoordPtr[u]->data[vMid][0] * wMid
-                       - VB->TexCoordPtr[u]->data[vMin][0] * wMin;
+               eMaj_ds = vMax->texcoord[u][0] * wMax
+                       - vMin->texcoord[u][0] * wMin;
+               eBot_ds = vMid->texcoord[u][0] * wMid
+                       - vMin->texcoord[u][0] * wMin;
                dsdx[u] = oneOverArea * (eMaj_ds * eBot.dy - eMaj.dy * eBot_ds);
                dsdy[u] = oneOverArea * (eMaj.dx * eBot_ds - eMaj_ds * eBot.dx);
 
-               if (VB->TexCoordPtr[u]->size > 1) {
-                  eMaj_dt = VB->TexCoordPtr[u]->data[vMax][1] * wMax
-                          - VB->TexCoordPtr[u]->data[vMin][1] * wMin;
-                  eBot_dt = VB->TexCoordPtr[u]->data[vMid][1] * wMid
-                          - VB->TexCoordPtr[u]->data[vMin][1] * wMin;
-                  dtdx[u] = oneOverArea * (eMaj_dt * eBot.dy - eMaj.dy * eBot_dt);
-                  dtdy[u] = oneOverArea * (eMaj.dx * eBot_dt - eMaj_dt * eBot.dx);
-               }
-               else {
-                  dtdx[u] = 0.0;
-                  dtdy[u] = 0.0;
-               }
-
-               if (VB->TexCoordPtr[u]->size > 2) {
-                  eMaj_du = VB->TexCoordPtr[u]->data[vMax][2] * wMax
-                          - VB->TexCoordPtr[u]->data[vMin][2] * wMin;
-                  eBot_du = VB->TexCoordPtr[u]->data[vMid][2] * wMid
-                          - VB->TexCoordPtr[u]->data[vMin][2] * wMin;
-                  dudx[u] = oneOverArea * (eMaj_du * eBot.dy - eMaj.dy * eBot_du);
-                  dudy[u] = oneOverArea * (eMaj.dx * eBot_du - eMaj_du * eBot.dx);
-               }
-               else {
-                  dudx[u] = 0.0;
-                  dudy[u] = 0.0;
-               }
-
-               if (VB->TexCoordPtr[u]->size > 3) {
-                  eMaj_dv = VB->TexCoordPtr[u]->data[vMax][3] * wMax
-                          - VB->TexCoordPtr[u]->data[vMin][3] * wMin;
-                  eBot_dv = VB->TexCoordPtr[u]->data[vMid][3] * wMid
-                          - VB->TexCoordPtr[u]->data[vMin][3] * wMin;
-                  dvdx[u] = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
-                  dvdy[u] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
-               }
-               else {
-                  eMaj_dv = wMax - wMin;
-                  eBot_dv = wMid - wMin;
-                  dvdx[u] = oneOverArea * (eMaj_dv * eBot.dy - eMaj.dy * eBot_dv);
-                  dvdy[u] = oneOverArea * (eMaj.dx * eBot_dv - eMaj_dv * eBot.dx);
-               }
+              eMaj_dt = vMax->texcoord[u][1] * wMax
+                 - vMin->texcoord[u][1] * wMin;
+              eBot_dt = vMid->texcoord[u][1] * wMid
+                 - 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;
+              eBot_du = vMid->texcoord[u][2] * wMid
+                 - 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;
+              eBot_dv = vMid->texcoord[u][3] * wMid
+                 - 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) {
-               GLint vLower;
+               SWvertex *vLower;
                GLfixed fsx = eLeft->fsx;
                fx = FixedCeil(fsx);
                fError = fx - fsx - FIXED_ONE;
 
 #ifdef INTERP_Z
                {
-                  GLfloat z0 = VB->Win.data[vLower][2] + ctx->PolygonZoffset;
+                  GLfloat z0 = vLower->win[2];
                   if (depthBits <= 16) {
                      /* interpolate fixed-pt values */
                      GLfloat tmp = (z0 * FIXED_SCALE +
                   dZRowOuter = (ctx->DrawBuffer->Width + idxOuter) * sizeof(DEPTH_TYPE);
 #  endif
                }
-               ffog = FloatToFixed(VB->FogCoordPtr->data[vLower]) * 256 + dfogdx * adjx + dfogdy * adjy + FIXED_HALF;
+               ffog = FloatToFixed(vLower->fog) * 256 + dfogdx * adjx + dfogdy * adjy + FIXED_HALF;
                fdfogOuter = SignedFloatToFixed(dfogdy + dxOuter * dfogdx);
 #endif
 #ifdef INTERP_RGB
-               fr = (GLfixed)(IntToFixed(VB->ColorPtr->data[vLower][0])
+               fr = (GLfixed)(IntToFixed(vLower->color[0])
                               + drdx * adjx + drdy * adjy) + FIXED_HALF;
                fdrOuter = SignedFloatToFixed(drdy + dxOuter * drdx);
 
-               fg = (GLfixed)(IntToFixed(VB->ColorPtr->data[vLower][1])
+               fg = (GLfixed)(IntToFixed(vLower->color[1])
                               + dgdx * adjx + dgdy * adjy) + FIXED_HALF;
                fdgOuter = SignedFloatToFixed(dgdy + dxOuter * dgdx);
 
-               fb = (GLfixed)(IntToFixed(VB->ColorPtr->data[vLower][2])
+               fb = (GLfixed)(IntToFixed(vLower->color[2])
                               + dbdx * adjx + dbdy * adjy) + FIXED_HALF;
                fdbOuter = SignedFloatToFixed(dbdy + dxOuter * dbdx);
 #endif
 #ifdef INTERP_SPEC
-               fsr = (GLfixed)(IntToFixed(VB->SecondaryColorPtr->data[vLower][0])
+               fsr = (GLfixed)(IntToFixed(vLower->specular[0])
                                + dsrdx * adjx + dsrdy * adjy) + FIXED_HALF;
                fdsrOuter = SignedFloatToFixed(dsrdy + dxOuter * dsrdx);
 
-               fsg = (GLfixed)(IntToFixed(VB->SecondaryColorPtr->data[vLower][1])
+               fsg = (GLfixed)(IntToFixed(vLower->specular[1])
                                + dsgdx * adjx + dsgdy * adjy) + FIXED_HALF;
                fdsgOuter = SignedFloatToFixed(dsgdy + dxOuter * dsgdx);
 
-               fsb = (GLfixed)(IntToFixed(VB->SecondaryColorPtr->data[vLower][2])
+               fsb = (GLfixed)(IntToFixed(vLower->specular[2])
                                + dsbdx * adjx + dsbdy * adjy) + FIXED_HALF;
                fdsbOuter = SignedFloatToFixed(dsbdy + dxOuter * dsbdx);
 #endif
 #ifdef INTERP_ALPHA
-               fa = (GLfixed)(IntToFixed(VB->ColorPtr->data[vLower][3])
+               fa = (GLfixed)(IntToFixed(vLower->color[3])
                               + dadx * adjx + dady * adjy) + FIXED_HALF;
                fdaOuter = SignedFloatToFixed(dady + dxOuter * dadx);
 #endif
 #ifdef INTERP_INDEX
-               fi = (GLfixed)(VB->IndexPtr->data[vLower] * FIXED_SCALE
+               fi = (GLfixed)(vLower->index * FIXED_SCALE
                               + didx * adjx + didy * adjy) + FIXED_HALF;
                fdiOuter = SignedFloatToFixed(didy + dxOuter * didx);
 #endif
 #ifdef INTERP_INT_TEX
                {
                   GLfloat s0, t0;
-                  s0 = VB->TexCoordPtr[0]->data[vLower][0] * S_SCALE;
+                  s0 = vLower->texcoord[0][0] * S_SCALE;
                   fs = (GLfixed)(s0 * FIXED_SCALE + dsdx * adjx + dsdy * adjy) + FIXED_HALF;
                   fdsOuter = SignedFloatToFixed(dsdy + dxOuter * dsdx);
 
-                 if (VB->TexCoordPtr[0]->size > 1)
-                 {
-                    t0 = VB->TexCoordPtr[0]->data[vLower][1] * T_SCALE;
-                    ft = (GLfixed)(t0 * FIXED_SCALE + dtdx * adjx + dtdy * adjy) + FIXED_HALF;
-                    fdtOuter = SignedFloatToFixed(dtdy + dxOuter * dtdx);
-                 } 
-                 else
-                 {
-                    t0 = 0;
-                    ft = (GLfixed) FIXED_HALF;
-                    fdtOuter = SignedFloatToFixed(0);
-                 }
+                 t0 = vLower->texcoord[0][1] * T_SCALE;
+                 ft = (GLfixed)(t0 * FIXED_SCALE + dtdx * adjx + dtdy * adjy) + FIXED_HALF;
+                 fdtOuter = SignedFloatToFixed(dtdy + dxOuter * dtdx);
               }
 #endif
 #ifdef INTERP_TEX
                {
-                  GLfloat invW = VB->Win.data[vLower][3];
+                  GLfloat invW = vLower->win[3];
                   GLfloat s0, t0, u0, v0;
-                  s0 = VB->TexCoordPtr[0]->data[vLower][0] * invW;
+                  s0 = vLower->texcoord[0][0] * invW;
                   sLeft = s0 + (dsdx * adjx + dsdy * adjy) * (1.0F/FIXED_SCALE);
                   dsOuter = dsdy + dxOuter * dsdx;
-                 if (VB->TexCoordPtr[0]->size > 1) {             
-                    t0 = VB->TexCoordPtr[0]->data[vLower][1] * invW;
-                    tLeft = t0 + (dtdx * adjx + dtdy * adjy) * (1.0F/FIXED_SCALE);
-                    dtOuter = dtdy + dxOuter * dtdx;
-                 }
-                  else {
-                    tLeft = dtOuter = 0.0;
-                 }
-                 if (VB->TexCoordPtr[0]->size > 2) {             
-                    u0 = VB->TexCoordPtr[0]->data[vLower][2] * invW;
-                    uLeft = u0 + (dudx * adjx + dudy * adjy) * (1.0F/FIXED_SCALE);
-                    duOuter = dudy + dxOuter * dudx;
-                 }
-                  else {
-                    uLeft = duOuter = 0.0;
-                 }
-                 if (VB->TexCoordPtr[0]->size > 3) {             
-                    v0 = VB->TexCoordPtr[0]->data[vLower][3] * invW;
-                 }
-                  else {
-                    v0 = invW;
-                 }
+                 t0 = vLower->texcoord[0][1] * invW;
+                 tLeft = t0 + (dtdx * adjx + dtdy * adjy) * (1.0F/FIXED_SCALE);
+                 dtOuter = dtdy + dxOuter * dtdx;
+                 u0 = vLower->texcoord[0][2] * invW;
+                 uLeft = u0 + (dudx * adjx + dudy * adjy) * (1.0F/FIXED_SCALE);
+                 duOuter = dudy + dxOuter * dudx;
+                 v0 = vLower->texcoord[0][3] * invW;
                  vLeft = v0 + (dvdx * adjx + dvdy * adjy) * (1.0F/FIXED_SCALE);
                  dvOuter = dvdy + dxOuter * dvdx;
                }
                {
                   GLuint u;
                   for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                     if (ctx->Texture.Unit[u].ReallyEnabled) {
-                        GLfloat invW = VB->Win.data[vLower][3];
+                     if (ctx->Texture.Unit[u]._ReallyEnabled) {
+                        GLfloat invW = vLower->win[3];
                         GLfloat s0, t0, u0, v0;
-                        s0 = VB->TexCoordPtr[u]->data[vLower][0] * invW;
+                        s0 = vLower->texcoord[u][0] * invW;
                         sLeft[u] = s0 + (dsdx[u] * adjx + dsdy[u] * adjy) * (1.0F/FIXED_SCALE);
                         dsOuter[u] = dsdy[u] + dxOuter * dsdx[u];
-                        if (VB->TexCoordPtr[u]->size > 1) {
-                           t0 = VB->TexCoordPtr[u]->data[vLower][1] * invW;
-                           tLeft[u] = t0 + (dtdx[u] * adjx + dtdy[u] * adjy) * (1.0F/FIXED_SCALE);
-                           dtOuter[u] = dtdy[u] + dxOuter * dtdx[u];
-                        }
-                        else {
-                           tLeft[u] = dtOuter[u] = 0.0;
-                        }
-                        if (VB->TexCoordPtr[u]->size > 2) {
-                           u0 = VB->TexCoordPtr[u]->data[vLower][2] * invW;
-                           uLeft[u] = u0 + (dudx[u] * adjx + dudy[u] * adjy) * (1.0F/FIXED_SCALE);
-                           duOuter[u] = dudy[u] + dxOuter * dudx[u];
-                        }
-                        else {
-                           uLeft[u] = duOuter[u] = 0.0;
-                        }
-                        if (VB->TexCoordPtr[u]->size > 3) {
-                           v0 = VB->TexCoordPtr[u]->data[vLower][3] * invW;
-                        }
-                        else {
-                           v0 =  invW;
-                        }
+                       t0 = vLower->texcoord[u][1] * invW;
+                       tLeft[u] = t0 + (dtdx[u] * adjx + dtdy[u] * adjy) * (1.0F/FIXED_SCALE);
+                       dtOuter[u] = dtdy[u] + dxOuter * dtdx[u];
+                       u0 = vLower->texcoord[u][2] * invW;
+                       uLeft[u] = u0 + (dudx[u] * adjx + dudy[u] * adjy) * (1.0F/FIXED_SCALE);
+                       duOuter[u] = dudy[u] + dxOuter * dudx[u];
+                       v0 = vLower->texcoord[u][3] * invW;
                         vLeft[u] = v0 + (dvdx[u] * adjx + dvdy[u] * adjy) * (1.0F/FIXED_SCALE);
                         dvOuter[u] = dvdy[u] + dxOuter * dvdx[u];
                      }
             {
                GLuint u;
                for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                  if (ctx->Texture.Unit[u].ReallyEnabled) {
+                  if (ctx->Texture.Unit[u]._ReallyEnabled) {
                      dsInner[u] = dsOuter[u] + dsdx[u];
                      dtInner[u] = dtOuter[u] + dtdx[u];
                      duInner[u] = duOuter[u] + dudx[u];
                {
                   GLuint u;
                   for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                     if (ctx->Texture.Unit[u].ReallyEnabled) {
+                     if (ctx->Texture.Unit[u]._ReallyEnabled) {
                         ss[u] = sLeft[u];
                         tt[u] = tLeft[u];
                         uu[u] = uLeft[u];
                   {
                      GLuint u;
                      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                        if (ctx->Texture.Unit[u].ReallyEnabled) {
+                        if (ctx->Texture.Unit[u]._ReallyEnabled) {
                            sLeft[u] += dsOuter[u];
                            tLeft[u] += dtOuter[u];
                            uLeft[u] += duOuter[u];
                   {
                      GLuint u;
                      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
-                        if (ctx->Texture.Unit[u].ReallyEnabled) {
+                        if (ctx->Texture.Unit[u]._ReallyEnabled) {
                            sLeft[u] += dsInner[u];
                            tLeft[u] += dtInner[u];
                            uLeft[u] += duInner[u];
index 3520fd506ac6a1a9812c490dd7f3d3219f2a39f0..890adb1c613bc268e9e53433cffe347e309c0bdc 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: s_zoom.c,v 1.1 2000/10/31 18:00:05 keithw Exp $ */
+/* $Id: s_zoom.c,v 1.2 2000/11/05 18:24:41 keithw Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -27,6 +27,7 @@
 #include "glheader.h"
 #include "macros.h"
 
+#include "s_context.h"
 #include "s_span.h"
 #include "s_stencil.h"
 #include "s_zoom.h"
index 4e8627e695595b2e611bcd77076863742f8fe859..c567d7997848524accca86f75321c50e9d2bf07b 100644 (file)
@@ -1,13 +1,83 @@
+/*
+ * Mesa 3-D graphics library
+ * Version:  3.5
+ * 
+ * Copyright (C) 1999  Brian Paul   All Rights Reserved.
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Keith Whitwell <keithw@valinux.com>
+ */
+
 #ifndef SWRAST_H
 #define SWRAST_H
 
 #include "types.h"
 
-/* These are the functions exported from swrast.  (more to come)
+/* The software rasterizer now uses this format for vertices.  Thus a
+ * 'RasterSetup' stage or other translation is required between the
+ * tnl module and the swrast rasterization functions.  This serves to
+ * isolate the swrast module from the internals of the tnl module, and
+ * improve its usefulness as a fallback mechanism for hardware
+ * drivers.
+ *
+ * Full software drivers:
+ *   - Register the rastersetup and triangle functions from 
+ *     utils/software_helper.
+ *   - On statechange, update the rasterization pointers in that module.
+ * 
+ * Rasterization hardware drivers:
+ *   - Keep native rastersetup.
+ *   - Implement native twoside,offset and unfilled triangle setup.
+ *   - Implement a translator from native vertices to swrast vertices.
+ *   - On partial fallback (mix of accelerated and unaccelerated
+ *   prims), call a pass-through function which translates native
+ *   vertices to SWvertices and calls the appropriate swrast function.
+ *   - On total fallback (vertex format insufficient for state or all
+ *     primitives unaccelerated), hook in swrast_setup instead. 
+ */
+typedef struct {
+   GLfloat win[4];
+   GLfloat eye[4];             /* for GL_EXT_point_param only */
+   GLfloat texcoord[MAX_TEXTURE_UNITS][4];
+   GLchan color[4];
+   GLchan specular[4];
+   GLfloat fog;
+   GLuint index;
+} SWvertex;
+
+
+
+
+/* These are the public-access functions exported from swrast.  
  */
 void
 _swrast_alloc_buffers( GLcontext *ctx );
 
+GLboolean
+_swrast_CreateContext( GLcontext *ctx );
+
+void
+_swrast_DestroyContext( GLcontext *ctx );
+
+
+
 
 void 
 _swrast_Bitmap( GLcontext *ctx, 
@@ -47,62 +117,35 @@ _swrast_Accum( GLcontext *ctx, GLenum op,
               GLfloat value, GLint xpos, GLint ypos, 
               GLint width, GLint height );
 
-void 
-_swrast_set_line_function( GLcontext *ctx );
-
-void 
-_swrast_set_point_function( GLcontext *ctx );
-
-void 
-_swrast_set_triangle_function( GLcontext *ctx );
-
-void 
-_swrast_set_quad_function( GLcontext *ctx );
-
-void 
-_swrast_flush( GLcontext *ctx );
-
-GLboolean
-_swrast_create_context( GLcontext *ctx );
-
-void
-_swrast_destroy_context( GLcontext *ctx );
+/* Get a pointer to the stipple counter.
+ */
+GLuint *
+_swrast_get_stipple_counter_ref( GLcontext *ctx );
 
 
-/* Replace:
+/* These will always render the correct point/line/triangle for the
+ * current state.
  */
 void
-_swrast_set_texture_sampler( struct gl_texture_object *t );
-
-
+_swrast_Point( GLcontext *ctx, SWvertex *v );
 
-#define _SWRAST_NEW_TRIANGLE (_NEW_RENDERMODE|         \
-                              _NEW_POLYGON|            \
-                              _NEW_DEPTH|              \
-                              _NEW_STENCIL|            \
-                              _NEW_COLOR|              \
-                              _NEW_TEXTURE|            \
-                              _NEW_HINT|               \
-                              _SWRAST_NEW_RASTERMASK|  \
-                              _NEW_LIGHT|              \
-                              _NEW_FOG)
-
-#define _SWRAST_NEW_LINE (_NEW_RENDERMODE|     \
-                          _NEW_LINE|           \
-                          _NEW_TEXTURE|                \
-                          _NEW_LIGHT|          \
-                          _NEW_FOG|            \
-                          _NEW_DEPTH)
-
-#define _SWRAST_NEW_POINT (_NEW_RENDERMODE |   \
-                          _NEW_POINT |         \
-                          _NEW_TEXTURE |       \
-                          _NEW_LIGHT |         \
-                          _NEW_FOG)
+void
+_swrast_Line( GLcontext *ctx, SWvertex *v0, SWvertex *v1 );
 
+void
+_swrast_Triangle( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2 );
 
+void
+_swrast_Quad( GLcontext *ctx, SWvertex *v0, SWvertex *v1, SWvertex *v2, 
+             SWvertex *v3);
 
+void 
+_swrast_flush( GLcontext *ctx );
 
 
+/* Tell the software rasterizer about core state changes.
+ */
+void
+_swrast_InvalidateState( GLcontext *ctx, GLuint new_state );
 
 #endif