s_aatritemp.h revision 8f95d790daee7c012364d689e7d86524340469c1
18f95d790daee7c012364d689e7d86524340469c1Brian Paul/* $Id: s_aatritemp.h,v 1.32 2003/01/20 00:25:17 brianp Exp $ */
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
5610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul * Version:  5.1
622144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
78f95d790daee7c012364d689e7d86524340469c1Brian Paul * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
9e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a
10e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * copy of this software and associated documentation files (the "Software"),
11e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * to deal in the Software without restriction, including without limitation
12e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * the rights to use, copy, modify, merge, publish, distribute, sublicense,
13e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * and/or sell copies of the Software, and to permit persons to whom the
14e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Software is furnished to do so, subject to the following conditions:
1522144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
1822144ab7552f0799bcfca506bf4ffa7f70a06649Gareth Hughes *
19e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
22e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
23e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
26e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
27e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
28e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
29e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Antialiased Triangle Rasterizer Template
30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This file is #include'd to generate custom AA triangle rasterizers.
32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * NOTE: this code hasn't been optimized yet.  That'll come after it
33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * works correctly.
34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The following macros may be defined to indicate what auxillary information
36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * must be copmuted across the triangle:
37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DO_Z         - if defined, compute Z values
38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DO_RGBA      - if defined, compute RGBA values
39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DO_INDEX     - if defined, compute color index values
40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DO_SPEC      - if defined, compute specular RGB values
41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DO_TEX       - if defined, compute unit 0 STRQ texcoords
42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *    DO_MULTITEX  - if defined, compute all unit's STRQ texcoords
43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
44e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*void triangle( GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint pv )*/
46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
47cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   const GLfloat *p0 = v0->win;
48cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   const GLfloat *p1 = v1->win;
49cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell   const GLfloat *p2 = v2->win;
50a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul   const SWvertex *vMin, *vMid, *vMax;
51ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   GLint iyMin, iyMax;
52ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   GLfloat yMin, yMax;
53ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   GLboolean ltor;
54ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   GLfloat majDx, majDy;  /* major (i.e. long) edge dx and dy */
5510f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
5677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   struct sw_span span;
5710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_Z
5947cf442c1164b6b406117fccfb8b564602741ee3Brian Paul   GLfloat zPlane[4];
6080532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#endif
6180532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#ifdef DO_FOG
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat fogPlane[4];
6380532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#else
6480532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul   GLfloat *fog = NULL;
65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_RGBA
6747cf442c1164b6b406117fccfb8b564602741ee3Brian Paul   GLfloat rPlane[4], gPlane[4], bPlane[4], aPlane[4];
68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_INDEX
7047cf442c1164b6b406117fccfb8b564602741ee3Brian Paul   GLfloat iPlane[4];
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_SPEC
7347cf442c1164b6b406117fccfb8b564602741ee3Brian Paul   GLfloat srPlane[4], sgPlane[4], sbPlane[4];
74e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_TEX
76e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat sPlane[4], tPlane[4], uPlane[4], vPlane[4];
77e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat texWidth, texHeight;
78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif defined(DO_MULTITEX)
79610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLfloat sPlane[MAX_TEXTURE_COORD_UNITS][4];  /* texture S */
80610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLfloat tPlane[MAX_TEXTURE_COORD_UNITS][4];  /* texture T */
81610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLfloat uPlane[MAX_TEXTURE_COORD_UNITS][4];  /* texture R */
82610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLfloat vPlane[MAX_TEXTURE_COORD_UNITS][4];  /* texture Q */
83610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLfloat texWidth[MAX_TEXTURE_COORD_UNITS];
84610d59981a9f43fefe29b34ef19c184d28e2bef5Brian Paul   GLfloat texHeight[MAX_TEXTURE_COORD_UNITS];
85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
86ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   GLfloat bf = SWRAST_CONTEXT(ctx)->_backface_sign;
8710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
8810f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
89b7f5e92f1749ce4601a758f66ddc64959f11742bBrian Paul   INIT_SPAN(span, GL_POLYGON, 0, 0, SPAN_COVERAGE);
902a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul
91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* determine bottom to top order of vertices */
92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
93cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfloat y0 = v0->win[1];
94cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfloat y1 = v1->win[1];
95cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      GLfloat y2 = v2->win[1];
96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (y0 <= y1) {
97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (y1 <= y2) {
98e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v0;   vMid = v1;   vMax = v2;   /* y0<=y1<=y2 */
99e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else if (y2 <= y0) {
101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v2;   vMid = v0;   vMax = v1;   /* y2<=y0<=y1 */
102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v0;   vMid = v2;   vMax = v1;  bf = -bf; /* y0<=y2<=y1 */
105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (y0 <= y2) {
109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v1;   vMid = v0;   vMax = v2;  bf = -bf; /* y1<=y0<=y2 */
110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else if (y2 <= y1) {
112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v2;   vMid = v1;   vMax = v0;  bf = -bf; /* y2<=y1<=y0 */
113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    vMin = v1;   vMid = v2;   vMax = v0;   /* y1<=y2<=y0 */
116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
120ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   majDx = vMax->win[0] - vMin->win[0];
121ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   majDy = vMax->win[1] - vMin->win[1];
122ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul
123ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   {
124ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat botDx = vMid->win[0] - vMin->win[0];
125ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat botDy = vMid->win[1] - vMin->win[1];
126ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat area = majDx * botDy - botDx * majDy;
127ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      ltor = (GLboolean) (area < 0.0F);
128ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      /* Do backface culling */
129ef4f5b391e560e535b25b372f797e41edeef09f1Keith Whitwell      if (area * bf < 0 || area == 0 || IS_INF_OR_NAN(area))
130ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul	 return;
131ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   }
132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifndef DO_OCCLUSION_TEST
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   ctx->OcclusionResult = GL_TRUE;
135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
13780532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul   /* Plane equation setup:
13880532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    * We evaluate plane equations at window (x,y) coordinates in order
13980532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    * to compute color, Z, fog, texcoords, etc.  This isn't terribly
140ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul    * efficient but it's easy and reliable.
14180532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    */
142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_Z
143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   compute_plane(p0, p1, p2, p0[2], p1[2], p2[2], zPlane);
14477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= SPAN_Z;
14580532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#endif
14680532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#ifdef DO_FOG
14780532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul   compute_plane(p0, p1, p2, v0->fog, v1->fog, v2->fog, fogPlane);
14877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= SPAN_FOG;
149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_RGBA
151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (ctx->Light.ShadeModel == GL_SMOOTH) {
1528f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->color[RCOMP], v1->color[RCOMP], v2->color[RCOMP], rPlane);
1538f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->color[GCOMP], v1->color[GCOMP], v2->color[GCOMP], gPlane);
1548f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->color[BCOMP], v1->color[BCOMP], v2->color[BCOMP], bPlane);
1558f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->color[ACOMP], v1->color[ACOMP], v2->color[ACOMP], aPlane);
156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
15858e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->color[RCOMP], rPlane);
15958e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->color[GCOMP], gPlane);
16058e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->color[BCOMP], bPlane);
16158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->color[ACOMP], aPlane);
162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
16377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= SPAN_RGBA;
164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_INDEX
166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (ctx->Light.ShadeModel == GL_SMOOTH) {
1677c4268176eaaeb45003db4d5042a518b84c9f6dcKarl Schultz      compute_plane(p0, p1, p2, (GLfloat) v0->index,
1687c4268176eaaeb45003db4d5042a518b84c9f6dcKarl Schultz                    (GLfloat) v1->index, (GLfloat) v2->index, iPlane);
169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
1717c4268176eaaeb45003db4d5042a518b84c9f6dcKarl Schultz      constant_plane((GLfloat) v2->index, iPlane);
172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
17377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= SPAN_INDEX;
174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_SPEC
17658e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   if (ctx->Light.ShadeModel == GL_SMOOTH) {
1778f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->specular[RCOMP], v1->specular[RCOMP], v2->specular[RCOMP], srPlane);
1788f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->specular[GCOMP], v1->specular[GCOMP], v2->specular[GCOMP], sgPlane);
1798f95d790daee7c012364d689e7d86524340469c1Brian Paul      compute_plane(p0, p1, p2, v0->specular[BCOMP], v1->specular[BCOMP], v2->specular[BCOMP], sbPlane);
180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
18158e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   else {
18258e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->specular[RCOMP], srPlane);
18358e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->specular[GCOMP], sgPlane);
18458e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell      constant_plane(v2->specular[BCOMP], sbPlane);
18558e991705392a2e17a1c8b034f4083a0adaf1943Keith Whitwell   }
18677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= SPAN_SPEC;
187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_TEX
189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
190cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const struct gl_texture_object *obj = ctx->Texture.Unit[0]._Current;
191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];
192cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat invW0 = v0->win[3];
193cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat invW1 = v1->win[3];
194cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat invW2 = v2->win[3];
195cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat s0 = v0->texcoord[0][0] * invW0;
196cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat s1 = v1->texcoord[0][0] * invW1;
197cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat s2 = v2->texcoord[0][0] * invW2;
198cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat t0 = v0->texcoord[0][1] * invW0;
199cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat t1 = v1->texcoord[0][1] * invW1;
200cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat t2 = v2->texcoord[0][1] * invW2;
201cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat r0 = v0->texcoord[0][2] * invW0;
202cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat r1 = v1->texcoord[0][2] * invW1;
203cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat r2 = v2->texcoord[0][2] * invW2;
204cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat q0 = v0->texcoord[0][3] * invW0;
205cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat q1 = v1->texcoord[0][3] * invW1;
206cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell      const GLfloat q2 = v2->texcoord[0][3] * invW2;
207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      compute_plane(p0, p1, p2, s0, s1, s2, sPlane);
208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      compute_plane(p0, p1, p2, t0, t1, t2, tPlane);
209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      compute_plane(p0, p1, p2, r0, r1, r2, uPlane);
210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      compute_plane(p0, p1, p2, q0, q1, q2, vPlane);
211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texWidth = (GLfloat) texImage->Width;
212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texHeight = (GLfloat) texImage->Height;
213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
21477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif defined(DO_MULTITEX)
216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {
217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLuint u;
218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (u = 0; u < ctx->Const.MaxTextureUnits; u++) {
219cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell         if (ctx->Texture.Unit[u]._ReallyEnabled) {
220cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const struct gl_texture_object *obj = ctx->Texture.Unit[u]._Current;
221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            const struct gl_texture_image *texImage = obj->Image[obj->BaseLevel];
222cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat invW0 = v0->win[3];
223cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat invW1 = v1->win[3];
224cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat invW2 = v2->win[3];
225cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat s0 = v0->texcoord[u][0] * invW0;
226cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat s1 = v1->texcoord[u][0] * invW1;
227cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat s2 = v2->texcoord[u][0] * invW2;
228cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat t0 = v0->texcoord[u][1] * invW0;
229cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat t1 = v1->texcoord[u][1] * invW1;
230cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat t2 = v2->texcoord[u][1] * invW2;
231cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat r0 = v0->texcoord[u][2] * invW0;
232cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat r1 = v1->texcoord[u][2] * invW1;
233cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat r2 = v2->texcoord[u][2] * invW2;
234cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat q0 = v0->texcoord[u][3] * invW0;
235cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat q1 = v1->texcoord[u][3] * invW1;
236cd03ed4f54444d96e4e47cdb118a3dfd94d92bb0Keith Whitwell            const GLfloat q2 = v2->texcoord[u][3] * invW2;
237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            compute_plane(p0, p1, p2, s0, s1, s2, sPlane[u]);
238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            compute_plane(p0, p1, p2, t0, t1, t2, tPlane[u]);
239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            compute_plane(p0, p1, p2, r0, r1, r2, uPlane[u]);
240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            compute_plane(p0, p1, p2, q0, q1, q2, vPlane[u]);
241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            texWidth[u]  = (GLfloat) texImage->Width;
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            texHeight[u] = (GLfloat) texImage->Height;
243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
24677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul   span.arrayMask |= (SPAN_TEXTURE | SPAN_LAMBDA);
247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
24980532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul   /* Begin bottom-to-top scan over the triangle.
25080532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    * The long edge will either be on the left or right side of the
25180532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    * triangle.  We always scan from the long edge toward the shorter
25280532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    * edges, stopping when we find that coverage = 0.  If the long edge
25380532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    * is on the left we scan left-to-right.  Else, we scan right-to-left.
25480532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul    */
255ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   yMin = vMin->win[1];
256ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   yMax = vMax->win[1];
257ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   iyMin = (GLint) yMin;
258ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   iyMax = (GLint) yMax + 1;
259ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul
260ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   if (ltor) {
261ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      /* scan left to right */
262ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat *pMin = vMin->win;
263ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat *pMid = vMid->win;
264ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat *pMax = vMax->win;
265ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat dxdy = majDx / majDy;
266ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat xAdj = dxdy < 0.0F ? -dxdy : 0.0F;
267ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      GLfloat x = pMin[0] - (yMin - iyMin) * dxdy;
268470a7b48745d0e467973c9b9d751a8be4abec0e6Brian Paul      GLint iy;
269ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      for (iy = iyMin; iy < iyMax; iy++, x += dxdy) {
270ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         GLint ix, startX = (GLint) (x - xAdj);
271f1e236987829393c81dc86ea19cb49eefe190317Brian Paul         GLuint count;
272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat coverage = 0.0F;
27310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
274ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         /* skip over fragments with zero coverage */
275ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         while (startX < MAX_WIDTH) {
276ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            coverage = compute_coveragef(pMin, pMid, pMax, startX, iy);
277ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            if (coverage > 0.0F)
278ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               break;
279ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            startX++;
280f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul         }
281f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul
282ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         /* enter interior of triangle */
283ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         ix = startX;
284ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         count = 0;
285ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         while (coverage > 0.0F) {
286ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            /* (cx,cy) = center of fragment */
287ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
28877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            struct span_arrays *array = span.array;
289ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#ifdef DO_INDEX
29077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->coverage[count] = (GLfloat) compute_coveragei(pMin, pMid, pMax, ix, iy);
291ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#else
29277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->coverage[count] = coverage;
293f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#endif
294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_Z
29577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->z[count] = (GLdepth) solve_plane(cx, cy, zPlane);
29680532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#endif
29780532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#ifdef DO_FOG
29877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul	    array->fog[count] = solve_plane(cx, cy, fogPlane);
299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_RGBA
30177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[count][RCOMP] = solve_plane_chan(cx, cy, rPlane);
30277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[count][GCOMP] = solve_plane_chan(cx, cy, gPlane);
30377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[count][BCOMP] = solve_plane_chan(cx, cy, bPlane);
30477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[count][ACOMP] = solve_plane_chan(cx, cy, aPlane);
305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_INDEX
30777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->index[count] = (GLint) solve_plane(cx, cy, iPlane);
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_SPEC
31077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->spec[count][RCOMP] = solve_plane_chan(cx, cy, srPlane);
31177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->spec[count][GCOMP] = solve_plane_chan(cx, cy, sgPlane);
31277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->spec[count][BCOMP] = solve_plane_chan(cx, cy, sbPlane);
313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_TEX
315ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            {
316ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               const GLfloat invQ = solve_plane_recip(cx, cy, vPlane);
31777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->texcoords[0][count][0] = solve_plane(cx, cy, sPlane) * invQ;
31877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->texcoords[0][count][1] = solve_plane(cx, cy, tPlane) * invQ;
31977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->texcoords[0][count][2] = solve_plane(cx, cy, uPlane) * invQ;
32077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->lambda[0][count] = compute_lambda(sPlane, tPlane, vPlane,
32131f12f504e61cb2ad65b8890a68eb7154edcb64bBrian Paul                                                      cx, cy, invQ,
32210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul                                                      texWidth, texHeight);
323ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            }
324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif defined(DO_MULTITEX)
325ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            {
326ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               GLuint unit;
327ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
328ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                  if (ctx->Texture.Unit[unit]._ReallyEnabled) {
329ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                     GLfloat invQ = solve_plane_recip(cx, cy, vPlane[unit]);
33077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][count][0] = solve_plane(cx, cy, sPlane[unit]) * invQ;
33177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][count][1] = solve_plane(cx, cy, tPlane[unit]) * invQ;
33277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][count][2] = solve_plane(cx, cy, uPlane[unit]) * invQ;
33377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->lambda[unit][count] = compute_lambda(sPlane[unit],
33431f12f504e61cb2ad65b8890a68eb7154edcb64bBrian Paul                                      tPlane[unit], vPlane[unit], cx, cy, invQ,
33531f12f504e61cb2ad65b8890a68eb7154edcb64bBrian Paul                                      texWidth[unit], texHeight[unit]);
336ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                  }
337ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               }
338ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            }
339ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#endif
340ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            ix++;
341ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            count++;
342ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            coverage = compute_coveragef(pMin, pMid, pMax, ix, iy);
343ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         }
34410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
345ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         if (ix <= startX)
346ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            continue;
34710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
34877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         span.x = startX;
34977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         span.y = iy;
35077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         span.end = (GLuint) ix - (GLuint) startX;
35177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         ASSERT(span.interpMask == 0);
352f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#if defined(DO_MULTITEX) || defined(DO_TEX)
35377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         _mesa_write_texture_span(ctx, &span);
354ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#elif defined(DO_RGBA)
35577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         _mesa_write_rgba_span(ctx, &span);
356ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#elif defined(DO_INDEX)
35777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         _mesa_write_index_span(ctx, &span);
358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
359ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      }
360ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   }
361ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul   else {
362ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      /* scan right to left */
363ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat *pMin = vMin->win;
364ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat *pMid = vMid->win;
365ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat *pMax = vMax->win;
366ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat dxdy = majDx / majDy;
367ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      const GLfloat xAdj = dxdy > 0 ? dxdy : 0.0F;
368ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      GLfloat x = pMin[0] - (yMin - iyMin) * dxdy;
369ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      GLint iy;
370ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      for (iy = iyMin; iy < iyMax; iy++, x += dxdy) {
371ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         GLint ix, left, startX = (GLint) (x + xAdj);
372ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         GLuint count, n;
373ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         GLfloat coverage = 0.0F;
37410f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
375ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         /* make sure we're not past the window edge */
376ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         if (startX >= ctx->DrawBuffer->_Xmax) {
377ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            startX = ctx->DrawBuffer->_Xmax - 1;
378ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         }
379d082417daeb3f8a35a490eb44b6c88463289fa5dBrian Paul
380ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         /* skip fragments with zero coverage */
381ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         while (startX >= 0) {
382ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            coverage = compute_coveragef(pMin, pMax, pMid, startX, iy);
383ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            if (coverage > 0.0F)
384ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               break;
385ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            startX--;
386ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         }
38710f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
388ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         /* enter interior of triangle */
389ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         ix = startX;
390ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         count = 0;
391ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         while (coverage > 0.0F) {
392ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            /* (cx,cy) = center of fragment */
393ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            const GLfloat cx = ix + 0.5F, cy = iy + 0.5F;
39477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            struct span_arrays *array = span.array;
395ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#ifdef DO_INDEX
39677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->coverage[ix] = (GLfloat) compute_coveragei(pMin, pMax, pMid, ix, iy);
397ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#else
39877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->coverage[ix] = coverage;
399ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul#endif
400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_Z
40177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->z[ix] = (GLdepth) solve_plane(cx, cy, zPlane);
40280532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#endif
40380532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#ifdef DO_FOG
40477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->fog[ix] = solve_plane(cx, cy, fogPlane);
405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_RGBA
40777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[ix][RCOMP] = solve_plane_chan(cx, cy, rPlane);
40877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[ix][GCOMP] = solve_plane_chan(cx, cy, gPlane);
40977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[ix][BCOMP] = solve_plane_chan(cx, cy, bPlane);
41077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->rgba[ix][ACOMP] = solve_plane_chan(cx, cy, aPlane);
411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_INDEX
41377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->index[ix] = (GLint) solve_plane(cx, cy, iPlane);
414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_SPEC
41677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->spec[ix][RCOMP] = solve_plane_chan(cx, cy, srPlane);
41777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->spec[ix][GCOMP] = solve_plane_chan(cx, cy, sgPlane);
41877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            array->spec[ix][BCOMP] = solve_plane_chan(cx, cy, sbPlane);
419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_TEX
421ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            {
422ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               const GLfloat invQ = solve_plane_recip(cx, cy, vPlane);
42377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->texcoords[0][ix][0] = solve_plane(cx, cy, sPlane) * invQ;
42477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->texcoords[0][ix][1] = solve_plane(cx, cy, tPlane) * invQ;
42577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->texcoords[0][ix][2] = solve_plane(cx, cy, uPlane) * invQ;
42677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->lambda[0][ix] = compute_lambda(sPlane, tPlane, vPlane,
42731f12f504e61cb2ad65b8890a68eb7154edcb64bBrian Paul                                          cx, cy, invQ, texWidth, texHeight);
428ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            }
429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif defined(DO_MULTITEX)
430ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            {
431ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               GLuint unit;
432ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
433ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                  if (ctx->Texture.Unit[unit]._ReallyEnabled) {
434ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                     GLfloat invQ = solve_plane_recip(cx, cy, vPlane[unit]);
43577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][ix][0] = solve_plane(cx, cy, sPlane[unit]) * invQ;
43677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][ix][1] = solve_plane(cx, cy, tPlane[unit]) * invQ;
43777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][ix][2] = solve_plane(cx, cy, uPlane[unit]) * invQ;
43877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->lambda[unit][ix] = compute_lambda(sPlane[unit],
43910f30eb43835c57c00783390a02d72daf4f78e26Brian Paul                                                            tPlane[unit],
44031f12f504e61cb2ad65b8890a68eb7154edcb64bBrian Paul                                                            vPlane[unit],
44131f12f504e61cb2ad65b8890a68eb7154edcb64bBrian Paul                                                            cx, cy, invQ,
44210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul                                                            texWidth[unit],
44310f30eb43835c57c00783390a02d72daf4f78e26Brian Paul                                                            texHeight[unit]);
444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }
446ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            }
447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
448ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            ix--;
449ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            count++;
450ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            coverage = compute_coveragef(pMin, pMax, pMid, ix, iy);
451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
45210f30eb43835c57c00783390a02d72daf4f78e26Brian Paul
453ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         if (startX <= ix)
454ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            continue;
455ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul
456ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         n = (GLuint) startX - (GLuint) ix;
457ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul
458ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         left = ix + 1;
459f1e236987829393c81dc86ea19cb49eefe190317Brian Paul
460f1e236987829393c81dc86ea19cb49eefe190317Brian Paul         /* shift all values to the left */
461f1e236987829393c81dc86ea19cb49eefe190317Brian Paul         /* XXX this is temporary */
462f1e236987829393c81dc86ea19cb49eefe190317Brian Paul         {
46377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            struct span_arrays *array = span.array;
464f1e236987829393c81dc86ea19cb49eefe190317Brian Paul            GLint j;
465f1e236987829393c81dc86ea19cb49eefe190317Brian Paul            for (j = 0; j < (GLint) n; j++) {
466f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#ifdef DO_RGBA
46777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               COPY_4V(array->rgba[j], array->rgba[j + left]);
468f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
469f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#ifdef DO_SPEC
47077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               COPY_4V(array->spec[j], array->spec[j + left]);
471f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
472f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#ifdef DO_INDEX
47377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->index[j] = array->index[j + left];
474f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
475f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#ifdef DO_Z
47677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->z[j] = array->z[j + left];
477f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
478f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#ifdef DO_FOG
47977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->fog[j] = array->fog[j + left];
480f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
481f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#ifdef DO_TEX
48277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               COPY_4V(array->texcoords[0][j], array->texcoords[0][j + left]);
483f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
484f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#if defined(DO_MULTITEX) || defined(DO_TEX)
48577df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->lambda[0][j] = array->lambda[0][j + left];
486f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
48777df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul               array->coverage[j] = array->coverage[j + left];
488f1e236987829393c81dc86ea19cb49eefe190317Brian Paul            }
489f1e236987829393c81dc86ea19cb49eefe190317Brian Paul         }
490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_MULTITEX
491f1e236987829393c81dc86ea19cb49eefe190317Brian Paul         /* shift texcoords */
492ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         {
49377df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul            struct span_arrays *array = span.array;
494ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            GLuint unit;
495ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
496ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               if (ctx->Texture.Unit[unit]._ReallyEnabled) {
497ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                  GLint j;
498ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                  for (j = 0; j < (GLint) n; j++) {
49977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul		     array->texcoords[unit][j][0] = array->texcoords[unit][j + left][0];
50077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][j][1] = array->texcoords[unit][j + left][1];
50177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->texcoords[unit][j][2] = array->texcoords[unit][j + left][2];
50277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul                     array->lambda[unit][j] = array->lambda[unit][j + left];
503ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul                  }
504ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul               }
505ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul            }
506ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul         }
507f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#endif
5082a182a98973edc9ecf2936b1288485bb2b3fa722Brian Paul
50977df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         span.x = left;
51077df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         span.y = iy;
51177df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         span.end = n;
51277df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         ASSERT(span.interpMask == 0);
513f1e236987829393c81dc86ea19cb49eefe190317Brian Paul#if defined(DO_MULTITEX) || defined(DO_TEX)
51477df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         _mesa_write_texture_span(ctx, &span);
515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif defined(DO_RGBA)
51677df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         _mesa_write_rgba_span(ctx, &span);
517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#elif defined(DO_INDEX)
51877df88727cb0a423dd5cb41498c2302d9df4fce7Brian Paul         _mesa_write_index_span(ctx, &span);
519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
520ee6cf4c6b081dbad7366b80637718d068530d79cBrian Paul      }
521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_Z
526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_Z
527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
52980532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#ifdef DO_FOG
53080532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#undef DO_FOG
53180532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul#endif
53280532da3bf2a83448c6f38c34dbaf32898acea2dBrian Paul
533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_RGBA
534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_RGBA
535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_INDEX
538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_INDEX
539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_SPEC
542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_SPEC
543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_TEX
546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_TEX
547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_MULTITEX
550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_MULTITEX
551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#ifdef DO_OCCLUSION_TEST
554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DO_OCCLUSION_TEST
555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
556