head	3.29;
access;
symbols
	merge-1:3.22.2.3
	autoconf:3.22.0.4
	experimental-1:3.22.0.2
	mesa-3-1-with-kw3:3.19
	mesa-3-1-prior-to-kw3:3.18;
locks; strict;
comment	@ * @;


3.29
date	99.07.21.13.53.12;	author miklos;	state Exp;
branches;
next	3.28;

3.28
date	99.07.16.22.09.15;	author brianp;	state Exp;
branches;
next	3.27;

3.27
date	99.07.15.01.55.15;	author brianp;	state Exp;
branches;
next	3.26;

3.26
date	99.07.13.16.57.01;	author miklos;	state Exp;
branches;
next	3.25;

3.25
date	99.07.12.15.51.21;	author brianp;	state Exp;
branches;
next	3.24;

3.24
date	99.07.12.12.05.25;	author keithw;	state Exp;
branches;
next	3.23;

3.23
date	99.06.18.20.06.30;	author brianp;	state Exp;
branches;
next	3.22;

3.22
date	99.05.17.21.44.52;	author brianp;	state Exp;
branches
	3.22.2.1;
next	3.21;

3.21
date	99.05.17.21.28.06;	author brianp;	state Exp;
branches;
next	3.20;

3.20
date	99.03.31.20.18.40;	author keithw;	state Exp;
branches;
next	3.19;

3.19
date	99.02.25.14.12.32;	author keithw;	state Exp;
branches;
next	3.18;

3.18
date	99.02.24.22.48.08;	author jens;	state Exp;
branches;
next	3.17;

3.17
date	99.02.14.03.46.34;	author brianp;	state Exp;
branches;
next	3.16;

3.16
date	98.11.17.01.53.35;	author brianp;	state Exp;
branches;
next	3.15;

3.15
date	98.11.08.22.34.07;	author brianp;	state Exp;
branches;
next	3.14;

3.14
date	98.11.03.01.16.57;	author brianp;	state Exp;
branches;
next	3.13;

3.13
date	98.10.31.17.06.15;	author brianp;	state Exp;
branches;
next	3.12;

3.12
date	98.10.29.02.34.36;	author brianp;	state Exp;
branches;
next	3.11;

3.11
date	98.09.18.02.33.05;	author brianp;	state Exp;
branches;
next	3.10;

3.10
date	98.07.09.03.16.24;	author brianp;	state Exp;
branches;
next	3.9;

3.9
date	98.06.24.02.52.05;	author brianp;	state Exp;
branches;
next	3.8;

3.8
date	98.06.18.02.49.35;	author brianp;	state Exp;
branches;
next	3.7;

3.7
date	98.06.07.22.18.52;	author brianp;	state Exp;
branches;
next	3.6;

3.6
date	98.05.31.23.50.36;	author brianp;	state Exp;
branches;
next	3.5;

3.5
date	98.04.01.02.58.52;	author brianp;	state Exp;
branches;
next	3.4;

3.4
date	98.03.27.04.26.44;	author brianp;	state Exp;
branches;
next	3.3;

3.3
date	98.02.20.04.54.02;	author brianp;	state Exp;
branches;
next	3.2;

3.2
date	98.02.04.00.44.29;	author brianp;	state Exp;
branches;
next	3.1;

3.1
date	98.02.02.03.09.34;	author brianp;	state Exp;
branches;
next	3.0;

3.0
date	98.01.31.21.05.24;	author brianp;	state Exp;
branches;
next	;

3.22.2.1
date	99.05.21.21.29.27;	author keithw;	state Exp;
branches;
next	3.22.2.2;

3.22.2.2
date	99.06.06.22.35.55;	author keithw;	state Exp;
branches;
next	3.22.2.3;

3.22.2.3
date	99.06.19.15.04.14;	author keithw;	state Exp;
branches;
next	;


desc
@triangle drawing functions
@


3.29
log
@Fixed compiler warning.
@
text
@/* $Id: triangle.c,v 3.28 1999/07/16 22:09:15 brianp Exp $ */

/*
 * Mesa 3-D graphics library
 * Version:  3.1
 * 
 * Copyright (C) 1999  Brian Paul   All Rights Reserved.
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */




/*
 * Triangle rasterizers
 * When the device driver doesn't implement triangle rasterization Mesa
 * will use these functions to draw triangles.
 */


#ifdef PC_HEADER
#include "all.h"
#else
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include "context.h"
#include "depth.h"
#include "feedback.h"
#include "macros.h"
#include "mmath.h"
#include "span.h"
#include "texstate.h"
#include "triangle.h"
#include "types.h"
#include "vb.h"
#ifdef XFree86Server
#include "GL/xf86glx.h"
#endif
#endif


/*
 * Put triangle in feedback buffer.
 */
static void feedback_triangle( GLcontext *ctx,
                               GLuint v0, GLuint v1, GLuint v2, GLuint pv )
{
   struct vertex_buffer *VB = ctx->VB;
   GLfloat color[4];
   GLuint i;
   GLuint texUnit = ctx->Texture.CurrentTransformUnit;

   FEEDBACK_TOKEN( ctx, (GLfloat) (GLint) GL_POLYGON_TOKEN );
   FEEDBACK_TOKEN( ctx, (GLfloat) 3 );        /* three vertices */

   if (ctx->Light.ShadeModel==GL_FLAT) {
      /* flat shading - same color for each vertex */
      UBYTE_RGBA_TO_FLOAT_RGBA( color, VB->ColorPtr->data[pv] );
   }

   for (i=0;i<3;i++) {
      GLfloat x, y, z, w;
      GLfloat tc[4];
      GLuint v;
      GLfloat invq;

      if (i==0)       v = v0;
      else if (i==1)  v = v1;
      else            v = v2;

      x = VB->Win.data[v][0];
      y = VB->Win.data[v][1];
      z = VB->Win.data[v][2] / DEPTH_SCALE;
      w = (VB->ClipPtr->size == 4 ? VEC_ELT(VB->ClipPtr, GLfloat, v)[3] : 1.0);

      if (ctx->Light.ShadeModel==GL_SMOOTH) {
	 UBYTE_RGBA_TO_FLOAT_RGBA( color, VB->ColorPtr->data[v] );
      }

      if (VB->TexCoordPtr[texUnit]->size == 4) {      
	 if (VB->TexCoordPtr[texUnit]->data[v][3]==0.0)
	    invq =  1.0;
	 else
	    invq = 1.0F / VB->TexCoordPtr[texUnit]->data[v][3];
	 tc[0] = VB->TexCoordPtr[texUnit]->data[v][0] * invq;
	 tc[1] = VB->TexCoordPtr[texUnit]->data[v][1] * invq;
	 tc[2] = VB->TexCoordPtr[texUnit]->data[v][2] * invq;
	 tc[3] = VB->TexCoordPtr[texUnit]->data[v][3];
      } else {
	 ASSIGN_4V(tc, 0,0,0,1);
	 COPY_SZ_4V(tc, 
		    VB->TexCoordPtr[texUnit]->size,
		    VB->TexCoordPtr[texUnit]->data[v]);
      }

      gl_feedback_vertex( ctx, x, y, z, w, color, 
			  (GLfloat) VB->IndexPtr->data[v], tc );
   }
}



/*
 * Put triangle in selection buffer.
 */
static void select_triangle( GLcontext *ctx,
                             GLuint v0, GLuint v1, GLuint v2, GLuint pv )
{
   struct vertex_buffer *VB = ctx->VB;
   (void) pv;
   gl_update_hitflag( ctx, VB->Win.data[v0][2] / DEPTH_SCALE );
   gl_update_hitflag( ctx, VB->Win.data[v1][2] / DEPTH_SCALE );
   gl_update_hitflag( ctx, VB->Win.data[v2][2] / DEPTH_SCALE );
}



/*
 * Render a flat-shaded color index triangle.
 */
static void flat_ci_triangle( GLcontext *ctx,
                              GLuint v0, GLuint v1, GLuint v2, GLuint pv )
{
#define INTERP_Z 1

#define SETUP_CODE				\
   GLuint index = VB->IndexPtr->data[pv];	\
   if (1) {					\
      /* set the color index */			\
      (*ctx->Driver.Index)( ctx, index );	\
   }

#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLdepth zspan[MAX_WIDTH];				\
	   if (n>0) {						\
	      for (i=0;i<n;i++) {				\
		 zspan[i] = FixedToDepth(ffz);			\
		 ffz += fdzdx;					\
	      }							\
	      gl_write_monoindex_span( ctx, n, LEFT, Y,		\
	                            zspan, index, GL_POLYGON );	\
	   }							\
	}

#include "tritemp.h"	      
}



/*
 * Render a smooth-shaded color index triangle.
 */
static void smooth_ci_triangle( GLcontext *ctx,
                                GLuint v0, GLuint v1, GLuint v2, GLuint pv )
{
   (void) pv;
#define INTERP_Z 1
#define INTERP_INDEX 1

#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLdepth zspan[MAX_WIDTH];				\
           GLuint index[MAX_WIDTH];				\
	   if (n>0) {						\
	      for (i=0;i<n;i++) {				\
		 zspan[i] = FixedToDepth(ffz);			\
                 index[i] = FixedToInt(ffi);			\
		 ffz += fdzdx;					\
		 ffi += fdidx;					\
	      }							\
	      gl_write_index_span( ctx, n, LEFT, Y, zspan,	\
	                           index, GL_POLYGON );		\
	   }							\
	}

#include "tritemp.h"
}



/*
 * Render a flat-shaded RGBA triangle.
 */
static void flat_rgba_triangle( GLcontext *ctx,
                                GLuint v0, GLuint v1, GLuint v2, GLuint pv )
{
#define INTERP_Z 1

#define SETUP_CODE				\
   if (1) {					\
      /* set the color */			\
      GLubyte r = VB->ColorPtr->data[pv][0];	\
      GLubyte g = VB->ColorPtr->data[pv][1];	\
      GLubyte b = VB->ColorPtr->data[pv][2];	\
      GLubyte a = VB->ColorPtr->data[pv][3];	\
      (*ctx->Driver.Color)( ctx, r, g, b, a );	\
   }

#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLdepth zspan[MAX_WIDTH];				\
	   if (n>0) {						\
	      for (i=0;i<n;i++) {				\
		 zspan[i] = FixedToDepth(ffz);			\
		 ffz += fdzdx;					\
	      }							\
              gl_write_monocolor_span( ctx, n, LEFT, Y, zspan,	\
                                    VB->ColorPtr->data[pv][0],	\
                                    VB->ColorPtr->data[pv][1],	\
                                    VB->ColorPtr->data[pv][2],	\
                                    VB->ColorPtr->data[pv][3],	\
			            GL_POLYGON );		\
	   }							\
	}

#include "tritemp.h"

   ASSERT(!ctx->Texture.ReallyEnabled);  /* texturing must be off */
   ASSERT(ctx->Light.ShadeModel==GL_FLAT);
}



/*
 * Render a smooth-shaded RGBA triangle.
 */
static void smooth_rgba_triangle( GLcontext *ctx,
                                  GLuint v0, GLuint v1, GLuint v2, GLuint pv )
{
   (void) pv;
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1

#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLdepth zspan[MAX_WIDTH];				\
	   GLubyte rgba[MAX_WIDTH][4];				\
	   if (n>0) {						\
	      for (i=0;i<n;i++) {				\
		 zspan[i] = FixedToDepth(ffz);			\
		 rgba[i][RCOMP] = FixedToInt(ffr);		\
		 rgba[i][GCOMP] = FixedToInt(ffg);		\
		 rgba[i][BCOMP] = FixedToInt(ffb);		\
		 rgba[i][ACOMP] = FixedToInt(ffa);		\
		 ffz += fdzdx;					\
		 ffr += fdrdx;					\
		 ffg += fdgdx;					\
		 ffb += fdbdx;					\
		 ffa += fdadx;					\
	      }							\
	      gl_write_rgba_span( ctx, n, LEFT, Y,		\
                                  (const GLdepth *) zspan,	\
	                          rgba, GL_POLYGON );		\
	   }							\
	}

#include "tritemp.h"

   ASSERT(!ctx->Texture.ReallyEnabled);  /* texturing must be off */
   ASSERT(ctx->Light.ShadeModel==GL_SMOOTH);
}


/*
 * Render an RGB, GL_DECAL, textured triangle.
 * Interpolate S,T only w/out mipmapping or perspective correction.
 */
static void simple_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                      GLuint v2, GLuint pv )
{
#define INTERP_INT_ST 1
#define S_SCALE twidth
#define T_SCALE theight
#define SETUP_CODE							\
   struct gl_texture_object *obj = ctx->Texture.Unit[0].CurrentD[2];	\
   GLint b = obj->BaseLevel;						\
   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
   GLubyte *texture = obj->Image[b]->Data;				\
   GLint smask = obj->Image[b]->Width - 1;				\
   GLint tmask = obj->Image[b]->Height - 1;
   (void) pv;

#define RGB_TEX                          \
        rgba[i][RCOMP] = texture[pos];	 \
        rgba[i][GCOMP] = texture[pos+1]; \
        rgba[i][BCOMP] = texture[pos+2]; \
        rgba[i][ACOMP] = 255



#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLubyte rgba[MAX_WIDTH][4];				\
	   if (n>0) {						\
              ffs -= FIXED_HALF; /* off-by-one error? */        \
              fft -= FIXED_HALF;                                \
	      for (i=0;i<n;i++) {				\
                 GLint s = FixedToInt(ffs) & smask;		\
                 GLint t = FixedToInt(fft) & tmask;		\
                 GLint pos = (t << twidth_log2) + s;		\
                 pos = pos + pos  + pos;  /* multiply by 3 */	\
                 RGB_TEX;                                       \
		 ffs += fdsdx;					\
		 fft += fdtdx;					\
	      }							\
              (*ctx->Driver.WriteRGBASpan)( ctx, n, LEFT, Y,	\
                           (const GLubyte (*)[4]) rgba, NULL );	\
	   }							\
	}

#include "tritemp.h"
}


/*
 * Render an RGB, GL_DECAL, textured triangle.
 * Interpolate S,T, GL_LESS depth test, w/out mipmapping or
 * perspective correction.
 */
static void simple_z_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                        GLuint v2, GLuint pv )
{
#define INTERP_Z 1
#define INTERP_INT_ST 1
#define S_SCALE twidth
#define T_SCALE theight
#define SETUP_CODE							\
   struct gl_texture_object *obj = ctx->Texture.Unit[0].CurrentD[2];	\
   GLint b = obj->BaseLevel;						\
   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
   GLubyte *texture = obj->Image[b]->Data;				\
   GLint smask = obj->Image[b]->Width - 1;				\
   GLint tmask = obj->Image[b]->Height - 1;
   (void) pv;

#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLubyte rgba[MAX_WIDTH][4];				\
           GLubyte mask[MAX_WIDTH];				\
	   if (n>0) {						\
              ffs -= FIXED_HALF; /* off-by-one error? */        \
              fft -= FIXED_HALF;                                \
	      for (i=0;i<n;i++) {				\
                 GLdepth z = FixedToDepth(ffz);			\
                 if (z < zRow[i]) {				\
                    GLint s = FixedToInt(ffs) & smask;		\
                    GLint t = FixedToInt(fft) & tmask;		\
                    GLint pos = (t << twidth_log2) + s;		\
                    pos = pos + pos  + pos;  /* multiply by 3 */\
                    RGB_TEX;                                    \
		    zRow[i] = z;				\
                    mask[i] = 1;				\
                 }						\
                 else {						\
                    mask[i] = 0;				\
                 }						\
		 ffz += fdzdx;					\
		 ffs += fdsdx;					\
		 fft += fdtdx;					\
	      }							\
              (*ctx->Driver.WriteRGBASpan)( ctx, n, LEFT, Y,	\
                           (const GLubyte (*)[4]) rgba, mask );	\
	   }							\
	}

#include "tritemp.h"
}



/*
 * Render an RGB/RGBA textured triangle without perspective correction.
 */
static void affine_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
				      GLuint v2, GLuint pv )
{
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define INTERP_INT_ST 1
#define S_SCALE twidth
#define T_SCALE theight
#define SETUP_CODE							\
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;			\
   struct gl_texture_object *obj = unit->CurrentD[2];			\
   GLint b = obj->BaseLevel;						\
   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
   GLubyte *texture = obj->Image[b]->Data;				\
   GLint smask = obj->Image[b]->Width - 1;				\
   GLint tmask = obj->Image[b]->Height - 1;                             \
   GLint format = obj->Image[b]->Format;                                \
   GLint filter = obj->MinFilter;                                       \
   GLint envmode = unit->EnvMode;                                       \
   GLint comp, tbytesline, tsize;                                       \
   GLfixed er, eg, eb, ea;                                              \
   GLint tr, tg, tb, ta;                                                \
   if (envmode == GL_BLEND || envmode == GL_ADD) {                      \
      /* potential off-by-one error here? (1.0f -> 2048 -> 0) */        \
      er = FloatToFixed(unit->EnvColor[0]);                             \
      eg = FloatToFixed(unit->EnvColor[1]);                             \
      eb = FloatToFixed(unit->EnvColor[2]);                             \
      ea = FloatToFixed(unit->EnvColor[3]);                             \
   }                                                                    \
   switch (format) {                                                    \
   case GL_ALPHA:                                                       \
   case GL_LUMINANCE:                                                   \
   case GL_INTENSITY:                                                   \
      comp = 1;                                                         \
      break;                                                            \
   case GL_LUMINANCE_ALPHA:                                             \
      comp = 2;                                                         \
      break;                                                            \
   case GL_RGB:                                                         \
      comp = 3;                                                         \
      break;                                                            \
   case GL_RGBA:                                                        \
      comp = 4;                                                         \
      break;                                                            \
   default:                                                             \
      gl_problem(NULL, "Bad texture format in affine_texture_triangle");\
      return;                                                           \
   }                                                                    \
   tbytesline = obj->Image[b]->Width * comp;                            \
   tsize = theight * tbytesline;
   (void) pv;

  /* Instead of defining a function for each mode, a test is done 
   * between the outer and inner loops. This is to reduce code size
   * and complexity. Observe that an optimizing compiler kills 
   * unused variables (for instance tf,sf,ti,si in case of GL_NEAREST).
   */ 

#define NEAREST_RGB    \
        tr = tex00[0]; \
        tg = tex00[1]; \
        tb = tex00[2]; \
        ta = 0xff

#define LINEAR_RGB                                                      \
	tr = (ti * (si * tex00[0] + sf * tex01[0]) +                    \
              tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \
	tg = (ti * (si * tex00[1] + sf * tex01[1]) +                    \
              tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \
	tb = (ti * (si * tex00[2] + sf * tex01[2]) +                    \
              tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \
	ta = 0xff

#define NEAREST_RGBA   \
        tr = tex00[0]; \
        tg = tex00[1]; \
        tb = tex00[2]; \
        ta = tex00[3]

#define LINEAR_RGBA                                                     \
	tr = (ti * (si * tex00[0] + sf * tex01[0]) +                    \
              tf * (si * tex10[0] + sf * tex11[0])) >> 2 * FIXED_SHIFT; \
	tg = (ti * (si * tex00[1] + sf * tex01[1]) +                    \
              tf * (si * tex10[1] + sf * tex11[1])) >> 2 * FIXED_SHIFT; \
	tb = (ti * (si * tex00[2] + sf * tex01[2]) +                    \
              tf * (si * tex10[2] + sf * tex11[2])) >> 2 * FIXED_SHIFT; \
	ta = (ti * (si * tex00[3] + sf * tex01[3]) +                    \
              tf * (si * tex10[3] + sf * tex11[3])) >> 2 * FIXED_SHIFT

#define MODULATE                                       \
        dest[0] = ffr * (tr + 1) >> (FIXED_SHIFT + 8); \
        dest[1] = ffg * (tg + 1) >> (FIXED_SHIFT + 8); \
        dest[2] = ffb * (tb + 1) >> (FIXED_SHIFT + 8); \
        dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8)

#define DECAL                                                                \
	dest[0] = ((0xff - ta) * ffr + ((ta + 1) * tr << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \
	dest[1] = ((0xff - ta) * ffg + ((ta + 1) * tg << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \
	dest[2] = ((0xff - ta) * ffb + ((ta + 1) * tb << FIXED_SHIFT)) >> (FIXED_SHIFT + 8); \
	dest[3] = FixedToInt(ffa)

#define BLEND                                                               \
        dest[0] = ((0xff - tr) * ffr + (tr + 1) * er) >> (FIXED_SHIFT + 8); \
        dest[1] = ((0xff - tg) * ffg + (tg + 1) * eg) >> (FIXED_SHIFT + 8); \
        dest[2] = ((0xff - tb) * ffb + (tb + 1) * eb) >> (FIXED_SHIFT + 8); \
	dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8)

#define REPLACE       \
        dest[0] = tr; \
        dest[1] = tg; \
        dest[2] = tb; \
        dest[3] = ta

#define ADD                                                          \
        dest[0] = ((ffr << 8) + (tr + 1) * er) >> (FIXED_SHIFT + 8); \
        dest[1] = ((ffg << 8) + (tg + 1) * eg) >> (FIXED_SHIFT + 8); \
        dest[2] = ((ffb << 8) + (tb + 1) * eb) >> (FIXED_SHIFT + 8); \
	dest[3] = ffa * (ta + 1) >> (FIXED_SHIFT + 8)

/* shortcuts */

#define NEAREST_RGB_REPLACE  NEAREST_RGB;REPLACE

#define NEAREST_RGBA_REPLACE  *(GLint *)dest = *(GLint *)tex00

#define SPAN1(DO_TEX,COMP)                                 \
	for (i=0;i<n;i++) {                                \
           GLint s = FixedToInt(ffs) & smask;              \
           GLint t = FixedToInt(fft) & tmask;              \
           GLint pos = (t << twidth_log2) + s;             \
           GLubyte *tex00 = texture + COMP * pos;          \
	   zspan[i] = FixedToDepth(ffz);                   \
           DO_TEX;                                         \
	   ffz += fdzdx;                                   \
           ffr += fdrdx;                                   \
	   ffg += fdgdx;                                   \
           ffb += fdbdx;                                   \
	   ffa += fdadx;                                   \
	   ffs += fdsdx;                                   \
	   fft += fdtdx;                                   \
           dest += 4;                                      \
	}

#define SPAN2(DO_TEX,COMP)                                 \
	for (i=0;i<n;i++) {                                \
           GLint s = FixedToInt(ffs) & smask;              \
           GLint t = FixedToInt(fft) & tmask;              \
           GLint sf = ffs & FIXED_FRAC_MASK;               \
           GLint tf = fft & FIXED_FRAC_MASK;               \
           GLint si = FIXED_FRAC_MASK - sf;                \
           GLint ti = FIXED_FRAC_MASK - tf;                \
           GLint pos = (t << twidth_log2) + s;             \
           GLubyte *tex00 = texture + COMP * pos;          \
           GLubyte *tex10 = tex00 + tbytesline;            \
           GLubyte *tex01 = tex00 + COMP;                  \
           GLubyte *tex11 = tex10 + COMP;                  \
           if (t == tmask) {                               \
              tex10 -= tsize;                              \
              tex11 -= tsize;                              \
           }                                               \
           if (s == smask) {                               \
              tex01 -= tbytesline;                         \
              tex11 -= tbytesline;                         \
           }                                               \
	   zspan[i] = FixedToDepth(ffz);                   \
           DO_TEX;                                         \
	   ffz += fdzdx;                                   \
           ffr += fdrdx;                                   \
	   ffg += fdgdx;                                   \
           ffb += fdbdx;                                   \
	   ffa += fdadx;                                   \
	   ffs += fdsdx;                                   \
	   fft += fdtdx;                                   \
           dest += 4;                                      \
	}

/* here comes the heavy part.. (something for the compiler to chew on) */
#define INNER_LOOP( LEFT, RIGHT, Y )	                   \
	{				                   \
	   GLint i, n = RIGHT-LEFT;	                   \
	   GLdepth zspan[MAX_WIDTH];	                   \
	   GLubyte rgba[MAX_WIDTH][4];                     \
	   if (n>0) {                                      \
              GLubyte *dest = rgba[0];                     \
              ffs -= FIXED_HALF; /* off-by-one error? */   \
              fft -= FIXED_HALF;                           \
              switch (filter) {                            \
   	      case GL_NEAREST:                             \
		 switch (format) {                         \
                 case GL_RGB:                              \
	            switch (envmode) {                     \
	            case GL_MODULATE:                      \
                       SPAN1(NEAREST_RGB;MODULATE,3);      \
                       break;                              \
	            case GL_DECAL:                         \
                    case GL_REPLACE:                       \
                       SPAN1(NEAREST_RGB_REPLACE,3);       \
                       break;                              \
                    case GL_BLEND:                         \
                       SPAN1(NEAREST_RGB;BLEND,3);         \
                       break;                              \
                    case GL_ADD:                           \
                       SPAN1(NEAREST_RGB;ADD,3);           \
                       break;                              \
	            }                                      \
                    break;                                 \
		 case GL_RGBA:                             \
		    switch(envmode) {                      \
		    case GL_MODULATE:                      \
                       SPAN1(NEAREST_RGBA;MODULATE,4);     \
                       break;                              \
		    case GL_DECAL:                         \
                       SPAN1(NEAREST_RGBA;DECAL,4);        \
                       break;                              \
		    case GL_BLEND:                         \
                       SPAN1(NEAREST_RGBA;BLEND,4);        \
                       break;                              \
		    case GL_REPLACE:                       \
                       SPAN1(NEAREST_RGBA_REPLACE,4);      \
                       break;                              \
		    case GL_ADD:                           \
                       SPAN1(NEAREST_RGBA;ADD,4);          \
                       break;                              \
		    }                                      \
                    break;                                 \
	         }                                         \
                 break;                                    \
	      case GL_LINEAR:                              \
                 ffs -= FIXED_HALF;                        \
                 fft -= FIXED_HALF;                        \
		 switch (format) {                         \
		 case GL_RGB:                              \
		    switch (envmode) {                     \
		    case GL_MODULATE:                      \
		       SPAN2(LINEAR_RGB;MODULATE,3);       \
                       break;                              \
		    case GL_DECAL:                         \
		    case GL_REPLACE:                       \
                       SPAN2(LINEAR_RGB;REPLACE,3);        \
                       break;                              \
		    case GL_BLEND:                         \
		       SPAN2(LINEAR_RGB;BLEND,3);          \
		       break;                              \
		    case GL_ADD:                           \
		       SPAN2(LINEAR_RGB;ADD,3);            \
		       break;                              \
		    }                                      \
		    break;                                 \
		 case GL_RGBA:                             \
		    switch (envmode) {                     \
		    case GL_MODULATE:                      \
		       SPAN2(LINEAR_RGBA;MODULATE,4);      \
		       break;                              \
		    case GL_DECAL:                         \
		       SPAN2(LINEAR_RGBA;DECAL,4);         \
		       break;                              \
		    case GL_BLEND:                         \
		       SPAN2(LINEAR_RGBA;BLEND,4);         \
		       break;                              \
		    case GL_REPLACE:                       \
		       SPAN2(LINEAR_RGBA;REPLACE,4);       \
		       break;                              \
		    case GL_ADD:                           \
		       SPAN2(LINEAR_RGBA;ADD,4);           \
		       break;                              \
		    }                                      \
		    break;                                 \
	         }                                         \
                 break;                                    \
	      }                                            \
              gl_write_rgba_span(ctx, n, LEFT, Y, zspan,   \
                                 rgba, GL_POLYGON);        \
              /* explicit kill of variables: */            \
              ffr = ffg = ffb = ffa = 0;                   \
           }                                               \
	}

#include "tritemp.h"
#undef SPAN1
#undef SPAN2
}


/*
 * Render an perspective corrected RGB/RGBA textured triangle.
 * The Q (aka V in Mesa) coordinate must be zero such that the divide
 * by interpolated Q/W comes out right.
 *
 * XXX (May 15, 1999) this function not used for now because repeating
 * of negative texture coords not handled correctly!!!
 */
#if 000
static void persp_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
				     GLuint v2, GLuint pv )
{

#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define INTERP_STUV 1
#define SETUP_CODE							\
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;			\
   struct gl_texture_object *obj = unit->CurrentD[2];			\
   GLint b = obj->BaseLevel;						\
   GLfloat twidth = (GLfloat) obj->Image[b]->Width;			\
   GLfloat theight = (GLfloat) obj->Image[b]->Height;			\
   GLint twidth_log2 = obj->Image[b]->WidthLog2;			\
   GLubyte *texture = obj->Image[b]->Data;				\
   GLint smask = (obj->Image[b]->Width - 1);                            \
   GLint tmask = (obj->Image[b]->Height - 1);                           \
   GLint format = obj->Image[b]->Format;                                \
   GLint filter = obj->MinFilter;                                       \
   GLint envmode = unit->EnvMode;                                       \
   GLfloat sscale, tscale;                                              \
   GLint comp, tbytesline, tsize;                                       \
   GLfixed er, eg, eb, ea;                                              \
   GLint tr, tg, tb, ta;                                                \
   if (envmode == GL_BLEND || envmode == GL_ADD) {                      \
      er = FloatToFixed(unit->EnvColor[0]);                             \
      eg = FloatToFixed(unit->EnvColor[1]);                             \
      eb = FloatToFixed(unit->EnvColor[2]);                             \
      ea = FloatToFixed(unit->EnvColor[3]);                             \
   }                                                                    \
   switch (format) {                                                    \
   case GL_ALPHA:                                                       \
   case GL_LUMINANCE:                                                   \
   case GL_INTENSITY:                                                   \
      comp = 1;                                                         \
      break;                                                            \
   case GL_LUMINANCE_ALPHA:                                             \
      comp = 2;                                                         \
      break;                                                            \
   case GL_RGB:                                                         \
      comp = 3;                                                         \
      break;                                                            \
   case GL_RGBA:                                                        \
      comp = 4;                                                         \
      break;                                                            \
   default:                                                             \
      gl_problem(NULL, "Bad texture format in persp_texture_triangle"); \
      return;                                                           \
   }                                                                    \
   if (filter == GL_NEAREST) {                                          \
      sscale = twidth;                                                  \
      tscale = theight;                                                 \
   }                                                                    \
   else {                                                               \
      sscale = FIXED_SCALE * twidth;                                    \
      tscale = FIXED_SCALE * theight;                                   \
   }                                                                    \
   tbytesline = obj->Image[b]->Width * comp;                            \
   tsize = theight * tbytesline;
   (void) pv;

#define SPAN1(DO_TEX,COMP)                                 \
        for (i=0;i<n;i++) {                                \
           GLfloat invQ = 1.0f / vv;                       \
           GLint s = (int)(SS * invQ) & smask;             \
           GLint t = (int)(TT * invQ) & tmask;             \
           GLint pos = COMP * ((t << twidth_log2) + s);    \
           GLubyte *tex00 = texture + pos;                 \
	   zspan[i] = FixedToDepth(ffz);                   \
           DO_TEX;                                         \
	   ffz += fdzdx;                                   \
           ffr += fdrdx;                                   \
	   ffg += fdgdx;                                   \
           ffb += fdbdx;                                   \
	   ffa += fdadx;                                   \
           SS += dSdx;                                     \
           TT += dTdx;                                     \
	   vv += dvdx;                                     \
           dest += 4;                                      \
	}

#define SPAN2(DO_TEX,COMP)                                 \
        for (i=0;i<n;i++) {                                \
           GLfloat invQ = 1.0f / vv;                       \
           GLfixed ffs = (int)(SS * invQ);                 \
           GLfixed fft = (int)(TT * invQ);                 \
	   GLint s = FixedToInt(ffs) & smask;              \
	   GLint t = FixedToInt(fft) & tmask;              \
           GLint sf = ffs & FIXED_FRAC_MASK;               \
           GLint tf = fft & FIXED_FRAC_MASK;               \
           GLint si = FIXED_FRAC_MASK - sf;                \
           GLint ti = FIXED_FRAC_MASK - tf;                \
           GLint pos = COMP * ((t << twidth_log2) + s);    \
           GLubyte *tex00 = texture + pos;                 \
           GLubyte *tex10 = tex00 + tbytesline;            \
           GLubyte *tex01 = tex00 + COMP;                  \
           GLubyte *tex11 = tex10 + COMP;                  \
           if (t == tmask) {                               \
              tex10 -= tsize;                              \
              tex11 -= tsize;                              \
           }                                               \
           if (s == smask) {                               \
              tex01 -= tbytesline;                         \
              tex11 -= tbytesline;                         \
           }                                               \
	   zspan[i] = FixedToDepth(ffz);                   \
           DO_TEX;                                         \
	   ffz += fdzdx;                                   \
           ffr += fdrdx;                                   \
	   ffg += fdgdx;                                   \
           ffb += fdbdx;                                   \
	   ffa += fdadx;                                   \
           SS += dSdx;                                     \
           TT += dTdx;                                     \
	   vv += dvdx;                                     \
           dest += 4;                                      \
	}

#define INNER_LOOP( LEFT, RIGHT, Y )	                   \
	{				                   \
	   GLint i, n = RIGHT-LEFT;	                   \
	   GLdepth zspan[MAX_WIDTH];	                   \
	   GLubyte rgba[MAX_WIDTH][4];	                   \
           (void)uu; /* please GCC */                      \
	   if (n>0) {                                      \
              GLfloat SS = ss * sscale;                    \
              GLfloat TT = tt * tscale;                    \
              GLfloat dSdx = dsdx * sscale;                \
              GLfloat dTdx = dtdx * tscale;                \
              GLubyte *dest = rgba[0];                     \
              switch (filter) {                            \
   	      case GL_NEAREST:                             \
		 switch (format) {                         \
                 case GL_RGB:                              \
	            switch (envmode) {                     \
	            case GL_MODULATE:                      \
                       SPAN1(NEAREST_RGB;MODULATE,3);      \
                       break;                              \
	            case GL_DECAL:                         \
                    case GL_REPLACE:                       \
                       SPAN1(NEAREST_RGB_REPLACE,3);       \
                       break;                              \
                    case GL_BLEND:                         \
                       SPAN1(NEAREST_RGB;BLEND,3);         \
                       break;                              \
                    case GL_ADD:                           \
                       SPAN1(NEAREST_RGB;ADD,3);           \
                       break;                              \
	            }                                      \
                    break;                                 \
		 case GL_RGBA:                             \
		    switch(envmode) {                      \
		    case GL_MODULATE:                      \
                       SPAN1(NEAREST_RGBA;MODULATE,4);     \
                       break;                              \
		    case GL_DECAL:                         \
                       SPAN1(NEAREST_RGBA;DECAL,4);        \
                       break;                              \
		    case GL_BLEND:                         \
                       SPAN1(NEAREST_RGBA;BLEND,4);        \
                       break;                              \
		    case GL_REPLACE:                       \
                       SPAN1(NEAREST_RGBA_REPLACE,4);      \
                       break;                              \
		    case GL_ADD:                           \
                       SPAN1(NEAREST_RGBA;ADD,4);          \
                       break;                              \
		    }                                      \
                    break;                                 \
	         }                                         \
                 break;                                    \
	      case GL_LINEAR:                              \
	         SS -= 0.5f * FIXED_SCALE * vv;            \
		 TT -= 0.5f * FIXED_SCALE * vv;            \
		 switch (format) {                         \
		 case GL_RGB:                              \
		    switch (envmode) {                     \
		    case GL_MODULATE:                      \
		       SPAN2(LINEAR_RGB;MODULATE,3);       \
                       break;                              \
		    case GL_DECAL:                         \
		    case GL_REPLACE:                       \
                       SPAN2(LINEAR_RGB;REPLACE,3);        \
                       break;                              \
		    case GL_BLEND:                         \
		       SPAN2(LINEAR_RGB;BLEND,3);          \
		       break;                              \
		    case GL_ADD:                           \
		       SPAN2(LINEAR_RGB;ADD,3);            \
		       break;                              \
		    }                                      \
		    break;                                 \
		 case GL_RGBA:                             \
		    switch (envmode) {                     \
		    case GL_MODULATE:                      \
		       SPAN2(LINEAR_RGBA;MODULATE,4);      \
		       break;                              \
		    case GL_DECAL:                         \
		       SPAN2(LINEAR_RGBA;DECAL,4);         \
		       break;                              \
		    case GL_BLEND:                         \
		       SPAN2(LINEAR_RGBA;BLEND,4);         \
		       break;                              \
		    case GL_REPLACE:                       \
		       SPAN2(LINEAR_RGBA;REPLACE,4);       \
		       break;                              \
		    case GL_ADD:                           \
		       SPAN2(LINEAR_RGBA;ADD,4);           \
		       break;                              \
		    }                                      \
		    break;                                 \
	         }                                         \
                 break;                                    \
	      }                                            \
	      gl_write_rgba_span( ctx, n, LEFT, Y, zspan,  \
				  rgba, GL_POLYGON );      \
              ffr = ffg = ffb = ffa = 0;                   \
	   }                                               \
	}


#include "tritemp.h"
#undef SPAN1
#undef SPAN2
}
#endif



/*
 * Render a smooth-shaded, textured, RGBA triangle.
 * Interpolate S,T,U with perspective correction, w/out mipmapping.
 * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because
 * R is already used for red.
 */
static void general_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                       GLuint v2, GLuint pv )
{
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define INTERP_STUV 1
#define SETUP_CODE						\
   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
   GLint r, g, b, a;						\
   if (flat_shade) {						\
      r = VB->ColorPtr->data[pv][0];				\
      g = VB->ColorPtr->data[pv][1];				\
      b = VB->ColorPtr->data[pv][2];				\
      a = VB->ColorPtr->data[pv][3];				\
   }
#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
	   GLdepth zspan[MAX_WIDTH];				\
	   GLubyte rgba[MAX_WIDTH][4];				\
           GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];	\
	   if (n>0) {						\
              if (flat_shade) {					\
                 for (i=0;i<n;i++) {				\
		    GLdouble invQ = 1.0 / vv;			\
		    zspan[i] = FixedToDepth(ffz);		\
		    rgba[i][RCOMP] = r;				\
		    rgba[i][GCOMP] = g;				\
		    rgba[i][BCOMP] = b;				\
		    rgba[i][ACOMP] = a;				\
		    s[i] = ss*invQ;				\
		    t[i] = tt*invQ;				\
		    u[i] = uu*invQ;				\
		    ffz += fdzdx;				\
		    ss += dsdx;					\
		    tt += dtdx;					\
		    uu += dudx;					\
		    vv += dvdx;					\
		 }						\
              }							\
              else {						\
                 for (i=0;i<n;i++) {				\
		    GLdouble invQ = 1.0 / vv;			\
		    zspan[i] = FixedToDepth(ffz);		\
		    rgba[i][RCOMP] = FixedToInt(ffr);		\
		    rgba[i][GCOMP] = FixedToInt(ffg);		\
		    rgba[i][BCOMP] = FixedToInt(ffb);		\
		    rgba[i][ACOMP] = FixedToInt(ffa);		\
		    s[i] = ss*invQ;				\
		    t[i] = tt*invQ;				\
		    u[i] = uu*invQ;				\
		    ffz += fdzdx;				\
		    ffr += fdrdx;				\
		    ffg += fdgdx;				\
		    ffb += fdbdx;				\
		    ffa += fdadx;				\
		    ss += dsdx;					\
		    tt += dtdx;					\
		    uu += dudx;					\
		    vv += dvdx;					\
		 }						\
              }							\
	      gl_write_texture_span( ctx, n, LEFT, Y, zspan,	\
                                     s, t, u, NULL, 		\
	                             rgba, \
                                     NULL, GL_POLYGON );	\
	   }							\
	}

#include "tritemp.h"
}


/*
 * Render a smooth-shaded, textured, RGBA triangle with separate specular
 * color interpolation.
 * Interpolate S,T,U with perspective correction, w/out mipmapping.
 * Note: we use texture coordinates S,T,U,V instead of S,T,R,Q because
 * R is already used for red.
 */
static void general_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
                                             GLuint v1, GLuint v2, GLuint pv,
                                             GLdepth zspan[MAX_WIDTH],
                                             GLubyte rgba[MAX_WIDTH][4],
                                             GLubyte spec[MAX_WIDTH][4] )
{
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_SPEC 1
#define INTERP_ALPHA 1
#define INTERP_STUV 1
#define SETUP_CODE						\
   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
   GLint r, g, b, a, sr, sg, sb;				\
   if (flat_shade) {						\
      r = VB->ColorPtr->data[pv][0];				\
      g = VB->ColorPtr->data[pv][1];				\
      b = VB->ColorPtr->data[pv][2];				\
      a = VB->ColorPtr->data[pv][3];				\
      sr = VB->Specular[pv][0]; 				\
      sg = VB->Specular[pv][1]; 				\
      sb = VB->Specular[pv][2]; 				\
   }
#define INNER_LOOP( LEFT, RIGHT, Y )				\
	{							\
	   GLint i, n = RIGHT-LEFT;				\
           GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];	\
	   if (n>0) {						\
              if (flat_shade) {					\
                 for (i=0;i<n;i++) {				\
		    GLdouble invQ = 1.0 / vv;			\
		    zspan[i] = FixedToDepth(ffz);		\
		    rgba[i][RCOMP] = r;				\
		    rgba[i][GCOMP] = g;				\
		    rgba[i][BCOMP] = b;				\
		    rgba[i][ACOMP] = a;				\
		    spec[i][RCOMP] = sr;			\
		    spec[i][GCOMP] = sg;			\
		    spec[i][BCOMP] = sb;			\
		    s[i] = ss*invQ;				\
		    t[i] = tt*invQ;				\
		    u[i] = uu*invQ;				\
		    ffz += fdzdx;				\
		    ss += dsdx;					\
		    tt += dtdx;					\
		    uu += dudx;					\
		    vv += dvdx;					\
		 }						\
              }							\
              else {						\
                 for (i=0;i<n;i++) {				\
		    GLdouble invQ = 1.0 / vv;			\
		    zspan[i] = FixedToDepth(ffz);		\
		    rgba[i][RCOMP] = FixedToInt(ffr);		\
		    rgba[i][GCOMP] = FixedToInt(ffg);		\
		    rgba[i][BCOMP] = FixedToInt(ffb);		\
		    rgba[i][ACOMP] = FixedToInt(ffa);		\
		    spec[i][RCOMP] = FixedToInt(ffsr);		\
		    spec[i][GCOMP] = FixedToInt(ffsg);		\
		    spec[i][BCOMP] = FixedToInt(ffsb);		\
		    s[i] = ss*invQ;				\
		    t[i] = tt*invQ;				\
		    u[i] = uu*invQ;				\
		    ffz += fdzdx;				\
		    ffr += fdrdx;				\
		    ffg += fdgdx;				\
		    ffb += fdbdx;				\
		    ffa += fdadx;				\
		    ffsr += fdsrdx;				\
		    ffsg += fdsgdx;				\
		    ffsb += fdsbdx;				\
		    ss += dsdx;					\
		    tt += dtdx;					\
		    uu += dudx;					\
		    vv += dvdx;					\
		 }						\
              }							\
	      gl_write_texture_span( ctx, n, LEFT, Y, zspan,	\
                                   s, t, u, NULL, rgba,		\
                                   (const GLubyte (*)[4]) spec,	\
	                           GL_POLYGON );		\
	   }							\
	}

#include "tritemp.h"
}



/*
 * Compute the lambda value (texture level value) for a fragment.
 */
static GLfloat compute_lambda( GLfloat s, GLfloat dsdx, GLfloat dsdy,
                               GLfloat t, GLfloat dtdx, GLfloat dtdy,
                               GLfloat invQ, GLfloat dqdx, GLfloat dqdy,
                               GLfloat width, GLfloat height ) 
{
   GLfloat dudx, dudy, dvdx, dvdy;
   GLfloat r1, r2, rho2;
   GLfloat invQ_width = invQ * width;
   GLfloat invQ_height = invQ * height;

   dudx = (dsdx - s*dqdx) * invQ_width;
   dudy = (dsdy - s*dqdy) * invQ_width;
   dvdx = (dtdx - t*dqdx) * invQ_height;
   dvdy = (dtdy - t*dqdy) * invQ_height;

   r1 = dudx * dudx + dudy * dudy;
   r2 = dvdx * dvdx + dvdy * dvdy;

   rho2 = r1 + r2;     /* used to be:  rho2 = MAX2(r1,r2); */
   ASSERT( rho2 >= 0.0 );

   /* return log base 2 of rho */
   return log(rho2) * 1.442695 * 0.5;       /* 1.442695 = 1/log(2) */
}


/*
 * Render a smooth-shaded, textured, RGBA triangle.
 * Interpolate S,T,U with perspective correction and compute lambda for
 * each fragment.  Lambda is used to determine whether to use the
 * minification or magnification filter.  If minification and using
 * mipmaps, lambda is also used to select the texture level of detail.
 */
static void lambda_textured_triangle1( GLcontext *ctx, GLuint v0, GLuint v1,
                                       GLuint v2, GLuint pv,
                                       GLfloat s[MAX_WIDTH],
                                       GLfloat t[MAX_WIDTH],
                                       GLfloat u[MAX_WIDTH] )
{
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define INTERP_STUV 1

#define SETUP_CODE							\
   const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;	\
   const GLint baseLevel = obj->BaseLevel;				\
   const struct gl_texture_image *texImage = obj->Image[baseLevel];	\
   const GLfloat twidth = (GLfloat) texImage->Width;			\
   const GLfloat theight = (GLfloat) texImage->Height;			\
   const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
   GLint r, g, b, a;							\
   if (flat_shade) {							\
      r = VB->ColorPtr->data[pv][0];					\
      g = VB->ColorPtr->data[pv][1];					\
      b = VB->ColorPtr->data[pv][2];					\
      a = VB->ColorPtr->data[pv][3];					\
   }

#define INNER_LOOP( LEFT, RIGHT, Y )					\
	{								\
	   GLint i, n = RIGHT-LEFT;					\
	   GLdepth zspan[MAX_WIDTH];					\
	   GLubyte rgba[MAX_WIDTH][4];					\
	   GLfloat lambda[MAX_WIDTH];					\
	   if (n>0) {							\
	      if (flat_shade) {						\
		 for (i=0;i<n;i++) {					\
		    GLdouble invQ = 1.0 / vv;				\
		    zspan[i] = FixedToDepth(ffz);			\
		    rgba[i][RCOMP] = r;					\
		    rgba[i][GCOMP] = g;					\
		    rgba[i][BCOMP] = b;					\
		    rgba[i][ACOMP] = a;					\
		    s[i] = ss*invQ;					\
		    t[i] = tt*invQ;					\
		    u[i] = uu*invQ;					\
		    lambda[i] = compute_lambda( s[i], dsdx, dsdy,	\
						t[i], dtdx, dtdy,	\
						invQ, dvdx, dvdy,	\
						twidth, theight );	\
		    ffz += fdzdx;					\
		    ss += dsdx;						\
		    tt += dtdx;						\
		    uu += dudx;						\
		    vv += dvdx;						\
		 }							\
              }								\
              else {							\
		 for (i=0;i<n;i++) {					\
		    GLdouble invQ = 1.0 / vv;				\
		    zspan[i] = FixedToDepth(ffz);			\
		    rgba[i][RCOMP] = FixedToInt(ffr);			\
		    rgba[i][GCOMP] = FixedToInt(ffg);			\
		    rgba[i][BCOMP] = FixedToInt(ffb);			\
		    rgba[i][ACOMP] = FixedToInt(ffa);			\
		    s[i] = ss*invQ;					\
		    t[i] = tt*invQ;					\
		    u[i] = uu*invQ;					\
		    lambda[i] = compute_lambda( s[i], dsdx, dsdy,	\
						t[i], dtdx, dtdy,	\
						invQ, dvdx, dvdy,	\
						twidth, theight );	\
		    ffz += fdzdx;					\
		    ffr += fdrdx;					\
		    ffg += fdgdx;					\
		    ffb += fdbdx;					\
		    ffa += fdadx;					\
		    ss += dsdx;						\
		    tt += dtdx;						\
		    uu += dudx;						\
		    vv += dvdx;						\
		 }							\
              }								\
	      gl_write_texture_span( ctx, n, LEFT, Y, zspan,		\
                                     s, t, u, lambda,	 		\
	                             rgba, NULL, GL_POLYGON );		\
	   }								\
	}

#include "tritemp.h"
}


/*
 * Render a smooth-shaded, textured, RGBA triangle with separate specular
 * interpolation.
 * Interpolate S,T,U with perspective correction and compute lambda for
 * each fragment.  Lambda is used to determine whether to use the
 * minification or magnification filter.  If minification and using
 * mipmaps, lambda is also used to select the texture level of detail.
 */
static void lambda_textured_spec_triangle1( GLcontext *ctx, GLuint v0,
                                            GLuint v1, GLuint v2, GLuint pv,
                                            GLfloat s[MAX_WIDTH],
                                            GLfloat t[MAX_WIDTH],
                                            GLfloat u[MAX_WIDTH] )
{
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_SPEC 1
#define INTERP_ALPHA 1
#define INTERP_STUV 1

#define SETUP_CODE							\
   const struct gl_texture_object *obj = ctx->Texture.Unit[0].Current;	\
   const GLint baseLevel = obj->BaseLevel;				\
   const struct gl_texture_image *texImage = obj->Image[baseLevel];	\
   const GLfloat twidth = (GLfloat) texImage->Width;			\
   const GLfloat theight = (GLfloat) texImage->Height;			\
   const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
   GLint r, g, b, a, sr, sg, sb;					\
   if (flat_shade) {							\
      r = VB->ColorPtr->data[pv][0];					\
      g = VB->ColorPtr->data[pv][1];					\
      b = VB->ColorPtr->data[pv][2];					\
      a = VB->ColorPtr->data[pv][3];					\
      sr = VB->Specular[pv][0];						\
      sg = VB->Specular[pv][1];						\
      sb = VB->Specular[pv][2];						\
   }

#define INNER_LOOP( LEFT, RIGHT, Y )					\
	{								\
	   GLint i, n = RIGHT-LEFT;					\
	   GLdepth zspan[MAX_WIDTH];					\
	   GLubyte spec[MAX_WIDTH][4];					\
           GLubyte rgba[MAX_WIDTH][4];					\
	   GLfloat lambda[MAX_WIDTH];					\
	   if (n>0) {							\
	      if (flat_shade) {						\
		 for (i=0;i<n;i++) {					\
		    GLdouble invQ = 1.0 / vv;				\
		    zspan[i] = FixedToDepth(ffz);			\
		    rgba[i][RCOMP] = r;					\
		    rgba[i][GCOMP] = g;					\
		    rgba[i][BCOMP] = b;					\
		    rgba[i][ACOMP] = a;					\
		    spec[i][RCOMP] = sr;				\
		    spec[i][GCOMP] = sg;				\
		    spec[i][BCOMP] = sb;				\
		    s[i] = ss*invQ;					\
		    t[i] = tt*invQ;					\
		    u[i] = uu*invQ;					\
		    lambda[i] = compute_lambda( s[i], dsdx, dsdy,	\
						t[i], dtdx, dtdy,	\
						invQ, dvdx, dvdy,	\
						twidth, theight );	\
		    ffz += fdzdx;					\
		    ss += dsdx;						\
		    tt += dtdx;						\
		    uu += dudx;						\
		    vv += dvdx;						\
		 }							\
              }								\
              else {							\
		 for (i=0;i<n;i++) {					\
		    GLdouble invQ = 1.0 / vv;				\
		    zspan[i] = FixedToDepth(ffz);			\
		    rgba[i][RCOMP] = FixedToInt(ffr);			\
		    rgba[i][GCOMP] = FixedToInt(ffg);			\
		    rgba[i][BCOMP] = FixedToInt(ffb);			\
		    rgba[i][ACOMP] = FixedToInt(ffa);			\
		    spec[i][RCOMP] = FixedToInt(ffsr);			\
		    spec[i][GCOMP] = FixedToInt(ffsg);			\
		    spec[i][BCOMP] = FixedToInt(ffsb);			\
		    s[i] = ss*invQ;					\
		    t[i] = tt*invQ;					\
		    u[i] = uu*invQ;					\
		    lambda[i] = compute_lambda( s[i], dsdx, dsdy,	\
						t[i], dtdx, dtdy,	\
						invQ, dvdx, dvdy,	\
						twidth, theight );	\
		    ffz += fdzdx;					\
		    ffr += fdrdx;					\
		    ffg += fdgdx;					\
		    ffb += fdbdx;					\
		    ffa += fdadx;					\
		    ffsr += fdsrdx;					\
		    ffsg += fdsgdx;					\
		    ffsb += fdsbdx;					\
		    ss += dsdx;						\
		    tt += dtdx;						\
		    uu += dudx;						\
		    vv += dvdx;						\
		 }							\
              }								\
	      gl_write_texture_span( ctx, n, LEFT, Y, zspan,		\
                                     s, t, u, lambda,	 		\
	                             rgba, (const GLubyte (*)[4]) spec, \
                                     GL_POLYGON );			\
	   }								\
	}

#include "tritemp.h"
}


/*
 * This is the big one!
 * Interpolate Z, RGB, Alpha, and two sets of texture coordinates.
 * Yup, it's slow.
 */
static void lambda_multitextured_triangle1( GLcontext *ctx, GLuint v0,
                                      GLuint v1, GLuint v2, GLuint pv,
                                      GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH],
                                      GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH],
                                      GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH]
                                      )
{
   GLubyte rgba[MAX_WIDTH][4];
#define INTERP_Z 1
#define INTERP_RGB 1
#define INTERP_ALPHA 1
#define INTERP_STUV 1
#define INTERP_STUV1 1

#define SETUP_CODE							\
   const struct gl_texture_object *obj0 = ctx->Texture.Unit[0].Current;	\
   const GLint baseLevel0 = obj0->BaseLevel;				\
   const struct gl_texture_image *texImage0 = obj0->Image[baseLevel0];	\
   const GLfloat twidth0 = (GLfloat) texImage0->Width;			\
   const GLfloat theight0 = (GLfloat) texImage0->Height;		\
   const struct gl_texture_object *obj1 = ctx->Texture.Unit[1].Current;	\
   const GLint baseLevel1 = obj1->BaseLevel;				\
   const struct gl_texture_image *texImage1 = obj1->Image[baseLevel1];	\
   const GLfloat twidth1 = (GLfloat) texImage1->Width;			\
   const GLfloat theight1 = (GLfloat) texImage1->Height;		\
   const GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);	\
   GLint r, g, b, a;							\
   if (flat_shade) {							\
      r = VB->ColorPtr->data[pv][0];					\
      g = VB->ColorPtr->data[pv][1];					\
      b = VB->ColorPtr->data[pv][2];					\
      a = VB->ColorPtr->data[pv][3];					\
   }

#define INNER_LOOP( LEFT, RIGHT, Y )					\
	{								\
	   GLint i, n = RIGHT-LEFT;					\
	   GLdepth zspan[MAX_WIDTH];					\
           GLfloat lambda[MAX_TEXTURE_UNITS][MAX_WIDTH];		\
	   if (n>0) {							\
	      if (flat_shade) {						\
		 for (i=0;i<n;i++) {					\
		    GLdouble invQ = 1.0 / vv;				\
		    GLdouble invQ1 = 1.0 / vv1;				\
		    zspan[i] = FixedToDepth(ffz);			\
		    rgba[i][RCOMP] = r;					\
		    rgba[i][GCOMP] = g;					\
		    rgba[i][BCOMP] = b;					\
		    rgba[i][ACOMP] = a;					\
		    s[0][i] = ss*invQ;					\
		    t[0][i] = tt*invQ;					\
		    u[0][i] = uu*invQ;					\
		    lambda[0][i] = compute_lambda( s[0][i], dsdx, dsdy,	\
						   t[0][i], dtdx, dtdy,	\
						   invQ, dvdx, dvdy,	\
						   twidth0, theight0 );	\
		    s[1][i] = ss1*invQ1;				\
		    t[1][i] = tt1*invQ1;				\
		    u[1][i] = uu1*invQ1;				\
		    lambda[1][i] = compute_lambda( s[1][i], ds1dx, ds1dy,	\
						   t[1][i], dt1dx, dt1dy,	\
						   invQ1, dvdx, dvdy,	\
						   twidth1, theight1 );	\
		    ffz += fdzdx;					\
		    ss += dsdx;						\
		    tt += dtdx;						\
		    uu += dudx;						\
		    vv += dvdx;						\
		    ss1 += ds1dx;					\
		    tt1 += dt1dx;					\
		    uu1 += du1dx;					\
		    vv1 += dv1dx;					\
		 }							\
              }								\
              else {							\
		 for (i=0;i<n;i++) {					\
		    GLdouble invQ = 1.0 / vv;				\
		    GLdouble invQ1 = 1.0 / vv1;				\
		    zspan[i] = FixedToDepth(ffz);			\
		    rgba[i][RCOMP] = FixedToInt(ffr);			\
		    rgba[i][GCOMP] = FixedToInt(ffg);			\
		    rgba[i][BCOMP] = FixedToInt(ffb);			\
		    rgba[i][ACOMP] = FixedToInt(ffa);			\
		    s[0][i] = ss*invQ;					\
		    t[0][i] = tt*invQ;					\
		    u[0][i] = uu*invQ;					\
		    lambda[0][i] = compute_lambda( s[0][i], dsdx, dsdy,	\
						   t[0][i], dtdx, dtdy,	\
						   invQ, dvdx, dvdy,	\
						   twidth0, theight0 );	\
		    s[1][i] = ss1*invQ1;				\
		    t[1][i] = tt1*invQ1;				\
		    u[1][i] = uu1*invQ1;				\
		    lambda[1][i] = compute_lambda( s[1][i], ds1dx, ds1dy, \
						   t[1][i], dt1dx, dt1dy, \
						   invQ1, dvdx, dvdy,	\
						   twidth1, theight1 );	\
		    ffz += fdzdx;					\
		    ffr += fdrdx;					\
		    ffg += fdgdx;					\
		    ffb += fdbdx;					\
		    ffa += fdadx;					\
		    ss += dsdx;						\
		    tt += dtdx;						\
		    uu += dudx;						\
		    vv += dvdx;						\
		    ss1 += ds1dx;					\
		    tt1 += dt1dx;					\
		    uu1 += du1dx;					\
		    vv1 += dv1dx;					\
		 }							\
              }								\
	      gl_write_multitexture_span( ctx, 2, n, LEFT, Y, zspan,	\
                                      (const GLfloat (*)[MAX_WIDTH]) s,	\
                                      (const GLfloat (*)[MAX_WIDTH]) t,	\
                                      (const GLfloat (*)[MAX_WIDTH]) u,	\
                                      (GLfloat (*)[MAX_WIDTH]) lambda,	\
	                              rgba, NULL, GL_POLYGON );		\
	   }								\
	}

#include "tritemp.h"
}


/*
 * These wrappers are needed to deal with the 32KB / stack frame limit
 * on Mac / PowerPC systems.
 */

static void general_textured_spec_triangle(GLcontext *ctx, GLuint v0,
                                           GLuint v1, GLuint v2, GLuint pv)
{
   GLdepth zspan[MAX_WIDTH];
   GLubyte rgba[MAX_WIDTH][4], spec[MAX_WIDTH][4];
   general_textured_spec_triangle1(ctx,v0,v1,v2,pv,zspan,rgba,spec);
}

static void lambda_textured_triangle( GLcontext *ctx, GLuint v0,
                                      GLuint v1, GLuint v2, GLuint pv )
{
   GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];
   lambda_textured_triangle1(ctx,v0,v1,v2,pv,s,t,u);
}

static void lambda_textured_spec_triangle( GLcontext *ctx, GLuint v0,
                                           GLuint v1, GLuint v2, GLuint pv )
{
   GLfloat s[MAX_WIDTH];
   GLfloat t[MAX_WIDTH];
   GLfloat u[MAX_WIDTH];
   lambda_textured_spec_triangle1(ctx,v0,v1,v2,pv,s,t,u);
}


static void lambda_multitextured_triangle( GLcontext *ctx, GLuint v0,
                                           GLuint v1, GLuint v2, GLuint pv)
{

   GLfloat s[MAX_TEXTURE_UNITS][MAX_WIDTH];
   GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH];
   DEFMARRAY(GLfloat,u,MAX_TEXTURE_UNITS,MAX_WIDTH);
   CHECKARRAY(u,return);
   
   lambda_multitextured_triangle1(ctx,v0,v1,v2,pv,s,t,u);
   
   UNDEFARRAY(u);
}


/*
 * Null rasterizer for measuring transformation speed.
 */
static void null_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                           GLuint v2, GLuint pv )
{
   (void) ctx;
   (void) v0;
   (void) v1;
   (void) v2;
   (void) pv;
}


#if 0
# define dputs(s) puts(s)
#else
# define dputs(s)
#endif

/*
 * Determine which triangle rendering function to use given the current
 * rendering context.
 */
void gl_set_triangle_function( GLcontext *ctx )
{
   GLboolean rgbmode = ctx->Visual->RGBAflag;

   if (ctx->RenderMode==GL_RENDER) {
      if (ctx->NoRaster) {
         ctx->Driver.TriangleFunc = null_triangle;
         return;
      }
      if (ctx->Driver.TriangleFunc) {
         /* Device driver will draw triangles. */
	 return;
      }

      if (ctx->Texture.ReallyEnabled) {
         /* Ugh, we do a _lot_ of tests to pick the best textured tri func */
	 int format, filter;
	 const struct gl_texture_object *current2Dtex = ctx->Texture.Unit[0].CurrentD[2];
         const struct gl_texture_image *image;
         /* First see if we can used an optimized 2-D texture function */
         if (ctx->Texture.ReallyEnabled==TEXTURE0_2D
             && current2Dtex->WrapS==GL_REPEAT
	     && current2Dtex->WrapT==GL_REPEAT
             && ((image = current2Dtex->Image[current2Dtex->BaseLevel]) != 0)  /* correct! */
             && image->Border==0
             && ((format = image->Format)==GL_RGB || format==GL_RGBA)
	     && (filter = current2Dtex->MinFilter)==current2Dtex->MagFilter
	     && ctx->Light.Model.ColorControl==GL_SINGLE_COLOR) {

	    if (ctx->Hint.PerspectiveCorrection==GL_FASTEST) {
	     
	       if (filter==GL_NEAREST
		   && format==GL_RGB
		   && (ctx->Texture.Unit[0].EnvMode==GL_REPLACE
		       || ctx->Texture.Unit[0].EnvMode==GL_DECAL)
		   && ((ctx->RasterMask==DEPTH_BIT
			&& ctx->Depth.Func==GL_LESS
			&& ctx->Depth.Mask==GL_TRUE)
		       || ctx->RasterMask==0)
		   && ctx->Polygon.StippleFlag==GL_FALSE) {

		  if (ctx->RasterMask==DEPTH_BIT) {
		     ctx->Driver.TriangleFunc = simple_z_textured_triangle;
		     dputs("simple_z_textured_triangle");
		  }
		  else {
		     ctx->Driver.TriangleFunc = simple_textured_triangle;
		     dputs("simple_textured_triangle");
		  }
	       }
	       else {
		  ctx->Driver.TriangleFunc = affine_textured_triangle;
		  dputs("affine_textured_triangle");
	       }
	    }
	    else {
	       /*ctx->Driver.TriangleFunc = persp_textured_triangle;*/
               ctx->Driver.TriangleFunc = general_textured_triangle;
	       dputs("persp_textured_triangle");
	    }
	 }
         else {
            /* More complicated textures (mipmap, multi-tex, sep specular) */
            GLboolean needLambda;
            /* if mag filter != min filter we need to compute lambda */
            const struct gl_texture_object *obj0 = ctx->Texture.Unit[0].Current;
            const struct gl_texture_object *obj1 = ctx->Texture.Unit[1].Current;
            if (obj0 && obj0->MinFilter != obj0->MagFilter)
               needLambda = GL_TRUE;
            else if (obj1 && obj1->MinFilter != obj1->MagFilter)
               needLambda = GL_TRUE;
            else
               needLambda = GL_FALSE;
            if (ctx->Texture.ReallyEnabled >= TEXTURE1_1D) {
               /* multi-texture! */
               ctx->Driver.TriangleFunc = lambda_multitextured_triangle;
	       dputs("lambda_multitextured_triangle");
            }
            else if (ctx->Light.Model.ColorControl==GL_SINGLE_COLOR) {
               if (needLambda) {
                  ctx->Driver.TriangleFunc = lambda_textured_triangle;
		  dputs("lambda_textured_triangle");
	       }
               else {
                  ctx->Driver.TriangleFunc = general_textured_triangle;
		  dputs("general_textured_triangle");
	       }
            }
            else {
               /* seprate specular color interpolation */
               if (needLambda) {
                  ctx->Driver.TriangleFunc = lambda_textured_spec_triangle;
		  dputs("lambda_textured_spec_triangle");
	       }
               else {
                  ctx->Driver.TriangleFunc = general_textured_spec_triangle;
		  dputs("general_textured_spec_triangle");
	       }
            }
         }
      }
      else {
	 if (ctx->Light.ShadeModel==GL_SMOOTH) {
	    /* smooth shaded, no texturing, stippled or some raster ops */
            if (rgbmode)
               ctx->Driver.TriangleFunc = smooth_rgba_triangle;
            else
               ctx->Driver.TriangleFunc = smooth_ci_triangle;
	 }
	 else {
	    /* flat shaded, no texturing, stippled or some raster ops */
            if (rgbmode)
               ctx->Driver.TriangleFunc = flat_rgba_triangle;
            else
               ctx->Driver.TriangleFunc = flat_ci_triangle;
	 }
      }
   }
   else if (ctx->RenderMode==GL_FEEDBACK) {
      ctx->Driver.TriangleFunc = feedback_triangle;
   }
   else {
      /* GL_SELECT mode */
      ctx->Driver.TriangleFunc = select_triangle;
   }
}
@


3.28
log
@fixed assertions (Texture.ReallyEnabled)
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.27 1999/07/15 01:55:15 brianp Exp $ */
d1567 1
a1567 1
             && (image = current2Dtex->Image[current2Dtex->BaseLevel])  /* correct! */
@


3.27
log
@added some simple assertions
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.26 1999/07/13 16:57:01 miklos Exp $ */
d239 1
a239 1
   ASSERT(!ctx->Texture.Enabled);  /* texturing must be off */
d282 1
a282 1
   ASSERT(!ctx->Texture.Enabled);  /* texturing must be off */
@


3.26
log
@DEFMARRAY fixes.
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.25 1999/07/12 15:51:21 brianp Exp $ */
d238 3
d281 3
@


3.25
log
@added some casts, misc clean-up
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.24 1999/07/12 12:05:25 keithw Exp $ */
a1345 1
                                      GLubyte rgba[MAX_WIDTH][4],
d1348 2
a1349 1
                                      GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH] )
d1351 1
d1502 1
a1502 1
   GLubyte rgba[MAX_WIDTH][4];
d1505 6
a1510 2
   GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH];
   lambda_multitextured_triangle1(ctx,v0,v1,v2,pv,rgba,s,t,u);
d1561 1
a1561 1
             && (image = current2Dtex->Image[current2Dtex->BaseLevel])  /* correct? */
@


3.24
log
@merge from experimental branch upto merge-1 tag
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.23 1999/06/18 20:06:30 brianp Exp $ */
d32 2
d144 2
a145 2
   GLuint index = VB->IndexPtr->data[pv];		\
   if (1) {			\
d210 1
a210 1
   if (1) {		\
d212 4
a215 4
      GLubyte r = VB->ColorPtr->data[pv][0];		\
      GLubyte g = VB->ColorPtr->data[pv][1];		\
      GLubyte b = VB->ColorPtr->data[pv][2];		\
      GLubyte a = VB->ColorPtr->data[pv][3];		\
d229 5
a233 3
                             VB->ColorPtr->data[pv][0], VB->ColorPtr->data[pv][1],\
                             VB->ColorPtr->data[pv][2], VB->ColorPtr->data[pv][3],\
			     GL_POLYGON );			\
d271 3
a273 2
	      gl_write_rgba_span( ctx, n, LEFT, Y, (const GLdepth *) zspan,	\
	                           rgba, GL_POLYGON );		\
d327 1
a327 1
                                            (const GLubyte (*)[4]) rgba, NULL );	\
a334 1

d385 1
a385 1
                                            (const GLubyte (*)[4]) rgba, mask );	\
d393 1
d407 2
a408 2
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;                     \
   struct gl_texture_object *obj = unit->CurrentD[2];                      \
d464 1
a464 1
#define LINEAR_RGB                                                    \
d479 1
a479 1
#define LINEAR_RGBA                                                   \
d489 1
a489 1
#define MODULATE                                     \
d495 1
a495 1
#define DECAL                                                                            \
d501 1
a501 1
#define BLEND                                                           \
d513 1
a513 1
#define ADD                                                      \
d691 1
d701 2
a702 2
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;                  \
   struct gl_texture_object *obj = unit->CurrentD[2];                     \
d918 2
d939 4
a942 4
      r = VB->ColorPtr->data[pv][0];					\
      g = VB->ColorPtr->data[pv][1];					\
      b = VB->ColorPtr->data[pv][2];					\
      a = VB->ColorPtr->data[pv][3];					\
d993 1
a993 1
	                             (const GLubyte (*)[4]) rgba, \
d1024 4
a1027 4
      r = VB->ColorPtr->data[pv][0];					\
      g = VB->ColorPtr->data[pv][1];					\
      b = VB->ColorPtr->data[pv][2];					\
      a = VB->ColorPtr->data[pv][3];					\
d1087 3
a1089 2
                                     s, t, u, NULL, 		\
	                             rgba, spec, GL_POLYGON );	\
a1126 1

d1154 4
a1157 4
      r = VB->ColorPtr->data[pv][0];						\
      g = VB->ColorPtr->data[pv][1];						\
      b = VB->ColorPtr->data[pv][2];						\
      a = VB->ColorPtr->data[pv][3];						\
a1224 1

d1254 4
a1257 4
      r = VB->ColorPtr->data[pv][0];						\
      g = VB->ColorPtr->data[pv][1];						\
      b = VB->ColorPtr->data[pv][2];						\
      a = VB->ColorPtr->data[pv][3];						\
d1330 2
a1331 1
	                             rgba, spec, GL_POLYGON );		\
a1338 1

d1348 2
a1349 1
                                      GLfloat t[MAX_TEXTURE_UNITS][MAX_WIDTH] )
d1371 4
a1374 4
      r = VB->ColorPtr->data[pv][0];						\
      g = VB->ColorPtr->data[pv][1];						\
      b = VB->ColorPtr->data[pv][2];						\
      a = VB->ColorPtr->data[pv][3];						\
a1380 1
           GLfloat u[MAX_TEXTURE_UNITS][MAX_WIDTH];			\
d1436 2
a1437 2
		    lambda[1][i] = compute_lambda( s[1][i], ds1dx, ds1dy,	\
						   t[1][i], dt1dx, dt1dy,	\
d1456 5
a1460 2
                                          s, t, u, lambda,	 	\
	                                  rgba, NULL, GL_POLYGON );	\
d1497 1
d1504 2
a1505 1
   lambda_multitextured_triangle1(ctx,v0,v1,v2,pv,rgba,s,t);
a1506 1

@


3.23
log
@whitespace cleanup
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.22 1999/05/17 21:44:52 brianp Exp $ */
d267 1
a267 1
	      gl_write_rgba_span( ctx, n, LEFT, Y, zspan,	\
d287 1
a287 1
   struct gl_texture_object *obj = ctx->Texture.Unit[0].Current2D;	\
d322 1
a322 1
                                             rgba, NULL );	\
d344 1
a344 1
   struct gl_texture_object *obj = ctx->Texture.Unit[0].Current2D;	\
d381 1
a381 1
                                             rgba, mask );	\
d402 2
a403 2
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;                  \
   struct gl_texture_object *obj = unit->Current2D;                     \
d696 1
a696 1
   struct gl_texture_object *obj = unit->Current2D;                     \
d985 2
a986 1
	                             rgba, NULL, GL_POLYGON );	\
d1539 1
a1539 1
	 const struct gl_texture_object *current2Dtex = ctx->Texture.Unit[0].Current2D;
@


3.22
log
@removed x86-optimized texel fetches - causes segfaults somtimes!
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.21 1999/05/17 21:28:06 brianp Exp $ */
d402 2
a403 2
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;                     \
   struct gl_texture_object *obj = unit->Current2D;                      \
d413 1
a413 1
   GLint envmode = unit->EnvMode;                                        \
d419 4
a422 4
      er = FloatToFixed(unit->EnvColor[0]);                              \
      eg = FloatToFixed(unit->EnvColor[1]);                              \
      eb = FloatToFixed(unit->EnvColor[2]);                              \
      ea = FloatToFixed(unit->EnvColor[3]);                              \
@


3.22.2.1
log
@Quake3 inspired optimizations
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.22 1999/05/17 21:44:52 brianp Exp $ */
d267 1
a267 1
	      gl_write_rgba_span( ctx, n, LEFT, Y, (const GLdepth *) zspan,	\
d322 1
a322 1
                                            (const GLubyte (*)[4]) rgba, NULL );	\
d381 1
a381 1
                                            (const GLubyte (*)[4]) rgba, mask );	\
d985 1
a985 2
	                             (const GLubyte (*)[4]) rgba, \
                                     NULL, GL_POLYGON );	\
a1531 1
	 ctx->IndirectTriangles &= ~DD_TRI_SW_RASTERIZE;
@


3.22.2.2
log
@some trial assembly, made newer code active by default
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.22.2.1 1999/05/21 21:29:27 keithw Exp $ */
d287 1
a287 1
   struct gl_texture_object *obj = ctx->Texture.Unit[0].CurrentD[2];	\
d344 1
a344 1
   struct gl_texture_object *obj = ctx->Texture.Unit[0].CurrentD[2];	\
d403 1
a403 1
   struct gl_texture_object *obj = unit->CurrentD[2];                      \
d696 1
a696 1
   struct gl_texture_object *obj = unit->CurrentD[2];                     \
d1540 1
a1540 1
	 const struct gl_texture_object *current2Dtex = ctx->Texture.Unit[0].CurrentD[2];
@


3.22.2.3
log
@Removed SGIS multitexture, added FX/X86 assm directory
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.22.2.2 1999/06/06 22:35:55 keithw Exp $ */
d1533 1
@


3.21
log
@disable use of persp_textured_triangle()
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.20 1999/03/31 20:18:40 keithw Exp $ */
d297 1
a297 4
#ifdef USE_X86_ASM
# define RGB_TEX *(GLint *)rgba[i] = *(GLint *)(texture + pos) | 0xff000000
#else
# define RGB_TEX                         \
a301 1
#endif
d516 2
a517 7
#if defined(USE_X86_ASM)
/* assumes (i) unaligned load capacity, and (ii) little endian: */
# define NEAREST_RGB_REPLACE  *(GLint *)dest = (*(GLint *)tex00 & 0x00ffffff) \
	                                       | ((ffa << (24 - FIXED_SHIFT)) & 0xff000000)
#else
# define NEAREST_RGB_REPLACE  NEAREST_RGB;REPLACE
#endif
@


3.20
log
@Compiled vertex arrays
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 1.3 1999/02/25 23:50:35 keithw Exp $ */
d691 3
d704 2
a705 2
   struct gl_texture_unit *unit = ctx->Texture.Unit+0;                     \
   struct gl_texture_object *obj = unit->Current2D;                      \
d715 1
a715 1
   GLint envmode = unit->EnvMode;                                        \
d721 4
a724 4
      er = FloatToFixed(unit->EnvColor[0]);                              \
      eg = FloatToFixed(unit->EnvColor[1]);                              \
      eb = FloatToFixed(unit->EnvColor[2]);                              \
      ea = FloatToFixed(unit->EnvColor[3]);                              \
d1586 2
a1587 1
	       ctx->Driver.TriangleFunc = persp_textured_triangle;
@


3.19
log
@Merged in kw3 patch
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.18 1999/02/24 22:48:08 jens Exp $ */
@


3.18
log
@Added header file to get XMesa to compile standalone and inside XFree86
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.17 1999/02/14 03:46:34 brianp Exp $ */
a27 57
/*
 * $Log: triangle.c,v $
 * Revision 3.17  1999/02/14 03:46:34  brianp
 * new copyright
 *
 * Revision 3.16  1998/11/17 01:53:35  brianp
 * fixed multi-texture bug/typo (use invQ1 instead of invQ)
 *
 * Revision 3.15  1998/11/08 22:34:07  brianp
 * renamed texture sets to texture units
 *
 * Revision 3.14  1998/11/03 01:16:57  brianp
 * added Texture.ReallyEnabled to simply testing for enabled textures
 *
 * Revision 3.13  1998/10/31 17:06:15  brianp
 * variety of multi-texture changes
 *
 * Revision 3.12  1998/10/29 02:34:36  brianp
 * cleaned-up code, fixed incomplete texture object selection bug
 *
 * Revision 3.11  1998/09/18 02:33:05  brianp
 * fixed sampling-out-of-bounds bug in optimized textured triangle functions
 *
 * Revision 3.10  1998/07/09 03:16:24  brianp
 * added Marten's latest texture triangle code
 *
 * Revision 3.9  1998/06/24 02:52:05  brianp
 * fixed texture coord interp problems.  lots of code clean-up
 *
 * Revision 3.8  1998/06/18 02:49:35  brianp
 * added Marten Stromberg's optimized textured triangle code
 *
 * Revision 3.7  1998/06/07 22:18:52  brianp
 * implemented GL_EXT_multitexture extension
 *
 * Revision 3.6  1998/05/31 23:50:36  brianp
 * cleaned up a few Solaris compiler warnings
 *
 * Revision 3.5  1998/04/01 02:58:52  brianp
 * applied Miklos Fazekas's 3-31-98 Macintosh changes
 *
 * Revision 3.4  1998/03/27 04:26:44  brianp
 * fixed G++ warnings
 *
 * Revision 3.3  1998/02/20 04:54:02  brianp
 * implemented GL_SGIS_multitexture
 *
 * Revision 3.2  1998/02/04 00:44:29  brianp
 * fixed casts and conditional expression problems for Amiga StormC compiler
 *
 * Revision 3.1  1998/02/02 03:09:34  brianp
 * added GL_LIGHT_MODEL_COLOR_CONTROL (separate specular color interpolation)
 *
 * Revision 3.0  1998/01/31 21:05:24  brianp
 * initial rev
 *
 */
d45 1
d73 1
a73 4
      color[0] = (GLfloat) VB->Color[pv][0] / 255.0;
      color[1] = (GLfloat) VB->Color[pv][1] / 255.0;
      color[2] = (GLfloat) VB->Color[pv][2] / 255.0;
      color[3] = (GLfloat) VB->Color[pv][3] / 255.0;
d86 4
a89 4
      x = VB->Win[v][0];
      y = VB->Win[v][1];
      z = VB->Win[v][2] / DEPTH_SCALE;
      w = VB->Clip[v][3];
d92 1
a92 5
         /* smooth shading - different color for each vertex */
         color[0] = (GLfloat) VB->Color[v][0] / 255.0;
         color[1] = (GLfloat) VB->Color[v][1] / 255.0;
         color[2] = (GLfloat) VB->Color[v][2] / 255.0;
         color[3] = (GLfloat) VB->Color[v][3] / 255.0;
d95 15
a109 8
      if (VB->MultiTexCoord[texUnit][v][3]==0.0)
         invq =  1.0;
      else
         invq = 1.0F / VB->MultiTexCoord[texUnit][v][3];
      tc[0] = VB->MultiTexCoord[texUnit][v][0] * invq;
      tc[1] = VB->MultiTexCoord[texUnit][v][1] * invq;
      tc[2] = VB->MultiTexCoord[texUnit][v][2] * invq;
      tc[3] = VB->MultiTexCoord[texUnit][v][3];
d111 2
a112 1
      gl_feedback_vertex( ctx, x, y, z, w, color, (GLfloat) VB->Index[v], tc );
d126 3
a128 3
   gl_update_hitflag( ctx, VB->Win[v0][2] / DEPTH_SCALE );
   gl_update_hitflag( ctx, VB->Win[v1][2] / DEPTH_SCALE );
   gl_update_hitflag( ctx, VB->Win[v2][2] / DEPTH_SCALE );
d142 2
a143 2
   GLuint index = VB->Index[pv];		\
   if (!VB->MonoColor) {			\
d208 1
a208 1
   if (!VB->MonoColor) {			\
d210 4
a213 4
      GLubyte r = VB->Color[pv][0];		\
      GLubyte g = VB->Color[pv][1];		\
      GLubyte b = VB->Color[pv][2];		\
      GLubyte a = VB->Color[pv][3];		\
d227 2
a228 2
                             VB->Color[pv][0], VB->Color[pv][1],\
                             VB->Color[pv][2], VB->Color[pv][3],\
d937 4
a940 4
      r = VB->Color[pv][0];					\
      g = VB->Color[pv][1];					\
      b = VB->Color[pv][2];					\
      a = VB->Color[pv][3];					\
d1021 4
a1024 4
      r = VB->Color[pv][0];					\
      g = VB->Color[pv][1];					\
      b = VB->Color[pv][2];					\
      a = VB->Color[pv][3];					\
d1151 4
a1154 4
      r = VB->Color[pv][0];						\
      g = VB->Color[pv][1];						\
      b = VB->Color[pv][2];						\
      a = VB->Color[pv][3];						\
d1252 4
a1255 4
      r = VB->Color[pv][0];						\
      g = VB->Color[pv][1];						\
      b = VB->Color[pv][2];						\
      a = VB->Color[pv][3];						\
d1368 4
a1371 4
      r = VB->Color[pv][0];						\
      g = VB->Color[pv][1];						\
      b = VB->Color[pv][2];						\
      a = VB->Color[pv][3];						\
d1538 1
d1540 2
a1541 1
      else if (ctx->Texture.ReallyEnabled) {
@


3.17
log
@new copyright
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.16 1998/11/17 01:53:35 brianp Exp brianp $ */
d30 3
d107 3
@


3.16
log
@fixed multi-texture bug/typo (use invQ1 instead of invQ)
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.15 1998/11/08 22:34:07 brianp Exp brianp $ */
d6 19
a24 15
 * Copyright (C) 1995-1998  Brian Paul
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * You should have received a copy of the GNU Library General Public
 * License along with this library; if not, write to the Free
 * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
d30 3
@


3.15
log
@renamed texture sets to texture units
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.14 1998/11/03 01:16:57 brianp Exp brianp $ */
d26 3
d1444 1
a1444 1
						   invQ, dvdx, dvdy,	\
@


3.14
log
@added Texture.ReallyEnabled to simply testing for enabled textures
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.13 1998/10/31 17:06:15 brianp Exp brianp $ */
d26 3
d106 1
a106 1
   GLuint texSet = ctx->Texture.CurrentTransformSet;
d142 1
a142 1
      if (VB->MultiTexCoord[texSet][v][3]==0.0)
d145 5
a149 5
         invq = 1.0F / VB->MultiTexCoord[texSet][v][3];
      tc[0] = VB->MultiTexCoord[texSet][v][0] * invq;
      tc[1] = VB->MultiTexCoord[texSet][v][1] * invq;
      tc[2] = VB->MultiTexCoord[texSet][v][2] * invq;
      tc[3] = VB->MultiTexCoord[texSet][v][3];
d326 1
a326 1
   struct gl_texture_object *obj = ctx->Texture.Set[0].Current2D;	\
d387 1
a387 1
   struct gl_texture_object *obj = ctx->Texture.Set[0].Current2D;	\
d445 2
a446 2
   struct gl_texture_set *set = ctx->Texture.Set+0;                     \
   struct gl_texture_object *obj = set->Current2D;                      \
d456 1
a456 1
   GLint envmode = set->EnvMode;                                        \
d462 4
a465 4
      er = FloatToFixed(set->EnvColor[0]);                              \
      eg = FloatToFixed(set->EnvColor[1]);                              \
      eb = FloatToFixed(set->EnvColor[2]);                              \
      ea = FloatToFixed(set->EnvColor[3]);                              \
d740 2
a741 2
   struct gl_texture_set *set = ctx->Texture.Set+0;                     \
   struct gl_texture_object *obj = set->Current2D;                      \
d751 1
a751 1
   GLint envmode = set->EnvMode;                                        \
d757 4
a760 4
      er = FloatToFixed(set->EnvColor[0]);                              \
      eg = FloatToFixed(set->EnvColor[1]);                              \
      eb = FloatToFixed(set->EnvColor[2]);                              \
      ea = FloatToFixed(set->EnvColor[3]);                              \
d1182 1
a1182 1
   const struct gl_texture_object *obj = ctx->Texture.Set[0].Current;	\
d1283 1
a1283 1
   const struct gl_texture_object *obj = ctx->Texture.Set[0].Current;	\
d1394 1
a1394 1
   const struct gl_texture_object *obj0 = ctx->Texture.Set[0].Current;	\
d1399 1
a1399 1
   const struct gl_texture_object *obj1 = ctx->Texture.Set[1].Current;	\
d1581 1
a1581 1
	 const struct gl_texture_object *current2Dtex = ctx->Texture.Set[0].Current2D;
d1597 2
a1598 2
		   && (ctx->Texture.Set[0].EnvMode==GL_REPLACE
		       || ctx->Texture.Set[0].EnvMode==GL_DECAL)
d1628 2
a1629 2
            const struct gl_texture_object *obj0 = ctx->Texture.Set[0].Current;
            const struct gl_texture_object *obj1 = ctx->Texture.Set[1].Current;
@


3.13
log
@variety of multi-texture changes
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.12 1998/10/29 02:34:36 brianp Exp brianp $ */
d26 3
d1575 1
a1575 4
      else if (((ctx->Texture.Enabled & 0x3) && ctx->Texture.Set[0].Current
               && ctx->Texture.Set[0].Current->Complete)
               || ((ctx->Texture.Enabled & 0x30) && ctx->Texture.Set[1].Current
               && ctx->Texture.Set[1].Current->Complete)) { 
d1581 1
a1581 1
         if (ctx->Texture.Enabled==TEXTURE0_2D
d1586 1
a1586 3
             && ((format = image->Format)==GL_RGB
		 || format==GL_RGBA)
             /* && ctx->TextureMatrixType[0]==MATRIX_IDENTITY  -- OK? */
d1623 1
a1623 1
            GLboolean needLambda = GL_FALSE;
d1625 9
a1633 11
            GLuint i;
            for (i=0;i<ctx->Const.MaxTextureUnits;i++) {
               GLuint mask = (TEXTURE0_1D|TEXTURE0_2D|TEXTURE0_3D) << (i*4);
               if (ctx->Texture.Enabled & mask) {
                  if (ctx->Texture.Set[i].Current->MinFilter != 
                      ctx->Texture.Set[i].Current->MagFilter) {
                     needLambda = GL_TRUE;
                  }
               }
            }
            if (ctx->Texture.Enabled >= TEXTURE1_1D) {
@


3.12
log
@cleaned-up code, fixed incomplete texture object selection bug
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.11 1998/09/18 02:33:05 brianp Exp brianp $ */
d26 3
d1378 2
a1379 2
                                      GLfloat s[MAX_TEX_COORD_SETS][MAX_WIDTH],
                                      GLfloat t[MAX_TEX_COORD_SETS][MAX_WIDTH] )
d1411 2
a1412 2
           GLfloat u[MAX_TEX_COORD_SETS][MAX_WIDTH];			\
           GLfloat lambda[MAX_TEX_COORD_SETS][MAX_WIDTH];		\
d1529 2
a1530 2
   GLfloat s[MAX_TEX_COORD_SETS][MAX_WIDTH];
   GLfloat t[MAX_TEX_COORD_SETS][MAX_WIDTH];
d1628 1
a1628 1
            for (i=0;i<MAX_TEX_SETS;i++) {
@


3.11
log
@fixed sampling-out-of-bounds bug in optimized textured triangle functions
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.10 1998/07/09 03:16:24 brianp Exp brianp $ */
d5 1
a5 1
 * Version:  3.0
d26 3
d1173 6
a1178 1
   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);		\
a1179 13
   GLfloat twidth, theight;						\
   if (ctx->Texture.Enabled & TEXTURE0_3D) {				\
      twidth = (GLfloat) ctx->Texture.Set[0].Current3D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Set[0].Current3D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE0_2D) {			\
      twidth = (GLfloat) ctx->Texture.Set[0].Current2D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Set[0].Current2D->Image[0]->Height;	\
   }									\
   else {								\
      twidth = (GLfloat) ctx->Texture.Set[0].Current1D->Image[0]->Width;	\
      theight = 1.0;							\
   }									\
d1274 6
a1279 1
   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);		\
a1280 13
   GLfloat twidth, theight;						\
   if (ctx->Texture.Enabled & TEXTURE0_3D) {				\
      twidth = (GLfloat) ctx->Texture.Set[0].Current3D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Set[0].Current3D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE0_2D) {			\
      twidth = (GLfloat) ctx->Texture.Set[0].Current2D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Set[0].Current2D->Image[0]->Height;	\
   }									\
   else {								\
      twidth = (GLfloat) ctx->Texture.Set[0].Current1D->Image[0]->Width;	\
      theight = 1.0;							\
   }									\
d1385 11
a1395 1
   GLboolean flat_shade = (ctx->Light.ShadeModel==GL_FLAT);		\
a1396 26
   GLfloat twidth0, theight0;						\
   GLfloat twidth1, theight1;						\
   if (ctx->Texture.Enabled & TEXTURE0_3D) {				\
      twidth0 = (GLfloat) ctx->Texture.Set[0].Current3D->Image[0]->Width;	\
      theight0 = (GLfloat) ctx->Texture.Set[0].Current3D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE0_2D) {			\
      twidth0 = (GLfloat) ctx->Texture.Set[0].Current2D->Image[0]->Width;	\
      theight0 = (GLfloat) ctx->Texture.Set[0].Current2D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE0_1D) {			\
      twidth0 = (GLfloat) ctx->Texture.Set[0].Current1D->Image[0]->Width;	\
      theight0 = 1.0;							\
   }									\
   if (ctx->Texture.Enabled & TEXTURE1_3D) {				\
      twidth1 = (GLfloat) ctx->Texture.Set[1].Current3D->Image[0]->Width;	\
      theight1 = (GLfloat) ctx->Texture.Set[1].Current3D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE1_2D) {			\
      twidth1 = (GLfloat) ctx->Texture.Set[1].Current2D->Image[0]->Width;	\
      theight1 = (GLfloat) ctx->Texture.Set[1].Current2D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE1_1D) {			\
      twidth1 = (GLfloat) ctx->Texture.Set[1].Current1D->Image[0]->Width;	\
      theight1 = 1.0;							\
   }									\
d1569 4
a1572 1
      else if (ctx->Texture.Enabled) {
a1578 2
             && ctx->Texture.Set[0].Current
             && ctx->Texture.Set[0].Current->Complete
@


3.10
log
@added Marten's latest texture triangle code
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.9 1998/06/24 02:52:05 brianp Exp brianp $ */
d26 3
d445 1
a445 1
   GLint comp, tbytesline;                                              \
d474 2
a475 1
   tbytesline = obj->Image[b]->Width * comp;
d587 8
d741 1
a741 1
   GLint comp, tbytesline;                                              \
d777 2
a778 1
   tbytesline = obj->Image[b]->Width * comp;
d817 8
@


3.9
log
@fixed texture coord interp problems.  lots of code clean-up
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.8 1998/06/18 02:49:35 brianp Exp brianp $ */
d26 3
d365 1
a365 1
                                      GLuint v2, GLuint pv )
d487 6
a492 6
	tr = ti * (si * tex00[0] + sf * tex01[0])                     \
           + tf * (si * tex10[0] + sf * tex11[0]) >> 2 * FIXED_SHIFT; \
	tg = ti * (si * tex00[1] + sf * tex01[1])                     \
           + tf * (si * tex10[1] + sf * tex11[1]) >> 2 * FIXED_SHIFT; \
	tb = ti * (si * tex00[2] + sf * tex01[2])                     \
           + tf * (si * tex10[2] + sf * tex11[2]) >> 2 * FIXED_SHIFT; \
d502 8
a509 8
	tr = ti * (si * tex00[0] + sf * tex01[0])                     \
           + tf * (si * tex10[0] + sf * tex11[0]) >> 2 * FIXED_SHIFT; \
	tg = ti * (si * tex00[1] + sf * tex01[1])                     \
           + tf * (si * tex10[1] + sf * tex11[1]) >> 2 * FIXED_SHIFT; \
	tb = ti * (si * tex00[2] + sf * tex01[2])                     \
           + tf * (si * tex10[2] + sf * tex11[2]) >> 2 * FIXED_SHIFT; \
	ta = ti * (si * tex00[3] + sf * tex01[3])                     \
           + tf * (si * tex10[3] + sf * tex11[3]) >> 2 * FIXED_SHIFT
d512 4
a515 4
        dest[0] = ffr * (tr + 1) >> FIXED_SHIFT + 8; \
        dest[1] = ffg * (tg + 1) >> FIXED_SHIFT + 8; \
        dest[2] = ffb * (tb + 1) >> FIXED_SHIFT + 8; \
        dest[3] = ffa * (ta + 1) >> FIXED_SHIFT + 8
d518 3
a520 3
	dest[0] = (0xff - ta) * ffr + ((ta + 1) * tr << FIXED_SHIFT) >> FIXED_SHIFT + 8; \
	dest[1] = (0xff - ta) * ffg + ((ta + 1) * tg << FIXED_SHIFT) >> FIXED_SHIFT + 8; \
	dest[2] = (0xff - ta) * ffb + ((ta + 1) * tb << FIXED_SHIFT) >> FIXED_SHIFT + 8; \
d524 4
a527 4
        dest[0] = (0xff - tr) * ffr + (tr + 1) * er >> FIXED_SHIFT + 8; \
        dest[1] = (0xff - tg) * ffg + (tg + 1) * eg >> FIXED_SHIFT + 8; \
        dest[2] = (0xff - tb) * ffb + (tb + 1) * eb >> FIXED_SHIFT + 8; \
	dest[3] = ffa * (ta + 1) >> FIXED_SHIFT + 8
d536 4
a539 4
        dest[0] = (ffr << 8) + (tr + 1) * er >> FIXED_SHIFT + 8; \
        dest[1] = (ffg << 8) + (tg + 1) * eg >> FIXED_SHIFT + 8; \
        dest[2] = (ffb << 8) + (tb + 1) * eb >> FIXED_SHIFT + 8; \
	dest[3] = ffa * (ta + 1) >> FIXED_SHIFT + 8
d545 2
a546 2
# define NEAREST_RGB_REPLACE  *(GLint *)dest = *(GLint *)tex00 & 0x00ffffff \
	                                       | (ffa << 24 - FIXED_SHIFT) & 0xff000000
d552 19
a570 1
#define SPAN(DO_TEX,COMP)                                  \
d611 1
a611 1
                       SPAN(NEAREST_RGB;MODULATE,3);       \
d615 1
a615 1
                       SPAN(NEAREST_RGB_REPLACE,3);        \
d618 1
a618 1
                       SPAN(NEAREST_RGB;BLEND,3);          \
d621 1
a621 1
                       SPAN(NEAREST_RGB;ADD,3);            \
d628 1
a628 1
                       SPAN(NEAREST_RGBA;MODULATE,4);      \
d631 1
a631 1
                       SPAN(NEAREST_RGBA;DECAL,4);         \
d634 1
a634 1
                       SPAN(NEAREST_RGBA;BLEND,4);         \
d637 1
a637 1
                       SPAN(NEAREST_RGBA_REPLACE,4);       \
d640 1
a640 1
                       SPAN(NEAREST_RGBA;ADD,4);           \
d653 1
a653 1
		       SPAN(LINEAR_RGB;MODULATE,3);        \
d657 1
a657 1
                       SPAN(LINEAR_RGB;REPLACE,3);         \
d660 1
a660 1
		       SPAN(LINEAR_RGB;BLEND,3);           \
d663 1
a663 1
		       SPAN(LINEAR_RGB;ADD,3);             \
d670 1
a670 1
		       SPAN(LINEAR_RGBA;MODULATE,4);       \
d673 1
a673 1
		       SPAN(LINEAR_RGBA;DECAL,4);          \
d676 1
a676 1
		       SPAN(LINEAR_RGBA;BLEND,4);          \
d679 1
a679 1
		       SPAN(LINEAR_RGBA;REPLACE,4);        \
d682 1
a682 1
		       SPAN(LINEAR_RGBA;ADD,4);            \
d691 2
d694 1
a694 1
	}                                                  \
d697 2
a698 1
#undef SPAN
d728 1
a728 2
   GLfloat sscale = FIXED_SCALE * twidth;                               \
   GLfloat tscale = FIXED_SCALE * theight;                              \
d757 8
d768 21
a788 1
#define SPAN(DO_TEX,COMP)                                  \
d790 3
a792 3
           GLfloat invQ = 1.0f / vv;                      \
           GLfixed ffs = (int)(SS * invQ);                \
           GLfixed fft = (int)(TT * invQ);                \
d822 1
d835 1
a835 1
                       SPAN(NEAREST_RGB;MODULATE,3);       \
d839 1
a839 1
                       SPAN(NEAREST_RGB_REPLACE,3);        \
d842 1
a842 1
                       SPAN(NEAREST_RGB;BLEND,3);          \
d845 1
a845 1
                       SPAN(NEAREST_RGB;ADD,3);            \
d852 1
a852 1
                       SPAN(NEAREST_RGBA;MODULATE,4);      \
d855 1
a855 1
                       SPAN(NEAREST_RGBA;DECAL,4);         \
d858 1
a858 1
                       SPAN(NEAREST_RGBA;BLEND,4);         \
d861 1
a861 1
                       SPAN(NEAREST_RGBA_REPLACE,4);       \
d864 1
a864 1
                       SPAN(NEAREST_RGBA;ADD,4);           \
d877 1
a877 1
		       SPAN(LINEAR_RGB;MODULATE,3);        \
d881 1
a881 1
                       SPAN(LINEAR_RGB;REPLACE,3);         \
d884 1
a884 1
		       SPAN(LINEAR_RGB;BLEND,3);           \
d887 1
a887 1
		       SPAN(LINEAR_RGB;ADD,3);             \
d894 1
a894 1
		       SPAN(LINEAR_RGBA;MODULATE,4);       \
d897 1
a897 1
		       SPAN(LINEAR_RGBA;DECAL,4);          \
d900 1
a900 1
		       SPAN(LINEAR_RGBA;BLEND,4);          \
d903 1
a903 1
		       SPAN(LINEAR_RGBA;REPLACE,4);        \
d906 1
a906 1
		       SPAN(LINEAR_RGBA;ADD,4);            \
d915 1
d919 1
d921 2
d1555 5
d1578 6
a1583 1
         if (   (ctx->Texture.Enabled==TEXTURE0_2D)
d1586 10
a1595 11
             && ((ctx->Texture.Set[0].Current2D->MinFilter==GL_NEAREST
		  && ctx->Texture.Set[0].Current2D->MagFilter==GL_NEAREST)
		 ||
		 (ctx->Texture.Set[0].Current2D->MinFilter==GL_LINEAR
		  && ctx->Texture.Set[0].Current2D->MagFilter==GL_LINEAR))
             && ctx->Texture.Set[0].Current2D->WrapS==GL_REPEAT
             && ctx->Texture.Set[0].Current2D->WrapT==GL_REPEAT
             && ctx->Texture.Set[0].Current2D->Image[0]->Border==0
	     && ctx->TextureMatrixType[0]==MATRIX_IDENTITY  /* XXX texSet */
	     && (ctx->Texture.Set[0].Current2D->Image[0]->Format==GL_RGB
		 || ctx->Texture.Set[0].Current2D->Image[0]->Format==GL_RGBA)) {
d1597 5
a1601 4
	       if (ctx->Texture.Set[0].Current2D->MinFilter==GL_NEAREST
		   && ctx->Texture.Set[0].Current2D->Image[0]->Format==GL_RGB
		   && (ctx->Texture.Set[0].EnvMode==GL_DECAL
		       || ctx->Texture.Set[0].EnvMode==GL_REPLACE)
d1607 1
d1610 1
d1614 1
d1619 1
d1624 1
d1628 1
d1644 1
d1647 1
a1647 1
               if (needLambda)
d1649 3
a1651 1
               else
d1653 2
d1658 1
a1658 1
               if (needLambda)
d1660 3
a1662 1
               else
d1664 2
a1693 1

@


3.8
log
@added Marten Stromberg's optimized textured triangle code
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.7 1998/06/07 22:18:52 brianp Exp $ */
d26 3
d67 1
d304 1
a304 1
#define INTERP_ST 1
d365 1
a365 1
#define INTERP_ST 1
d423 1
a423 1
#define INTERP_ST 1
d680 2
d690 1
a690 1
#define INTERP_STW 1
d739 3
a741 3
           GLfloat wwinv = 1.0f / ww;                      \
           GLfixed ffs = (int)(SS * wwinv);                \
           GLfixed fft = (int)(TT * wwinv);                \
d762 1
a762 1
	   ww += dwdx;                                     \
d819 2
a820 2
	         SS -= 0.5f * FIXED_SCALE * ww;            \
		 TT -= 0.5f * FIXED_SCALE * ww;            \
d882 1
a882 2
#define INTERP_STW 1
#define INTERP_UV 1
d901 1
a901 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);		\
d907 3
a909 3
		    s[i] = ss*wwvvInv;				\
		    t[i] = tt*wwvvInv;				\
		    u[i] = uu*wwvvInv;				\
a914 1
		    ww += dwdx;					\
d919 1
a919 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);		\
d925 3
a927 3
		    s[i] = ss*wwvvInv;				\
		    t[i] = tt*wwvvInv;				\
		    u[i] = uu*wwvvInv;				\
a935 1
		    ww += dwdx;					\
d966 1
a966 2
#define INTERP_STW 1
#define INTERP_UV 1
d986 1
a986 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);		\
d995 3
a997 3
		    s[i] = ss*wwvvInv;				\
		    t[i] = tt*wwvvInv;				\
		    u[i] = uu*wwvvInv;				\
a1002 1
		    ww += dwdx;					\
d1007 1
a1007 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);		\
d1016 3
a1018 3
		    s[i] = ss*wwvvInv;				\
		    t[i] = tt*wwvvInv;				\
		    u[i] = uu*wwvvInv;				\
a1029 1
		    ww += dwdx;					\
d1047 3
a1049 4
static GLfloat compute_lambda( GLfloat s, GLfloat t,
                               GLfloat dsdx, GLfloat dsdy,
                               GLfloat dtdx, GLfloat dtdy,
                               GLfloat w, GLfloat dwdx, GLfloat dwdy,
a1051 2
   /* TODO: this function can probably be optimized a bit */
   GLfloat invw = 1.0 / w;
d1054 2
d1057 4
a1060 4
   dudx = (dsdx - s*dwdx) * invw * width;
   dudy = (dsdy - s*dwdy) * invw * width;
   dvdx = (dtdx - t*dwdx) * invw * height;
   dvdy = (dtdy - t*dwdy) * invw * height;
d1065 5
a1069 9
   /* rho2 = MAX2(r1,r2); */
   rho2 = r1 + r2;
   if (rho2 <= 0.0F) {
      return 0.0F;
   }
   else {
      /* return log base 2 of rho */
      return log(rho2) * 1.442695 * 0.5;       /* 1.442695 = 1/log(2) */
   }
d1090 1
a1090 2
#define INTERP_STW 1
#define INTERP_UV 1
d1124 1
a1124 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);			\
d1130 6
a1135 7
		    s[i] = ss*wwvvInv;					\
		    t[i] = tt*wwvvInv;					\
		    u[i] = uu*wwvvInv;					\
		    lambda[i] = compute_lambda( s[i], t[i],		\
						dsdx, dsdy,		\
						dtdx, dtdy, ww,		\
						dwdx, dwdy,		\
a1141 1
		    ww += dwdx;						\
d1146 1
a1146 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);			\
d1152 6
a1157 7
		    s[i] = ss*wwvvInv;					\
		    t[i] = tt*wwvvInv;					\
		    u[i] = uu*wwvvInv;					\
		    lambda[i] = compute_lambda( s[i], t[i],		\
						dsdx, dsdy,		\
						dtdx, dtdy, ww,		\
						dwdx, dwdy,		\
a1167 1
		    ww += dwdx;						\
d1199 1
a1199 2
#define INTERP_STW 1
#define INTERP_UV 1
d1237 1
a1237 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);			\
d1246 6
a1251 7
		    s[i] = ss*wwvvInv;					\
		    t[i] = tt*wwvvInv;					\
		    u[i] = uu*wwvvInv;					\
		    lambda[i] = compute_lambda( s[i], t[i],		\
						dsdx, dsdy,		\
						dtdx, dtdy, ww,		\
						dwdx, dwdy,		\
a1257 1
		    ww += dwdx;						\
d1262 1
a1262 1
		    GLdouble wwvvInv = 1.0 / (ww*vv);			\
d1271 6
a1276 7
		    s[i] = ss*wwvvInv;					\
		    t[i] = tt*wwvvInv;					\
		    u[i] = uu*wwvvInv;					\
		    lambda[i] = compute_lambda( s[i], t[i],		\
						dsdx, dsdy,		\
						dtdx, dtdy, ww,		\
						dwdx, dwdy,		\
a1289 1
		    ww += dwdx;						\
d1317 2
a1318 4
#define INTERP_STW 1
#define INTERP_UV 1
#define INTERP_STW1 1
#define INTERP_UV1 1
d1365 2
a1366 2
		    GLdouble wwvvInv = 1.0 / (ww*vv);			\
		    GLdouble wwvv1Inv = 1.0 / (ww*vv1);			\
d1372 14
a1385 16
		    s[0][i] = ss*wwvvInv;				\
		    t[0][i] = tt*wwvvInv;				\
		    u[0][i] = uu*wwvvInv;				\
		    lambda[0][i] = compute_lambda( s[0][i], t[0][i],	\
						dsdx, dsdy,		\
						dtdx, dtdy, ww,		\
						dwdx, dwdy,		\
						twidth0, theight0 );	\
		    s[1][i] = ss1*wwvv1Inv;				\
		    t[1][i] = tt1*wwvv1Inv;				\
		    u[1][i] = uu1*wwvv1Inv;				\
		    lambda[1][i] = compute_lambda( s[1][i], t[1][i],	\
						ds1dx, ds1dy,		\
						dt1dx, dt1dy, ww,	\
						dwdx, dwdy,		\
						twidth1, theight1 );	\
a1394 1
		    ww += dwdx;						\
d1399 2
a1400 2
		    GLdouble wwvvInv = 1.0 / (ww*vv);			\
		    GLdouble wwvv1Inv = 1.0 / (ww*vv1);			\
d1406 14
a1419 16
		    s[0][i] = ss*wwvvInv;				\
		    t[0][i] = tt*wwvvInv;				\
		    u[0][i] = uu*wwvvInv;				\
		    lambda[0][i] = compute_lambda( s[0][i], t[0][i],	\
						dsdx, dsdy,		\
						dtdx, dtdy, ww,		\
						dwdx, dwdy,		\
						twidth0, theight0 );	\
		    s[1][i] = ss1*wwvv1Inv;				\
		    t[1][i] = tt1*wwvv1Inv;				\
		    u[1][i] = uu1*wwvv1Inv;				\
		    lambda[1][i] = compute_lambda( s[1][i], t[1][i],	\
						ds1dx, ds1dy,		\
						dt1dx, dt1dy, ww,	\
						dwdx, dwdy,		\
						twidth1, theight1 );	\
a1432 1
		    ww += dwdx;						\
@


3.7
log
@implemented GL_EXT_multitexture extension
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.6 1998/05/31 23:50:36 brianp Exp brianp $ */
d26 3
a292 1

d314 12
d331 2
d338 1
a338 4
                 rgba[i][RCOMP] = texture[pos];			\
                 rgba[i][GCOMP] = texture[pos+1];		\
                 rgba[i][BCOMP] = texture[pos+2];		\
                 rgba[i][ACOMP] = 255;				\
d381 2
d390 1
a390 4
                    rgba[i][RCOMP] = texture[pos];		\
                    rgba[i][GCOMP] = texture[pos+1];		\
                    rgba[i][BCOMP] = texture[pos+2];		\
                    rgba[i][ACOMP] = 255;			\
d410 453
d973 3
a975 3
      sr = VB->Color[pv][0];					\
      sg = VB->Color[pv][1];					\
      sb = VB->Color[pv][2];					\
d1543 5
a1547 2
             && ctx->Texture.Set[0].Current2D->MinFilter==GL_NEAREST
             && ctx->Texture.Set[0].Current2D->MagFilter==GL_NEAREST
a1549 1
             && ctx->Texture.Set[0].Current2D->Image[0]->Format==GL_RGB
d1551 28
a1578 16
             && (ctx->Texture.Set[0].EnvMode==GL_DECAL
                 || ctx->Texture.Set[0].EnvMode==GL_REPLACE)
             && ctx->Hint.PerspectiveCorrection==GL_FASTEST
             && ctx->TextureMatrixType[0]==MATRIX_IDENTITY  /* XXX texSet */
             && ((ctx->RasterMask==DEPTH_BIT
                  && ctx->Depth.Func==GL_LESS
                  && ctx->Depth.Mask==GL_TRUE)
                 || ctx->RasterMask==0)
             && ctx->Polygon.StippleFlag==GL_FALSE) {
            if (ctx->RasterMask==DEPTH_BIT) {
               ctx->Driver.TriangleFunc = simple_z_textured_triangle;
            }
            else {
               ctx->Driver.TriangleFunc = simple_textured_triangle;
            }
         }
@


3.6
log
@cleaned up a few Solaris compiler warnings
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.5 1998/04/01 02:58:52 brianp Exp brianp $ */
d26 3
d81 1
d117 8
a124 5
      invq = (VB->TexCoord[v][3]==0.0) ? 1.0 : (1.0F / VB->TexCoord[v][3]);
      tc[0] = VB->TexCoord[v][0] * invq;
      tc[1] = VB->TexCoord[v][1] * invq;
      tc[2] = VB->TexCoord[v][2] * invq;
      tc[3] = VB->TexCoord[v][3];
d859 4
a862 4
                                            GLuint v1, GLuint v2, GLuint pv,
                                            GLubyte rgba[MAX_WIDTH][4],
                                            GLfloat s[2][MAX_WIDTH],
                                            GLfloat t[2][MAX_WIDTH] )
d912 2
a913 2
           GLfloat u[2][MAX_WIDTH];					\
           GLfloat lambda[2][MAX_WIDTH];				\
d1036 2
a1037 1
   GLfloat s[2][MAX_WIDTH], t[2][MAX_WIDTH];
@


3.5
log
@applied Miklos Fazekas's 3-31-98 Macintosh changes
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.4 1998/03/27 04:26:44 brianp Exp brianp $ */
d26 3
d107 4
a110 4
         color[0] = VB->Color[v][0] / 255.0;
         color[1] = VB->Color[v][1] / 255.0;
         color[2] = VB->Color[v][2] / 255.0;
         color[3] = VB->Color[v][3] / 255.0;
@


3.4
log
@fixed G++ warnings
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.3 1998/02/20 04:54:02 brianp Exp brianp $ */
d26 3
d478 5
a482 2
static void general_textured_spec_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                            GLuint v2, GLuint pv )
a504 2
	   GLdepth zspan[MAX_WIDTH];				\
	   GLubyte rgba[MAX_WIDTH][4], spec[MAX_WIDTH][4];	\
d611 5
a615 2
static void lambda_textured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                      GLuint v2, GLuint pv )
d651 1
a651 2
           GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];		\
	   DEFARRAY(GLfloat,lambda,MAX_WIDTH);				\
a708 1
	   UNDEFARRAY(lambda);						\
d724 5
a728 2
static void lambda_textured_spec_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                           GLuint v2, GLuint pv )
d767 3
a769 3
	   GLubyte rgba[MAX_WIDTH][4], spec[MAX_WIDTH][4];		\
           GLfloat s[MAX_WIDTH], t[MAX_WIDTH], u[MAX_WIDTH];		\
	   DEFARRAY(GLfloat,lambda,MAX_WIDTH);				\
a835 1
	   UNDEFARRAY(lambda);						\
d848 5
a852 2
static void lambda_multitextured_triangle( GLcontext *ctx, GLuint v0, GLuint v1,
                                           GLuint v2, GLuint pv )
d902 1
a902 2
	   GLubyte rgba[MAX_WIDTH][4];					\
           GLfloat s[2][MAX_WIDTH], t[2][MAX_WIDTH], u[2][MAX_WIDTH];	\
a986 1
	   UNDEFARRAY(lambda);						\
d990 38
@


3.3
log
@implemented GL_SGIS_multitexture
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.2 1998/02/04 00:44:29 brianp Exp brianp $ */
d26 3
d126 1
a126 1

d174 1
d245 1
d297 1
d347 1
d992 5
@


3.2
log
@fixed casts and conditional expression problems for Amiga StormC compiler
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.1 1998/02/02 03:09:34 brianp Exp brianp $ */
d26 3
d284 8
a291 7
   GLint b = ctx->Texture.Current2D->BaseLevel;				\
   GLfloat twidth = (GLfloat) ctx->Texture.Current2D->Image[b]->Width;	\
   GLfloat theight = (GLfloat) ctx->Texture.Current2D->Image[b]->Height;\
   GLint twidth_log2 = ctx->Texture.Current2D->Image[b]->WidthLog2;	\
   GLubyte *texture = ctx->Texture.Current2D->Image[b]->Data;		\
   GLint smask = ctx->Texture.Current2D->Image[b]->Width - 1;		\
   GLint tmask = ctx->Texture.Current2D->Image[b]->Height - 1;
d333 8
a340 7
   GLint b = ctx->Texture.Current2D->BaseLevel;				\
   GLfloat twidth = (GLfloat) ctx->Texture.Current2D->Image[b]->Width;	\
   GLfloat theight = (GLfloat) ctx->Texture.Current2D->Image[b]->Height;\
   GLint twidth_log2 = ctx->Texture.Current2D->Image[b]->WidthLog2;	\
   GLubyte *texture = ctx->Texture.Current2D->Image[b]->Data;		\
   GLint smask = ctx->Texture.Current2D->Image[b]->Width - 1;		\
   GLint tmask = ctx->Texture.Current2D->Image[b]->Height - 1;
d613 7
a619 7
   if (ctx->Texture.Enabled & TEXTURE_3D) {				\
      twidth = (GLfloat) ctx->Texture.Current3D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Current3D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE_2D) {			\
      twidth = (GLfloat) ctx->Texture.Current2D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Current2D->Image[0]->Height;	\
d622 1
a622 1
      twidth = (GLfloat) ctx->Texture.Current1D->Image[0]->Width;	\
d703 1
d726 7
a732 7
   if (ctx->Texture.Enabled & TEXTURE_3D) {				\
      twidth = (GLfloat) ctx->Texture.Current3D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Current3D->Image[0]->Height;	\
   }									\
   else if (ctx->Texture.Enabled & TEXTURE_2D) {			\
      twidth = (GLfloat) ctx->Texture.Current2D->Image[0]->Width;	\
      theight = (GLfloat) ctx->Texture.Current2D->Image[0]->Height;	\
d735 1
a735 1
      twidth = (GLfloat) ctx->Texture.Current1D->Image[0]->Width;	\
d830 150
d1005 12
a1016 12
      else if (ctx->Texture.Enabled
               && ctx->Texture.Current
               && ctx->Texture.Current->Complete) {
         if (   (ctx->Texture.Enabled==TEXTURE_2D)
             && ctx->Texture.Current2D->MinFilter==GL_NEAREST
             && ctx->Texture.Current2D->MagFilter==GL_NEAREST
             && ctx->Texture.Current2D->WrapS==GL_REPEAT
             && ctx->Texture.Current2D->WrapT==GL_REPEAT
             && ctx->Texture.Current2D->Image[0]->Format==GL_RGB
             && ctx->Texture.Current2D->Image[0]->Border==0
             && (ctx->Texture.EnvMode==GL_DECAL
                 || ctx->Texture.EnvMode==GL_REPLACE)
d1018 1
a1018 1
             && ctx->TextureMatrixType==MATRIX_IDENTITY
d1032 10
a1041 12
            GLboolean needLambda = GL_TRUE;
            /* if mag filter == min filter we're not mipmapping */
            if (ctx->Texture.Enabled & TEXTURE_3D) {
               if (ctx->Texture.Current3D->MinFilter==
                   ctx->Texture.Current3D->MagFilter) {
                  needLambda = GL_FALSE;
               }
	    }
            else if (ctx->Texture.Enabled & TEXTURE_2D) {
               if (ctx->Texture.Current2D->MinFilter==
                   ctx->Texture.Current2D->MagFilter) {
                  needLambda = GL_FALSE;
d1044 3
a1046 5
            else if (ctx->Texture.Enabled & TEXTURE_1D) {
               if (ctx->Texture.Current1D->MinFilter==
                   ctx->Texture.Current1D->MagFilter) {
                  needLambda = GL_FALSE;
               }
d1048 1
a1048 1
            if (ctx->Light.Model.ColorControl==GL_SINGLE_COLOR) {
@


3.1
log
@added GL_LIGHT_MODEL_COLOR_CONTROL (separate specular color interpolation)
@
text
@d1 1
a1 1
/* $Id: triangle.c,v 3.0 1998/01/31 21:05:24 brianp Exp brianp $ */
d26 3
d67 1
a67 1
   FEEDBACK_TOKEN( ctx, (GLfloat) GL_POLYGON_TOKEN );
d914 4
a917 2
	    ctx->Driver.TriangleFunc = rgbmode ? smooth_rgba_triangle
                                               : smooth_ci_triangle;
d921 4
a924 2
	    ctx->Driver.TriangleFunc = rgbmode ? flat_rgba_triangle
                                               : flat_ci_triangle;
@


3.0
log
@initial rev
@
text
@d1 1
a1 1
/* $Id$ */
d25 4
a28 1
 * $Log$
d445 97
a541 1
	                             rgba, GL_POLYGON );	\
d686 125
a810 1
	                             rgba, GL_POLYGON );		\
d893 13
a905 2
            ctx->Driver.TriangleFunc = needLambda ? lambda_textured_triangle
                                                  : general_textured_triangle;
@
