s_triangle.c revision e3a051e0538a605551f4d58294c94f5eb00ed07f
1e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* $Id: s_triangle.c,v 1.1 2000/10/31 18:00:04 keithw Exp $ */
2e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
3e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
4e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Mesa 3-D graphics library
5e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Version:  3.5
6e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
7e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
8e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
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:
15e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
16e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The above copyright notice and this permission notice shall be included
17e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * in all copies or substantial portions of the Software.
18e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
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 * Triangle rasterizers
30e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * When the device driver doesn't implement triangle rasterization Mesa
31e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * will use these functions to draw triangles.
32e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
33e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
34e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
35e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "glheader.h"
36e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "context.h"
37e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "feedback.h"
38e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "macros.h"
39e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mem.h"
40e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "mmath.h"
41e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "teximage.h"
42e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "texstate.h"
43e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
44e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_aatriangle.h"
45e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_depth.h"
46e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_span.h"
47e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
48e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic GLboolean cull_triangle( GLcontext *ctx,
49e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			    GLuint v0, GLuint v1, GLuint v2, GLuint pv )
50e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
51e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct vertex_buffer *VB = ctx->VB;
52e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat (*win)[4] = VB->Win.data;
53e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat ex = win[v1][0] - win[v0][0];
54e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat ey = win[v1][1] - win[v0][1];
55e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat fx = win[v2][0] - win[v0][0];
56e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat fy = win[v2][1] - win[v0][1];
57e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat c = ex*fy-ey*fx;
58e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
59e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (c * ctx->backface_sign > 0)
60e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return 0;
61e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
62e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   return 1;
63e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
64e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
65e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
66e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
67e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a flat-shaded color index triangle.
68e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
69e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_ci_triangle( GLcontext *ctx,
70e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                              GLuint v0, GLuint v1, GLuint v2, GLuint pv )
71e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
72e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
73e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE				\
74e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLuint index = VB->IndexPtr->data[pv];	\
75e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (1) {					\
76e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* set the color index */			\
77e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      (*ctx->Driver.Index)( ctx, index );	\
78e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
79e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
80e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
81e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
82e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   const GLint n = RIGHT-LEFT;				\
83e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;				                \
84e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];				\
85e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];				\
86e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
87e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      for (i=0;i<n;i++) {				\
88e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 zspan[i] = FixedToDepth(ffz);			\
89e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffz += fdzdx;					\
90e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fogspan[i] = fffog / 256;			\
91e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fffog += fdfogdx;				\
92e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }							\
93e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_monoindex_span( ctx, n, LEFT, Y, zspan,	\
94e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                         fogspan, index, GL_POLYGON );	\
95e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
96e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
97e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
98e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
99e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded color index triangle.
105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_ci_triangle( GLcontext *ctx,
107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                GLuint v0, GLuint v1, GLuint v2, GLuint pv )
108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;
110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INDEX 1
112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   const GLint n = RIGHT-LEFT;				\
116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;				                \
117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];				\
118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLfixed fogspan[MAX_WIDTH];				\
119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLuint index[MAX_WIDTH];				\
120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      for (i=0;i<n;i++) {				\
122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 zspan[i] = FixedToDepth(ffz);			\
123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffz += fdzdx;					\
124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 index[i] = FixedToInt(ffi);			\
125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffi += fdidx;					\
126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fogspan[i] = fffog / 256;			\
127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fffog += fdfogdx;				\
128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }							\
129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_index_span( ctx, n, LEFT, Y, zspan, fogspan,	\
130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                           index, GL_POLYGON );		\
131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a flat-shaded RGBA triangle.
141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void flat_rgba_triangle( GLcontext *ctx,
143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                GLuint v0, GLuint v1, GLuint v2, GLuint pv )
144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE				\
149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (1) {					\
150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* set the color */			\
151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan r = VB->ColorPtr->data[pv][0];	\
152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan g = VB->ColorPtr->data[pv][1];	\
153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan b = VB->ColorPtr->data[pv][2];	\
154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan a = VB->ColorPtr->data[pv][3];	\
155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      (*ctx->Driver.Color)( ctx, r, g, b, a );	\
156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   const GLint n = RIGHT-LEFT;				\
161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;						\
162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];				\
163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];				\
164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      for (i=0;i<n;i++) {				\
166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 zspan[i] = FixedToDepth(ffz);			\
167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffz += fdzdx;					\
168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fogspan[i] = fffog / 256;			\
169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fffog += fdfogdx;				\
170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }							\
171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              gl_write_monocolor_span( ctx, n, LEFT, Y, zspan,	\
172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       fogspan, \
173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       VB->ColorPtr->data[pv],	\
174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			               GL_POLYGON );		\
175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   ASSERT(!ctx->Texture.ReallyEnabled);  /* texturing must be off */
181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   ASSERT(ctx->Light.ShadeModel==GL_FLAT);
182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded RGBA triangle.
188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void smooth_rgba_triangle( GLcontext *ctx,
190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                  GLuint v0, GLuint v1, GLuint v2, GLuint pv )
191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;
193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   const GLint n = RIGHT-LEFT;                          \
201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;				                \
202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];				\
203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan rgba[MAX_WIDTH][4];				\
204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];				\
205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      for (i=0;i<n;i++) {				\
207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 zspan[i] = FixedToDepth(ffz);			\
208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 rgba[i][RCOMP] = FixedToInt(ffr);		\
209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 rgba[i][GCOMP] = FixedToInt(ffg);		\
210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 rgba[i][BCOMP] = FixedToInt(ffb);		\
211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 rgba[i][ACOMP] = FixedToInt(ffa);		\
212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fogspan[i] = fffog / 256;			\
213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fffog += fdfogdx;				\
214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffz += fdzdx;					\
215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffr += fdrdx;					\
216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffg += fdgdx;					\
217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffb += fdbdx;					\
218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffa += fdadx;					\
219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }							\
220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_rgba_span( ctx, n, LEFT, Y,		\
221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                  (CONST GLdepth *) zspan,	\
222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                  fogspan,                      \
223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                          rgba, GL_POLYGON );		\
224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   ASSERT(!ctx->Texture.ReallyEnabled);  /* texturing must be off */
230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   ASSERT(ctx->Light.ShadeModel==GL_SMOOTH);
231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an RGB, GL_DECAL, textured triangle.
236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T only w/out mipmapping or perspective correction.
237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * No fog.
239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void simple_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLuint v2, GLuint pv )
242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INT_TEX 1
244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SCALE twidth
245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define T_SCALE theight
246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_object *obj = ctx->Texture.Unit[0].CurrentD[2];	\
248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint b = obj->BaseLevel;						\
249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan *texture = obj->Image[b]->Data;				\
253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint smask = obj->Image[b]->Width - 1;				\
254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint tmask = obj->Image[b]->Height - 1;				\
255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;								\
256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (!texture) {							\
257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (!_mesa_get_teximages_from_driver(ctx, obj))			\
258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;							\
259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texture = obj->Image[b]->Data;					\
260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ASSERT(texture);							\
261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   CONST GLint n = RIGHT-LEFT;				\
266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;				                \
267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan rgb[MAX_WIDTH][3];				\
268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ffs -= FIXED_HALF; /* off-by-one error? */        \
270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              fft -= FIXED_HALF;                                \
271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      for (i=0;i<n;i++) {				\
272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 GLint s = FixedToInt(ffs) & smask;		\
273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 GLint t = FixedToInt(fft) & tmask;		\
274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 GLint pos = (t << twidth_log2) + s;		\
275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 pos = pos + pos + pos;  /* multiply by 3 */	\
276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 rgb[i][RCOMP] = texture[pos];			\
277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 rgb[i][GCOMP] = texture[pos+1];		\
278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 rgb[i][BCOMP] = texture[pos+2];		\
279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffs += fdsdx;					\
280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fft += fdtdx;					\
281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }							\
282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              (*ctx->Driver.WriteRGBSpan)( ctx, n, LEFT, Y,	\
283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           (CONST GLchan (*)[3]) rgb, NULL );	\
284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an RGB, GL_DECAL, textured triangle.
293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T, GL_LESS depth test, w/out mipmapping or
294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * perspective correction.
295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * No fog.
297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void simple_z_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                        GLuint v2, GLuint pv )
300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INT_TEX 1
304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SCALE twidth
305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define T_SCALE theight
306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_object *obj = ctx->Texture.Unit[0].CurrentD[2];	\
308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint b = obj->BaseLevel;						\
309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan *texture = obj->Image[b]->Data;				\
313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint smask = obj->Image[b]->Width - 1;				\
314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint tmask = obj->Image[b]->Height - 1;				\
315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;								\
316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (!texture) {							\
317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (!_mesa_get_teximages_from_driver(ctx, obj))			\
318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;							\
319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texture = obj->Image[b]->Data;					\
320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ASSERT(texture);							\
321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   CONST GLint n = RIGHT-LEFT;                          \
326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;				                \
327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan rgb[MAX_WIDTH][3];				\
328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLubyte mask[MAX_WIDTH];				\
329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           (void) fffog;                                        \
330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ffs -= FIXED_HALF; /* off-by-one error? */        \
332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              fft -= FIXED_HALF;                                \
333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      for (i=0;i<n;i++) {				\
334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 GLdepth z = FixedToDepth(ffz);			\
335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 if (z < zRow[i]) {				\
336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    GLint s = FixedToInt(ffs) & smask;		\
337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    GLint t = FixedToInt(fft) & tmask;		\
338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    GLint pos = (t << twidth_log2) + s;		\
339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    pos = pos + pos + pos;  /* multiply by 3 */	\
340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    rgb[i][RCOMP] = texture[pos];		\
341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    rgb[i][GCOMP] = texture[pos+1];		\
342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    rgb[i][BCOMP] = texture[pos+2];		\
343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zRow[i] = z;				\
344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    mask[i] = 1;				\
345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 }						\
346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 else {						\
347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    mask[i] = 0;				\
348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 }						\
349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffz += fdzdx;					\
350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ffs += fdsdx;					\
351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 fft += fdtdx;					\
352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }							\
353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              (*ctx->Driver.WriteRGBSpan)( ctx, n, LEFT, Y,	\
354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           (CONST GLchan (*)[3]) rgb, mask );	\
355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an RGB/RGBA textured triangle without perspective correction.
365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void affine_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				      GLuint v2, GLuint pv )
368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_INT_TEX 1
374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define S_SCALE twidth
375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define T_SCALE theight
376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_unit *unit = ctx->Texture.Unit+0;			\
378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_object *obj = unit->CurrentD[2];			\
379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint b = obj->BaseLevel;						\
380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan *texture = obj->Image[b]->Data;				\
384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint smask = obj->Image[b]->Width - 1;				\
385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint tmask = obj->Image[b]->Height - 1;                             \
386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint format = obj->Image[b]->Format;                                \
387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint filter = obj->MinFilter;                                       \
388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint envmode = unit->EnvMode;                                       \
389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint comp, tbytesline, tsize;                                       \
390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfixed er, eg, eb, ea;                                              \
391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint tr, tg, tb, ta;                                                \
392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (!texture) {							\
393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (!_mesa_get_teximages_from_driver(ctx, obj))			\
394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;							\
395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texture = obj->Image[b]->Data;					\
396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ASSERT(texture);							\
397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (envmode == GL_BLEND || envmode == GL_ADD) {                      \
399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* potential off-by-one error here? (1.0f -> 2048 -> 0) */        \
400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      er = FloatToFixed(unit->EnvColor[0]);                             \
401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eg = FloatToFixed(unit->EnvColor[1]);                             \
402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eb = FloatToFixed(unit->EnvColor[2]);                             \
403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ea = FloatToFixed(unit->EnvColor[3]);                             \
404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                                    \
405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (format) {                                                    \
406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_ALPHA:                                                       \
407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_LUMINANCE:                                                   \
408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_INTENSITY:                                                   \
409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 1;                                                         \
410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_LUMINANCE_ALPHA:                                             \
412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 2;                                                         \
413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_RGB:                                                         \
415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 3;                                                         \
416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_RGBA:                                                        \
418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 4;                                                         \
419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   default:                                                             \
421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      gl_problem(NULL, "Bad texture format in affine_texture_triangle");\
422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;                                                           \
423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                                    \
424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tbytesline = obj->Image[b]->Width * comp;                            \
425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tsize = theight * tbytesline;
426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;
427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell  /* Instead of defining a function for each mode, a test is done
429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   * between the outer and inner loops. This is to reduce code size
430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   * and complexity. Observe that an optimizing compiler kills
431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   * unused variables (for instance tf,sf,ti,si in case of GL_NEAREST).
432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   */
433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGB    \
435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        tr = tex00[0]; \
436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        tg = tex00[1]; \
437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        tb = tex00[2]; \
438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        ta = 0xff
439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define LINEAR_RGB                                                      \
441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	tr = (ti * (si * tex00[0] + sf * tex01[0]) +                    \
442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \
443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	tg = (ti * (si * tex00[1] + sf * tex01[1]) +                    \
444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \
445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	tb = (ti * (si * tex00[2] + sf * tex01[2]) +                    \
446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \
447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	ta = 0xff
448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGBA   \
450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        tr = tex00[0]; \
451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        tg = tex00[1]; \
452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        tb = tex00[2]; \
453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        ta = tex00[3]
454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define LINEAR_RGBA                                                     \
456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	tr = (ti * (si * tex00[0] + sf * tex01[0]) +                    \
457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \
458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	tg = (ti * (si * tex00[1] + sf * tex01[1]) +                    \
459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \
460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	tb = (ti * (si * tex00[2] + sf * tex01[2]) +                    \
461e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \
462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	ta = (ti * (si * tex00[3] + sf * tex01[3]) +                    \
463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tf * (si * tex10[3] + sf * tex11[3])) >> 2 * FIXED_SHIFT
464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define MODULATE                                       \
466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[0] = ffr * (tr + 1) >> (FIXED_SHIFT + 8); \
467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[1] = ffg * (tg + 1) >> (FIXED_SHIFT + 8); \
468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[2] = ffb * (tb + 1) >> (FIXED_SHIFT + 8); \
469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8)
470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DECAL                                                                \
472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	dest[0] = ((0xff - ta) * ffr + ((ta + 1) * tr << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \
473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	dest[1] = ((0xff - ta) * ffg + ((ta + 1) * tg << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \
474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	dest[2] = ((0xff - ta) * ffb + ((ta + 1) * tb << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \
475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	dest[3] = FixedToInt(ffa)
476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define BLEND                                                               \
478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[0] = ((0xff - tr) * ffr + (tr + 1) * er) >> (FIXED_SHIFT + 8); \
479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[1] = ((0xff - tg) * ffg + (tg + 1) * eg) >> (FIXED_SHIFT + 8); \
480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[2] = ((0xff - tb) * ffb + (tb + 1) * eb) >> (FIXED_SHIFT + 8); \
481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8)
482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define REPLACE       \
484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[0] = tr; \
485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[1] = tg; \
486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[2] = tb; \
487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[3] = ta
488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define ADD                                                          \
490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[0] = ((ffr << 8) + (tr + 1) * er) >> (FIXED_SHIFT + 8); \
491e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[1] = ((ffg << 8) + (tg + 1) * eg) >> (FIXED_SHIFT + 8); \
492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[2] = ((ffb << 8) + (tb + 1) * eb) >> (FIXED_SHIFT + 8); \
493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8)
494e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* shortcuts */
496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGB_REPLACE  NEAREST_RGB;REPLACE
498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define NEAREST_RGBA_REPLACE  *(GLint *)dest = *(GLint *)tex00
500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN1(DO_TEX,COMP)                                 \
502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	for (i=0;i<n;i++) {                                \
503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint s = FixedToInt(ffs) & smask;              \
504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint t = FixedToInt(fft) & tmask;              \
505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint pos = (t << twidth_log2) + s;             \
506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex00 = texture + COMP * pos;           \
507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   zspan[i] = FixedToDepth(ffz);                   \
508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fogspan[i] = fffog / 256;                       \
509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           DO_TEX;                                         \
510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fffog += fdfogdx;                               \
511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffz += fdzdx;                                   \
512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           ffr += fdrdx;                                   \
513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffg += fdgdx;                                   \
514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           ffb += fdbdx;                                   \
515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffa += fdadx;                                   \
516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffs += fdsdx;                                   \
517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fft += fdtdx;                                   \
518e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           dest += 4;                                      \
519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN2(DO_TEX,COMP)                                 \
522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	for (i=0;i<n;i++) {                                \
523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint s = FixedToInt(ffs) & smask;              \
524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint t = FixedToInt(fft) & tmask;              \
525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint sf = ffs & FIXED_FRAC_MASK;               \
526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint tf = fft & FIXED_FRAC_MASK;               \
527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint si = FIXED_FRAC_MASK - sf;                \
528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint ti = FIXED_FRAC_MASK - tf;                \
529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint pos = (t << twidth_log2) + s;             \
530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex00 = texture + COMP * pos;           \
531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex10 = tex00 + tbytesline;             \
532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex01 = tex00 + COMP;                   \
533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex11 = tex10 + COMP;                   \
534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           if (t == tmask) {                               \
535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex10 -= tsize;                              \
536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex11 -= tsize;                              \
537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           }                                               \
538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           if (s == smask) {                               \
539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex01 -= tbytesline;                         \
540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex11 -= tbytesline;                         \
541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           }                                               \
542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   zspan[i] = FixedToDepth(ffz);                   \
543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fogspan[i] = fffog / 256;                       \
544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           DO_TEX;                                         \
545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fffog += fdfogdx;                               \
546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffz += fdzdx;                                   \
547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           ffr += fdrdx;                                   \
548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffg += fdgdx;                                   \
549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           ffb += fdbdx;                                   \
550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffa += fdadx;                                   \
551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffs += fdsdx;                                   \
552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fft += fdtdx;                                   \
553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           dest += 4;                                      \
554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* here comes the heavy part.. (something for the compiler to chew on) */
557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )	                   \
558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{				                   \
559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           CONST GLint n = RIGHT-LEFT;	                   \
560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;                                        \
561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];	                   \
562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];	                   \
563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan rgba[MAX_WIDTH][4];                      \
564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {                                      \
565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              GLchan *dest = rgba[0];                      \
566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ffs -= FIXED_HALF; /* off-by-one error? */   \
567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              fft -= FIXED_HALF;                           \
568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              switch (filter) {                            \
569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   	      case GL_NEAREST:                             \
570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 switch (format) {                         \
571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 case GL_RGB:                              \
572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	            switch (envmode) {                     \
573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	            case GL_MODULATE:                      \
574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGB;MODULATE,3);      \
575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
576e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	            case GL_DECAL:                         \
577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    case GL_REPLACE:                       \
578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGB_REPLACE,3);       \
579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    case GL_BLEND:                         \
581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGB;BLEND,3);         \
582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_ADD:                           \
584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN1(NEAREST_RGB;ADD,3);           \
585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    default: /* unexpected env mode */     \
587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       abort();                            \
588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	            }                                      \
589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    break;                                 \
590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 case GL_RGBA:                             \
591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    switch(envmode) {                      \
592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_MODULATE:                      \
593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGBA;MODULATE,4);     \
594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_DECAL:                         \
596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGBA;DECAL,4);        \
597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_BLEND:                         \
599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGBA;BLEND,4);        \
600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_ADD:                           \
602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN1(NEAREST_RGBA;ADD,4);          \
603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_REPLACE:                       \
605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN1(NEAREST_RGBA_REPLACE,4);      \
606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    default: /* unexpected env mode */     \
608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       abort();                            \
609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    }                                      \
610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    break;                                 \
611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	         }                                         \
612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 break;                                    \
613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      case GL_LINEAR:                              \
614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 ffs -= FIXED_HALF;                        \
615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 fft -= FIXED_HALF;                        \
616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 switch (format) {                         \
617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 case GL_RGB:                              \
618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    switch (envmode) {                     \
619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_MODULATE:                      \
620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGB;MODULATE,3);       \
621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_DECAL:                         \
623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_REPLACE:                       \
624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       SPAN2(LINEAR_RGB;REPLACE,3);        \
625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       break;                              \
626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_BLEND:                         \
627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGB;BLEND,3);          \
628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_ADD:                           \
630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGB;ADD,3);            \
631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    default: /* unexpected env mode */     \
633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       abort();                            \
634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    }                                      \
635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    break;                                 \
636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 case GL_RGBA:                             \
637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    switch (envmode) {                     \
638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_MODULATE:                      \
639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGBA;MODULATE,4);      \
640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_DECAL:                         \
642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGBA;DECAL,4);         \
643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_BLEND:                         \
645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGBA;BLEND,4);         \
646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_ADD:                           \
648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGBA;ADD,4);           \
649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    case GL_REPLACE:                       \
651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       SPAN2(LINEAR_RGBA;REPLACE,4);       \
652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       break;                              \
653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                    default: /* unexpected env mode */     \
654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                       abort();                            \
655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    }                                      \
656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    break;                                 \
657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	         }                                         \
658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 break;                                    \
659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      }                                            \
660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              gl_write_rgba_span(ctx, n, LEFT, Y, zspan,   \
661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                 fogspan,                  \
662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                 rgba, GL_POLYGON);        \
663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              /* explicit kill of variables: */            \
664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ffr = ffg = ffb = ffa = 0;                   \
665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           }                                               \
666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN1
670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN2
671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an perspective corrected RGB/RGBA textured triangle.
677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The Q (aka V in Mesa) coordinate must be zero such that the divide
678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * by interpolated Q/W comes out right.
679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This function only renders textured triangles that use GL_NEAREST.
681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Perspective correction works right.
682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This function written by Klaus Niederkrueger <klaus@math.leidenuniv.nl>
684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Send all questions and bug reports to him.
685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void near_persp_textured_triangle(GLcontext *ctx, GLuint v0, GLuint v1,
687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				         GLuint v2, GLuint pv )
688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/* The BIAS value is used to shift negative values into positive values.
690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Without this, negative texture values don't GL_REPEAT correctly at just
691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * below zero, because (int)-0.5 = 0 = (int)0.5. We're not going to worry
692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * about texture coords less than -BIAS. This could be fixed by using
693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * FLOORF etc. instead, but this is slower...
694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define BIAS 4096.0F
696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_unit *unit = ctx->Texture.Unit+0;			\
704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_object *obj = unit->CurrentD[2];			\
705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint b = obj->BaseLevel;					\
706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat twidth = (GLfloat) obj->Image[b]->Width;	      	\
707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat theight = (GLfloat) obj->Image[b]->Height;		\
708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan *texture = obj->Image[b]->Data;				\
710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint smask = (obj->Image[b]->Width - 1);                      \
711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint tmask = (obj->Image[b]->Height - 1);                     \
712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint format = obj->Image[b]->Format;                          \
713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint envmode = unit->EnvMode;                                 \
714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat sscale, tscale;                                              \
715e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*GLint comp, tbytesline, tsize; */                                  \
716e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfixed er, eg, eb, ea;                                              \
717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint tr, tg, tb, ta;                                                \
718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (!texture) {							\
719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (!_mesa_get_teximages_from_driver(ctx, obj))			\
720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;							\
721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texture = obj->Image[b]->Data;					\
722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ASSERT(texture);							\
723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (envmode == GL_BLEND || envmode == GL_ADD) {                      \
725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      er = FloatToFixed(unit->EnvColor[0]);                             \
726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eg = FloatToFixed(unit->EnvColor[1]);                             \
727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eb = FloatToFixed(unit->EnvColor[2]);                             \
728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ea = FloatToFixed(unit->EnvColor[3]);                             \
729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                                    \
730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*switch (format) {                                                  \
731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_ALPHA:                                                       \
732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_LUMINANCE:                                                   \
733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_INTENSITY:                                                   \
734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 1;                                                         \
735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_LUMINANCE_ALPHA:                                             \
737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 2;                                                         \
738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_RGB:                                                         \
740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 3;                                                         \
741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_RGBA:                                                        \
743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 4;                                                         \
744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   default:                                                             \
746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      gl_problem(NULL, "Bad texture format in near_persp_texture_triangle"); \
747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;                                                           \
748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      } */                                                              \
749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   sscale = twidth;                                                     \
750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tscale = theight;                                                    \
751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /*tbytesline = obj->Image[b]->Width * comp;                          \
752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tsize = theight * tbytesline;*/
753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;
754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define OLD_SPAN(DO_TEX,COMP)                         \
756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   for (i=0;i<n;i++) {                                \
757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat invQ = 1.0f / vv;                       \
758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint s = (int)(SS * invQ + BIAS) & smask;      \
759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint t = (int)(TT * invQ + BIAS) & tmask;      \
760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint pos = COMP * ((t << twidth_log2) + s);    \
761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan *tex00 = texture + pos;                  \
762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      zspan[i] = FixedToDepth(ffz);                   \
763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      fogspan[i] = fffog / 256;                       \
764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DO_TEX;                                         \
765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      fffog += fdfogdx;                               \
766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ffz += fdzdx;                                   \
767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ffr += fdrdx;                                   \
768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ffg += fdgdx;                                   \
769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ffb += fdbdx;                                   \
770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ffa += fdadx;                                   \
771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      SS += dSdx;                                     \
772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      TT += dTdx;                                     \
773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      vv += dvdx;                                     \
774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      dest += 4;                                      \
775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define X_Y_TEX_COORD(X, Y) ((((int)(X) & tmask) << twidth_log2) + ((int)(Y) & smask))
778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define Y_X_TEX_COORD(X, Y) ((((int)(Y) & tmask) << twidth_log2) + ((int)(X) & smask))
779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN1(DO_TEX, COMP, TEX_COORD) {                          \
781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat x_max = CEILF(x_tex);                                  \
782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat y_max = y_tex + (x_max - x_tex) * dy_dx;               \
783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint j, x_m = (int)x_max;                                     \
784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint pos;                                                     \
785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if ((int)y_max != (int)y_tex) {                                \
786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat x_mid = x_tex + (CEILF(y_tex)-y_tex) * dx_dy;       \
787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);    \
788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_tex, y_tex);                       \
789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);                                         \
790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_max;                                              \
791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                              \
792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   nominator += vv * x_max;                                       \
793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   denominator -= dvdx * x_max;                                   \
794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   j = nominator / denominator;                                   \
795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   pos = COMP * TEX_COORD(x_tex, y_tex);                          \
796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   DRAW_LINE (DO_TEX);                                            \
797e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   while (i<n)  {                                                 \
798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_max;                                              \
799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_max += dy_dx;                                             \
800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if ((int)y_max != (int)y_tex) {                             \
801e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat x_mid = (CEILF(y_tex)-y_tex) * dx_dy;            \
802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid); \
803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         pos = COMP * TEX_COORD(x_m, y_tex);                      \
804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         DRAW_LINE (DO_TEX);                                      \
805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         y_tex = y_max;                                           \
806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }                                                           \
807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      nominator += vv;                                            \
808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      denominator -= dvdx;                                        \
809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = nominator/denominator;                                  \
810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_m, y_tex);                         \
811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);                                         \
812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      x_m ++;                                                     \
813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                              \
814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN2(DO_TEX, COMP, TEX_COORD)  {			\
817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat x_max = CEILF (x_tex);				\
818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat y_max = y_tex + (x_max - x_tex) * dy_dx;		\
819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint j, x_m = (int) x_max;					\
820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint pos;							\
821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if ((int)y_max != (int)y_tex) {				\
822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat x_mid = x_tex + (FLOORF(y_tex)-y_tex) * dx_dy;	\
823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);	\
824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_tex, y_tex);			\
825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);					\
826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_max;						\
827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }								\
828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   nominator += vv * x_max;					\
829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   denominator -= dvdx * x_max;					\
830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   j = nominator / denominator;					\
831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   pos = COMP * TEX_COORD(x_tex, y_tex);			\
832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   DRAW_LINE (DO_TEX);						\
833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   while (i<n)  {						\
834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_max;						\
835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_max += dy_dx;						\
836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if ((int)y_max != (int)y_tex) {				\
837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat x_mid = (FLOORF(y_tex)-y_tex) * dx_dy;		\
838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);\
839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         pos = COMP * TEX_COORD(x_m, y_tex);			\
840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         DRAW_LINE (DO_TEX);					\
841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         y_tex = y_max;						\
842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }								\
843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      nominator += vv;						\
844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      denominator -= dvdx;					\
845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = nominator/denominator;				\
846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_m, y_tex);			\
847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);					\
848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      x_m ++;							\
849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }								\
850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN3(DO_TEX, COMP, TEX_COORD) {				\
853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat x_min = FLOORF (x_tex);					\
854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat y_min = y_tex + (x_min - x_tex) * dy_dx;			\
855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint j, x_m = (int)x_min;						\
856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint pos;								\
857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if ((int)y_min != (int)y_tex) {					\
858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat x_mid = x_tex + (CEILF(y_tex)-y_tex) * dx_dy;		\
859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);		\
860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_m, y_tex);				\
861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);						\
862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_min;							\
863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   nominator += vv*x_min;						\
865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   denominator -= dvdx*x_min;						\
866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   j = nominator / denominator;						\
867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   pos = COMP * TEX_COORD(x_m, y_tex);					\
868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   DRAW_LINE (DO_TEX);							\
869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   while (i<n) {							\
870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      x_m --;								\
871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_min;							\
872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_min -= dy_dx;							\
873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if ((int)y_min != (int)y_tex) {					\
874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat x_mid = (CEILF(y_tex)-y_tex) * dx_dy;			\
875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);	\
876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         pos = COMP * TEX_COORD(x_m, y_tex);				\
877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         DRAW_LINE (DO_TEX);						\
878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         y_tex = y_min;							\
879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }									\
880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      nominator -= vv;							\
881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      denominator += dvdx;						\
882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = nominator/denominator;					\
883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_m, y_tex);				\
884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);						\
885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN4(DO_TEX, COMP, TEX_COORD)					\
889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{									\
890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat x_min = FLOORF(x_tex);					\
891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint x_m = (int)x_min;						\
892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat y_min = y_tex + (x_min - x_tex) * dy_dx;			\
893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint j;								\
894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint pos;								\
895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if ((int)y_min != (int)y_tex) {					\
896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat x_mid = x_tex + (FLOORF(y_tex)-y_tex) * dx_dy;		\
897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);		\
898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_m, y_tex);				\
899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);						\
900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_min;							\
901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   nominator += vv * x_min;						\
903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   denominator -= dvdx * x_min;						\
904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   j = nominator / denominator;						\
905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   pos = COMP * TEX_COORD(x_m, y_tex);					\
906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   DRAW_LINE (DO_TEX);							\
907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   while (i<n)  {							\
908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      x_m --;								\
909e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_tex = y_min;							\
910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      y_min -= dy_dx;							\
911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if ((int)y_min != (int)y_tex) {					\
912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat x_mid = (FLOORF(y_tex)-y_tex) * dx_dy;			\
913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         j = (nominator + vv * x_mid)/(denominator - dvdx*x_mid);	\
914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         pos = COMP * TEX_COORD(x_m, (y_tex));				\
915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         DRAW_LINE (DO_TEX);						\
916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         y_tex = y_min;							\
917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }									\
918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      nominator -= vv;							\
919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      denominator += dvdx;						\
920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      j = nominator/denominator;					\
921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      pos = COMP * TEX_COORD(x_m, y_tex);				\
922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      DRAW_LINE (DO_TEX);						\
923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
924e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DRAW_LINE(DO_TEX)		\
927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {					\
928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan *tex00 = texture + pos;	\
929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (j>n || j<-100000)		\
930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         j = n;				\
931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      while (i<j) {			\
932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         zspan[i] = FixedToDepth(ffz);	\
933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fogspan[i] = fffog / 256;      \
934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         DO_TEX;			\
935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         fffog += fdfogdx;              \
936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffz += fdzdx;			\
937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffr += fdrdx;			\
938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffg += fdgdx;			\
939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffb += fdbdx;			\
940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffa += fdadx;			\
941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dest += 4;			\
942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         i++;				\
943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }					\
944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )					\
947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {									\
948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i = 0;							\
949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      const GLint n = RIGHT-LEFT;					\
950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLdepth zspan[MAX_WIDTH];						\
951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfixed fogspan[MAX_WIDTH];					\
952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan rgba[MAX_WIDTH][4];					\
953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      (void)uu; /* please GCC */					\
954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (n > 0) {							\
955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLchan *dest = rgba[0];					\
956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat SS = ss * sscale;					\
957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat TT = tt * tscale;					\
958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dSdx = dsdx * sscale;					\
959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dTdx = dtdx * tscale;					\
960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat x_tex;					                \
961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat y_tex;					                \
962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dx_tex;	                                        \
963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dy_tex;	                                        \
964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (n<5) /* When line very short, setup-time > speed-gain. */	\
965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            goto old_span;  /* So: take old method */			\
966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         x_tex = SS / vv,					        \
967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            y_tex = TT / vv;					        \
968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dx_tex = (SS + n * dSdx) / (vv + n * dvdx) - x_tex,	        \
969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dy_tex = (TT + n * dTdx) / (vv + n * dvdx) - y_tex;	        \
970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* Choose between walking over texture or over pixelline: */	\
971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* If there are few texels, walk over texture otherwise   */	\
972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* walk over pixelarray. The quotient on the right side   */	\
973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* should give the timeratio needed to draw one texel in  */	\
974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 /* comparison to one pixel. Depends on CPU.	 	   */	\
975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (dx_tex*dx_tex + dy_tex*dy_tex < (n*n)/16) {		\
976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            x_tex += BIAS;						\
977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            y_tex += BIAS;						\
978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (dx_tex*dx_tex > dy_tex*dy_tex) {			\
979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* if (FABSF(dx_tex) > FABSF(dy_tex)) */			\
980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat nominator = - SS - vv * BIAS;			\
981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat denominator = dvdx * BIAS + dSdx;		\
982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat dy_dx;						\
983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat dx_dy;						\
984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (dy_tex != 0.0f) {					\
985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dy_dx = dy_tex / dx_tex;                              \
986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dx_dy = 1.0f/dy_dx;					\
987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }                                                        \
988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else                                                     \
989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dy_dx = 0.0f;                                         \
990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (dx_tex > 0.0f) {					\
991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (dy_tex > 0.0f) {					\
992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD);	\
1001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD);	\
1004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN1(NEAREST_RGB;ADD,3, Y_X_TEX_COORD);     \
1007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
1016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD);	\
1019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD);	\
1022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN1(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD);    \
1025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
1028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  else {  /* dy_tex <= 0.0f */				\
1036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
1037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
1038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
1039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
1041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD);	\
1045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD);	\
1048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN2(NEAREST_RGB;ADD,3, Y_X_TEX_COORD);     \
1051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1057e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
1060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD);	\
1063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1064e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD);	\
1066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN2(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD);    \
1069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
1072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }							\
1080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else { /* dx_tex < 0.0f */				\
1081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (dy_tex > 0.0f) {					\
1082e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
1083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
1084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
1085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
1087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD);	\
1091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD);	\
1094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN3(NEAREST_RGB;ADD,3, Y_X_TEX_COORD);     \
1097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1099e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
1106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD);	\
1109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                          case GL_BLEND:				\
1111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD);	\
1112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN3(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD);    \
1115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
1118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  else {  /* dy_tex <= 0.0f */				\
1126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
1127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
1128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
1129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGB;MODULATE,3, Y_X_TEX_COORD);\
1131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                          case GL_DECAL:				\
1133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGB_REPLACE,3, Y_X_TEX_COORD);	\
1135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGB;BLEND,3, Y_X_TEX_COORD);	\
1138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN4(NEAREST_RGB;ADD,3, Y_X_TEX_COORD);     \
1141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                            case GL_MODULATE:				\
1149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA;MODULATE,4, Y_X_TEX_COORD);\
1150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA;DECAL,4, Y_X_TEX_COORD);	\
1153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA;BLEND,4, Y_X_TEX_COORD);	\
1156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN4(NEAREST_RGBA;ADD,4, Y_X_TEX_COORD);    \
1159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA_REPLACE,4, Y_X_TEX_COORD);\
1162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }							\
1170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }								\
1171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {  /* FABSF(dx_tex) > FABSF(dy_tex) */		        \
1172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat swap;						\
1173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat dy_dx;						\
1174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat dx_dy;						\
1175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               GLfloat nominator, denominator;				\
1176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (dx_tex == 0.0f /* &&  dy_tex == 0.0f*/)		\
1177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  goto old_span; /* case so special, that use old */    \
1178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /* swap some x-values and y-values */			\
1179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SS = TT;							\
1180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dSdx = dTdx;						\
1181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               swap = x_tex, x_tex = y_tex, y_tex = swap;		\
1182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               swap = dx_tex, dx_tex = dy_tex, dy_tex = swap;		\
1183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               nominator = - SS - vv * BIAS;				\
1184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               denominator = dvdx * BIAS + dSdx;			\
1185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (dy_tex != 0.0f) {					\
1186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dy_dx = dy_tex / dx_tex;                              \
1187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dx_dy = 1.0f/dy_dx;					\
1188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }                                                        \
1189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else                                                     \
1190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  dy_dx = 0.0f;                                         \
1191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (dx_tex > 0.0f) {					\
1192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (dy_tex > 0.0f) {					\
1193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     switch (format) {					\
1194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     case GL_RGB:					\
1195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			switch (envmode) {				\
1196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			case GL_MODULATE:				\
1197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
1198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			   break;					\
1199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:                       		\
1201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD);	\
1202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD);	\
1205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN1(NEAREST_RGB;ADD,3, X_Y_TEX_COORD);     \
1208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default: /* unexpected env mode */		\
1210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
1217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD);  \
1220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD);  \
1223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN1(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD);    \
1226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN1(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
1229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  else { /* dy_tex <= 0.0f */				\
1237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
1238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
1239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
1240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
1242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                          case GL_DECAL:				\
1244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD);	\
1246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD);	\
1249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN2(NEAREST_RGB;ADD,3, X_Y_TEX_COORD);     \
1252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                            }						\
1256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
1261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD);	\
1264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:				        \
1266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD);	\
1267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN2(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD);    \
1270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN2(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
1273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }							\
1281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else { /* dx_tex < 0.0f */				\
1282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (dy_tex > 0.0f) {					\
1283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
1284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
1285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
1286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
1288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:				\
1290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD);	\
1292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD);	\
1295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN3(NEAREST_RGB;ADD,3, X_Y_TEX_COORD);     \
1298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {				\
1305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           case GL_MODULATE:				\
1306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
1307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD);	\
1310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD);	\
1313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN3(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD);    \
1316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN3(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
1319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  else { /* dy_tex <= 0.0f */				\
1327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     switch (format) {					\
1328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGB:					\
1329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch (envmode) {				\
1330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGB;MODULATE,3, X_Y_TEX_COORD);\
1332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                          case GL_DECAL:				\
1334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGB_REPLACE,3, X_Y_TEX_COORD);	\
1336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:					\
1338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGB;BLEND,3, X_Y_TEX_COORD);	\
1339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN4(NEAREST_RGB;ADD,3, X_Y_TEX_COORD);     \
1342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                            }						\
1346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     case GL_RGBA:					\
1348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        switch(envmode) {                      		\
1349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_MODULATE:				\
1350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA;MODULATE,4, X_Y_TEX_COORD);\
1351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_DECAL:					\
1353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA;DECAL,4, X_Y_TEX_COORD);	\
1354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_BLEND:				        \
1356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA;BLEND,4, X_Y_TEX_COORD);	\
1357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		        case GL_ADD:                                    \
1359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           SPAN4(NEAREST_RGBA;ADD,4, X_Y_TEX_COORD);    \
1360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		           break;                                       \
1361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        case GL_REPLACE:				\
1362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           SPAN4(NEAREST_RGBA_REPLACE,4, X_Y_TEX_COORD);\
1363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           break;					\
1364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        default:					\
1365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           abort();					\
1366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        }						\
1367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                        break;						\
1368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     }							\
1369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }							\
1370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }							\
1371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }								\
1372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }								\
1373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {                                                		\
1374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            old_span:                                                   \
1375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            switch (format) {                                  		\
1376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_RGB:						\
1377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               switch (envmode) {                              		\
1378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_MODULATE:					\
1379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGB;MODULATE,3);			\
1380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_DECAL:						\
1382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_REPLACE:						\
1383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGB_REPLACE,3);			\
1384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_BLEND:						\
1386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGB;BLEND,3);			\
1387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       case GL_ADD:                                             \
1389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  OLD_SPAN(NEAREST_RGB;ADD,3);                          \
1390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  break;                                                \
1391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               default:							\
1392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  abort();						\
1393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }							\
1394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;							\
1395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_RGBA:						\
1396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               switch(envmode) {                               		\
1397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_MODULATE:					\
1398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGBA;MODULATE,4);			\
1399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_DECAL:						\
1401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGBA;DECAL,4);			\
1402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_BLEND:						\
1404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGBA;BLEND,4);			\
1405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       case GL_ADD:                                             \
1407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  OLD_SPAN(NEAREST_RGBA;ADD,4);                         \
1408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  break;                                                \
1409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               case GL_REPLACE:						\
1410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  OLD_SPAN(NEAREST_RGBA_REPLACE,4);			\
1411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  break;						\
1412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               default:							\
1413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  abort();						\
1414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               }							\
1415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;							\
1416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }								\
1417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }								\
1418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         gl_write_rgba_span( ctx, n, LEFT, Y, zspan,			\
1419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                             fogspan, rgba, GL_POLYGON);		\
1420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffr = ffg = ffb = ffa = 0;					\
1421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }									\
1422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
1423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
1425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef OLD_SPAN
1426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN1
1427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN2
1428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN3
1429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN4
1430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef X_Y_TEX_COORD
1431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef Y_X_TEX_COORD
1432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef DRAW_LINE
1433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef BIAS
1434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
1439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render an perspective corrected RGB/RGBA textured triangle.
1440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * The Q (aka V in Mesa) coordinate must be zero such that the divide
1441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * by interpolated Q/W comes out right.
1442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
1443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This function written by Klaus Niederkrueger <klaus@math.leidenuniv.nl>
1444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Send all questions and bug reports to him.
1445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lin_persp_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
1447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		               		 GLuint v2, GLuint pv )
1448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1449e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
1450e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1451e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
1452e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
1453e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
1454e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
1455e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_unit *unit = ctx->Texture.Unit+0;			\
1456e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   struct gl_texture_object *obj = unit->CurrentD[2];			\
1457e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint b = obj->BaseLevel;					\
1458e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat twidth = (GLfloat) obj->Image[b]->Width;	        \
1459e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat theight = (GLfloat) obj->Image[b]->Height;		\
1460e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
1461e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan *texture = obj->Image[b]->Data;				\
1462e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint smask = (obj->Image[b]->Width - 1);                      \
1463e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint tmask = (obj->Image[b]->Height - 1);                     \
1464e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint format = obj->Image[b]->Format;                          \
1465e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint envmode = unit->EnvMode;                                 \
1466e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat sscale, tscale;                                              \
1467e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint comp, tbytesline, tsize;                                       \
1468e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfixed er, eg, eb, ea;                                              \
1469e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint tr, tg, tb, ta;                                                \
1470e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (!texture) {							\
1471e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (!_mesa_get_teximages_from_driver(ctx, obj))			\
1472e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;							\
1473e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      texture = obj->Image[b]->Data;					\
1474e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ASSERT(texture);							\
1475e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }									\
1476e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (envmode == GL_BLEND || envmode == GL_ADD) {                      \
1477e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      er = FloatToFixed(unit->EnvColor[0]);                             \
1478e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eg = FloatToFixed(unit->EnvColor[1]);                             \
1479e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      eb = FloatToFixed(unit->EnvColor[2]);                             \
1480e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ea = FloatToFixed(unit->EnvColor[3]);                             \
1481e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                                    \
1482e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   switch (format) {                                                    \
1483e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_ALPHA:							\
1484e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_LUMINANCE:							\
1485e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_INTENSITY:							\
1486e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 1;                                                         \
1487e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
1488e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_LUMINANCE_ALPHA:						\
1489e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 2;                                                         \
1490e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
1491e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_RGB:								\
1492e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 3;                                                         \
1493e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
1494e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   case GL_RGBA:							\
1495e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      comp = 4;                                                         \
1496e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      break;                                                            \
1497e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   default:								\
1498e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      gl_problem(NULL, "Bad texture format in lin_persp_texture_triangle"); \
1499e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;                                                           \
1500e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }                                                                    \
1501e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   sscale = FIXED_SCALE * twidth;                                       \
1502e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tscale = FIXED_SCALE * theight;                                      \
1503e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tbytesline = obj->Image[b]->Width * comp;                            \
1504e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   tsize = theight * tbytesline;
1505e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;
1506e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1507e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SPAN(DO_TEX,COMP)                                  \
1508e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell        for (i=0;i<n;i++) {                                \
1509e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLfloat invQ = 1.0f / vv;                       \
1510e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLfixed ffs = (int)(SS * invQ);                 \
1511e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLfixed fft = (int)(TT * invQ);                 \
1512e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint s = FixedToInt(ffs) & smask;              \
1513e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint t = FixedToInt(fft) & tmask;              \
1514e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint sf = ffs & FIXED_FRAC_MASK;               \
1515e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint tf = fft & FIXED_FRAC_MASK;               \
1516e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint si = FIXED_FRAC_MASK - sf;                \
1517e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint ti = FIXED_FRAC_MASK - tf;                \
1518e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLint pos = COMP * ((t << twidth_log2) + s);    \
1519e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex00 = texture + pos;                  \
1520e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex10 = tex00 + tbytesline;             \
1521e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex01 = tex00 + COMP;                   \
1522e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan *tex11 = tex10 + COMP;                   \
1523e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           if (t == tmask) {                               \
1524e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex10 -= tsize;                              \
1525e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex11 -= tsize;                              \
1526e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           }                                               \
1527e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           if (s == smask) {                               \
1528e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex01 -= tbytesline;                         \
1529e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              tex11 -= tbytesline;                         \
1530e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           }                                               \
1531e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   zspan[i] = FixedToDepth(ffz);                   \
1532e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fogspan[i] = fffog / 256;                       \
1533e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           DO_TEX;                                         \
1534e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   fffog += fdfogdx;                               \
1535e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffz += fdzdx;                                   \
1536e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           ffr += fdrdx;                                   \
1537e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffg += fdgdx;                                   \
1538e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           ffb += fdbdx;                                   \
1539e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   ffa += fdadx;                                   \
1540e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           SS += dSdx;                                     \
1541e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           TT += dTdx;                                     \
1542e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   vv += dvdx;                                     \
1543e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           dest += 4;                                      \
1544e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
1545e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1546e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )			\
1547e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {							\
1548e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;						\
1549e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      const GLint n = RIGHT-LEFT;			\
1550e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLdepth zspan[MAX_WIDTH];				\
1551e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfixed fogspan[MAX_WIDTH];			\
1552e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLchan rgba[MAX_WIDTH][4];			\
1553e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      (void) uu; /* please GCC */			\
1554e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (n > 0) {					\
1555e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat SS = ss * sscale;			\
1556e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat TT = tt * tscale;			\
1557e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dSdx = dsdx * sscale;			\
1558e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLfloat dTdx = dtdx * tscale;			\
1559e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         GLchan *dest = rgba[0];			\
1560e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         SS -= 0.5f * FIXED_SCALE * vv;			\
1561e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         TT -= 0.5f * FIXED_SCALE * vv;			\
1562e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         switch (format) {				\
1563e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         case GL_RGB:					\
1564e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            switch (envmode) {				\
1565e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_MODULATE:				\
1566e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGB;MODULATE,3);		\
1567e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1568e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_DECAL:				\
1569e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_REPLACE:				\
1570e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGB;REPLACE,3);		\
1571e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1572e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_BLEND:				\
1573e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGB;BLEND,3);		\
1574e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1575e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_ADD:                                \
1576e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       SPAN(LINEAR_RGB;ADD,3);                  \
1577e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       break;                                   \
1578e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            default:					\
1579e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               abort();					\
1580e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }						\
1581e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            break;					\
1582e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         case GL_RGBA:					\
1583e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            switch (envmode) {				\
1584e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_MODULATE:				\
1585e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGBA;MODULATE,4);		\
1586e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1587e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_DECAL:				\
1588e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGBA;DECAL,4);		\
1589e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1590e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_BLEND:				\
1591e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGBA;BLEND,4);		\
1592e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1593e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_REPLACE:				\
1594e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGBA;REPLACE,4);		\
1595e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;					\
1596e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            case GL_ADD:                                \
1597e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               SPAN(LINEAR_RGBA;ADD,4);                 \
1598e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               break;                                   \
1599e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            default: /* unexpected env mode */		\
1600e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               abort();					\
1601e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }						\
1602e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }						\
1603e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         gl_write_rgba_span( ctx, n, LEFT, Y, zspan,	\
1604e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                             fogspan,                   \
1605e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                             rgba, GL_POLYGON );	\
1606e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ffr = ffg = ffb = ffa = 0;			\
1607e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }							\
1608e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1609e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1610e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1611e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
1612e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#undef SPAN
1613e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1614e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1615e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1616e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1617e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
1618e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle.
1619e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction, w/out mipmapping.
1620e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because
1621e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * R is already used for red.
1622e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1623e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
1624e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       GLuint v2, GLuint pv )
1625e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1626e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
1627e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1628e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
1629e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
1630e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
1631e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE						\
1632e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
1633e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint r, g, b, a;						\
1634e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (flat_shade) {						\
1635e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      r = VB->ColorPtr->data[pv][0];				\
1636e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      g = VB->ColorPtr->data[pv][1];				\
1637e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      b = VB->ColorPtr->data[pv][2];				\
1638e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      a = VB->ColorPtr->data[pv][3];				\
1639e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1640e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
1641e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
1642e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;                                             \
1643e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           const GLint n = RIGHT-LEFT;				\
1644e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];				\
1645e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];				\
1646e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan rgba[MAX_WIDTH][4];				\
1647e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];	\
1648e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
1649e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              if (flat_shade) {					\
1650e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 for (i=0;i<n;i++) {				\
1651e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;			\
1652e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);		\
1653e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;          		\
1654e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = r;				\
1655e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = g;				\
1656e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = b;				\
1657e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = a;				\
1658e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;				\
1659e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;				\
1660e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 	    u[i] = uu*invQ;				\
1661e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell 		    fffog += fdfogdx;				\
1662e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;				\
1663e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;					\
1664e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;					\
1665e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;					\
1666e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;					\
1667e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }						\
1668e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }							\
1669e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              else {						\
1670e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 for (i=0;i<n;i++) {				\
1671e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;			\
1672e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);		\
1673e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = FixedToInt(ffr);		\
1674e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = FixedToInt(ffg);		\
1675e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = FixedToInt(ffb);		\
1676e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = FixedToInt(ffa);		\
1677e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;         		\
1678e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;				\
1679e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;				\
1680e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;				\
1681e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;				\
1682e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;				\
1683e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffr += fdrdx;				\
1684e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffg += fdgdx;				\
1685e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffb += fdbdx;				\
1686e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffa += fdadx;				\
1687e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;					\
1688e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;					\
1689e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;					\
1690e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;					\
1691e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }						\
1692e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }							\
1693e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_texture_span( ctx, n, LEFT, Y, zspan, fogspan,	\
1694e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                     s, t, u, NULL, 		\
1695e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                             rgba, \
1696e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                     NULL, GL_POLYGON );	\
1697e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
1698e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
1699e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1700e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
1701e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1702e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1703e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1704e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
1705e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle with separate specular
1706e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * color interpolation.
1707e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction, w/out mipmapping.
1708e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because
1709e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * R is already used for red.
1710e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1711e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
1712e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                             GLuint v1, GLuint v2, GLuint pv,
1713e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                             GLdepth zspan[MAX_WIDTH],
1714e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                             GLfixed fogspan[MAX_WIDTH],
1715e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                             GLchan rgba[MAX_WIDTH][4],
1716e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                             GLchan spec[MAX_WIDTH][4] )
1717e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1718e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
1719e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1720e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
1721e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_SPEC 1
1722e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
1723e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
1724e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE						\
1725e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
1726e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint r, g, b, a, sr, sg, sb;				\
1727e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (flat_shade) {						\
1728e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      r = VB->ColorPtr->data[pv][0];				\
1729e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      g = VB->ColorPtr->data[pv][1];				\
1730e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      b = VB->ColorPtr->data[pv][2];				\
1731e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      a = VB->ColorPtr->data[pv][3];				\
1732e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      sr = VB->SecondaryColorPtr->data[pv][0]; 			\
1733e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      sg = VB->SecondaryColorPtr->data[pv][1]; 			\
1734e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      sb = VB->SecondaryColorPtr->data[pv][2]; 			\
1735e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1736e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )				\
1737e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{							\
1738e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;                                             \
1739e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           const GLint n = RIGHT-LEFT;				\
1740e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];	\
1741e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {						\
1742e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              if (flat_shade) {					\
1743e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 for (i=0;i<n;i++) {				\
1744e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;			\
1745e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);		\
1746e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;			\
1747e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = r;				\
1748e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = g;				\
1749e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = b;				\
1750e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = a;				\
1751e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][RCOMP] = sr;			\
1752e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][GCOMP] = sg;			\
1753e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][BCOMP] = sb;			\
1754e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;				\
1755e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;				\
1756e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;				\
1757e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;				\
1758e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;				\
1759e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;					\
1760e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;					\
1761e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;					\
1762e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;					\
1763e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }						\
1764e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }							\
1765e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              else {						\
1766e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                 for (i=0;i<n;i++) {				\
1767e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;			\
1768e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);		\
1769e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;			\
1770e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = FixedToInt(ffr);		\
1771e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = FixedToInt(ffg);		\
1772e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = FixedToInt(ffb);		\
1773e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = FixedToInt(ffa);		\
1774e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][RCOMP] = FixedToInt(ffsr);		\
1775e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][GCOMP] = FixedToInt(ffsg);		\
1776e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][BCOMP] = FixedToInt(ffsb);		\
1777e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;				\
1778e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;				\
1779e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;				\
1780e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;				\
1781e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;				\
1782e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffr += fdrdx;				\
1783e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffg += fdgdx;				\
1784e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffb += fdbdx;				\
1785e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffa += fdadx;				\
1786e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffsr += fdsrdx;				\
1787e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffsg += fdsgdx;				\
1788e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffsb += fdsbdx;				\
1789e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;					\
1790e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;					\
1791e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;					\
1792e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;					\
1793e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }						\
1794e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }							\
1795e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_texture_span( ctx, n, LEFT, Y, zspan,	\
1796e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                   fogspan,                     \
1797e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                   s, t, u, NULL, rgba,		\
1798e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                   (CONST GLchan (*)[4]) spec,	\
1799e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                           GL_POLYGON );		\
1800e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }							\
1801e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
1802e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1803e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
1804e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1805e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1806e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1807e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1808e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
1809e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Compute the lambda value for a fragment. (texture level of detail)
1810e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1811e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic INLINE GLfloat
1812e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellcompute_lambda( GLfloat dsdx, GLfloat dsdy, GLfloat dtdx, GLfloat dtdy,
1813e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                GLfloat invQ, GLfloat width, GLfloat height )
1814e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1815e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat dudx = dsdx * invQ * width;
1816e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat dudy = dsdy * invQ * width;
1817e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat dvdx = dtdx * invQ * height;
1818e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat dvdy = dtdy * invQ * height;
1819e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat r1 = dudx * dudx + dudy * dudy;
1820e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat r2 = dvdx * dvdx + dvdy * dvdy;
1821e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat rho2 = r1 + r2;     /* used to be:  rho2 = MAX2(r1,r2); */
1822e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   /* return log base 2 of rho */
1823e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   return log(rho2) * 1.442695 * 0.5;       /* 1.442695 = 1/log(2) */
1824e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1825e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1826e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1827e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
1828e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle.
1829e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction and compute lambda for
1830e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * each fragment.  Lambda is used to determine whether to use the
1831e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * minification or magnification filter.  If minification and using
1832e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * mipmaps, lambda is also used to select the texture level of detail.
1833e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1834e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1,
1835e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       GLuint v2, GLuint pv,
1836e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       GLfloat s[MAX_WIDTH],
1837e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       GLfloat t[MAX_WIDTH],
1838e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                       GLfloat u[MAX_WIDTH] )
1839e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1840e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
1841e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1842e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
1843e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
1844e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
1845e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1846e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
1847e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;	\
1848e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint baseLevel = obj->BaseLevel;				\
1849e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const struct gl_texture_image *texImage = obj->Image[baseLevel];	\
1850e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat twidth = (GLfloat) texImage->Width;			\
1851e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat theight = (GLfloat) texImage->Height;			\
1852e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
1853e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint r, g, b, a;							\
1854e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (flat_shade) {							\
1855e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      r = VB->ColorPtr->data[pv][0];					\
1856e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      g = VB->ColorPtr->data[pv][1];					\
1857e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      b = VB->ColorPtr->data[pv][2];					\
1858e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      a = VB->ColorPtr->data[pv][3];					\
1859e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1860e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1861e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )					\
1862e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{								\
1863e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;                                                     \
1864e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           const GLint n = RIGHT-LEFT;					\
1865e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];					\
1866e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];					\
1867e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan rgba[MAX_WIDTH][4];					\
1868e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfloat lambda[MAX_WIDTH];					\
1869e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {							\
1870e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      if (flat_shade) {						\
1871e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 for (i=0;i<n;i++) {					\
1872e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;				\
1873e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);			\
1874e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;          			\
1875e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = r;					\
1876e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = g;					\
1877e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = b;					\
1878e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = a;					\
1879e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;					\
1880e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;					\
1881e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;					\
1882e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy,	\
1883e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell						invQ, twidth, theight );\
1884e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;					\
1885e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;					\
1886e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;						\
1887e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;						\
1888e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;						\
1889e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;						\
1890e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }							\
1891e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }								\
1892e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              else {							\
1893e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 for (i=0;i<n;i++) {					\
1894e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;				\
1895e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);			\
1896e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;          			\
1897e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = FixedToInt(ffr);			\
1898e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = FixedToInt(ffg);			\
1899e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = FixedToInt(ffb);			\
1900e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = FixedToInt(ffa);			\
1901e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;					\
1902e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;					\
1903e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;					\
1904e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy,	\
1905e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell						invQ, twidth, theight );\
1906e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;					\
1907e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;					\
1908e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffr += fdrdx;					\
1909e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffg += fdgdx;					\
1910e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffb += fdbdx;					\
1911e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffa += fdadx;					\
1912e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;						\
1913e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;						\
1914e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;						\
1915e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;						\
1916e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }							\
1917e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }								\
1918e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_texture_span( ctx, n, LEFT, Y, zspan, fogspan,	\
1919e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                     s, t, u, lambda,	 		\
1920e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                             rgba, NULL, GL_POLYGON );		\
1921e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }								\
1922e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
1923e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1924e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
1925e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
1926e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1927e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1928e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
1929e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Render a smooth-shaded, textured, RGBA triangle with separate specular
1930e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * interpolation.
1931e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate S,T,U with perspective correction and compute lambda for
1932e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * each fragment.  Lambda is used to determine whether to use the
1933e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * minification or magnification filter.  If minification and using
1934e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * mipmaps, lambda is also used to select the texture level of detail.
1935e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
1936e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
1937e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                            GLuint v1, GLuint v2, GLuint pv,
1938e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                            GLfloat s[MAX_WIDTH],
1939e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                            GLfloat t[MAX_WIDTH],
1940e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                            GLfloat u[MAX_WIDTH] )
1941e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
1942e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
1943e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
1944e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
1945e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_SPEC 1
1946e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
1947e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_TEX 1
1948e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1949e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE							\
1950e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;	\
1951e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLint baseLevel = obj->BaseLevel;				\
1952e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const struct gl_texture_image *texImage = obj->Image[baseLevel];	\
1953e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat twidth = (GLfloat) texImage->Width;			\
1954e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLfloat theight = (GLfloat) texImage->Height;			\
1955e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
1956e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint r, g, b, a, sr, sg, sb;					\
1957e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (flat_shade) {							\
1958e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      r = VB->ColorPtr->data[pv][0];					\
1959e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      g = VB->ColorPtr->data[pv][1];					\
1960e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      b = VB->ColorPtr->data[pv][2];					\
1961e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      a = VB->ColorPtr->data[pv][3];					\
1962e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      sr = VB->SecondaryColorPtr->data[pv][0];				\
1963e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      sg = VB->SecondaryColorPtr->data[pv][1];				\
1964e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      sb = VB->SecondaryColorPtr->data[pv][2];				\
1965e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
1966e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
1967e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )					\
1968e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	{								\
1969e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLint i;                                                     \
1970e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           const GLint n = RIGHT-LEFT;					\
1971e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLdepth zspan[MAX_WIDTH];					\
1972e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfixed fogspan[MAX_WIDTH];					\
1973e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLchan spec[MAX_WIDTH][4];					\
1974e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell           GLchan rgba[MAX_WIDTH][4];					\
1975e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   GLfloat lambda[MAX_WIDTH];					\
1976e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   if (n>0) {							\
1977e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      if (flat_shade) {						\
1978e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 for (i=0;i<n;i++) {					\
1979e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;				\
1980e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);			\
1981e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;				\
1982e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = r;					\
1983e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = g;					\
1984e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = b;					\
1985e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = a;					\
1986e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][RCOMP] = sr;				\
1987e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][GCOMP] = sg;				\
1988e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][BCOMP] = sb;				\
1989e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;					\
1990e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;					\
1991e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;					\
1992e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy,	\
1993e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell						invQ, twidth, theight );\
1994e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;					\
1995e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;					\
1996e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;						\
1997e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;						\
1998e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;						\
1999e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;						\
2000e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }							\
2001e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }								\
2002e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              else {							\
2003e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 for (i=0;i<n;i++) {					\
2004e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    GLdouble invQ = 1.0 / vv;				\
2005e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    zspan[i] = FixedToDepth(ffz);			\
2006e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fogspan[i] = fffog / 256;				\
2007e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][RCOMP] = FixedToInt(ffr);			\
2008e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][GCOMP] = FixedToInt(ffg);			\
2009e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][BCOMP] = FixedToInt(ffb);			\
2010e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    rgba[i][ACOMP] = FixedToInt(ffa);			\
2011e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][RCOMP] = FixedToInt(ffsr);			\
2012e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][GCOMP] = FixedToInt(ffsg);			\
2013e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    spec[i][BCOMP] = FixedToInt(ffsb);			\
2014e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    s[i] = ss*invQ;					\
2015e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    t[i] = tt*invQ;					\
2016e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    u[i] = uu*invQ;					\
2017e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    lambda[i] = compute_lambda( dsdx, dsdy, dtdx, dtdy,	\
2018e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell						invQ, twidth, theight );\
2019e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    fffog += fdfogdx;					\
2020e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffz += fdzdx;					\
2021e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffr += fdrdx;					\
2022e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffg += fdgdx;					\
2023e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffb += fdbdx;					\
2024e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffa += fdadx;					\
2025e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffsr += fdsrdx;					\
2026e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffsg += fdsgdx;					\
2027e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ffsb += fdsbdx;					\
2028e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    ss += dsdx;						\
2029e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    tt += dtdx;						\
2030e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    uu += dudx;						\
2031e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		    vv += dvdx;						\
2032e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 }							\
2033e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              }								\
2034e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	      gl_write_texture_span( ctx, n, LEFT, Y, zspan, fogspan,	\
2035e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                     s, t, u, lambda,	 		\
2036e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	                             rgba, (CONST GLchan (*)[4]) spec,	\
2037e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                     GL_POLYGON );			\
2038e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	   }								\
2039e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	}
2040e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2041e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
2042e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2043e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2044e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2045e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2046e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * This is the big one!
2047e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Interpolate Z, RGB, Alpha, and two sets of texture coordinates.
2048e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Yup, it's slow.
2049e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
2050e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
2051e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLuint v1, GLuint v2, GLuint pv,
2052e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
2053e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
2054e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH]
2055e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      )
2056e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2057e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
2058e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2059e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_RGB 1
2060e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_ALPHA 1
2061e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_MULTITEX 1
2062e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2063e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define SETUP_CODE								\
2064e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan rgba[MAX_WIDTH][4];							\
2065e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);		\
2066e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat twidth[MAX_TEXTURE_UNITS], theight[MAX_TEXTURE_UNITS];		\
2067e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLint r, g, b, a;								\
2068e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (flat_shade) {								\
2069e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      r = VB->ColorPtr->data[pv][0];						\
2070e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      g = VB->ColorPtr->data[pv][1];						\
2071e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      b = VB->ColorPtr->data[pv][2];						\
2072e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      a = VB->ColorPtr->data[pv][3];						\
2073e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }										\
2074e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {										\
2075e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLuint unit;								\
2076e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {		\
2077e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Texture.Unit[unit].ReallyEnabled) {				\
2078e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            const struct gl_texture_object *obj = ctx->Texture.Unit[unit].Current; \
2079e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            const GLint baseLevel = obj->BaseLevel;				\
2080e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            const struct gl_texture_image *texImage = obj->Image[baseLevel];	\
2081e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            twidth[unit] = (GLfloat) texImage->Width;				\
2082e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            theight[unit] = (GLfloat) texImage->Height;				\
2083e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }									\
2084e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }										\
2085e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2086e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2087e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2088e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2089e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )						\
2090e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {										\
2091e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;									\
2092e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      const GLint n = RIGHT-LEFT;						\
2093e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLdepth zspan[MAX_WIDTH];							\
2094e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfixed fogspan[MAX_WIDTH];						\
2095e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH];				\
2096e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (n > 0) {								\
2097e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (flat_shade) {							\
2098e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {							\
2099e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       zspan[i] = FixedToDepth(ffz);					\
2100e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       fogspan[i] = fffog / 256;					\
2101e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               fffog += fdfogdx;						\
2102e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       ffz += fdzdx;							\
2103e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][RCOMP] = r;						\
2104e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][GCOMP] = g;						\
2105e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][BCOMP] = b;						\
2106e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][ACOMP] = a;						\
2107e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       {								\
2108e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  GLuint unit;							\
2109e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {	\
2110e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     if (ctx->Texture.Unit[unit].ReallyEnabled) {		\
2111e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			GLdouble invQ = 1.0 / vv[unit];				\
2112e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			s[unit][i] = ss[unit] * invQ;				\
2113e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			t[unit][i] = tt[unit] * invQ;				\
2114e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			u[unit][i] = uu[unit] * invQ;				\
2115e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			lambda[unit][i] = compute_lambda(dsdx[unit], dsdy[unit],\
2116e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				   dtdx[unit], dtdy[unit], invQ,		\
2117e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				   twidth[unit], theight[unit] );		\
2118e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			ss[unit] += dsdx[unit];					\
2119e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			tt[unit] += dtdx[unit];					\
2120e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			uu[unit] += dudx[unit];					\
2121e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			vv[unit] += dvdx[unit];					\
2122e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     }								\
2123e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }								\
2124e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }								\
2125e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }									\
2126e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }									\
2127e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else { /* smooth shade */						\
2128e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    for (i=0;i<n;i++) {							\
2129e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       zspan[i] = FixedToDepth(ffz);					\
2130e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       fogspan[i] = fffog / 256;					\
2131e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       ffz += fdzdx;							\
2132e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       fffog += fdfogdx;						\
2133e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][RCOMP] = FixedToInt(ffr);				\
2134e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][GCOMP] = FixedToInt(ffg);				\
2135e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][BCOMP] = FixedToInt(ffb);				\
2136e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       rgba[i][ACOMP] = FixedToInt(ffa);				\
2137e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       ffr += fdrdx;							\
2138e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       ffg += fdgdx;							\
2139e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       ffb += fdbdx;							\
2140e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       ffa += fdadx;							\
2141e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       {								\
2142e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  GLuint unit;							\
2143e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {	\
2144e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     if (ctx->Texture.Unit[unit].ReallyEnabled) {		\
2145e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			GLdouble invQ = 1.0 / vv[unit];				\
2146e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			s[unit][i] = ss[unit] * invQ;				\
2147e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			t[unit][i] = tt[unit] * invQ;				\
2148e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			u[unit][i] = uu[unit] * invQ;				\
2149e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			lambda[unit][i] = compute_lambda(dsdx[unit], dsdy[unit],\
2150e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				   dtdx[unit], dtdy[unit], invQ,		\
2151e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				   twidth[unit], theight[unit] );		\
2152e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			ss[unit] += dsdx[unit];					\
2153e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			tt[unit] += dtdx[unit];					\
2154e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			uu[unit] += dudx[unit];					\
2155e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			vv[unit] += dvdx[unit];					\
2156e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     }								\
2157e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }								\
2158e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }								\
2159e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }									\
2160e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }									\
2161e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 gl_write_multitexture_span( ctx, n, LEFT, Y, zspan, fogspan,		\
2162e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				     (const GLfloat (*)[MAX_WIDTH]) s,		\
2163e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				     (const GLfloat (*)[MAX_WIDTH]) t,		\
2164e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				     (const GLfloat (*)[MAX_WIDTH]) u,		\
2165e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				     (GLfloat (*)[MAX_WIDTH]) lambda,		\
2166e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell				     rgba, NULL, GL_POLYGON );			\
2167e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }										\
2168e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2169e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
2170e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2171e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2172e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2173e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2174e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * These wrappers are needed to deal with the 32KB / stack frame limit
2175e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * on Mac / PowerPC systems.
2176e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
2177e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2178e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void general_textured_spec_triangle(GLcontext *ctx, GLuint v0,
2179e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                           GLuint v1, GLuint v2, GLuint pv)
2180e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2181e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLdepth zspan[MAX_WIDTH];
2182e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfixed fogspan[MAX_WIDTH];
2183e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLchan rgba[MAX_WIDTH][4], spec[MAX_WIDTH][4];
2184e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   general_textured_spec_triangle1(ctx,v0,v1,v2,pv,zspan,fogspan,rgba,spec);
2185e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2186e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2187e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lambda_textured_triangle( GLcontext *ctx, GLuint v0,
2188e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLuint v1, GLuint v2, GLuint pv )
2189e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2190e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];
2191e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   lambda_textured_triangle1(ctx,v0,v1,v2,pv,s,t,u);
2192e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2193e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2194e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lambda_textured_spec_triangle( GLcontext *ctx, GLuint v0,
2195e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                           GLuint v1, GLuint v2, GLuint pv )
2196e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2197e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat s[MAX_WIDTH];
2198e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat t[MAX_WIDTH];
2199e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat u[MAX_WIDTH];
2200e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   lambda_textured_spec_triangle1(ctx,v0,v1,v2,pv,s,t,u);
2201e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2202e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2203e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2204e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void lambda_multitextured_triangle( GLcontext *ctx, GLuint v0,
2205e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                           GLuint v1, GLuint v2, GLuint pv)
2206e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2207e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2208e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH];
2209e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH];
2210e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   DEFMARRAY(GLfloat,u,MAX_TEXTURE_UNITS,MAX_WIDTH);
2211e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   CHECKARRAY(u,return);
2212e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2213e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   lambda_multitextured_triangle1(ctx,v0,v1,v2,pv,s,t,u);
2214e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2215e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   UNDEFARRAY(u);
2216e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2217e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2218e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2219e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2220e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void occlusion_zless_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
2221e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                                      GLuint v2, GLuint pv )
2222e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2223e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void)pv;
2224e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (ctx->OcclusionResult) {
2225e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      return;
2226e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2227e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2228e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DO_OCCLUSION_TEST
2229e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INTERP_Z 1
2230e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define DEPTH_TYPE DEFAULT_SOFTWARE_DEPTH_TYPE
2231e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#define INNER_LOOP( LEFT, RIGHT, Y )		\
2232e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   {						\
2233e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      GLint i;                                  \
2234e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      const GLint len = RIGHT-LEFT;		\
2235e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      for (i=0;i<len;i++) {			\
2236e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 GLdepth z = FixedToDepth(ffz);		\
2237e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         (void) fffog;                          \
2238e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (z < zRow[i]) {			\
2239e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    ctx->OcclusionResult = GL_TRUE;	\
2240e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    return;				\
2241e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }					\
2242e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 ffz += fdzdx;				\
2243e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }						\
2244e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2245e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#include "s_tritemp.h"
2246e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2247e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2248e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2249e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2250e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2251e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Null rasterizer for measuring transformation speed.
2252e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
2253e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellstatic void null_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
2254e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                           GLuint v2, GLuint pv )
2255e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2256e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) ctx;
2257e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) v0;
2258e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) v1;
2259e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) v2;
2260e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   (void) pv;
2261e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2262e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2263e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2264e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#if 0
2265e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# define dputs(s) puts(s)
2266e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#else
2267e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell# define dputs(s)
2268e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell#endif
2269e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2270e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2271e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2272e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell/*
2273e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Determine which triangle rendering function to use given the current
2274e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * rendering context.
2275e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell *
2276e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * Please update the summary flag _SWRAST_NEW_TRIANGLE if you add or
2277e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell * remove tests to this code.
2278e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell */
2279e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwellvoid
2280e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell_swrast_set_triangle_function( GLcontext *ctx )
2281e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell{
2282e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   const GLboolean rgbmode = ctx->Visual.RGBAflag;
2283e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2284e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   if (ctx->RenderMode==GL_RENDER) {
2285e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->NoRaster) {
2286e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ctx->Driver.TriangleFunc = null_triangle;
2287e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;
2288e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2289e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Driver.TriangleFunc) {
2290e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* Device driver will draw triangles. */
2291e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         dputs("Driver triangle");
2292e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 return;
2293e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2294e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2295e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Polygon.SmoothFlag) {
2296e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         _mesa_set_aa_triangle_function(ctx);
2297e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         ASSERT(ctx->Driver.TriangleFunc);
2298e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         return;
2299e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2300e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2301e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Depth.OcclusionTest &&
2302e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell          ctx->Depth.Test &&
2303e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell          ctx->Depth.Mask == GL_FALSE &&
2304e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell          ctx->Depth.Func == GL_LESS &&
2305e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell          !ctx->Stencil.Enabled) {
2306e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if ((rgbmode &&
2307e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ctx->Color.ColorMask[0] == 0 &&
2308e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ctx->Color.ColorMask[1] == 0 &&
2309e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ctx->Color.ColorMask[2] == 0 &&
2310e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell              ctx->Color.ColorMask[3] == 0)
2311e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell             ||
2312e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell             (!rgbmode && ctx->Color.IndexMask == 0)) {
2313e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            dputs("occlusion_test_triangle");
2314e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            ctx->Driver.TriangleFunc = occlusion_zless_triangle;
2315e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            return;
2316e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
2317e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2318e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2319e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      if (ctx->Texture.ReallyEnabled) {
2320e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* Ugh, we do a _lot_ of tests to pick the best textured tri func */
2321e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 GLint format, filter;
2322e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 const struct gl_texture_object *current2Dtex = ctx->Texture.Unit[0].CurrentD[2];
2323e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         const struct gl_texture_image *image;
2324e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         /* First see if we can used an optimized 2-D texture function */
2325e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         if (ctx->Texture.ReallyEnabled==TEXTURE0_2D
2326e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell             && current2Dtex->WrapS==GL_REPEAT
2327e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	     && current2Dtex->WrapT==GL_REPEAT
2328e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell             && ((image = current2Dtex->Image[current2Dtex->BaseLevel]) != 0)  /* correct! */
2329e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell             && image->Border==0
2330e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell             && ((format = image->Format)==GL_RGB || format==GL_RGBA)
2331e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	     && (filter = current2Dtex->MinFilter)==current2Dtex->MagFilter
2332e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	     && ctx->Light.Model.ColorControl==GL_SINGLE_COLOR
2333e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	     && ctx->Texture.Unit[0].EnvMode!=GL_COMBINE_EXT) {
2334e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2335e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    if (ctx->Hint.PerspectiveCorrection==GL_FASTEST) {
2336e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2337e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (filter==GL_NEAREST
2338e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		   && format==GL_RGB
2339e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		   && (ctx->Texture.Unit[0].EnvMode==GL_REPLACE
2340e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       || ctx->Texture.Unit[0].EnvMode==GL_DECAL)
2341e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		   && ((ctx->RasterMask==DEPTH_BIT
2342e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			&& ctx->Depth.Func==GL_LESS
2343e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell			&& ctx->Depth.Mask==GL_TRUE)
2344e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		       || ctx->RasterMask==0)
2345e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		   && ctx->Polygon.StippleFlag==GL_FALSE) {
2346e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell
2347e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  if (ctx->RasterMask==DEPTH_BIT) {
2348e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     ctx->Driver.TriangleFunc = simple_z_textured_triangle;
2349e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     dputs("simple_z_textured_triangle");
2350e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
2351e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  else {
2352e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     ctx->Driver.TriangleFunc = simple_textured_triangle;
2353e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     dputs("simple_textured_triangle");
2354e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  }
2355e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2356e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       else {
2357e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  if (ctx->Texture.Unit[0].EnvMode==GL_ADD) {
2358e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     ctx->Driver.TriangleFunc = general_textured_triangle;
2359e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     dputs("general_textured_triangle");
2360e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
2361e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  else {
2362e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     ctx->Driver.TriangleFunc = affine_textured_triangle;
2363e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                     dputs("affine_textured_triangle");
2364e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  }
2365e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2366e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
2367e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    else {
2368e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       if (filter==GL_NEAREST) {
2369e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ctx->Driver.TriangleFunc = near_persp_textured_triangle;
2370e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 dputs("near_persp_textured_triangle");
2371e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2372e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       else {
2373e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 ctx->Driver.TriangleFunc = lin_persp_textured_triangle;
2374e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		 dputs("lin_persp_textured_triangle");
2375e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2376e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    }
2377e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
2378e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         else {
2379e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* More complicated textures (mipmap, multi-tex, sep specular) */
2380e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            GLboolean needLambda;
2381e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            /* if mag filter != min filter we need to compute lambda */
2382e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;
2383e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (obj && obj->MinFilter != obj->MagFilter)
2384e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               needLambda = GL_TRUE;
2385e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else
2386e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               needLambda = GL_FALSE;
2387e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (ctx->Texture.MultiTextureEnabled) {
2388e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               ctx->Driver.TriangleFunc = lambda_multitextured_triangle;
2389e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       dputs("lambda_multitextured_triangle");
2390e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2391e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else if ((ctx->Light.Enabled &&
2392e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		      ctx->Light.Model.ColorControl==GL_SEPARATE_SPECULAR_COLOR)
2393e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		     || ctx->Fog.ColorSumEnabled) {
2394e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               /* separate specular color interpolation */
2395e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (needLambda) {
2396e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  ctx->Driver.TriangleFunc = lambda_textured_spec_triangle;
2397e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  dputs("lambda_textured_spec_triangle");
2398e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2399e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else {
2400e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  ctx->Driver.TriangleFunc = general_textured_spec_triangle;
2401e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  dputs("general_textured_spec_triangle");
2402e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2403e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2404e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
2405e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               if (needLambda) {
2406e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  ctx->Driver.TriangleFunc = lambda_textured_triangle;
2407e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  dputs("lambda_textured_triangle");
2408e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2409e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               else {
2410e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell                  ctx->Driver.TriangleFunc = general_textured_triangle;
2411e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell		  dputs("general_textured_triangle");
2412e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	       }
2413e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2414e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell         }
2415e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2416e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      else {
2417e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 if (ctx->Light.ShadeModel==GL_SMOOTH) {
2418e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* smooth shaded, no texturing, stippled or some raster ops */
2419e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (rgbmode) {
2420e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dputs("smooth_rgba_triangle");
2421e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               ctx->Driver.TriangleFunc = smooth_rgba_triangle;
2422e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2423e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
2424e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dputs("smooth_ci_triangle");
2425e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               ctx->Driver.TriangleFunc = smooth_ci_triangle;
2426e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2427e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
2428e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 else {
2429e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	    /* flat shaded, no texturing, stippled or some raster ops */
2430e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            if (rgbmode) {
2431e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dputs("flat_rgba_triangle");
2432e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               ctx->Driver.TriangleFunc = flat_rgba_triangle;
2433e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2434e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            else {
2435e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               dputs("flat_ci_triangle");
2436e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell               ctx->Driver.TriangleFunc = flat_ci_triangle;
2437e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell            }
2438e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell	 }
2439e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      }
2440e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2441e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else if (ctx->RenderMode==GL_FEEDBACK) {
2442e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ctx->Driver.TriangleFunc = gl_feedback_triangle;
2443e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2444e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   else {
2445e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      /* GL_SELECT mode */
2446e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell      ctx->Driver.TriangleFunc = gl_select_triangle;
2447e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell   }
2448e3a051e0538a605551f4d58294c94f5eb00ed07fKeith Whitwell}
2449