swrast: do texture sampling/combining in floating point
authorBrian Paul <brianp@vmware.com>
Sun, 8 Mar 2009 19:49:57 +0000 (13:49 -0600)
committerBrian Paul <brianp@vmware.com>
Thu, 2 Apr 2009 02:17:19 +0000 (20:17 -0600)
The code's cleaner and a step toward supporting float-valued texture sampling.
Some optimizations for common cases can be added and re-enabled...

src/mesa/main/colormac.h
src/mesa/swrast/s_atifragshader.c
src/mesa/swrast/s_context.c
src/mesa/swrast/s_context.h
src/mesa/swrast/s_fragprog.c
src/mesa/swrast/s_texcombine.c
src/mesa/swrast/s_texfilter.c
src/mesa/tnl/t_vb_program.c

index 74692e9a9884897c62c45b423c9d71f7dfda10e5..815624ee5080c5f1101a702f724e2d2015db8a3a 100644 (file)
@@ -71,9 +71,6 @@
 /** \def COPY_CHAN4
  * Copy a GLchan[4] array */
 
-/** \def CHAN_PRODUCT
- * Scaled product (usually approximated) between two GLchan arguments */
-
 #if CHAN_BITS == 8
 
 #define BYTE_TO_CHAN(b)   ((b) < 0 ? 0 : (GLchan) (b))
@@ -91,8 +88,6 @@
 
 #define COPY_CHAN4(DST, SRC)  COPY_4UBV(DST, SRC)
 
-#define CHAN_PRODUCT(a, b)  ((GLubyte) (((GLint)(a) * ((GLint)(b) + 1)) >> 8))
-
 #elif CHAN_BITS == 16
 
 #define BYTE_TO_CHAN(b)   ((b) < 0 ? 0 : (((GLchan) (b)) * 516))
 
 #define COPY_CHAN4(DST, SRC)  COPY_4V(DST, SRC)
 
-#define CHAN_PRODUCT(a, b) ((GLchan) ((((GLuint) (a)) * ((GLuint) (b))) / 65535))
-
 #elif CHAN_BITS == 32
 
 /* XXX floating-point color channels not fully thought-out */
 
 #define COPY_CHAN4(DST, SRC)  COPY_4V(DST, SRC)
 
-#define CHAN_PRODUCT(a, b)    ((a) * (b))
-
 #else
 
 #error unexpected CHAN_BITS size
index 458fe18163eb2042480bb16cb4228999c53ba28d..5fefae6c42b38ce1cf3928acd3a68ce11b42c363 100644 (file)
@@ -47,17 +47,12 @@ static void
 fetch_texel(GLcontext * ctx, const GLfloat texcoord[4], GLfloat lambda,
            GLuint unit, GLfloat color[4])
 {
-   GLchan rgba[4];
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* XXX use a float-valued TextureSample routine here!!! */
    swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current,
                                1, (const GLfloat(*)[4]) texcoord,
-                               &lambda, &rgba);
-   color[0] = CHAN_TO_FLOAT(rgba[0]);
-   color[1] = CHAN_TO_FLOAT(rgba[1]);
-   color[2] = CHAN_TO_FLOAT(rgba[2]);
-   color[3] = CHAN_TO_FLOAT(rgba[3]);
+                               &lambda, (GLfloat (*)[4]) color);
 }
 
 static void
index 4dbccbb2d5920632d2120db8c1ade165994a493c..0257abc34acf989038d07023d9e78a827695bfac 100644 (file)
@@ -820,8 +820,8 @@ _swrast_CreateContext( GLcontext *ctx )
    swrast->PointSpan.facing = 0;
    swrast->PointSpan.array = swrast->SpanArrays;
 
-   swrast->TexelBuffer = (GLchan *) MALLOC(ctx->Const.MaxTextureImageUnits *
-                                           MAX_WIDTH * 4 * sizeof(GLchan));
+   swrast->TexelBuffer = (GLfloat *) MALLOC(ctx->Const.MaxTextureImageUnits *
+                                           MAX_WIDTH * 4 * sizeof(GLfloat));
    if (!swrast->TexelBuffer) {
       FREE(swrast->SpanArrays);
       FREE(swrast);
index 6e8d080704dd4609f31a40e536a14f23c4b522d6..4cf57c6fc67c82f6999c7d62e90dce63916280ab 100644 (file)
@@ -52,7 +52,7 @@
 typedef void (*texture_sample_func)(GLcontext *ctx,
                                     const struct gl_texture_object *tObj,
                                     GLuint n, const GLfloat texcoords[][4],
-                                    const GLfloat lambda[], GLchan rgba[][4]);
+                                    const GLfloat lambda[], GLfloat rgba[][4]);
 
 typedef void (_ASMAPIP blend_func)( GLcontext *ctx, GLuint n,
                                     const GLubyte mask[],
@@ -221,7 +221,7 @@ typedef struct
    /** Buffer for saving the sampled texture colors.
     * Needed for GL_ARB_texture_env_crossbar implementation.
     */
-   GLchan *TexelBuffer;
+   GLfloat *TexelBuffer;
 
    validate_texture_image_func ValidateTextureImage;
 
index ae1dea16a07bd18562fe0e9a3c897f6e263946ed..5f032bbd69d3d6ebed8e5039626d7f4664ae2563 100644 (file)
  * and return results in 'colorOut'.
  */
 static INLINE void
-swizzle_texel(const GLchan texel[4], GLfloat colorOut[4], GLuint swizzle)
+swizzle_texel(const GLfloat texel[4], GLfloat colorOut[4], GLuint swizzle)
 {
    if (swizzle == SWIZZLE_NOOP) {
-      colorOut[0] = CHAN_TO_FLOAT(texel[0]);
-      colorOut[1] = CHAN_TO_FLOAT(texel[1]);
-      colorOut[2] = CHAN_TO_FLOAT(texel[2]);
-      colorOut[3] = CHAN_TO_FLOAT(texel[3]);
+      COPY_4V(colorOut, texel);
    }
    else {
       GLfloat vector[6];
-      vector[SWIZZLE_X] = CHAN_TO_FLOAT(texel[0]);
-      vector[SWIZZLE_Y] = CHAN_TO_FLOAT(texel[1]);
-      vector[SWIZZLE_Z] = CHAN_TO_FLOAT(texel[2]);
-      vector[SWIZZLE_W] = CHAN_TO_FLOAT(texel[3]);
+      vector[SWIZZLE_X] = texel[0];
+      vector[SWIZZLE_Y] = texel[1];
+      vector[SWIZZLE_Z] = texel[2];
+      vector[SWIZZLE_W] = texel[3];
       vector[SWIZZLE_ZERO] = 0.0F;
       vector[SWIZZLE_ONE] = 1.0F;
       colorOut[0] = vector[GET_SWZ(swizzle, 0)];
@@ -73,7 +70,7 @@ fetch_texel_lod( GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
 
    if (texObj) {
       SWcontext *swrast = SWRAST_CONTEXT(ctx);
-      GLchan rgba[4];
+      GLfloat rgba[4];
 
       lambda = CLAMP(lambda, texObj->MinLod, texObj->MaxLod);
 
@@ -108,7 +105,7 @@ fetch_texel_deriv( GLcontext *ctx, const GLfloat texcoord[4],
       const GLfloat texW = (GLfloat) texImg->WidthScale;
       const GLfloat texH = (GLfloat) texImg->HeightScale;
       GLfloat lambda;
-      GLchan rgba[4];
+      GLfloat rgba[4];
 
       lambda = _swrast_compute_lambda(texdx[0], texdy[0], /* ds/dx, ds/dy */
                                       texdx[1], texdy[1], /* dt/dx, dt/dy */
index aa28311672d3d2f49822ce2367a1c45821e6c5af..c48a6fb1141f865035eb18617a8a0d69c0941703 100644 (file)
 #include "s_texcombine.h"
 
 
-#define PROD(A,B)   ( (GLuint)(A) * ((GLuint)(B)+1) )
-#define S_PROD(A,B) ( (GLint)(A) * ((GLint)(B)+1) )
-#if CHAN_BITS == 32
-typedef GLfloat ChanTemp;
-#else
-typedef GLuint ChanTemp;
-#endif
+#define MAX_COMBINER_TERMS 4
 
 
 /**
@@ -63,32 +57,36 @@ typedef GLuint ChanTemp;
  */
 static void
 texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
-                 CONST GLchan (*primary_rgba)[4],
-                 CONST GLchan *texelBuffer,
-                 GLchan (*rgba)[4] )
+                 CONST GLfloat (*primary_rgba)[4],
+                 CONST GLfloat *texelBuffer,
+                 GLchan (*rgbaChan)[4] )
 {
    const struct gl_texture_unit *textureUnit = &(ctx->Texture.Unit[unit]);
-   const GLchan (*argRGB [4])[4];
-   const GLchan (*argA [4])[4];
+   const GLfloat (*argRGB [MAX_COMBINER_TERMS])[4];
+   const GLfloat (*argA [MAX_COMBINER_TERMS])[4];
    const GLint RGBshift = textureUnit->_CurrentCombine->ScaleShiftRGB;
    const GLuint Ashift   = textureUnit->_CurrentCombine->ScaleShiftA;
-#if CHAN_TYPE == GL_FLOAT
-   const GLchan RGBmult = (GLfloat) (1 << RGBshift);
-   const GLchan Amult = (GLfloat) (1 << Ashift);
-#else
-   const GLint half = (CHAN_MAX + 1) / 2;
-#endif
-   static const GLchan one[4] = { CHAN_MAX, CHAN_MAX, CHAN_MAX, CHAN_MAX };
-   static const GLchan zero[4] = { 0, 0, 0, 0 };
+   const GLfloat RGBmult = (GLfloat) (1 << RGBshift);
+   const GLfloat Amult = (GLfloat) (1 << Ashift);
+   static const GLfloat one[4] = { 1, 1, 1, 1 };
+   static const GLfloat zero[4] = { 0, 0, 0, 0 };
    const GLuint numColorArgs = textureUnit->_CurrentCombine->_NumArgsRGB;
    const GLuint numAlphaArgs = textureUnit->_CurrentCombine->_NumArgsA;
-   GLchan ccolor[4][MAX_WIDTH][4];
+   GLfloat ccolor[MAX_COMBINER_TERMS][MAX_WIDTH][4]; /* temp color buffers */
+   GLfloat rgba[MAX_WIDTH][4];
    GLuint i, j;
 
    ASSERT(ctx->Extensions.EXT_texture_env_combine ||
           ctx->Extensions.ARB_texture_env_combine);
    ASSERT(CONST_SWRAST_CONTEXT(ctx)->_AnyTextureCombine);
 
+   for (i = 0; i < n; i++) {
+      rgba[i][RCOMP] = CHAN_TO_FLOAT(rgbaChan[i][RCOMP]);
+      rgba[i][GCOMP] = CHAN_TO_FLOAT(rgbaChan[i][GCOMP]);
+      rgba[i][BCOMP] = CHAN_TO_FLOAT(rgbaChan[i][BCOMP]);
+      rgba[i][ACOMP] = CHAN_TO_FLOAT(rgbaChan[i][ACOMP]);
+   }
+
    /*
    printf("modeRGB 0x%x  modeA 0x%x  srcRGB1 0x%x  srcA1 0x%x  srcRGB2 0x%x  srcA2 0x%x\n",
           textureUnit->_CurrentCombine->ModeRGB,
@@ -107,39 +105,47 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
 
       switch (srcRGB) {
          case GL_TEXTURE:
-            argRGB[j] = (const GLchan (*)[4])
-               (texelBuffer + unit * (n * 4 * sizeof(GLchan)));
+            argRGB[j] = (const GLfloat (*)[4])
+               (texelBuffer + unit * (n * 4 * sizeof(GLfloat)));
             break;
          case GL_PRIMARY_COLOR:
             argRGB[j] = primary_rgba;
             break;
          case GL_PREVIOUS:
-            argRGB[j] = (const GLchan (*)[4]) rgba;
+            argRGB[j] = (const GLfloat (*)[4]) rgba;
             break;
          case GL_CONSTANT:
             {
-               GLchan (*c)[4] = ccolor[j];
-               GLchan red, green, blue, alpha;
-               UNCLAMPED_FLOAT_TO_CHAN(red,   textureUnit->EnvColor[0]);
-               UNCLAMPED_FLOAT_TO_CHAN(green, textureUnit->EnvColor[1]);
-               UNCLAMPED_FLOAT_TO_CHAN(blue,  textureUnit->EnvColor[2]);
-               UNCLAMPED_FLOAT_TO_CHAN(alpha, textureUnit->EnvColor[3]);
+               GLfloat (*c)[4] = ccolor[j];
+               GLfloat red   = textureUnit->EnvColor[0];
+               GLfloat green = textureUnit->EnvColor[1];
+               GLfloat blue  = textureUnit->EnvColor[2];
+               GLfloat alpha = textureUnit->EnvColor[3];
                for (i = 0; i < n; i++) {
-                  c[i][RCOMP] = red;
-                  c[i][GCOMP] = green;
-                  c[i][BCOMP] = blue;
-                  c[i][ACOMP] = alpha;
+                  ASSIGN_4V(c[i], red, green, blue, alpha);
                }
-               argRGB[j] = (const GLchan (*)[4]) ccolor[j];
+               argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
             }
             break;
         /* GL_ATI_texture_env_combine3 allows GL_ZERO & GL_ONE as sources.
          */
         case GL_ZERO:
-            argRGB[j] = & zero;
+            {
+               GLfloat (*c)[4] = ccolor[j];
+               for (i = 0; i < n; i++) {
+                  ASSIGN_4V(c[i], 0.0F, 0.0F, 0.0F, 0.0F);
+               }
+               argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
+            }
             break;
         case GL_ONE:
-            argRGB[j] = & one;
+            {
+               GLfloat (*c)[4] = ccolor[j];
+               for (i = 0; i < n; i++) {
+                  ASSIGN_4V(c[i], 1.0F, 1.0F, 1.0F, 1.0F);
+               }
+               argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
+            }
             break;
          default:
             /* ARB_texture_env_crossbar source */
@@ -148,23 +154,23 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
                ASSERT(srcUnit < ctx->Const.MaxTextureUnits);
                if (!ctx->Texture.Unit[srcUnit]._ReallyEnabled)
                   return;
-               argRGB[j] = (const GLchan (*)[4])
-                  (texelBuffer + srcUnit * (n * 4 * sizeof(GLchan)));
+               argRGB[j] = (const GLfloat (*)[4])
+                  (texelBuffer + srcUnit * (n * 4 * sizeof(GLfloat)));
             }
       }
 
       if (textureUnit->_CurrentCombine->OperandRGB[j] != GL_SRC_COLOR) {
-         const GLchan (*src)[4] = argRGB[j];
-         GLchan (*dst)[4] = ccolor[j];
+         const GLfloat (*src)[4] = argRGB[j];
+         GLfloat (*dst)[4] = ccolor[j];
 
          /* point to new arg[j] storage */
-         argRGB[j] = (const GLchan (*)[4]) ccolor[j];
+         argRGB[j] = (const GLfloat (*)[4]) ccolor[j];
 
          if (textureUnit->_CurrentCombine->OperandRGB[j] == GL_ONE_MINUS_SRC_COLOR) {
             for (i = 0; i < n; i++) {
-               dst[i][RCOMP] = CHAN_MAX - src[i][RCOMP];
-               dst[i][GCOMP] = CHAN_MAX - src[i][GCOMP];
-               dst[i][BCOMP] = CHAN_MAX - src[i][BCOMP];
+               dst[i][RCOMP] = 1.0F - src[i][RCOMP];
+               dst[i][GCOMP] = 1.0F - src[i][GCOMP];
+               dst[i][BCOMP] = 1.0F - src[i][BCOMP];
             }
          }
          else if (textureUnit->_CurrentCombine->OperandRGB[j] == GL_SRC_ALPHA) {
@@ -177,9 +183,9 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
          else {
             ASSERT(textureUnit->_CurrentCombine->OperandRGB[j] ==GL_ONE_MINUS_SRC_ALPHA);
             for (i = 0; i < n; i++) {
-               dst[i][RCOMP] = CHAN_MAX - src[i][ACOMP];
-               dst[i][GCOMP] = CHAN_MAX - src[i][ACOMP];
-               dst[i][BCOMP] = CHAN_MAX - src[i][ACOMP];
+               dst[i][RCOMP] = 1.0F - src[i][ACOMP];
+               dst[i][GCOMP] = 1.0F - src[i][ACOMP];
+               dst[i][BCOMP] = 1.0F - src[i][ACOMP];
             }
          }
       }
@@ -193,22 +199,22 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
 
       switch (srcA) {
          case GL_TEXTURE:
-            argA[j] = (const GLchan (*)[4])
-               (texelBuffer + unit * (n * 4 * sizeof(GLchan)));
+            argA[j] = (const GLfloat (*)[4])
+               (texelBuffer + unit * (n * 4 * sizeof(GLfloat)));
             break;
          case GL_PRIMARY_COLOR:
             argA[j] = primary_rgba;
             break;
          case GL_PREVIOUS:
-            argA[j] = (const GLchan (*)[4]) rgba;
+            argA[j] = (const GLfloat (*)[4]) rgba;
             break;
          case GL_CONSTANT:
             {
-               GLchan alpha, (*c)[4] = ccolor[j];
-               UNCLAMPED_FLOAT_TO_CHAN(alpha, textureUnit->EnvColor[3]);
+               GLfloat alpha, (*c)[4] = ccolor[j];
+               alpha = textureUnit->EnvColor[3];
                for (i = 0; i < n; i++)
                   c[i][ACOMP] = alpha;
-               argA[j] = (const GLchan (*)[4]) ccolor[j];
+               argA[j] = (const GLfloat (*)[4]) ccolor[j];
             }
             break;
         /* GL_ATI_texture_env_combine3 allows GL_ZERO & GL_ONE as sources.
@@ -226,17 +232,17 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
                ASSERT(srcUnit < ctx->Const.MaxTextureUnits);
                if (!ctx->Texture.Unit[srcUnit]._ReallyEnabled)
                   return;
-               argA[j] = (const GLchan (*)[4])
-                  (texelBuffer + srcUnit * (n * 4 * sizeof(GLchan)));
+               argA[j] = (const GLfloat (*)[4])
+                  (texelBuffer + srcUnit * (n * 4 * sizeof(GLfloat)));
             }
       }
 
       if (textureUnit->_CurrentCombine->OperandA[j] == GL_ONE_MINUS_SRC_ALPHA) {
-         const GLchan (*src)[4] = argA[j];
-         GLchan (*dst)[4] = ccolor[j];
-         argA[j] = (const GLchan (*)[4]) ccolor[j];
+         const GLfloat (*src)[4] = argA[j];
+         GLfloat (*dst)[4] = ccolor[j];
+         argA[j] = (const GLfloat (*)[4]) ccolor[j];
          for (i = 0; i < n; i++) {
-            dst[i][ACOMP] = CHAN_MAX - src[i][ACOMP];
+            dst[i][ACOMP] = 1.0F - src[i][ACOMP];
          }
       }
    }
@@ -247,21 +253,12 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
    switch (textureUnit->_CurrentCombine->ModeRGB) {
       case GL_REPLACE:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
             if (RGBshift) {
                for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                   rgba[i][RCOMP] = arg0[i][RCOMP] * RGBmult;
                   rgba[i][GCOMP] = arg0[i][GCOMP] * RGBmult;
                   rgba[i][BCOMP] = arg0[i][BCOMP] * RGBmult;
-#else
-                  GLuint r = (GLuint) arg0[i][RCOMP] << RGBshift;
-                  GLuint g = (GLuint) arg0[i][GCOMP] << RGBshift;
-                  GLuint b = (GLuint) arg0[i][BCOMP] << RGBshift;
-                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
-                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
-                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
-#endif
                }
             }
             else {
@@ -275,179 +272,91 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
          break;
       case GL_MODULATE:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - RGBshift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = arg0[i][RCOMP] * arg1[i][RCOMP] * RGBmult;
                rgba[i][GCOMP] = arg0[i][GCOMP] * arg1[i][GCOMP] * RGBmult;
                rgba[i][BCOMP] = arg0[i][BCOMP] * arg1[i][BCOMP] * RGBmult;
-#else
-               GLuint r = PROD(arg0[i][RCOMP], arg1[i][RCOMP]) >> shift;
-               GLuint g = PROD(arg0[i][GCOMP], arg1[i][GCOMP]) >> shift;
-               GLuint b = PROD(arg0[i][BCOMP], arg1[i][BCOMP]) >> shift;
-               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_ADD:
          if (textureUnit->EnvMode == GL_COMBINE4_NV) {
             /* (a * b) + (c * d) */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];
-            const GLchan (*arg3)[4] = (const GLchan (*)[4]) argRGB[3];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
+            const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argRGB[3];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = (arg0[i][RCOMP] * arg1[i][RCOMP] +
                                  arg2[i][RCOMP] * arg3[i][RCOMP]) * RGBmult;
                rgba[i][GCOMP] = (arg0[i][GCOMP] * arg1[i][GCOMP] +
                                  arg2[i][GCOMP] * arg3[i][GCOMP]) * RGBmult;
                rgba[i][BCOMP] = (arg0[i][BCOMP] * arg1[i][BCOMP] +
                                  arg2[i][BCOMP] * arg3[i][BCOMP]) * RGBmult;
-#else
-               const GLint shift = CHAN_BITS - RGBshift;
-               GLint r = (PROD(arg0[i][RCOMP], arg1[i][RCOMP]) >> shift) +
-                         (PROD(arg2[i][RCOMP], arg3[i][RCOMP]) >> shift);
-               GLint g = (PROD(arg0[i][GCOMP], arg1[i][GCOMP]) >> shift) +
-                         (PROD(arg2[i][GCOMP], arg3[i][GCOMP]) >> shift);
-               GLint b = (PROD(arg0[i][BCOMP], arg1[i][BCOMP]) >> shift) +
-                         (PROD(arg2[i][BCOMP], arg3[i][BCOMP]) >> shift);
-               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);
-#endif
             }
          }
          else {
             /* 2-term addition */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = (arg0[i][RCOMP] + arg1[i][RCOMP]) * RGBmult;
                rgba[i][GCOMP] = (arg0[i][GCOMP] + arg1[i][GCOMP]) * RGBmult;
                rgba[i][BCOMP] = (arg0[i][BCOMP] + arg1[i][BCOMP]) * RGBmult;
-#else
-               GLint r = ((GLint) arg0[i][RCOMP] + (GLint) arg1[i][RCOMP]) << RGBshift;
-               GLint g = ((GLint) arg0[i][GCOMP] + (GLint) arg1[i][GCOMP]) << RGBshift;
-               GLint b = ((GLint) arg0[i][BCOMP] + (GLint) arg1[i][BCOMP]) << RGBshift;
-               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_ADD_SIGNED:
          if (textureUnit->EnvMode == GL_COMBINE4_NV) {
             /* (a * b) + (c * d) - 0.5 */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];
-            const GLchan (*arg3)[4] = (const GLchan (*)[4]) argRGB[3];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
+            const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argRGB[3];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = (arg0[i][RCOMP] + arg1[i][RCOMP] *
                                  arg2[i][RCOMP] + arg3[i][RCOMP] - 0.5) * RGBmult;
                rgba[i][GCOMP] = (arg0[i][GCOMP] + arg1[i][GCOMP] *
                                  arg2[i][GCOMP] + arg3[i][GCOMP] - 0.5) * RGBmult;
                rgba[i][BCOMP] = (arg0[i][BCOMP] + arg1[i][BCOMP] *
                                  arg2[i][BCOMP] + arg3[i][BCOMP] - 0.5) * RGBmult;
-#else
-               GLint r = (((PROD(arg0[i][RCOMP], arg1[i][RCOMP]) +
-                            PROD(arg2[i][RCOMP], arg3[i][RCOMP])) >> CHAN_BITS) - half)
-                          << RGBshift;
-               GLint g = (((PROD(arg0[i][GCOMP], arg1[i][GCOMP]) +
-                            PROD(arg2[i][GCOMP], arg3[i][GCOMP])) >> CHAN_BITS) - half)
-                          << RGBshift;
-               GLint b = (((PROD(arg0[i][BCOMP], arg1[i][BCOMP]) +
-                            PROD(arg2[i][BCOMP], arg3[i][BCOMP])) >> CHAN_BITS) - half)
-                          << RGBshift;
-               rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
-#endif
             }
          }
          else {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = (arg0[i][RCOMP] + arg1[i][RCOMP] - 0.5) * RGBmult;
                rgba[i][GCOMP] = (arg0[i][GCOMP] + arg1[i][GCOMP] - 0.5) * RGBmult;
                rgba[i][BCOMP] = (arg0[i][BCOMP] + arg1[i][BCOMP] - 0.5) * RGBmult;
-#else
-               GLint r = (GLint) arg0[i][RCOMP] + (GLint) arg1[i][RCOMP] - half;
-               GLint g = (GLint) arg0[i][GCOMP] + (GLint) arg1[i][GCOMP] - half;
-               GLint b = (GLint) arg0[i][BCOMP] + (GLint) arg1[i][BCOMP] - half;
-               r = (r < 0) ? 0 : r << RGBshift;
-               g = (g < 0) ? 0 : g << RGBshift;
-               b = (b < 0) ? 0 : b << RGBshift;
-               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_INTERPOLATE:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - RGBshift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = (arg0[i][RCOMP] * arg2[i][RCOMP] +
-                      arg1[i][RCOMP] * (CHAN_MAXF - arg2[i][RCOMP])) * RGBmult;
+                      arg1[i][RCOMP] * (1.0F - arg2[i][RCOMP])) * RGBmult;
                rgba[i][GCOMP] = (arg0[i][GCOMP] * arg2[i][GCOMP] +
-                      arg1[i][GCOMP] * (CHAN_MAXF - arg2[i][GCOMP])) * RGBmult;
+                      arg1[i][GCOMP] * (1.0F - arg2[i][GCOMP])) * RGBmult;
                rgba[i][BCOMP] = (arg0[i][BCOMP] * arg2[i][BCOMP] +
-                      arg1[i][BCOMP] * (CHAN_MAXF - arg2[i][BCOMP])) * RGBmult;
-#else
-               GLuint r = (PROD(arg0[i][RCOMP], arg2[i][RCOMP])
-                           + PROD(arg1[i][RCOMP], CHAN_MAX - arg2[i][RCOMP]))
-                              >> shift;
-               GLuint g = (PROD(arg0[i][GCOMP], arg2[i][GCOMP])
-                           + PROD(arg1[i][GCOMP], CHAN_MAX - arg2[i][GCOMP]))
-                              >> shift;
-               GLuint b = (PROD(arg0[i][BCOMP], arg2[i][BCOMP])
-                           + PROD(arg1[i][BCOMP], CHAN_MAX - arg2[i][BCOMP]))
-                              >> shift;
-               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);
-#endif
+                      arg1[i][BCOMP] * (1.0F - arg2[i][BCOMP])) * RGBmult;
             }
          }
          break;
       case GL_SUBTRACT:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][RCOMP] = (arg0[i][RCOMP] - arg1[i][RCOMP]) * RGBmult;
                rgba[i][GCOMP] = (arg0[i][GCOMP] - arg1[i][GCOMP]) * RGBmult;
                rgba[i][BCOMP] = (arg0[i][BCOMP] - arg1[i][BCOMP]) * RGBmult;
-#else
-               GLint r = ((GLint) arg0[i][RCOMP] - (GLint) arg1[i][RCOMP]) << RGBshift;
-               GLint g = ((GLint) arg0[i][GCOMP] - (GLint) arg1[i][GCOMP]) << RGBshift;
-               GLint b = ((GLint) arg0[i][BCOMP] - (GLint) arg1[i][BCOMP]) << RGBshift;
-               rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
-#endif
             }
          }
          break;
@@ -455,25 +364,15 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
       case GL_DOT3_RGBA_EXT:
          {
             /* Do not scale the result by 1 2 or 4 */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               GLchan dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
+               GLfloat dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
                              (arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +
                              (arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))
                             * 4.0F;
-               dot = CLAMP(dot, 0.0F, CHAN_MAXF);
-#else
-               GLint dot = (S_PROD((GLint)arg0[i][RCOMP] - half,
-                                  (GLint)arg1[i][RCOMP] - half) +
-                           S_PROD((GLint)arg0[i][GCOMP] - half,
-                                  (GLint)arg1[i][GCOMP] - half) +
-                           S_PROD((GLint)arg0[i][BCOMP] - half,
-                                  (GLint)arg1[i][BCOMP] - half)) >> 6;
-               dot = CLAMP(dot, 0, CHAN_MAX);
-#endif
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLchan) dot;
+               dot = CLAMP(dot, 0.0F, 1.0F);
+               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLfloat) dot;
             }
          }
          break;
@@ -481,113 +380,60 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
       case GL_DOT3_RGBA:
          {
             /* DO scale the result by 1 2 or 4 */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               GLchan dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
+               GLfloat dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +
                              (arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +
                              (arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))
                             * 4.0F * RGBmult;
-               dot = CLAMP(dot, 0.0, CHAN_MAXF);
-#else
-               GLint dot = (S_PROD((GLint)arg0[i][RCOMP] - half,
-                                  (GLint)arg1[i][RCOMP] - half) +
-                           S_PROD((GLint)arg0[i][GCOMP] - half,
-                                  (GLint)arg1[i][GCOMP] - half) +
-                           S_PROD((GLint)arg0[i][BCOMP] - half,
-                                  (GLint)arg1[i][BCOMP] - half)) >> 6;
-               dot <<= RGBshift;
-               dot = CLAMP(dot, 0, CHAN_MAX);
-#endif
-               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLchan) dot;
+               dot = CLAMP(dot, 0.0, 1.0F);
+               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLfloat) dot;
             }
          }
          break;
       case GL_MODULATE_ADD_ATI:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - RGBshift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) + arg1[i][RCOMP]) * RGBmult;
-               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) + arg1[i][GCOMP]) * RGBmult;
-               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) + arg1[i][BCOMP]) * RGBmult;
-#else
-               GLuint r = (PROD(arg0[i][RCOMP], arg2[i][RCOMP])
-                           + ((GLuint) arg1[i][RCOMP] << CHAN_BITS)) >> shift;
-               GLuint g = (PROD(arg0[i][GCOMP], arg2[i][GCOMP])
-                           + ((GLuint) arg1[i][GCOMP] << CHAN_BITS)) >> shift;
-               GLuint b = (PROD(arg0[i][BCOMP], arg2[i][BCOMP])
-                           + ((GLuint) arg1[i][BCOMP] << CHAN_BITS)) >> shift;
-               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);
-#endif
+               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) +
+                                 arg1[i][RCOMP]) * RGBmult;
+               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) +
+                                 arg1[i][GCOMP]) * RGBmult;
+               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) +
+                                 arg1[i][BCOMP]) * RGBmult;
             }
         }
          break;
       case GL_MODULATE_SIGNED_ADD_ATI:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - RGBshift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) + arg1[i][RCOMP] - 0.5) * RGBmult;
-               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) + arg1[i][GCOMP] - 0.5) * RGBmult;
-               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) + arg1[i][BCOMP] - 0.5) * RGBmult;
-#else
-               GLint r = (S_PROD(arg0[i][RCOMP], arg2[i][RCOMP])
-                         + (((GLint) arg1[i][RCOMP] - half) << CHAN_BITS))
-                   >> shift;
-               GLint g = (S_PROD(arg0[i][GCOMP], arg2[i][GCOMP])
-                         + (((GLint) arg1[i][GCOMP] - half) << CHAN_BITS))
-                   >> shift;
-               GLint b = (S_PROD(arg0[i][BCOMP], arg2[i][BCOMP])
-                         + (((GLint) arg1[i][BCOMP] - half) << CHAN_BITS))
-                   >> shift;
-               rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
-#endif
+               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) +
+                                 arg1[i][RCOMP] - 0.5) * RGBmult;
+               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) +
+                                 arg1[i][GCOMP] - 0.5) * RGBmult;
+               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) +
+                                 arg1[i][BCOMP] - 0.5) * RGBmult;
             }
         }
          break;
       case GL_MODULATE_SUBTRACT_ATI:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - RGBshift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argRGB[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argRGB[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argRGB[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) - arg1[i][RCOMP]) * RGBmult;
-               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) - arg1[i][GCOMP]) * RGBmult;
-               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) - arg1[i][BCOMP]) * RGBmult;
-#else
-               GLint r = (S_PROD(arg0[i][RCOMP], arg2[i][RCOMP])
-                         - ((GLint) arg1[i][RCOMP] << CHAN_BITS))
-                   >> shift;
-               GLint g = (S_PROD(arg0[i][GCOMP], arg2[i][GCOMP])
-                         - ((GLint) arg1[i][GCOMP] << CHAN_BITS))
-                   >> shift;
-               GLint b = (S_PROD(arg0[i][BCOMP], arg2[i][BCOMP])
-                         - ((GLint) arg1[i][BCOMP] << CHAN_BITS))
-                   >> shift;
-               rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);
-               rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);
-               rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);
-#endif
+               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) -
+                                 arg1[i][RCOMP]) * RGBmult;
+               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) -
+                                 arg1[i][GCOMP]) * RGBmult;
+               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) -
+                                 arg1[i][BCOMP]) * RGBmult;
             }
         }
          break;
@@ -617,15 +463,11 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
    switch (textureUnit->_CurrentCombine->ModeA) {
       case GL_REPLACE:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
             if (Ashift) {
                for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-                  GLchan a = arg0[i][ACOMP] * Amult;
-#else
-                  GLuint a = (GLuint) arg0[i][ACOMP] << Ashift;
-#endif
-                  rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);
+                  GLfloat a = arg0[i][ACOMP] * Amult;
+                  rgba[i][ACOMP] = (GLfloat) MIN2(a, 1.0F);
                }
             }
             else {
@@ -637,182 +479,107 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
          break;
       case GL_MODULATE:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - Ashift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = arg0[i][ACOMP] * arg1[i][ACOMP] * Amult;
-#else
-               GLuint a = (PROD(arg0[i][ACOMP], arg1[i][ACOMP]) >> shift);
-               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_ADD:
          if (textureUnit->EnvMode == GL_COMBINE4_NV) {
             /* (a * b) + (c * d) */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];
-            const GLchan (*arg3)[4] = (const GLchan (*)[4]) argA[3];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
+            const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argA[3];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = (arg0[i][ACOMP] * arg1[i][ACOMP] +
                                  arg2[i][ACOMP] * arg3[i][ACOMP]) * Amult;
-#else
-               const GLint shift = CHAN_BITS - Ashift;
-               GLint a = (PROD(arg0[i][ACOMP], arg1[i][ACOMP]) >> shift) +
-                         (PROD(arg2[i][ACOMP], arg3[i][ACOMP]) >> shift);
-               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);
-#endif
             }
          }
          else {
             /* two-term add */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = (arg0[i][ACOMP] + arg1[i][ACOMP]) * Amult;
-#else
-               GLint a = ((GLint) arg0[i][ACOMP] + arg1[i][ACOMP]) << Ashift;
-               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_ADD_SIGNED:
          if (textureUnit->EnvMode == GL_COMBINE4_NV) {
             /* (a * b) + (c * d) - 0.5 */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];
-            const GLchan (*arg3)[4] = (const GLchan (*)[4]) argA[3];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
+            const GLfloat (*arg3)[4] = (const GLfloat (*)[4]) argA[3];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = (arg0[i][ACOMP] * arg1[i][ACOMP] +
                                  arg2[i][ACOMP] * arg3[i][ACOMP] -
                                  0.5) * Amult;
-#else
-               GLint a = (((PROD(arg0[i][ACOMP], arg1[i][ACOMP]) +
-                            PROD(arg2[i][ACOMP], arg3[i][ACOMP])) >> CHAN_BITS) - half)
-                          << Ashift;
-               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-#endif
             }
          }
          else {
             /* a + b - 0.5 */
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = (arg0[i][ACOMP] + arg1[i][ACOMP] - 0.5F) * Amult;
-#else
-               GLint a = (GLint) arg0[i][ACOMP] + (GLint) arg1[i][ACOMP] -half;
-               a = (a < 0) ? 0 : a << Ashift;
-               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_INTERPOLATE:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - Ashift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
             for (i=0; i<n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = (arg0[i][ACOMP] * arg2[i][ACOMP] +
-                                 arg1[i][ACOMP] * (CHAN_MAXF - arg2[i][ACOMP]))
+                                 arg1[i][ACOMP] * (1.0F - arg2[i][ACOMP]))
                                 * Amult;
-#else
-               GLuint a = (PROD(arg0[i][ACOMP], arg2[i][ACOMP])
-                           + PROD(arg1[i][ACOMP], CHAN_MAX - arg2[i][ACOMP]))
-                              >> shift;
-               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_SUBTRACT:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
                rgba[i][ACOMP] = (arg0[i][ACOMP] - arg1[i][ACOMP]) * Amult;
-#else
-               GLint a = ((GLint) arg0[i][ACOMP] - (GLint) arg1[i][ACOMP]) << Ashift;
-               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-#endif
             }
          }
          break;
       case GL_MODULATE_ADD_ATI:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - Ashift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) + arg1[i][ACOMP]) * Amult;
-#else
-               GLint a = (PROD(arg0[i][ACOMP], arg2[i][ACOMP])
-                          + ((GLuint) arg1[i][ACOMP] << CHAN_BITS))
-                   >> shift;
-               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-#endif
+               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP])
+                                 + arg1[i][ACOMP]) * Amult;
             }
          }
          break;
       case GL_MODULATE_SIGNED_ADD_ATI:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - Ashift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) + arg1[i][ACOMP] - 0.5F) * Amult;
-#else
-               GLint a = (S_PROD(arg0[i][ACOMP], arg2[i][ACOMP])
-                         + (((GLint) arg1[i][ACOMP] - half) << CHAN_BITS))
-                   >> shift;
-               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-#endif
+               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) +
+                                 arg1[i][ACOMP] - 0.5F) * Amult;
             }
          }
          break;
       case GL_MODULATE_SUBTRACT_ATI:
          {
-            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];
-            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];
-            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];
-#if CHAN_TYPE != GL_FLOAT
-            const GLint shift = CHAN_BITS - Ashift;
-#endif
+            const GLfloat (*arg0)[4] = (const GLfloat (*)[4]) argA[0];
+            const GLfloat (*arg1)[4] = (const GLfloat (*)[4]) argA[1];
+            const GLfloat (*arg2)[4] = (const GLfloat (*)[4]) argA[2];
             for (i = 0; i < n; i++) {
-#if CHAN_TYPE == GL_FLOAT
-               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) - arg1[i][ACOMP]) * Amult;
-#else
-               GLint a = (S_PROD(arg0[i][ACOMP], arg2[i][ACOMP]) 
-                         - ((GLint) arg1[i][ACOMP] << CHAN_BITS))
-                   >> shift;
-               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);
-#endif
+               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP])
+                                 - arg1[i][ACOMP]) * Amult;
             }
          }
          break;
@@ -831,8 +598,15 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
         rgba[i][ACOMP] = rgba[i][RCOMP];
       }
    }
+
+   for (i = 0; i < n; i++) {
+      UNCLAMPED_FLOAT_TO_CHAN(rgbaChan[i][RCOMP], rgba[i][RCOMP]);
+      UNCLAMPED_FLOAT_TO_CHAN(rgbaChan[i][GCOMP], rgba[i][GCOMP]);
+      UNCLAMPED_FLOAT_TO_CHAN(rgbaChan[i][BCOMP], rgba[i][BCOMP]);
+      UNCLAMPED_FLOAT_TO_CHAN(rgbaChan[i][ACOMP], rgba[i][ACOMP]);
+   }
 }
-#undef PROD
+
 
 
 /**
@@ -840,17 +614,17 @@ texture_combine( const GLcontext *ctx, GLuint unit, GLuint n,
  * See GL_EXT_texture_swizzle.
  */
 static void
-swizzle_texels(GLuint swizzle, GLuint count, GLchan (*texels)[4])
+swizzle_texels(GLuint swizzle, GLuint count, GLfloat (*texels)[4])
 {
    const GLuint swzR = GET_SWZ(swizzle, 0);
    const GLuint swzG = GET_SWZ(swizzle, 1);
    const GLuint swzB = GET_SWZ(swizzle, 2);
    const GLuint swzA = GET_SWZ(swizzle, 3);
-   GLchan vector[6];
+   GLfloat vector[6];
    GLuint i;
 
    vector[SWIZZLE_ZERO] = 0;
-   vector[SWIZZLE_ONE] = CHAN_MAX;
+   vector[SWIZZLE_ONE] = 1.0F;
 
    for (i = 0; i < count; i++) {
       vector[SWIZZLE_X] = texels[i][0];
@@ -880,13 +654,15 @@ static void
 texture_apply( const GLcontext *ctx,
                const struct gl_texture_unit *texUnit,
                GLuint n,
-               CONST GLchan primary_rgba[][4], CONST GLchan texel[][4],
-               GLchan rgba[][4] )
+               CONST GLfloat primary_rgba[][4], CONST GLfloat texel[][4],
+               GLchan rgbaChan[][4] )
 {
    GLint baseLevel;
    GLuint i;
-   GLchan Rc, Gc, Bc, Ac;
+   GLfloat Rc, Gc, Bc, Ac;
    GLenum format;
+   GLfloat rgba[MAX_WIDTH][4];
+
    (void) primary_rgba;
 
    ASSERT(texUnit);
@@ -904,6 +680,16 @@ texture_apply( const GLcontext *ctx,
       format = texUnit->_Current->DepthMode;
    }
 
+   if (texUnit->EnvMode != GL_REPLACE) {
+      /* convert GLchan colors to GLfloat */
+      for (i = 0; i < n; i++) {
+         rgba[i][RCOMP] = CHAN_TO_FLOAT(rgbaChan[i][RCOMP]);
+         rgba[i][GCOMP] = CHAN_TO_FLOAT(rgbaChan[i][GCOMP]);
+         rgba[i][BCOMP] = CHAN_TO_FLOAT(rgbaChan[i][BCOMP]);
+         rgba[i][ACOMP] = CHAN_TO_FLOAT(rgbaChan[i][ACOMP]);
+      }
+   }
+
    switch (texUnit->EnvMode) {
       case GL_REPLACE:
         switch (format) {
@@ -917,14 +703,14 @@ texture_apply( const GLcontext *ctx,
            case GL_LUMINANCE:
               for (i=0;i<n;i++) {
                  /* Cv = Lt */
-                  GLchan Lt = texel[i][RCOMP];
+                  GLfloat Lt = texel[i][RCOMP];
                   rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = Lt;
                   /* Av = Af */
               }
               break;
            case GL_LUMINANCE_ALPHA:
               for (i=0;i<n;i++) {
-                  GLchan Lt = texel[i][RCOMP];
+                  GLfloat Lt = texel[i][RCOMP];
                  /* Cv = Lt */
                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = Lt;
                  /* Av = At */
@@ -934,7 +720,7 @@ texture_apply( const GLcontext *ctx,
            case GL_INTENSITY:
               for (i=0;i<n;i++) {
                  /* Cv = It */
-                  GLchan It = texel[i][RCOMP];
+                  GLfloat It = texel[i][RCOMP];
                   rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = It;
                   /* Av = It */
                   rgba[i][ACOMP] = It;
@@ -971,58 +757,58 @@ texture_apply( const GLcontext *ctx,
               for (i=0;i<n;i++) {
                  /* Cv = Cf */
                  /* Av = AfAt */
-                 rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], texel[i][ACOMP] );
+                 rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
               }
               break;
            case GL_LUMINANCE:
               for (i=0;i<n;i++) {
                  /* Cv = LtCf */
-                  GLchan Lt = texel[i][RCOMP];
-                 rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], Lt );
-                 rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], Lt );
-                 rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], Lt );
+                  GLfloat Lt = texel[i][RCOMP];
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * Lt;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * Lt;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * Lt;
                  /* Av = Af */
               }
               break;
            case GL_LUMINANCE_ALPHA:
               for (i=0;i<n;i++) {
                  /* Cv = CfLt */
-                  GLchan Lt = texel[i][RCOMP];
-                 rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], Lt );
-                 rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], Lt );
-                 rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], Lt );
+                  GLfloat Lt = texel[i][RCOMP];
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * Lt;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * Lt;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * Lt;
                  /* Av = AfAt */
-                 rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], texel[i][ACOMP] );
+                 rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
               }
               break;
            case GL_INTENSITY:
               for (i=0;i<n;i++) {
                  /* Cv = CfIt */
-                  GLchan It = texel[i][RCOMP];
-                 rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], It );
-                 rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], It );
-                 rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], It );
+                  GLfloat It = texel[i][RCOMP];
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * It;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * It;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * It;
                  /* Av = AfIt */
-                 rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], It );
+                 rgba[i][ACOMP] = rgba[i][ACOMP] * It;
               }
               break;
            case GL_RGB:
               for (i=0;i<n;i++) {
                  /* Cv = CfCt */
-                 rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], texel[i][RCOMP] );
-                 rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], texel[i][GCOMP] );
-                 rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], texel[i][BCOMP] );
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * texel[i][RCOMP];
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * texel[i][GCOMP];
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * texel[i][BCOMP];
                  /* Av = Af */
               }
               break;
            case GL_RGBA:
               for (i=0;i<n;i++) {
                  /* Cv = CfCt */
-                 rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], texel[i][RCOMP] );
-                 rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], texel[i][GCOMP] );
-                 rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], texel[i][BCOMP] );
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * texel[i][RCOMP];
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * texel[i][GCOMP];
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * texel[i][BCOMP];
                  /* Av = AfAt */
-                 rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], texel[i][ACOMP] );
+                 rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
               }
               break;
             default:
@@ -1051,10 +837,10 @@ texture_apply( const GLcontext *ctx,
            case GL_RGBA:
               for (i=0;i<n;i++) {
                  /* Cv = Cf(1-At) + CtAt */
-                 GLchan t = texel[i][ACOMP], s = CHAN_MAX - t;
-                 rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(texel[i][RCOMP],t);
-                 rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(texel[i][GCOMP],t);
-                 rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(texel[i][BCOMP],t);
+                 GLfloat t = texel[i][ACOMP], s = 1.0F - t;
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * s + texel[i][RCOMP] * t;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * s + texel[i][GCOMP] * t;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * s + texel[i][BCOMP] * t;
                  /* Av = Af */
               }
               break;
@@ -1065,67 +851,73 @@ texture_apply( const GLcontext *ctx,
         break;
 
       case GL_BLEND:
-         UNCLAMPED_FLOAT_TO_CHAN(Rc, texUnit->EnvColor[0]);
-         UNCLAMPED_FLOAT_TO_CHAN(Gc, texUnit->EnvColor[1]);
-         UNCLAMPED_FLOAT_TO_CHAN(Bc, texUnit->EnvColor[2]);
-         UNCLAMPED_FLOAT_TO_CHAN(Ac, texUnit->EnvColor[3]);
+         Rc = texUnit->EnvColor[0];
+         Gc = texUnit->EnvColor[1];
+         Bc = texUnit->EnvColor[2];
+         Ac = texUnit->EnvColor[3];
         switch (format) {
            case GL_ALPHA:
               for (i=0;i<n;i++) {
                  /* Cv = Cf */
                  /* Av = AfAt */
-                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);
+                  rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
               }
               break;
             case GL_LUMINANCE:
               for (i=0;i<n;i++) {
                  /* Cv = Cf(1-Lt) + CcLt */
-                 GLchan Lt = texel[i][RCOMP], s = CHAN_MAX - Lt;
-                 rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(Rc, Lt);
-                 rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(Gc, Lt);
-                 rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(Bc, Lt);
+                 GLfloat Lt = texel[i][RCOMP], s = 1.0F - Lt;
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * s + Rc * Lt;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * s + Gc * Lt;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * s + Bc * Lt;
                  /* Av = Af */
               }
               break;
            case GL_LUMINANCE_ALPHA:
               for (i=0;i<n;i++) {
                  /* Cv = Cf(1-Lt) + CcLt */
-                 GLchan Lt = texel[i][RCOMP], s = CHAN_MAX - Lt;
-                 rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(Rc, Lt);
-                 rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(Gc, Lt);
-                 rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(Bc, Lt);
+                 GLfloat Lt = texel[i][RCOMP], s = 1.0F - Lt;
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * s + Rc * Lt;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * s + Gc * Lt;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * s + Bc * Lt;
                  /* Av = AfAt */
-                 rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP],texel[i][ACOMP]);
+                 rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
               }
               break;
             case GL_INTENSITY:
               for (i=0;i<n;i++) {
                  /* Cv = Cf(1-It) + CcIt */
-                 GLchan It = texel[i][RCOMP], s = CHAN_MAX - It;
-                 rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(Rc, It);
-                 rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(Gc, It);
-                 rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(Bc, It);
+                 GLfloat It = texel[i][RCOMP], s = 1.0F - It;
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * s + Rc * It;
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * s + Gc * It;
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * s + Bc * It;
                   /* Av = Af(1-It) + Ac*It */
-                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], s) + CHAN_PRODUCT(Ac, It);
+                  rgba[i][ACOMP] = rgba[i][ACOMP] * s + Ac * It;
                }
                break;
            case GL_RGB:
               for (i=0;i<n;i++) {
                  /* Cv = Cf(1-Ct) + CcCt */
-                 rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], (CHAN_MAX-texel[i][RCOMP])) + CHAN_PRODUCT(Rc,texel[i][RCOMP]);
-                 rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], (CHAN_MAX-texel[i][GCOMP])) + CHAN_PRODUCT(Gc,texel[i][GCOMP]);
-                 rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], (CHAN_MAX-texel[i][BCOMP])) + CHAN_PRODUCT(Bc,texel[i][BCOMP]);
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * (1.0F - texel[i][RCOMP])
+                     + Rc * texel[i][RCOMP];
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * (1.0F - texel[i][GCOMP])
+                     + Gc * texel[i][GCOMP];
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * (1.0F - texel[i][BCOMP])
+                     + Bc * texel[i][BCOMP];
                  /* Av = Af */
               }
               break;
            case GL_RGBA:
               for (i=0;i<n;i++) {
                  /* Cv = Cf(1-Ct) + CcCt */
-                 rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], (CHAN_MAX-texel[i][RCOMP])) + CHAN_PRODUCT(Rc,texel[i][RCOMP]);
-                 rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], (CHAN_MAX-texel[i][GCOMP])) + CHAN_PRODUCT(Gc,texel[i][GCOMP]);
-                 rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], (CHAN_MAX-texel[i][BCOMP])) + CHAN_PRODUCT(Bc,texel[i][BCOMP]);
+                 rgba[i][RCOMP] = rgba[i][RCOMP] * (1.0F - texel[i][RCOMP])
+                     + Rc * texel[i][RCOMP];
+                 rgba[i][GCOMP] = rgba[i][GCOMP] * (1.0F - texel[i][GCOMP])
+                     + Gc * texel[i][GCOMP];
+                 rgba[i][BCOMP] = rgba[i][BCOMP] * (1.0F - texel[i][BCOMP])
+                     + Bc * texel[i][BCOMP];
                  /* Av = AfAt */
-                 rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP],texel[i][ACOMP]);
+                 rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
               }
               break;
             default:
@@ -1134,7 +926,7 @@ texture_apply( const GLcontext *ctx,
         }
         break;
 
-     /* XXX don't clamp results if GLchan is float??? */
+     /* XXX don't clamp results if GLfloat is float??? */
 
       case GL_ADD:  /* GL_EXT_texture_add_env */
          switch (format) {
@@ -1143,66 +935,66 @@ texture_apply( const GLcontext *ctx,
                   /* Rv = Rf */
                   /* Gv = Gf */
                   /* Bv = Bf */
-                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);
+                  rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
                }
                break;
             case GL_LUMINANCE:
                for (i=0;i<n;i++) {
-                  ChanTemp Lt = texel[i][RCOMP];
-                  ChanTemp r = rgba[i][RCOMP] + Lt;
-                  ChanTemp g = rgba[i][GCOMP] + Lt;
-                  ChanTemp b = rgba[i][BCOMP] + Lt;
-                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
-                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
-                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
+                  GLfloat Lt = texel[i][RCOMP];
+                  GLfloat r = rgba[i][RCOMP] + Lt;
+                  GLfloat g = rgba[i][GCOMP] + Lt;
+                  GLfloat b = rgba[i][BCOMP] + Lt;
+                  rgba[i][RCOMP] = MIN2(r, 1.0F);
+                  rgba[i][GCOMP] = MIN2(g, 1.0F);
+                  rgba[i][BCOMP] = MIN2(b, 1.0F);
                   /* Av = Af */
                }
                break;
             case GL_LUMINANCE_ALPHA:
                for (i=0;i<n;i++) {
-                  ChanTemp Lt = texel[i][RCOMP];
-                  ChanTemp r = rgba[i][RCOMP] + Lt;
-                  ChanTemp g = rgba[i][GCOMP] + Lt;
-                  ChanTemp b = rgba[i][BCOMP] + Lt;
-                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
-                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
-                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
-                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);
+                  GLfloat Lt = texel[i][RCOMP];
+                  GLfloat r = rgba[i][RCOMP] + Lt;
+                  GLfloat g = rgba[i][GCOMP] + Lt;
+                  GLfloat b = rgba[i][BCOMP] + Lt;
+                  rgba[i][RCOMP] = MIN2(r, 1.0F);
+                  rgba[i][GCOMP] = MIN2(g, 1.0F);
+                  rgba[i][BCOMP] = MIN2(b, 1.0F);
+                  rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
                }
                break;
             case GL_INTENSITY:
                for (i=0;i<n;i++) {
-                  GLchan It = texel[i][RCOMP];
-                  ChanTemp r = rgba[i][RCOMP] + It;
-                  ChanTemp g = rgba[i][GCOMP] + It;
-                  ChanTemp b = rgba[i][BCOMP] + It;
-                  ChanTemp a = rgba[i][ACOMP] + It;
-                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
-                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
-                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
-                  rgba[i][ACOMP] = MIN2(a, CHAN_MAX);
+                  GLfloat It = texel[i][RCOMP];
+                  GLfloat r = rgba[i][RCOMP] + It;
+                  GLfloat g = rgba[i][GCOMP] + It;
+                  GLfloat b = rgba[i][BCOMP] + It;
+                  GLfloat a = rgba[i][ACOMP] + It;
+                  rgba[i][RCOMP] = MIN2(r, 1.0F);
+                  rgba[i][GCOMP] = MIN2(g, 1.0F);
+                  rgba[i][BCOMP] = MIN2(b, 1.0F);
+                  rgba[i][ACOMP] = MIN2(a, 1.0F);
                }
                break;
            case GL_RGB:
               for (i=0;i<n;i++) {
-                  ChanTemp r = rgba[i][RCOMP] + texel[i][RCOMP];
-                  ChanTemp g = rgba[i][GCOMP] + texel[i][GCOMP];
-                  ChanTemp b = rgba[i][BCOMP] + texel[i][BCOMP];
-                 rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
-                 rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
-                 rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
+                  GLfloat r = rgba[i][RCOMP] + texel[i][RCOMP];
+                  GLfloat g = rgba[i][GCOMP] + texel[i][GCOMP];
+                  GLfloat b = rgba[i][BCOMP] + texel[i][BCOMP];
+                 rgba[i][RCOMP] = MIN2(r, 1.0F);
+                 rgba[i][GCOMP] = MIN2(g, 1.0F);
+                 rgba[i][BCOMP] = MIN2(b, 1.0F);
                  /* Av = Af */
               }
               break;
            case GL_RGBA:
               for (i=0;i<n;i++) {
-                  ChanTemp r = rgba[i][RCOMP] + texel[i][RCOMP];
-                  ChanTemp g = rgba[i][GCOMP] + texel[i][GCOMP];
-                  ChanTemp b = rgba[i][BCOMP] + texel[i][BCOMP];
-                 rgba[i][RCOMP] = MIN2(r, CHAN_MAX);
-                 rgba[i][GCOMP] = MIN2(g, CHAN_MAX);
-                 rgba[i][BCOMP] = MIN2(b, CHAN_MAX);
-                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);
+                  GLfloat r = rgba[i][RCOMP] + texel[i][RCOMP];
+                  GLfloat g = rgba[i][GCOMP] + texel[i][GCOMP];
+                  GLfloat b = rgba[i][BCOMP] + texel[i][BCOMP];
+                 rgba[i][RCOMP] = MIN2(r, 1.0F);
+                 rgba[i][GCOMP] = MIN2(g, 1.0F);
+                 rgba[i][BCOMP] = MIN2(b, 1.0F);
+                  rgba[i][ACOMP] = rgba[i][ACOMP] * texel[i][ACOMP];
                }
                break;
             default:
@@ -1215,6 +1007,14 @@ texture_apply( const GLcontext *ctx,
          _mesa_problem(ctx, "Bad env mode in texture_apply");
          return;
    }
+
+   /* convert GLfloat colors to GLchan */
+   for (i = 0; i < n; i++) {
+      CLAMPED_FLOAT_TO_CHAN(rgbaChan[i][RCOMP], rgba[i][RCOMP]);
+      CLAMPED_FLOAT_TO_CHAN(rgbaChan[i][GCOMP], rgba[i][GCOMP]);
+      CLAMPED_FLOAT_TO_CHAN(rgbaChan[i][BCOMP], rgba[i][BCOMP]);
+      CLAMPED_FLOAT_TO_CHAN(rgbaChan[i][ACOMP], rgba[i][ACOMP]);
+   }
 }
 
 
@@ -1226,7 +1026,7 @@ void
 _swrast_texture_span( GLcontext *ctx, SWspan *span )
 {
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
-   GLchan primary_rgba[MAX_WIDTH][4];
+   GLfloat primary_rgba[MAX_WIDTH][4];
    GLuint unit;
 
    ASSERT(span->end < MAX_WIDTH);
@@ -1234,8 +1034,15 @@ _swrast_texture_span( GLcontext *ctx, SWspan *span )
    /*
     * Save copy of the incoming fragment colors (the GL_PRIMARY_COLOR)
     */
-   if (swrast->_AnyTextureCombine)
-      MEMCPY(primary_rgba, span->array->rgba, 4 * span->end * sizeof(GLchan));
+   if (swrast->_AnyTextureCombine) {
+      GLuint i;
+      for (i = 0; i < span->end; i++) {
+         primary_rgba[i][RCOMP] = CHAN_TO_FLOAT(span->array->rgba[i][RCOMP]);
+         primary_rgba[i][GCOMP] = CHAN_TO_FLOAT(span->array->rgba[i][GCOMP]);
+         primary_rgba[i][BCOMP] = CHAN_TO_FLOAT(span->array->rgba[i][BCOMP]);
+         primary_rgba[i][ACOMP] = CHAN_TO_FLOAT(span->array->rgba[i][ACOMP]);
+      }
+   }
 
    /* First must sample all bump maps */
    for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
@@ -1323,8 +1130,8 @@ _swrast_texture_span( GLcontext *ctx, SWspan *span )
          const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
          const struct gl_texture_object *curObj = texUnit->_Current;
          GLfloat *lambda = span->array->lambda[unit];
-         GLchan (*texels)[4] = (GLchan (*)[4])
-            (swrast->TexelBuffer + unit * (span->end * 4 * sizeof(GLchan)));
+         GLfloat (*texels)[4] = (GLfloat (*)[4])
+            (swrast->TexelBuffer + unit * (span->end * 4 * sizeof(GLfloat)));
 
          /* adjust texture lod (lambda) */
          if (span->arrayMask & SPAN_LAMBDA) {
@@ -1357,13 +1164,7 @@ _swrast_texture_span( GLcontext *ctx, SWspan *span )
 
          /* GL_SGI_texture_color_table */
          if (texUnit->ColorTableEnabled) {
-#if CHAN_TYPE == GL_UNSIGNED_BYTE
-            _mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);
-#elif CHAN_TYPE == GL_UNSIGNED_SHORT
-            _mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);
-#else
             _mesa_lookup_rgba_float(&texUnit->ColorTable, span->end, texels);
-#endif
          }
 
          /* GL_EXT_texture_swizzle */
@@ -1383,19 +1184,19 @@ _swrast_texture_span( GLcontext *ctx, SWspan *span )
          const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
          if (texUnit->_CurrentCombine != &texUnit->_EnvMode ) {
             texture_combine( ctx, unit, span->end,
-                             (CONST GLchan (*)[4]) primary_rgba,
+                             (CONST GLfloat (*)[4]) primary_rgba,
                              swrast->TexelBuffer,
                              span->array->rgba );
          }
          else {
             /* conventional texture blend */
-            const GLchan (*texels)[4] = (const GLchan (*)[4])
+            const GLfloat (*texels)[4] = (const GLfloat (*)[4])
                (swrast->TexelBuffer + unit *
-                (span->end * 4 * sizeof(GLchan)));
+                (span->end * 4 * sizeof(GLfloat)));
 
 
             texture_apply( ctx, texUnit, span->end,
-                           (CONST GLchan (*)[4]) primary_rgba, texels,
+                           (CONST GLfloat (*)[4]) primary_rgba, texels,
                            span->array->rgba );
          }
       }
index 19317c393a977f82282bfadb6828b37ed501599c..b76de045f82eb79342b54ac921e3336ac104563b 100644 (file)
@@ -133,27 +133,12 @@ ilerp_3d(GLint ia, GLint ib, GLint ic,
  * Do linear interpolation of colors.
  */
 static INLINE void
-lerp_rgba(GLchan result[4], GLfloat t, const GLchan a[4], const GLchan b[4])
+lerp_rgba(GLfloat result[4], GLfloat t, const GLfloat a[4], const GLfloat b[4])
 {
-#if CHAN_TYPE == GL_FLOAT
    result[0] = LERP(t, a[0], b[0]);
    result[1] = LERP(t, a[1], b[1]);
    result[2] = LERP(t, a[2], b[2]);
    result[3] = LERP(t, a[3], b[3]);
-#elif CHAN_TYPE == GL_UNSIGNED_SHORT
-   result[0] = (GLchan) (LERP(t, a[0], b[0]) + 0.5);
-   result[1] = (GLchan) (LERP(t, a[1], b[1]) + 0.5);
-   result[2] = (GLchan) (LERP(t, a[2], b[2]) + 0.5);
-   result[3] = (GLchan) (LERP(t, a[3], b[3]) + 0.5);
-#else
-   /* fixed point interpolants in [0, ILERP_SCALE] */
-   const GLint it = IROUND_POS(t * ILERP_SCALE);
-   ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
-   result[0] = ILERP(it, a[0], b[0]);
-   result[1] = ILERP(it, a[1], b[1]);
-   result[2] = ILERP(it, a[2], b[2]);
-   result[3] = ILERP(it, a[3], b[3]);
-#endif
 }
 
 
@@ -161,29 +146,14 @@ lerp_rgba(GLchan result[4], GLfloat t, const GLchan a[4], const GLchan b[4])
  * Do bilinear interpolation of colors.
  */
 static INLINE void
-lerp_rgba_2d(GLchan result[4], GLfloat a, GLfloat b,
-             const GLchan t00[4], const GLchan t10[4],
-             const GLchan t01[4], const GLchan t11[4])
+lerp_rgba_2d(GLfloat result[4], GLfloat a, GLfloat b,
+             const GLfloat t00[4], const GLfloat t10[4],
+             const GLfloat t01[4], const GLfloat t11[4])
 {
-#if CHAN_TYPE == GL_FLOAT
    result[0] = lerp_2d(a, b, t00[0], t10[0], t01[0], t11[0]);
    result[1] = lerp_2d(a, b, t00[1], t10[1], t01[1], t11[1]);
    result[2] = lerp_2d(a, b, t00[2], t10[2], t01[2], t11[2]);
    result[3] = lerp_2d(a, b, t00[3], t10[3], t01[3], t11[3]);
-#elif CHAN_TYPE == GL_UNSIGNED_SHORT
-   result[0] = (GLchan) (lerp_2d(a, b, t00[0], t10[0], t01[0], t11[0]) + 0.5);
-   result[1] = (GLchan) (lerp_2d(a, b, t00[1], t10[1], t01[1], t11[1]) + 0.5);
-   result[2] = (GLchan) (lerp_2d(a, b, t00[2], t10[2], t01[2], t11[2]) + 0.5);
-   result[3] = (GLchan) (lerp_2d(a, b, t00[3], t10[3], t01[3], t11[3]) + 0.5);
-#else
-   const GLint ia = IROUND_POS(a * ILERP_SCALE);
-   const GLint ib = IROUND_POS(b * ILERP_SCALE);
-   ASSERT(CHAN_TYPE == GL_UNSIGNED_BYTE);
-   result[0] = ilerp_2d(ia, ib, t00[0], t10[0], t01[0], t11[0]);
-   result[1] = ilerp_2d(ia, ib, t00[1], t10[1], t01[1], t11[1]);
-   result[2] = ilerp_2d(ia, ib, t00[2], t10[2], t01[2], t11[2]);
-   result[3] = ilerp_2d(ia, ib, t00[3], t10[3], t01[3], t11[3]);
-#endif
 }
 
 
@@ -191,34 +161,18 @@ lerp_rgba_2d(GLchan result[4], GLfloat a, GLfloat b,
  * Do trilinear interpolation of colors.
  */
 static INLINE void
-lerp_rgba_3d(GLchan result[4], GLfloat a, GLfloat b, GLfloat c,
-             const GLchan t000[4], const GLchan t100[4],
-             const GLchan t010[4], const GLchan t110[4],
-             const GLchan t001[4], const GLchan t101[4],
-             const GLchan t011[4], const GLchan t111[4])
+lerp_rgba_3d(GLfloat result[4], GLfloat a, GLfloat b, GLfloat c,
+             const GLfloat t000[4], const GLfloat t100[4],
+             const GLfloat t010[4], const GLfloat t110[4],
+             const GLfloat t001[4], const GLfloat t101[4],
+             const GLfloat t011[4], const GLfloat t111[4])
 {
    GLuint k;
    /* compiler should unroll these short loops */
-#if CHAN_TYPE == GL_FLOAT
    for (k = 0; k < 4; k++) {
       result[k] = lerp_3d(a, b, c, t000[k], t100[k], t010[k], t110[k],
                                    t001[k], t101[k], t011[k], t111[k]);
    }
-#elif CHAN_TYPE == GL_UNSIGNED_SHORT
-   for (k = 0; k < 4; k++) {
-      result[k] = (GLchan)(lerp_3d(a, b, c,
-                                   t000[k], t100[k], t010[k], t110[k],
-                                   t001[k], t101[k], t011[k], t111[k]) + 0.5F);
-   }
-#else
-   GLint ia = IROUND_POS(a * ILERP_SCALE);
-   GLint ib = IROUND_POS(b * ILERP_SCALE);
-   GLint ic = IROUND_POS(c * ILERP_SCALE);
-   for (k = 0; k < 4; k++) {
-      result[k] = ilerp_3d(ia, ib, ic, t000[k], t100[k], t010[k], t110[k],
-                                       t001[k], t101[k], t011[k], t111[k]);
-   }
-#endif
 }
 
 
@@ -671,7 +625,7 @@ static INLINE void
 sample_1d_nearest(GLcontext *ctx,
                   const struct gl_texture_object *tObj,
                   const struct gl_texture_image *img,
-                  const GLfloat texcoord[4], GLchan rgba[4])
+                  const GLfloat texcoord[4], GLfloat rgba[4])
 {
    const GLint width = img->Width2;  /* without border, power of two */
    GLint i;
@@ -680,10 +634,10 @@ sample_1d_nearest(GLcontext *ctx,
    i += img->Border;
    if (i < 0 || i >= (GLint) img->Width) {
       /* Need this test for GL_CLAMP_TO_BORDER mode */
-      COPY_CHAN4(rgba, tObj->_BorderChan);
+      COPY_4V(rgba, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i, 0, 0, rgba);
+      img->FetchTexelf(img, i, 0, 0, rgba);
    }
 }
 
@@ -695,13 +649,13 @@ static INLINE void
 sample_1d_linear(GLcontext *ctx,
                  const struct gl_texture_object *tObj,
                  const struct gl_texture_image *img,
-                 const GLfloat texcoord[4], GLchan rgba[4])
+                 const GLfloat texcoord[4], GLfloat rgba[4])
 {
    const GLint width = img->Width2;
    GLint i0, i1;
    GLbitfield useBorderColor = 0x0;
    GLfloat a;
-   GLchan t0[4], t1[4];  /* texels */
+   GLfloat t0[4], t1[4];  /* texels */
 
    linear_texel_locations(tObj->WrapS, img, width, texcoord[0], &i0, &i1, &a);
 
@@ -716,16 +670,16 @@ sample_1d_linear(GLcontext *ctx,
 
    /* fetch texel colors */
    if (useBorderColor & I0BIT) {
-      COPY_CHAN4(t0, tObj->_BorderChan);
+      COPY_4V(t0, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, 0, 0, t0);
+      img->FetchTexelf(img, i0, 0, 0, t0);
    }
    if (useBorderColor & I1BIT) {
-      COPY_CHAN4(t1, tObj->_BorderChan);
+      COPY_4V(t1, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, 0, 0, t1);
+      img->FetchTexelf(img, i1, 0, 0, t1);
    }
 
    lerp_rgba(rgba, a, t0, t1);
@@ -736,7 +690,7 @@ static void
 sample_1d_nearest_mipmap_nearest(GLcontext *ctx,
                                  const struct gl_texture_object *tObj,
                                  GLuint n, const GLfloat texcoord[][4],
-                                 const GLfloat lambda[], GLchan rgba[][4])
+                                 const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -751,7 +705,7 @@ static void
 sample_1d_linear_mipmap_nearest(GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4])
+                                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -766,7 +720,7 @@ static void
 sample_1d_nearest_mipmap_linear(GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4])
+                                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -777,7 +731,7 @@ sample_1d_nearest_mipmap_linear(GLcontext *ctx,
                            texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];
+         GLfloat t0[4], t1[4];
          const GLfloat f = FRAC(lambda[i]);
          sample_1d_nearest(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_1d_nearest(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -791,7 +745,7 @@ static void
 sample_1d_linear_mipmap_linear(GLcontext *ctx,
                                const struct gl_texture_object *tObj,
                                GLuint n, const GLfloat texcoord[][4],
-                               const GLfloat lambda[], GLchan rgba[][4])
+                               const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -802,7 +756,7 @@ sample_1d_linear_mipmap_linear(GLcontext *ctx,
                           texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];
+         GLfloat t0[4], t1[4];
          const GLfloat f = FRAC(lambda[i]);
          sample_1d_linear(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_1d_linear(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -817,7 +771,7 @@ static void
 sample_nearest_1d( GLcontext *ctx,
                    const struct gl_texture_object *tObj, GLuint n,
                    const GLfloat texcoords[][4], const GLfloat lambda[],
-                   GLchan rgba[][4] )
+                   GLfloat rgba[][4] )
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -833,7 +787,7 @@ static void
 sample_linear_1d( GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                   const GLfloat texcoords[][4], const GLfloat lambda[],
-                  GLchan rgba[][4] )
+                  GLfloat rgba[][4] )
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -849,7 +803,7 @@ static void
 sample_lambda_1d( GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                   const GLfloat texcoords[][4],
-                  const GLfloat lambda[], GLchan rgba[][4] )
+                  const GLfloat lambda[], GLfloat rgba[][4] )
 {
    GLuint minStart, minEnd;  /* texels with minification */
    GLuint magStart, magEnd;  /* texels with magnification */
@@ -929,7 +883,7 @@ sample_2d_nearest(GLcontext *ctx,
                   const struct gl_texture_object *tObj,
                   const struct gl_texture_image *img,
                   const GLfloat texcoord[4],
-                  GLchan rgba[])
+                  GLfloat rgba[])
 {
    const GLint width = img->Width2;    /* without border, power of two */
    const GLint height = img->Height2;  /* without border, power of two */
@@ -945,10 +899,10 @@ sample_2d_nearest(GLcontext *ctx,
 
    if (i < 0 || i >= (GLint) img->Width || j < 0 || j >= (GLint) img->Height) {
       /* Need this test for GL_CLAMP_TO_BORDER mode */
-      COPY_CHAN4(rgba, tObj->_BorderChan);
+      COPY_4V(rgba, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i, j, 0, rgba);
+      img->FetchTexelf(img, i, j, 0, rgba);
    }
 }
 
@@ -962,14 +916,14 @@ sample_2d_linear(GLcontext *ctx,
                  const struct gl_texture_object *tObj,
                  const struct gl_texture_image *img,
                  const GLfloat texcoord[4],
-                 GLchan rgba[])
+                 GLfloat rgba[])
 {
    const GLint width = img->Width2;
    const GLint height = img->Height2;
    GLint i0, j0, i1, j1;
    GLbitfield useBorderColor = 0x0;
    GLfloat a, b;
-   GLchan t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
+   GLfloat t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
 
    linear_texel_locations(tObj->WrapS, img, width, texcoord[0],  &i0, &i1, &a);
    linear_texel_locations(tObj->WrapT, img, height, texcoord[1], &j0, &j1, &b);
@@ -989,28 +943,28 @@ sample_2d_linear(GLcontext *ctx,
 
    /* fetch four texel colors */
    if (useBorderColor & (I0BIT | J0BIT)) {
-      COPY_CHAN4(t00, tObj->_BorderChan);
+      COPY_4V(t00, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, j0, 0, t00);
+      img->FetchTexelf(img, i0, j0, 0, t00);
    }
    if (useBorderColor & (I1BIT | J0BIT)) {
-      COPY_CHAN4(t10, tObj->_BorderChan);
+      COPY_4V(t10, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, j0, 0, t10);
+      img->FetchTexelf(img, i1, j0, 0, t10);
    }
    if (useBorderColor & (I0BIT | J1BIT)) {
-      COPY_CHAN4(t01, tObj->_BorderChan);
+      COPY_4V(t01, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, j1, 0, t01);
+      img->FetchTexelf(img, i0, j1, 0, t01);
    }
    if (useBorderColor & (I1BIT | J1BIT)) {
-      COPY_CHAN4(t11, tObj->_BorderChan);
+      COPY_4V(t11, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, j1, 0, t11);
+      img->FetchTexelf(img, i1, j1, 0, t11);
    }
 
    lerp_rgba_2d(rgba, a, b, t00, t10, t01, t11);
@@ -1026,13 +980,13 @@ sample_2d_linear_repeat(GLcontext *ctx,
                         const struct gl_texture_object *tObj,
                         const struct gl_texture_image *img,
                         const GLfloat texcoord[4],
-                        GLchan rgba[])
+                        GLfloat rgba[])
 {
    const GLint width = img->Width2;
    const GLint height = img->Height2;
    GLint i0, j0, i1, j1;
    GLfloat wi, wj;
-   GLchan t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
+   GLfloat t00[4], t10[4], t01[4], t11[4]; /* sampled texel colors */
 
    (void) ctx;
 
@@ -1045,10 +999,10 @@ sample_2d_linear_repeat(GLcontext *ctx,
    linear_repeat_texel_location(width,  texcoord[0], &i0, &i1, &wi);
    linear_repeat_texel_location(height, texcoord[1], &j0, &j1, &wj);
 
-   img->FetchTexelc(img, i0, j0, 0, t00);
-   img->FetchTexelc(img, i1, j0, 0, t10);
-   img->FetchTexelc(img, i0, j1, 0, t01);
-   img->FetchTexelc(img, i1, j1, 0, t11);
+   img->FetchTexelf(img, i0, j0, 0, t00);
+   img->FetchTexelf(img, i1, j0, 0, t10);
+   img->FetchTexelf(img, i0, j1, 0, t01);
+   img->FetchTexelf(img, i1, j1, 0, t11);
 
    lerp_rgba_2d(rgba, wi, wj, t00, t10, t01, t11);
 }
@@ -1058,7 +1012,7 @@ static void
 sample_2d_nearest_mipmap_nearest(GLcontext *ctx,
                                  const struct gl_texture_object *tObj,
                                  GLuint n, const GLfloat texcoord[][4],
-                                 const GLfloat lambda[], GLchan rgba[][4])
+                                 const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    for (i = 0; i < n; i++) {
@@ -1072,7 +1026,7 @@ static void
 sample_2d_linear_mipmap_nearest(GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4])
+                                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1087,7 +1041,7 @@ static void
 sample_2d_nearest_mipmap_linear(GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4])
+                                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1098,7 +1052,7 @@ sample_2d_nearest_mipmap_linear(GLcontext *ctx,
                            texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_nearest(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_2d_nearest(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -1112,7 +1066,7 @@ static void
 sample_2d_linear_mipmap_linear( GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4] )
+                                const GLfloat lambda[], GLfloat rgba[][4] )
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1123,7 +1077,7 @@ sample_2d_linear_mipmap_linear( GLcontext *ctx,
                           texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_linear(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_2d_linear(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -1137,7 +1091,7 @@ static void
 sample_2d_linear_mipmap_linear_repeat(GLcontext *ctx,
                                       const struct gl_texture_object *tObj,
                                       GLuint n, const GLfloat texcoord[][4],
-                                      const GLfloat lambda[], GLchan rgba[][4])
+                                      const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1150,7 +1104,7 @@ sample_2d_linear_mipmap_linear_repeat(GLcontext *ctx,
                                  texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_linear_repeat(ctx, tObj, tObj->Image[0][level  ],
                                  texcoord[i], t0);
@@ -1167,7 +1121,7 @@ static void
 sample_nearest_2d(GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                   const GLfloat texcoords[][4],
-                  const GLfloat lambda[], GLchan rgba[][4])
+                  const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -1183,7 +1137,7 @@ static void
 sample_linear_2d(GLcontext *ctx,
                  const struct gl_texture_object *tObj, GLuint n,
                  const GLfloat texcoords[][4],
-                 const GLfloat lambda[], GLchan rgba[][4])
+                 const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -1279,7 +1233,7 @@ opt_sample_rgba_2d(GLcontext *ctx,
       const GLint row = IFLOOR(texcoords[i][1] * height) & rowMask;
       const GLint pos = (row << shift) | col;
       const GLchan *texel = ((GLchan *) img->Data) + (pos << 2);    /* pos*4 */
-      COPY_CHAN4(rgba[i], texel);
+      COPY_4V(rgba[i], texel);
    }
 }
 
@@ -1289,7 +1243,7 @@ static void
 sample_lambda_2d(GLcontext *ctx,
                  const struct gl_texture_object *tObj,
                  GLuint n, const GLfloat texcoords[][4],
-                 const GLfloat lambda[], GLchan rgba[][4])
+                 const GLfloat lambda[], GLfloat rgba[][4])
 {
    const struct gl_texture_image *tImg = tObj->Image[0][tObj->BaseLevel];
    GLuint minStart, minEnd;  /* texels with minification */
@@ -1312,6 +1266,7 @@ sample_lambda_2d(GLcontext *ctx,
       case GL_NEAREST:
          if (repeatNoBorderPOT) {
             switch (tImg->TexFormat->MesaFormat) {
+#if 0
             case MESA_FORMAT_RGB:
                opt_sample_rgb_2d(ctx, tObj, m, texcoords + minStart,
                                  NULL, rgba + minStart);
@@ -1320,6 +1275,7 @@ sample_lambda_2d(GLcontext *ctx,
               opt_sample_rgba_2d(ctx, tObj, m, texcoords + minStart,
                                   NULL, rgba + minStart);
                break;
+#endif
             default:
                sample_nearest_2d(ctx, tObj, m, texcoords + minStart,
                                  NULL, rgba + minStart );
@@ -1369,6 +1325,7 @@ sample_lambda_2d(GLcontext *ctx,
       case GL_NEAREST:
          if (repeatNoBorderPOT) {
             switch (tImg->TexFormat->MesaFormat) {
+#if 0
             case MESA_FORMAT_RGB:
                opt_sample_rgb_2d(ctx, tObj, m, texcoords + magStart,
                                  NULL, rgba + magStart);
@@ -1377,6 +1334,7 @@ sample_lambda_2d(GLcontext *ctx,
               opt_sample_rgba_2d(ctx, tObj, m, texcoords + magStart,
                                   NULL, rgba + magStart);
                break;
+#endif
             default:
                sample_nearest_2d(ctx, tObj, m, texcoords + magStart,
                                  NULL, rgba + magStart );
@@ -1411,7 +1369,7 @@ sample_3d_nearest(GLcontext *ctx,
                   const struct gl_texture_object *tObj,
                   const struct gl_texture_image *img,
                   const GLfloat texcoord[4],
-                  GLchan rgba[4])
+                  GLfloat rgba[4])
 {
    const GLint width = img->Width2;     /* without border, power of two */
    const GLint height = img->Height2;   /* without border, power of two */
@@ -1427,10 +1385,10 @@ sample_3d_nearest(GLcontext *ctx,
        j < 0 || j >= (GLint) img->Height ||
        k < 0 || k >= (GLint) img->Depth) {
       /* Need this test for GL_CLAMP_TO_BORDER mode */
-      COPY_CHAN4(rgba, tObj->_BorderChan);
+      COPY_4V(rgba, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i, j, k, rgba);
+      img->FetchTexelf(img, i, j, k, rgba);
    }
 }
 
@@ -1443,7 +1401,7 @@ sample_3d_linear(GLcontext *ctx,
                  const struct gl_texture_object *tObj,
                  const struct gl_texture_image *img,
                  const GLfloat texcoord[4],
-                 GLchan rgba[4])
+                 GLfloat rgba[4])
 {
    const GLint width = img->Width2;
    const GLint height = img->Height2;
@@ -1451,8 +1409,8 @@ sample_3d_linear(GLcontext *ctx,
    GLint i0, j0, k0, i1, j1, k1;
    GLbitfield useBorderColor = 0x0;
    GLfloat a, b, c;
-   GLchan t000[4], t010[4], t001[4], t011[4];
-   GLchan t100[4], t110[4], t101[4], t111[4];
+   GLfloat t000[4], t010[4], t001[4], t011[4];
+   GLfloat t100[4], t110[4], t101[4], t111[4];
 
    linear_texel_locations(tObj->WrapS, img, width, texcoord[0],  &i0, &i1, &a);
    linear_texel_locations(tObj->WrapT, img, height, texcoord[1], &j0, &j1, &b);
@@ -1478,53 +1436,53 @@ sample_3d_linear(GLcontext *ctx,
 
    /* Fetch texels */
    if (useBorderColor & (I0BIT | J0BIT | K0BIT)) {
-      COPY_CHAN4(t000, tObj->_BorderChan);
+      COPY_4V(t000, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, j0, k0, t000);
+      img->FetchTexelf(img, i0, j0, k0, t000);
    }
    if (useBorderColor & (I1BIT | J0BIT | K0BIT)) {
-      COPY_CHAN4(t100, tObj->_BorderChan);
+      COPY_4V(t100, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, j0, k0, t100);
+      img->FetchTexelf(img, i1, j0, k0, t100);
    }
    if (useBorderColor & (I0BIT | J1BIT | K0BIT)) {
-      COPY_CHAN4(t010, tObj->_BorderChan);
+      COPY_4V(t010, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, j1, k0, t010);
+      img->FetchTexelf(img, i0, j1, k0, t010);
    }
    if (useBorderColor & (I1BIT | J1BIT | K0BIT)) {
-      COPY_CHAN4(t110, tObj->_BorderChan);
+      COPY_4V(t110, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, j1, k0, t110);
+      img->FetchTexelf(img, i1, j1, k0, t110);
    }
 
    if (useBorderColor & (I0BIT | J0BIT | K1BIT)) {
-      COPY_CHAN4(t001, tObj->_BorderChan);
+      COPY_4V(t001, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, j0, k1, t001);
+      img->FetchTexelf(img, i0, j0, k1, t001);
    }
    if (useBorderColor & (I1BIT | J0BIT | K1BIT)) {
-      COPY_CHAN4(t101, tObj->_BorderChan);
+      COPY_4V(t101, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, j0, k1, t101);
+      img->FetchTexelf(img, i1, j0, k1, t101);
    }
    if (useBorderColor & (I0BIT | J1BIT | K1BIT)) {
-      COPY_CHAN4(t011, tObj->_BorderChan);
+      COPY_4V(t011, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, j1, k1, t011);
+      img->FetchTexelf(img, i0, j1, k1, t011);
    }
    if (useBorderColor & (I1BIT | J1BIT | K1BIT)) {
-      COPY_CHAN4(t111, tObj->_BorderChan);
+      COPY_4V(t111, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, j1, k1, t111);
+      img->FetchTexelf(img, i1, j1, k1, t111);
    }
 
    /* trilinear interpolation of samples */
@@ -1536,7 +1494,7 @@ static void
 sample_3d_nearest_mipmap_nearest(GLcontext *ctx,
                                  const struct gl_texture_object *tObj,
                                  GLuint n, const GLfloat texcoord[][4],
-                                 const GLfloat lambda[], GLchan rgba[][4] )
+                                 const GLfloat lambda[], GLfloat rgba[][4] )
 {
    GLuint i;
    for (i = 0; i < n; i++) {
@@ -1550,7 +1508,7 @@ static void
 sample_3d_linear_mipmap_nearest(GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4])
+                                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1565,7 +1523,7 @@ static void
 sample_3d_nearest_mipmap_linear(GLcontext *ctx,
                                 const struct gl_texture_object *tObj,
                                 GLuint n, const GLfloat texcoord[][4],
-                                const GLfloat lambda[], GLchan rgba[][4])
+                                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1576,7 +1534,7 @@ sample_3d_nearest_mipmap_linear(GLcontext *ctx,
                            texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_3d_nearest(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_3d_nearest(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -1590,7 +1548,7 @@ static void
 sample_3d_linear_mipmap_linear(GLcontext *ctx,
                                const struct gl_texture_object *tObj,
                                GLuint n, const GLfloat texcoord[][4],
-                               const GLfloat lambda[], GLchan rgba[][4])
+                               const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1601,7 +1559,7 @@ sample_3d_linear_mipmap_linear(GLcontext *ctx,
                           texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_3d_linear(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_3d_linear(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -1616,7 +1574,7 @@ static void
 sample_nearest_3d(GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                   const GLfloat texcoords[][4], const GLfloat lambda[],
-                  GLchan rgba[][4])
+                  GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -1632,7 +1590,7 @@ static void
 sample_linear_3d(GLcontext *ctx,
                  const struct gl_texture_object *tObj, GLuint n,
                  const GLfloat texcoords[][4],
-                const GLfloat lambda[], GLchan rgba[][4])
+                const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -1648,7 +1606,7 @@ static void
 sample_lambda_3d(GLcontext *ctx,
                  const struct gl_texture_object *tObj, GLuint n,
                  const GLfloat texcoords[][4], const GLfloat lambda[],
-                 GLchan rgba[][4])
+                 GLfloat rgba[][4])
 {
    GLuint minStart, minEnd;  /* texels with minification */
    GLuint magStart, magEnd;  /* texels with magnification */
@@ -1799,7 +1757,7 @@ static void
 sample_nearest_cube(GLcontext *ctx,
                    const struct gl_texture_object *tObj, GLuint n,
                     const GLfloat texcoords[][4], const GLfloat lambda[],
-                    GLchan rgba[][4])
+                    GLfloat rgba[][4])
 {
    GLuint i;
    (void) lambda;
@@ -1817,7 +1775,7 @@ static void
 sample_linear_cube(GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                    const GLfloat texcoords[][4],
-                  const GLfloat lambda[], GLchan rgba[][4])
+                  const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    (void) lambda;
@@ -1835,7 +1793,7 @@ static void
 sample_cube_nearest_mipmap_nearest(GLcontext *ctx,
                                    const struct gl_texture_object *tObj,
                                    GLuint n, const GLfloat texcoord[][4],
-                                   const GLfloat lambda[], GLchan rgba[][4])
+                                   const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1864,7 +1822,7 @@ static void
 sample_cube_linear_mipmap_nearest(GLcontext *ctx,
                                   const struct gl_texture_object *tObj,
                                   GLuint n, const GLfloat texcoord[][4],
-                                  const GLfloat lambda[], GLchan rgba[][4])
+                                  const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1883,7 +1841,7 @@ static void
 sample_cube_nearest_mipmap_linear(GLcontext *ctx,
                                   const struct gl_texture_object *tObj,
                                   GLuint n, const GLfloat texcoord[][4],
-                                  const GLfloat lambda[], GLchan rgba[][4])
+                                  const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1898,7 +1856,7 @@ sample_cube_nearest_mipmap_linear(GLcontext *ctx,
                            newCoord, rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_nearest(ctx, tObj, images[level  ], newCoord, t0);
          sample_2d_nearest(ctx, tObj, images[level+1], newCoord, t1);
@@ -1912,7 +1870,7 @@ static void
 sample_cube_linear_mipmap_linear(GLcontext *ctx,
                                  const struct gl_texture_object *tObj,
                                  GLuint n, const GLfloat texcoord[][4],
-                                 const GLfloat lambda[], GLchan rgba[][4])
+                                 const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -1927,7 +1885,7 @@ sample_cube_linear_mipmap_linear(GLcontext *ctx,
                           newCoord, rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];
+         GLfloat t0[4], t1[4];
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_linear(ctx, tObj, images[level  ], newCoord, t0);
          sample_2d_linear(ctx, tObj, images[level+1], newCoord, t1);
@@ -1942,7 +1900,7 @@ static void
 sample_lambda_cube(GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                   const GLfloat texcoords[][4], const GLfloat lambda[],
-                  GLchan rgba[][4])
+                  GLfloat rgba[][4])
 {
    GLuint minStart, minEnd;  /* texels with minification */
    GLuint magStart, magEnd;  /* texels with magnification */
@@ -2076,7 +2034,7 @@ static void
 sample_nearest_rect(GLcontext *ctx,
                    const struct gl_texture_object *tObj, GLuint n,
                     const GLfloat texcoords[][4], const GLfloat lambda[],
-                    GLchan rgba[][4])
+                    GLfloat rgba[][4])
 {
    const struct gl_texture_image *img = tObj->Image[0][0];
    const GLint width = img->Width;
@@ -2099,9 +2057,9 @@ sample_nearest_rect(GLcontext *ctx,
       col = clamp_rect_coord_nearest(tObj->WrapS, texcoords[i][0], width);
       row = clamp_rect_coord_nearest(tObj->WrapT, texcoords[i][1], height);
       if (col < 0 || col >= width || row < 0 || row >= height)
-         COPY_CHAN4(rgba[i], tObj->_BorderChan);
+         COPY_4V(rgba[i], tObj->BorderColor);
       else
-         img->FetchTexelc(img, col, row, 0, rgba[i]);
+         img->FetchTexelf(img, col, row, 0, rgba[i]);
    }
 }
 
@@ -2110,7 +2068,7 @@ static void
 sample_linear_rect(GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                    const GLfloat texcoords[][4],
-                  const GLfloat lambda[], GLchan rgba[][4])
+                  const GLfloat lambda[], GLfloat rgba[][4])
 {
    const struct gl_texture_image *img = tObj->Image[0][0];
    const GLint width = img->Width;
@@ -2130,7 +2088,7 @@ sample_linear_rect(GLcontext *ctx,
 
    for (i = 0; i < n; i++) {
       GLint i0, j0, i1, j1;
-      GLchan t00[4], t01[4], t10[4], t11[4];
+      GLfloat t00[4], t01[4], t10[4], t11[4];
       GLfloat a, b;
       GLbitfield useBorderColor = 0x0;
 
@@ -2147,24 +2105,24 @@ sample_linear_rect(GLcontext *ctx,
 
       /* get four texel samples */
       if (useBorderColor & (I0BIT | J0BIT))
-         COPY_CHAN4(t00, tObj->_BorderChan);
+         COPY_4V(t00, tObj->BorderColor);
       else
-         img->FetchTexelc(img, i0, j0, 0, t00);
+         img->FetchTexelf(img, i0, j0, 0, t00);
 
       if (useBorderColor & (I1BIT | J0BIT))
-         COPY_CHAN4(t10, tObj->_BorderChan);
+         COPY_4V(t10, tObj->BorderColor);
       else
-         img->FetchTexelc(img, i1, j0, 0, t10);
+         img->FetchTexelf(img, i1, j0, 0, t10);
 
       if (useBorderColor & (I0BIT | J1BIT))
-         COPY_CHAN4(t01, tObj->_BorderChan);
+         COPY_4V(t01, tObj->BorderColor);
       else
-         img->FetchTexelc(img, i0, j1, 0, t01);
+         img->FetchTexelf(img, i0, j1, 0, t01);
 
       if (useBorderColor & (I1BIT | J1BIT))
-         COPY_CHAN4(t11, tObj->_BorderChan);
+         COPY_4V(t11, tObj->BorderColor);
       else
-         img->FetchTexelc(img, i1, j1, 0, t11);
+         img->FetchTexelf(img, i1, j1, 0, t11);
 
       lerp_rgba_2d(rgba[i], a, b, t00, t10, t01, t11);
    }
@@ -2176,7 +2134,7 @@ static void
 sample_lambda_rect(GLcontext *ctx,
                   const struct gl_texture_object *tObj, GLuint n,
                   const GLfloat texcoords[][4], const GLfloat lambda[],
-                  GLchan rgba[][4])
+                  GLfloat rgba[][4])
 {
    GLuint minStart, minEnd, magStart, magEnd;
 
@@ -2222,7 +2180,7 @@ sample_2d_array_nearest(GLcontext *ctx,
                         const struct gl_texture_object *tObj,
                         const struct gl_texture_image *img,
                         const GLfloat texcoord[4],
-                        GLchan rgba[4])
+                        GLfloat rgba[4])
 {
    const GLint width = img->Width2;     /* without border, power of two */
    const GLint height = img->Height2;   /* without border, power of two */
@@ -2239,10 +2197,10 @@ sample_2d_array_nearest(GLcontext *ctx,
        j < 0 || j >= (GLint) img->Height ||
        array < 0 || array >= (GLint) img->Depth) {
       /* Need this test for GL_CLAMP_TO_BORDER mode */
-      COPY_CHAN4(rgba, tObj->_BorderChan);
+      COPY_4V(rgba, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i, j, array, rgba);
+      img->FetchTexelf(img, i, j, array, rgba);
    }
 }
 
@@ -2255,7 +2213,7 @@ sample_2d_array_linear(GLcontext *ctx,
                        const struct gl_texture_object *tObj,
                        const struct gl_texture_image *img,
                        const GLfloat texcoord[4],
-                       GLchan rgba[4])
+                       GLfloat rgba[4])
 {
    const GLint width = img->Width2;
    const GLint height = img->Height2;
@@ -2264,14 +2222,14 @@ sample_2d_array_linear(GLcontext *ctx,
    GLint array;
    GLbitfield useBorderColor = 0x0;
    GLfloat a, b;
-   GLchan t00[4], t01[4], t10[4], t11[4];
+   GLfloat t00[4], t01[4], t10[4], t11[4];
 
    linear_texel_locations(tObj->WrapS, img, width,  texcoord[0], &i0, &i1, &a);
    linear_texel_locations(tObj->WrapT, img, height, texcoord[1], &j0, &j1, &b);
    array = clamp_rect_coord_nearest(tObj->WrapR, texcoord[2], depth);
 
    if (array < 0 || array >= depth) {
-      COPY_CHAN4(rgba, tObj->_BorderChan);
+      COPY_4V(rgba, tObj->BorderColor);
    }
    else {
       if (img->Border) {
@@ -2290,28 +2248,28 @@ sample_2d_array_linear(GLcontext *ctx,
 
       /* Fetch texels */
       if (useBorderColor & (I0BIT | J0BIT)) {
-        COPY_CHAN4(t00, tObj->_BorderChan);
+        COPY_4V(t00, tObj->BorderColor);
       }
       else {
-        img->FetchTexelc(img, i0, j0, array, t00);
+        img->FetchTexelf(img, i0, j0, array, t00);
       }
       if (useBorderColor & (I1BIT | J0BIT)) {
-        COPY_CHAN4(t10, tObj->_BorderChan);
+        COPY_4V(t10, tObj->BorderColor);
       }
       else {
-        img->FetchTexelc(img, i1, j0, array, t10);
+        img->FetchTexelf(img, i1, j0, array, t10);
       }
       if (useBorderColor & (I0BIT | J1BIT)) {
-        COPY_CHAN4(t01, tObj->_BorderChan);
+        COPY_4V(t01, tObj->BorderColor);
       }
       else {
-        img->FetchTexelc(img, i0, j1, array, t01);
+        img->FetchTexelf(img, i0, j1, array, t01);
       }
       if (useBorderColor & (I1BIT | J1BIT)) {
-        COPY_CHAN4(t11, tObj->_BorderChan);
+        COPY_4V(t11, tObj->BorderColor);
       }
       else {
-        img->FetchTexelc(img, i1, j1, array, t11);
+        img->FetchTexelf(img, i1, j1, array, t11);
       }
       
       /* trilinear interpolation of samples */
@@ -2324,7 +2282,7 @@ static void
 sample_2d_array_nearest_mipmap_nearest(GLcontext *ctx,
                                        const struct gl_texture_object *tObj,
                                        GLuint n, const GLfloat texcoord[][4],
-                                       const GLfloat lambda[], GLchan rgba[][4])
+                                       const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    for (i = 0; i < n; i++) {
@@ -2339,7 +2297,7 @@ static void
 sample_2d_array_linear_mipmap_nearest(GLcontext *ctx,
                                       const struct gl_texture_object *tObj,
                                       GLuint n, const GLfloat texcoord[][4],
-                                      const GLfloat lambda[], GLchan rgba[][4])
+                                      const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -2355,7 +2313,7 @@ static void
 sample_2d_array_nearest_mipmap_linear(GLcontext *ctx,
                                       const struct gl_texture_object *tObj,
                                       GLuint n, const GLfloat texcoord[][4],
-                                      const GLfloat lambda[], GLchan rgba[][4])
+                                      const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -2366,7 +2324,7 @@ sample_2d_array_nearest_mipmap_linear(GLcontext *ctx,
                                  texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_array_nearest(ctx, tObj, tObj->Image[0][level  ],
                                  texcoord[i], t0);
@@ -2382,7 +2340,7 @@ static void
 sample_2d_array_linear_mipmap_linear(GLcontext *ctx,
                                      const struct gl_texture_object *tObj,
                                      GLuint n, const GLfloat texcoord[][4],
-                                     const GLfloat lambda[], GLchan rgba[][4])
+                                     const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -2393,7 +2351,7 @@ sample_2d_array_linear_mipmap_linear(GLcontext *ctx,
                           texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_2d_array_linear(ctx, tObj, tObj->Image[0][level  ],
                                 texcoord[i], t0);
@@ -2410,7 +2368,7 @@ static void
 sample_nearest_2d_array(GLcontext *ctx,
                         const struct gl_texture_object *tObj, GLuint n,
                         const GLfloat texcoords[][4], const GLfloat lambda[],
-                        GLchan rgba[][4])
+                        GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -2427,7 +2385,7 @@ static void
 sample_linear_2d_array(GLcontext *ctx,
                        const struct gl_texture_object *tObj, GLuint n,
                        const GLfloat texcoords[][4],
-                       const GLfloat lambda[], GLchan rgba[][4])
+                       const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -2443,7 +2401,7 @@ static void
 sample_lambda_2d_array(GLcontext *ctx,
                        const struct gl_texture_object *tObj, GLuint n,
                        const GLfloat texcoords[][4], const GLfloat lambda[],
-                       GLchan rgba[][4])
+                       GLfloat rgba[][4])
 {
    GLuint minStart, minEnd;  /* texels with minification */
    GLuint magStart, magEnd;  /* texels with magnification */
@@ -2532,7 +2490,7 @@ sample_1d_array_nearest(GLcontext *ctx,
                         const struct gl_texture_object *tObj,
                         const struct gl_texture_image *img,
                         const GLfloat texcoord[4],
-                        GLchan rgba[4])
+                        GLfloat rgba[4])
 {
    const GLint width = img->Width2;     /* without border, power of two */
    const GLint height = img->Height;
@@ -2546,10 +2504,10 @@ sample_1d_array_nearest(GLcontext *ctx,
    if (i < 0 || i >= (GLint) img->Width ||
        array < 0 || array >= (GLint) img->Height) {
       /* Need this test for GL_CLAMP_TO_BORDER mode */
-      COPY_CHAN4(rgba, tObj->_BorderChan);
+      COPY_4V(rgba, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i, array, 0, rgba);
+      img->FetchTexelf(img, i, array, 0, rgba);
    }
 }
 
@@ -2562,7 +2520,7 @@ sample_1d_array_linear(GLcontext *ctx,
                        const struct gl_texture_object *tObj,
                        const struct gl_texture_image *img,
                        const GLfloat texcoord[4],
-                       GLchan rgba[4])
+                       GLfloat rgba[4])
 {
    const GLint width = img->Width2;
    const GLint height = img->Height;
@@ -2570,7 +2528,7 @@ sample_1d_array_linear(GLcontext *ctx,
    GLint array;
    GLbitfield useBorderColor = 0x0;
    GLfloat a;
-   GLchan t0[4], t1[4];
+   GLfloat t0[4], t1[4];
 
    linear_texel_locations(tObj->WrapS, img, width, texcoord[0], &i0, &i1, &a);
    array = clamp_rect_coord_nearest(tObj->WrapT, texcoord[1], height);
@@ -2589,16 +2547,16 @@ sample_1d_array_linear(GLcontext *ctx,
 
    /* Fetch texels */
    if (useBorderColor & (I0BIT | K0BIT)) {
-      COPY_CHAN4(t0, tObj->_BorderChan);
+      COPY_4V(t0, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i0, array, 0, t0);
+      img->FetchTexelf(img, i0, array, 0, t0);
    }
    if (useBorderColor & (I1BIT | K0BIT)) {
-      COPY_CHAN4(t1, tObj->_BorderChan);
+      COPY_4V(t1, tObj->BorderColor);
    }
    else {
-      img->FetchTexelc(img, i1, array, 0, t1);
+      img->FetchTexelf(img, i1, array, 0, t1);
    }
 
    /* bilinear interpolation of samples */
@@ -2610,7 +2568,7 @@ static void
 sample_1d_array_nearest_mipmap_nearest(GLcontext *ctx,
                                        const struct gl_texture_object *tObj,
                                        GLuint n, const GLfloat texcoord[][4],
-                                       const GLfloat lambda[], GLchan rgba[][4])
+                                       const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    for (i = 0; i < n; i++) {
@@ -2625,7 +2583,7 @@ static void
 sample_1d_array_linear_mipmap_nearest(GLcontext *ctx,
                                       const struct gl_texture_object *tObj,
                                       GLuint n, const GLfloat texcoord[][4],
-                                      const GLfloat lambda[], GLchan rgba[][4])
+                                      const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -2641,7 +2599,7 @@ static void
 sample_1d_array_nearest_mipmap_linear(GLcontext *ctx,
                                       const struct gl_texture_object *tObj,
                                       GLuint n, const GLfloat texcoord[][4],
-                                      const GLfloat lambda[], GLchan rgba[][4])
+                                      const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -2652,7 +2610,7 @@ sample_1d_array_nearest_mipmap_linear(GLcontext *ctx,
                                  texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_1d_array_nearest(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_1d_array_nearest(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -2666,7 +2624,7 @@ static void
 sample_1d_array_linear_mipmap_linear(GLcontext *ctx,
                                      const struct gl_texture_object *tObj,
                                      GLuint n, const GLfloat texcoord[][4],
-                                     const GLfloat lambda[], GLchan rgba[][4])
+                                     const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    ASSERT(lambda != NULL);
@@ -2677,7 +2635,7 @@ sample_1d_array_linear_mipmap_linear(GLcontext *ctx,
                           texcoord[i], rgba[i]);
       }
       else {
-         GLchan t0[4], t1[4];  /* texels */
+         GLfloat t0[4], t1[4];  /* texels */
          const GLfloat f = FRAC(lambda[i]);
          sample_1d_array_linear(ctx, tObj, tObj->Image[0][level  ], texcoord[i], t0);
          sample_1d_array_linear(ctx, tObj, tObj->Image[0][level+1], texcoord[i], t1);
@@ -2692,7 +2650,7 @@ static void
 sample_nearest_1d_array(GLcontext *ctx,
                         const struct gl_texture_object *tObj, GLuint n,
                         const GLfloat texcoords[][4], const GLfloat lambda[],
-                        GLchan rgba[][4])
+                        GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -2708,7 +2666,7 @@ static void
 sample_linear_1d_array(GLcontext *ctx,
                        const struct gl_texture_object *tObj, GLuint n,
                        const GLfloat texcoords[][4],
-                       const GLfloat lambda[], GLchan rgba[][4])
+                       const GLfloat lambda[], GLfloat rgba[][4])
 {
    GLuint i;
    struct gl_texture_image *image = tObj->Image[0][tObj->BaseLevel];
@@ -2724,7 +2682,7 @@ static void
 sample_lambda_1d_array(GLcontext *ctx,
                        const struct gl_texture_object *tObj, GLuint n,
                        const GLfloat texcoords[][4], const GLfloat lambda[],
-                       GLchan rgba[][4])
+                       GLfloat rgba[][4])
 {
    GLuint minStart, minEnd;  /* texels with minification */
    GLuint magStart, magEnd;  /* texels with magnification */
@@ -2802,7 +2760,7 @@ static void
 sample_depth_texture( GLcontext *ctx,
                       const struct gl_texture_object *tObj, GLuint n,
                       const GLfloat texcoords[][4], const GLfloat lambda[],
-                      GLchan texel[][4] )
+                      GLfloat texel[][4] )
 {
    const GLint baseLevel = tObj->BaseLevel;
    const struct gl_texture_image *img = tObj->Image[0][baseLevel];
@@ -2811,9 +2769,9 @@ sample_depth_texture( GLcontext *ctx,
    const GLint depth = img->Depth;
    const GLuint compare_coord = (tObj->Target == GL_TEXTURE_2D_ARRAY_EXT)
        ? 3 : 2;
-   GLchan ambient;
+   GLfloat ambient;
    GLenum function;
-   GLchan result;
+   GLfloat result;
 
    (void) lambda;
 
@@ -2826,7 +2784,7 @@ sample_depth_texture( GLcontext *ctx,
           tObj->Target == GL_TEXTURE_1D_ARRAY_EXT ||
           tObj->Target == GL_TEXTURE_2D_ARRAY_EXT);
 
-   UNCLAMPED_FLOAT_TO_CHAN(ambient, tObj->CompareFailValue);
+   ambient = tObj->CompareFailValue;
 
    /* XXXX if tObj->MinFilter != tObj->MagFilter, we're ignoring lambda */
 
@@ -2889,31 +2847,31 @@ sample_depth_texture( GLcontext *ctx,
 
          switch (function) {
          case GL_LEQUAL:
-            result = (texcoords[i][compare_coord] <= depthSample) ? CHAN_MAX : ambient;
+            result = (texcoords[i][compare_coord] <= depthSample) ? 1.0F : ambient;
             break;
          case GL_GEQUAL:
-            result = (texcoords[i][compare_coord] >= depthSample) ? CHAN_MAX : ambient;
+            result = (texcoords[i][compare_coord] >= depthSample) ? 1.0F : ambient;
             break;
          case GL_LESS:
-            result = (texcoords[i][compare_coord] < depthSample) ? CHAN_MAX : ambient;
+            result = (texcoords[i][compare_coord] < depthSample) ? 1.0F : ambient;
             break;
          case GL_GREATER:
-            result = (texcoords[i][compare_coord] > depthSample) ? CHAN_MAX : ambient;
+            result = (texcoords[i][compare_coord] > depthSample) ? 1.0F : ambient;
             break;
          case GL_EQUAL:
-            result = (texcoords[i][compare_coord] == depthSample) ? CHAN_MAX : ambient;
+            result = (texcoords[i][compare_coord] == depthSample) ? 1.0F : ambient;
             break;
          case GL_NOTEQUAL:
-            result = (texcoords[i][compare_coord] != depthSample) ? CHAN_MAX : ambient;
+            result = (texcoords[i][compare_coord] != depthSample) ? 1.0F : ambient;
             break;
          case GL_ALWAYS:
-            result = CHAN_MAX;
+            result = 1.0F;
             break;
          case GL_NEVER:
             result = ambient;
             break;
          case GL_NONE:
-            CLAMPED_FLOAT_TO_CHAN(result, depthSample);
+            result = depthSample;
             break;
          default:
             _mesa_problem(ctx, "Bad compare func in sample_depth_texture");
@@ -2922,22 +2880,13 @@ sample_depth_texture( GLcontext *ctx,
 
          switch (tObj->DepthMode) {
          case GL_LUMINANCE:
-            texel[i][RCOMP] = result;
-            texel[i][GCOMP] = result;
-            texel[i][BCOMP] = result;
-            texel[i][ACOMP] = CHAN_MAX;
+            ASSIGN_4V(texel[i], result, result, result, 1.0F);
             break;
          case GL_INTENSITY:
-            texel[i][RCOMP] = result;
-            texel[i][GCOMP] = result;
-            texel[i][BCOMP] = result;
-            texel[i][ACOMP] = result;
+            ASSIGN_4V(texel[i], result, result, result, result);
             break;
          case GL_ALPHA:
-            texel[i][RCOMP] = 0;
-            texel[i][GCOMP] = 0;
-            texel[i][BCOMP] = 0;
-            texel[i][ACOMP] = result;
+            ASSIGN_4V(texel[i], 0.0F, 0.0F, 0.0F, result);
             break;
          default:
             _mesa_problem(ctx, "Bad depth texture mode");
@@ -3074,42 +3023,42 @@ sample_depth_texture( GLcontext *ctx,
                if (depth01 <= texcoords[i][compare_coord])  luminance -= d;
                if (depth10 <= texcoords[i][compare_coord])  luminance -= d;
                if (depth11 <= texcoords[i][compare_coord])  luminance -= d;
-               result = (GLchan) luminance;
+               result = (GLfloat) luminance;
                break;
             case GL_GEQUAL:
                if (depth00 >= texcoords[i][compare_coord])  luminance -= d;
                if (depth01 >= texcoords[i][compare_coord])  luminance -= d;
                if (depth10 >= texcoords[i][compare_coord])  luminance -= d;
                if (depth11 >= texcoords[i][compare_coord])  luminance -= d;
-               result = (GLchan) luminance;
+               result = (GLfloat) luminance;
                break;
             case GL_LESS:
                if (depth00 < texcoords[i][compare_coord])  luminance -= d;
                if (depth01 < texcoords[i][compare_coord])  luminance -= d;
                if (depth10 < texcoords[i][compare_coord])  luminance -= d;
                if (depth11 < texcoords[i][compare_coord])  luminance -= d;
-               result = (GLchan) luminance;
+               result = (GLfloat) luminance;
                break;
             case GL_GREATER:
                if (depth00 > texcoords[i][compare_coord])  luminance -= d;
                if (depth01 > texcoords[i][compare_coord])  luminance -= d;
                if (depth10 > texcoords[i][compare_coord])  luminance -= d;
                if (depth11 > texcoords[i][compare_coord])  luminance -= d;
-               result = (GLchan) luminance;
+               result = (GLfloat) luminance;
                break;
             case GL_EQUAL:
                if (depth00 == texcoords[i][compare_coord])  luminance -= d;
                if (depth01 == texcoords[i][compare_coord])  luminance -= d;
                if (depth10 == texcoords[i][compare_coord])  luminance -= d;
                if (depth11 == texcoords[i][compare_coord])  luminance -= d;
-               result = (GLchan) luminance;
+               result = (GLfloat) luminance;
                break;
             case GL_NOTEQUAL:
                if (depth00 != texcoords[i][compare_coord])  luminance -= d;
                if (depth01 != texcoords[i][compare_coord])  luminance -= d;
                if (depth10 != texcoords[i][compare_coord])  luminance -= d;
                if (depth11 != texcoords[i][compare_coord])  luminance -= d;
-               result = (GLchan) luminance;
+               result = (GLfloat) luminance;
                break;
             case GL_ALWAYS:
                result = 0;
@@ -3168,7 +3117,7 @@ static void
 null_sample_func( GLcontext *ctx,
                  const struct gl_texture_object *tObj, GLuint n,
                  const GLfloat texcoords[][4], const GLfloat lambda[],
-                 GLchan rgba[][4])
+                 GLfloat rgba[][4])
 {
    GLuint i;
    (void) ctx;
@@ -3225,6 +3174,7 @@ _swrast_choose_texture_sample_func( GLcontext *ctx,
          }
          else {
             /* check for a few optimized cases */
+#if 0
             const struct gl_texture_image *img = t->Image[0][t->BaseLevel];
             ASSERT(t->MinFilter == GL_NEAREST);
             if (t->WrapS == GL_REPEAT &&
@@ -3241,6 +3191,10 @@ _swrast_choose_texture_sample_func( GLcontext *ctx,
                      img->TexFormat->MesaFormat == MESA_FORMAT_RGBA) {
                return &opt_sample_rgba_2d;
             }
+#else
+            if (0)
+               ;
+#endif
             else {
                return &sample_nearest_2d;
             }
index f99401ca6d870f09657ae26c72d4afb82fe7ce1b..1795f62c3233a1e2fc4bcc06973f716c31e5463a 100644 (file)
@@ -176,17 +176,12 @@ static void
 vp_fetch_texel(GLcontext *ctx, const GLfloat texcoord[4], GLfloat lambda,
                GLuint unit, GLfloat color[4])
 {
-   GLchan rgba[4];
    SWcontext *swrast = SWRAST_CONTEXT(ctx);
 
    /* XXX use a float-valued TextureSample routine here!!! */
    swrast->TextureSample[unit](ctx, ctx->Texture.Unit[unit]._Current,
                                1, (const GLfloat (*)[4]) texcoord,
-                               &lambda, &rgba);
-   color[0] = CHAN_TO_FLOAT(rgba[0]);
-   color[1] = CHAN_TO_FLOAT(rgba[1]);
-   color[2] = CHAN_TO_FLOAT(rgba[2]);
-   color[3] = CHAN_TO_FLOAT(rgba[3]);
+                               &lambda,  (GLfloat (*)[4]) color);
 }