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