implemented new ImageTransferState bitmask
authorBrian Paul <brian.paul@tungstengraphics.com>
Mon, 21 Aug 2000 14:22:24 +0000 (14:22 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Mon, 21 Aug 2000 14:22:24 +0000 (14:22 +0000)
src/mesa/main/attrib.c
src/mesa/main/context.c
src/mesa/main/enable.c
src/mesa/main/image.c
src/mesa/main/image.h
src/mesa/main/pixel.c
src/mesa/main/state.c
src/mesa/main/state.h
src/mesa/main/teximage.c

index be0a644ce1d2dfb51771607909dba5860c88e1b8..8c40063c1357ec041efe4e6b4eae153bba8980ce 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: attrib.c,v 1.25 2000/07/19 18:34:00 brianp Exp $ */
+/* $Id: attrib.c,v 1.26 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -806,6 +806,7 @@ _mesa_PopAttrib(void)
    }
 
    ctx->NewState = NEW_ALL;
+   ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
 }
 
 
index 5adbeb87714a601790a818250b101ec073a9d82c..9933076797d23071d819840e227c2f944cc27ab9 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: context.c,v 1.79 2000/07/19 20:58:59 brianp Exp $ */
+/* $Id: context.c,v 1.80 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -1036,7 +1036,6 @@ init_attrib_groups( GLcontext *ctx )
    ctx->Pixel.BlueScale = 1.0;
    ctx->Pixel.AlphaBias = 0.0;
    ctx->Pixel.AlphaScale = 1.0;
-   ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
    ctx->Pixel.DepthBias = 0.0;
    ctx->Pixel.DepthScale = 1.0;
    ctx->Pixel.IndexOffset = 0;
@@ -1283,6 +1282,7 @@ init_attrib_groups( GLcontext *ctx )
    ctx->StippleCounter = 0;
    ctx->NeedNormals = GL_FALSE;
    ctx->DoViewportMapping = GL_TRUE;
+   ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
 
    ctx->NeedEyeCoords = GL_FALSE;
    ctx->NeedEyeNormals = GL_FALSE;
index 0fa408f7644acf8f7c2f05bed008ff2d0de3b026..537d2dda88c30c854bd9f8f5e765f5f6ca844c21 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: enable.c,v 1.21 2000/05/23 15:17:12 brianp Exp $ */
+/* $Id: enable.c,v 1.22 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -476,34 +476,44 @@ void _mesa_set_enable( GLcontext *ctx, GLenum cap, GLboolean state )
 
       /* GL_SGIS_pixel_texture */
       case GL_PIXEL_TEXTURE_SGIS:
+         /* XXX check for extension */
          ctx->Pixel.PixelTextureEnabled = state;
          break;
 
       /* GL_SGIX_pixel_texture */
       case GL_PIXEL_TEX_GEN_SGIX:
+         /* XXX check for extension */
          ctx->Pixel.PixelTextureEnabled = state;
          break;
 
       /* GL_SGI_color_table */
       case GL_COLOR_TABLE_SGI:
+         /* XXX check for extension */
          ctx->Pixel.ColorTableEnabled = state;
+         ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
          break;
       case GL_POST_CONVOLUTION_COLOR_TABLE_SGI:
          ctx->Pixel.PostConvolutionColorTableEnabled = state;
+         ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
          break;
       case GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI:
          ctx->Pixel.PostColorMatrixColorTableEnabled = state;
+         ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
          break;
 
       /* GL_EXT_convolution */
       case GL_CONVOLUTION_1D:
+         /* XXX check for extension */
          ctx->Pixel.Convolution1DEnabled = state;
+         ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
          break;
       case GL_CONVOLUTION_2D:
          ctx->Pixel.Convolution2DEnabled = state;
+         ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
          break;
       case GL_SEPARABLE_2D:
          ctx->Pixel.Separable2DEnabled = state;
+         ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
          break;
 
       /* GL_ARB_texture_cube_map */
index 6d4464dbb88f8fb0f4242c41dd5045fb1f9f9820..49ea1d5bf5799c162bb96f32fb0498a090533e59 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: image.c,v 1.35 2000/06/30 22:12:00 brianp Exp $ */
+/* $Id: image.c,v 1.36 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
+ * Version:  3.5
  * 
  * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  * 
@@ -604,31 +604,23 @@ _mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
  *         type - dest packing datatype
  *         destination - destination packing address
  *         packing - pixel packing parameters
- *         applyTransferOps - apply scale/bias/lookup-table ops?
+ *         transferOps - bitmask of IMAGE_*_BIT operations to apply
  */
 void
 _mesa_pack_rgba_span( GLcontext *ctx,
                       GLuint n, CONST GLubyte srcRgba[][4],
                       GLenum format, GLenum type, GLvoid *destination,
                       const struct gl_pixelstore_attrib *packing,
-                      GLboolean applyTransferOps )
+                      GLuint transferOps)
 {
-   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
-                        ctx->Pixel.MapColorFlag ||
-                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
-                        ctx->Pixel.ScaleOrBiasRGBApcm ||
-                        ctx->Pixel.ColorTableEnabled ||
-                        ctx->Pixel.PostColorMatrixColorTableEnabled ||
-                        ctx->Pixel.PostConvolutionColorTableEnabled ||
-                        ctx->Pixel.MinMaxEnabled ||
-                        ctx->Pixel.HistogramEnabled);
+   ASSERT(ctx->ImageTransferState != UPDATE_IMAGE_TRANSFER_STATE);
 
    /* Test for optimized case first */
-   if (!applyTransferOps && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
+   if (transferOps == 0 && format == GL_RGBA && type == GL_UNSIGNED_BYTE) {
       /* common simple case */
       MEMCPY( destination, srcRgba, n * 4 * sizeof(GLubyte) );
    }
-   else if (!applyTransferOps && format == GL_RGB && type == GL_UNSIGNED_BYTE) {
+   else if (transferOps == 0 && format == GL_RGB && type == GL_UNSIGNED_BYTE) {
       /* common simple case */
       GLint i;
       GLubyte *dest = (GLubyte *) destination;
@@ -662,49 +654,51 @@ _mesa_pack_rgba_span( GLcontext *ctx,
       /*
        * Apply scale, bias and lookup-tables if enabled.
        */
-      if (applyTransferOps) {
+      if (transferOps) {
          /* scale & bias */
-         if (ctx->Pixel.ScaleOrBiasRGBA) {
+         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
             _mesa_scale_and_bias_rgba( ctx, n, rgba );
          }
          /* color map lookup */
-         if (ctx->Pixel.MapColorFlag) {
+         if (transferOps & IMAGE_MAP_COLOR_BIT) {
             _mesa_map_rgba( ctx, n, rgba );
          }
          /* GL_COLOR_TABLE lookup */
-         if (ctx->Pixel.ColorTableEnabled) {
+         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
          }
-         /* XXX convolution here */
+         /* convolution */
+         if (transferOps & IMAGE_CONVOLUTION_BIT) {
+            /* XXX to do */
+         }
          /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
-         if (ctx->Pixel.PostConvolutionColorTableEnabled) {
+         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
          }
          /* color matrix transform */
-         if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
-             ctx->Pixel.ScaleOrBiasRGBApcm) {
+         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
             _mesa_transform_rgba(ctx, n, rgba);
          }
          /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
-         if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
+         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
          }
          /* update histogram count */
-         if (ctx->Pixel.HistogramEnabled) {
+         if (transferOps & IMAGE_HISTOGRAM_BIT) {
             _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
          }
-         /* XXX min/max here */
-         if (ctx->Pixel.MinMaxEnabled) {
+         /* min/max here */
+         if (transferOps & IMAGE_MIN_MAX_BIT) {
             _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
             if (ctx->MinMax.Sink)
                return;
          }
       }
 
-      if (format==GL_LUMINANCE || format==GL_LUMINANCE_ALPHA) {
-         for (i=0;i<n;i++) {
+      if (format == GL_LUMINANCE || format == GL_LUMINANCE_ALPHA) {
+         for (i = 0; i < n; i++) {
             GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
-            luminance[i] = CLAMP( sum, 0.0F, 1.0F );
+            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
          }
       }
 
@@ -2130,8 +2124,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
 
 /*
  * Unpack a row of color image data from a client buffer according to
- * the pixel unpacking parameters.  Apply any enabled pixel transfer
- * ops (PixelMap, scale/bias) if the applyTransferOps flag is enabled.
+ * the pixel unpacking parameters.
  * Return GLubyte values in the specified dest image format.
  * This is (or will be) used by glDrawPixels and glTexImage?D().
  * Input:  ctx - the context
@@ -2142,7 +2135,7 @@ extract_float_rgba(GLuint n, GLfloat rgba[][4],
  *         srcType - source image  datatype
  *         source - source image pointer
  *         unpacking - pixel unpacking parameters
- *         applyTransferOps - apply scale/bias/lookup-table ops?
+ *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
  *
  * XXX perhaps expand this to process whole images someday.
  */
@@ -2152,7 +2145,7 @@ _mesa_unpack_ubyte_color_span( GLcontext *ctx,
                                GLenum srcFormat, GLenum srcType,
                                const GLvoid *source,
                                const struct gl_pixelstore_attrib *unpacking,
-                               GLboolean applyTransferOps )
+                               GLuint transferOps )
 {
    ASSERT(dstFormat == GL_ALPHA ||
           dstFormat == GL_LUMINANCE || 
@@ -2200,18 +2193,8 @@ _mesa_unpack_ubyte_color_span( GLcontext *ctx,
    /* this is intended for RGBA mode only */
    assert(ctx->Visual->RGBAflag);
 
-   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
-                        ctx->Pixel.MapColorFlag ||
-                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
-                        ctx->Pixel.ScaleOrBiasRGBApcm ||
-                        ctx->Pixel.ColorTableEnabled ||
-                        ctx->Pixel.PostColorMatrixColorTableEnabled ||
-                        ctx->Pixel.PostConvolutionColorTableEnabled ||
-                        ctx->Pixel.MinMaxEnabled ||
-                        ctx->Pixel.HistogramEnabled);
-
    /* Try simple cases first */
-   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE) {
+   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE) {
       if (dstFormat == GL_RGBA) {
          if (srcFormat == GL_RGBA) {
             MEMCPY( dest, source, n * 4 * sizeof(GLubyte) );
@@ -2280,13 +2263,11 @@ _mesa_unpack_ubyte_color_span( GLcontext *ctx,
          extract_uint_indexes(n, indexes, srcFormat, srcType, source,
                               unpacking);
 
-         if (applyTransferOps) {
-            if (ctx->Pixel.MapColorFlag) {
-               _mesa_map_ci(ctx, n, indexes);
-            }
-            if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
-               _mesa_shift_and_offset_ci(ctx, n, indexes);
-            }
+         if (transferOps & IMAGE_MAP_COLOR_BIT) {
+            _mesa_map_ci(ctx, n, indexes);
+         }
+         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
+            _mesa_shift_and_offset_ci(ctx, n, indexes);
          }
 
          if (dstFormat == GL_COLOR_INDEX) {
@@ -2306,43 +2287,43 @@ _mesa_unpack_ubyte_color_span( GLcontext *ctx,
          extract_float_rgba(n, rgba, srcFormat, srcType, source,
                             unpacking->SwapBytes);
 
-         if (applyTransferOps) {
-            /* scale and bias colors */
-            if (ctx->Pixel.ScaleOrBiasRGBA) {
-               _mesa_scale_and_bias_rgba(ctx, n, rgba);
-            }
-            /* color map lookup */
-            if (ctx->Pixel.MapColorFlag) {
-               _mesa_map_rgba(ctx, n, rgba);
-            }
+         /* scale and bias colors */
+         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
+            _mesa_scale_and_bias_rgba(ctx, n, rgba);
+         }
+         /* color map lookup */
+         if (transferOps & IMAGE_MAP_COLOR_BIT) {
+            _mesa_map_rgba(ctx, n, rgba);
          }
       }
 
-      if (applyTransferOps) {
+      if (transferOps) {
          /* GL_COLOR_TABLE lookup */
-         if (ctx->Pixel.ColorTableEnabled) {
+         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
          }
-         /* XXX convolution here */
+         /* convolution */
+         if (transferOps & IMAGE_CONVOLUTION_BIT) {
+            /* XXX to do */
+         }
          /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
-         if (ctx->Pixel.PostConvolutionColorTableEnabled) {
+         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
          }
          /* color matrix transform */
-         if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
-             ctx->Pixel.ScaleOrBiasRGBApcm) {
+         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
             _mesa_transform_rgba(ctx, n, rgba);
          }
          /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
-         if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
+         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
          }
          /* update histogram count */
-         if (ctx->Pixel.HistogramEnabled) {
+         if (transferOps & IMAGE_HISTOGRAM_BIT) {
             _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
          }
-         /* XXX min/max here */
-         if (ctx->Pixel.MinMaxEnabled) {
+         /* min/max here */
+         if (transferOps & IMAGE_MIN_MAX_BIT) {
             _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
          }
       }
@@ -2471,7 +2452,7 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
                                GLenum srcFormat, GLenum srcType,
                                const GLvoid *source,
                                const struct gl_pixelstore_attrib *unpacking,
-                               GLboolean applyTransferOps, GLboolean clamp )
+                               GLuint transferOps, GLboolean clamp )
 {
    ASSERT(dstFormat == GL_ALPHA ||
           dstFormat == GL_LUMINANCE || 
@@ -2519,16 +2500,6 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
    /* this is intended for RGBA mode only */
    assert(ctx->Visual->RGBAflag);
 
-   applyTransferOps &= (ctx->Pixel.ScaleOrBiasRGBA ||
-                        ctx->Pixel.MapColorFlag ||
-                        ctx->ColorMatrix.type != MATRIX_IDENTITY ||
-                        ctx->Pixel.ScaleOrBiasRGBApcm ||
-                        ctx->Pixel.ColorTableEnabled ||
-                        ctx->Pixel.PostColorMatrixColorTableEnabled ||
-                        ctx->Pixel.PostConvolutionColorTableEnabled ||
-                        ctx->Pixel.MinMaxEnabled ||
-                        ctx->Pixel.HistogramEnabled);
-
    /* general solution, no special cases, yet */
    {
       GLfloat rgba[MAX_WIDTH][4];
@@ -2549,13 +2520,11 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
          extract_uint_indexes(n, indexes, srcFormat, srcType, source,
                               unpacking);
 
-         if (applyTransferOps) {
-            if (ctx->Pixel.MapColorFlag) {
-               _mesa_map_ci(ctx, n, indexes);
-            }
-            if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
-               _mesa_shift_and_offset_ci(ctx, n, indexes);
-            }
+         if (transferOps & IMAGE_MAP_COLOR_BIT) {
+            _mesa_map_ci(ctx, n, indexes);
+         }
+         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
+            _mesa_shift_and_offset_ci(ctx, n, indexes);
          }
 
          if (dstFormat == GL_COLOR_INDEX) {
@@ -2575,43 +2544,43 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
          extract_float_rgba(n, rgba, srcFormat, srcType, source,
                             unpacking->SwapBytes);
 
-         if (applyTransferOps) {
-            /* scale and bias colors */
-            if (ctx->Pixel.ScaleOrBiasRGBA) {
-               _mesa_scale_and_bias_rgba(ctx, n, rgba);
-            }
-            /* color map lookup */
-            if (ctx->Pixel.MapColorFlag) {
-               _mesa_map_rgba(ctx, n, rgba);
-            }
+         /* scale and bias colors */
+         if (transferOps & IMAGE_SCALE_BIAS_BIT) {
+            _mesa_scale_and_bias_rgba(ctx, n, rgba);
+         }
+         /* color map lookup */
+         if (transferOps & IMAGE_MAP_COLOR_BIT) {
+            _mesa_map_rgba(ctx, n, rgba);
          }
       }
 
-      if (applyTransferOps) {
+      if (transferOps) {
          /* GL_COLOR_TABLE lookup */
-         if (ctx->Pixel.ColorTableEnabled) {
+         if (transferOps & IMAGE_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->ColorTable, n, rgba);
          }
-         /* XXX convolution here */
+         /* convolution */
+         if (transferOps & IMAGE_CONVOLUTION_BIT) {
+            /* XXX to do */
+         }
          /* GL_POST_CONVOLUTION_COLOR_TABLE lookup */
-         if (ctx->Pixel.PostConvolutionColorTableEnabled) {
+         if (transferOps & IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->PostConvolutionColorTable, n, rgba);
          }
          /* color matrix transform */
-         if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
-             ctx->Pixel.ScaleOrBiasRGBApcm) {
+         if (transferOps & IMAGE_COLOR_MATRIX_BIT) {
             _mesa_transform_rgba(ctx, n, rgba);
          }
          /* GL_POST_COLOR_MATRIX_COLOR_TABLE lookup */
-         if (ctx->Pixel.PostColorMatrixColorTableEnabled) {
+         if (transferOps & IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT) {
             _mesa_lookup_rgba(&ctx->PostColorMatrixColorTable, n, rgba);
          }
          /* update histogram count */
-         if (ctx->Pixel.HistogramEnabled) {
+         if (transferOps & IMAGE_HISTOGRAM_BIT) {
             _mesa_update_histogram(ctx, n, (CONST GLfloat (*)[4]) rgba);
          }
-         /* XXX min/max here */
-         if (ctx->Pixel.MinMaxEnabled) {
+         /* min/max here */
+         if (transferOps & IMAGE_MIN_MAX_BIT) {
             _mesa_update_minmax(ctx, n, (CONST GLfloat (*)[4]) rgba);
          }
       }
@@ -2666,11 +2635,11 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
             dstLuminanceIndex = dstIntensityIndex = -1;
             break;
          default:
-            gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_span()");
+            gl_problem(ctx, "bad dstFormat in _mesa_unpack_float_color_span()");
             return;
       }
 
-      /* Now pack results in teh requested dstFormat */
+      /* Now pack results in the requested dstFormat */
       if (dstRedIndex >= 0) {
          GLfloat *dst = dest;
          GLuint i;
@@ -2736,8 +2705,7 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
 
 /*
  * Unpack a row of color index data from a client buffer according to
- * the pixel unpacking parameters.  Apply pixel transfer ops if enabled
- * and applyTransferOps is true.
+ * the pixel unpacking parameters.
  * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
  *
  * Args:  ctx - the context
@@ -2747,14 +2715,14 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
  *        srcType - source pixel type
  *        source - source data pointer
  *        unpacking - pixel unpacking parameters
- *        applyTransferOps - apply offset/bias/lookup ops?
+ *        transferOps - the pixel transfer operations to apply
  */
 void
 _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
                          GLenum dstType, GLvoid *dest,
                          GLenum srcType, const GLvoid *source,
                          const struct gl_pixelstore_attrib *unpacking,
-                         GLboolean applyTransferOps )
+                         GLuint transferOps )
 {
    ASSERT(srcType == GL_BITMAP ||
           srcType == GL_UNSIGNED_BYTE ||
@@ -2769,16 +2737,17 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
           dstType == GL_UNSIGNED_SHORT ||
           dstType == GL_UNSIGNED_INT);
 
-   applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag);
+
+   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
 
    /*
     * Try simple cases first
     */
-   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE
+   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
        && dstType == GL_UNSIGNED_BYTE) {
       MEMCPY(dest, source, n * sizeof(GLubyte));
    }
-   else if (!applyTransferOps && srcType == GL_UNSIGNED_INT
+   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
             && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) {
       MEMCPY(dest, source, n * sizeof(GLuint));
    }
@@ -2792,15 +2761,13 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
       extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
                            unpacking);
 
-      if (applyTransferOps) {
-         if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
-            /* shift and offset indexes */
-            _mesa_shift_and_offset_ci(ctx, n, indexes);
-         }
-         if (ctx->Pixel.MapColorFlag) {
-            /* Apply lookup table */
-            _mesa_map_ci(ctx, n, indexes);
-         }
+      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
+         /* shift and offset indexes */
+         _mesa_shift_and_offset_ci(ctx, n, indexes);
+      }
+      if (transferOps & IMAGE_MAP_COLOR_BIT) {
+         /* Apply lookup table */
+         _mesa_map_ci(ctx, n, indexes);
       }
 
       /* convert to dest type */
@@ -2835,8 +2802,7 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
 
 /*
  * Unpack a row of stencil data from a client buffer according to
- * the pixel unpacking parameters.  Apply pixel transfer ops if enabled
- * and applyTransferOps is true.
+ * the pixel unpacking parameters.
  * This is (or will be) used by glDrawPixels
  *
  * Args:  ctx - the context
@@ -2846,14 +2812,14 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
  *        srcType - source pixel type
  *        source - source data pointer
  *        unpacking - pixel unpacking parameters
- *        applyTransferOps - apply offset/bias/lookup ops?
+ *        transferOps - apply offset/bias/lookup ops?
  */
 void
 _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
                            GLenum dstType, GLvoid *dest,
                            GLenum srcType, const GLvoid *source,
                            const struct gl_pixelstore_attrib *unpacking,
-                           GLboolean applyTransferOps )
+                           GLuint transferOps )
 {
    ASSERT(srcType == GL_BITMAP ||
           srcType == GL_UNSIGNED_BYTE ||
@@ -2868,17 +2834,21 @@ _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
           dstType == GL_UNSIGNED_SHORT ||
           dstType == GL_UNSIGNED_INT);
 
-   applyTransferOps &= (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset || ctx->Pixel.MapColorFlag);
+   /* only shift and offset apply to stencil */
+   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
 
    /*
     * Try simple cases first
     */
-   if (!applyTransferOps && srcType == GL_UNSIGNED_BYTE
-       && dstType == GL_UNSIGNED_BYTE) {
+   if (transferOps == 0 &&
+       srcType == GL_UNSIGNED_BYTE &&
+       dstType == GL_UNSIGNED_BYTE) {
       MEMCPY(dest, source, n * sizeof(GLubyte));
    }
-   else if (!applyTransferOps && srcType == GL_UNSIGNED_INT
-            && dstType == GL_UNSIGNED_INT && !unpacking->SwapBytes) {
+   else if (transferOps == 0 &&
+            srcType == GL_UNSIGNED_INT &&
+            dstType == GL_UNSIGNED_INT &&
+            !unpacking->SwapBytes) {
       MEMCPY(dest, source, n * sizeof(GLuint));
    }
    else {
@@ -2891,8 +2861,8 @@ _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
       extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
                            unpacking);
 
-      if (applyTransferOps) {
-         if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset) {
+      if (transferOps) {
+         if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
             /* shift and offset indexes */
             _mesa_shift_and_offset_ci(ctx, n, indexes);
          }
@@ -2942,7 +2912,7 @@ void
 _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest,
                          GLenum srcType, const GLvoid *source,
                          const struct gl_pixelstore_attrib *unpacking,
-                         GLboolean applyTransferOps )
+                         GLuint transferOps )
 {
    GLfloat *depth = MALLOC(n * sizeof(GLfloat));
    if (!depth)
index 1526491b810b6fcce29e6cf00c10a680e969ef84..c9a3aab662c957d607e74568495f0a25a6b779c7 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: image.h,v 1.9 2000/05/10 14:39:53 brianp Exp $ */
+/* $Id: image.h,v 1.10 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
+ * Version:  3.5
  * 
  * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  * 
@@ -84,7 +84,7 @@ _mesa_pack_rgba_span( GLcontext *ctx,
                       GLuint n, CONST GLubyte rgba[][4],
                       GLenum format, GLenum type, GLvoid *dest,
                       const struct gl_pixelstore_attrib *packing,
-                      GLboolean applyTransferOps );
+                      GLuint transferOps );
 
 
 extern void
@@ -93,7 +93,7 @@ _mesa_unpack_ubyte_color_span( GLcontext *ctx,
                                GLenum srcFormat, GLenum srcType,
                                const GLvoid *source,
                                const struct gl_pixelstore_attrib *unpacking,
-                               GLboolean applyTransferOps );
+                               GLuint transferOps );
 
 
 extern void
@@ -102,7 +102,7 @@ _mesa_unpack_float_color_span( GLcontext *ctx,
                                GLenum srcFormat, GLenum srcType,
                                const GLvoid *source,
                                const struct gl_pixelstore_attrib *unpacking,
-                               GLboolean applyTransferOps, GLboolean clamp );
+                               GLuint transferOps, GLboolean clamp );
 
 
 extern void
@@ -110,7 +110,7 @@ _mesa_unpack_index_span( const GLcontext *ctx, GLuint n,
                          GLenum dstType, GLvoid *dest,
                          GLenum srcType, const GLvoid *source,
                          const struct gl_pixelstore_attrib *unpacking,
-                         GLboolean applyTransferOps );
+                         GLuint transferOps );
 
 
 extern void
@@ -118,14 +118,14 @@ _mesa_unpack_stencil_span( const GLcontext *ctx, GLuint n,
                            GLenum dstType, GLvoid *dest,
                            GLenum srcType, const GLvoid *source,
                            const struct gl_pixelstore_attrib *unpacking,
-                           GLboolean applyTransferOps );
+                           GLuint transferOps );
 
 
 extern void
 _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n, GLdepth *dest,
                          GLenum srcType, const GLvoid *source,
                          const struct gl_pixelstore_attrib *unpacking,
-                         GLboolean applyTransferOps );
+                         GLuint transferOps );
 
 
 extern void *
index 7d5d23ec504da28ecec3b662adb022cf42475c8e..8c839b894c48eeab62eae29adb552b6733462a3a 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: pixel.c,v 1.11 2000/05/07 20:41:30 brianp Exp $ */
+/* $Id: pixel.c,v 1.12 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
@@ -610,29 +610,8 @@ _mesa_PixelTransferf( GLenum pname, GLfloat param )
          return;
    }
 
-   if (ctx->Pixel.RedScale!=1.0F   || ctx->Pixel.RedBias!=0.0F ||
-       ctx->Pixel.GreenScale!=1.0F || ctx->Pixel.GreenBias!=0.0F ||
-       ctx->Pixel.BlueScale!=1.0F  || ctx->Pixel.BlueBias!=0.0F ||
-       ctx->Pixel.AlphaScale!=1.0F || ctx->Pixel.AlphaBias!=0.0F) {
-      ctx->Pixel.ScaleOrBiasRGBA = GL_TRUE;
-   }
-   else {
-      ctx->Pixel.ScaleOrBiasRGBA = GL_FALSE;
-   }
-
-   if (ctx->Pixel.PostColorMatrixScale[0] != 1.0F ||
-       ctx->Pixel.PostColorMatrixBias[0]  != 0.0F ||
-       ctx->Pixel.PostColorMatrixScale[1] != 1.0F ||
-       ctx->Pixel.PostColorMatrixBias[1]  != 0.0F ||
-       ctx->Pixel.PostColorMatrixScale[2] != 1.0F ||
-       ctx->Pixel.PostColorMatrixBias[2]  != 0.0F ||
-       ctx->Pixel.PostColorMatrixScale[3] != 1.0F ||
-       ctx->Pixel.PostColorMatrixBias[3]  != 0.0F) {
-      ctx->Pixel.ScaleOrBiasRGBApcm = GL_TRUE;
-   }
-   else {
-      ctx->Pixel.ScaleOrBiasRGBApcm = GL_FALSE;
-   }
+   /* signal to recompute the bitmask */
+   ctx->ImageTransferState = UPDATE_IMAGE_TRANSFER_STATE;
 }
 
 
index 8f52c9fe43ae4dbd2a3f755f47edb17ea392c33d..90cb0728a82bc37703e35a940e123237f7858c1a 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: state.c,v 1.21 2000/06/30 14:14:37 brianp Exp $ */
+/* $Id: state.c,v 1.22 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
+ * Version:  3.5
  *
  * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  *
@@ -1230,3 +1230,61 @@ void gl_update_state( GLcontext *ctx )
    gl_update_pipelines(ctx);
    ctx->NewState = 0;
 }
+
+
+
+
+/*
+ * Return a bitmask of IMAGE_*_BIT flags which to indicate which
+ * pixel transfer operations are enabled.
+ */
+void
+_mesa_update_image_transfer_state(GLcontext *ctx)
+{
+   GLuint mask = 0;
+
+   if (ctx->Pixel.RedScale   != 1.0F || ctx->Pixel.RedBias   != 0.0F ||
+       ctx->Pixel.GreenScale != 1.0F || ctx->Pixel.GreenBias != 0.0F ||
+       ctx->Pixel.BlueScale  != 1.0F || ctx->Pixel.BlueBias  != 0.0F ||
+       ctx->Pixel.AlphaScale != 1.0F || ctx->Pixel.AlphaBias != 0.0F)
+      mask |= IMAGE_SCALE_BIAS_BIT;
+
+   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset)
+      mask |= IMAGE_SHIFT_OFFSET_BIT;
+   
+   if (ctx->Pixel.MapColorFlag)
+      mask |= IMAGE_MAP_COLOR_BIT;
+
+   if (ctx->Pixel.ColorTableEnabled)
+      mask |= IMAGE_COLOR_TABLE_BIT;
+
+   if (ctx->Pixel.Convolution1DEnabled ||
+       ctx->Pixel.Convolution2DEnabled ||
+       ctx->Pixel.Separable2DEnabled)
+      mask |= IMAGE_CONVOLUTION_BIT;
+
+   if (ctx->Pixel.PostConvolutionColorTableEnabled)
+      mask |= IMAGE_POST_CONVOLUTION_COLOR_TABLE_BIT;
+
+   if (ctx->ColorMatrix.type != MATRIX_IDENTITY ||
+       ctx->Pixel.PostColorMatrixScale[0] != 1.0F ||
+       ctx->Pixel.PostColorMatrixBias[0]  != 0.0F ||
+       ctx->Pixel.PostColorMatrixScale[1] != 1.0F ||
+       ctx->Pixel.PostColorMatrixBias[1]  != 0.0F ||
+       ctx->Pixel.PostColorMatrixScale[2] != 1.0F ||
+       ctx->Pixel.PostColorMatrixBias[2]  != 0.0F ||
+       ctx->Pixel.PostColorMatrixScale[3] != 1.0F ||
+       ctx->Pixel.PostColorMatrixBias[3]  != 0.0F)
+      mask |= IMAGE_COLOR_MATRIX_BIT;
+
+   if (ctx->Pixel.PostColorMatrixColorTableEnabled)
+      mask |= IMAGE_POST_COLOR_MATRIX_COLOR_TABLE_BIT;
+
+   if (ctx->Pixel.HistogramEnabled)
+      mask |= IMAGE_HISTOGRAM_BIT;
+
+   if (ctx->Pixel.MinMaxEnabled)
+      mask |= IMAGE_MIN_MAX_BIT;
+
+   ctx->ImageTransferState = mask;
+}
index 55d7b4c1c4b0f522059d809131348e33ba5aa87f..640c21dc7cec39575de493cbd1adce44e0981f0a 100644 (file)
@@ -1,8 +1,8 @@
-/* $Id: state.h,v 1.2 2000/05/24 15:04:45 brianp Exp $ */
+/* $Id: state.h,v 1.3 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
+ * Version:  3.5
  * 
  * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  * 
@@ -37,15 +37,17 @@ _mesa_init_no_op_table(struct _glapi_table *exec, GLuint tableSize);
 extern void
 _mesa_init_exec_table(struct _glapi_table *exec, GLuint tableSize);
 
+extern void
+gl_update_state( GLcontext *ctx );
 
-extern void gl_update_state( GLcontext *ctx );
-
+extern void
+gl_print_state( const char *msg, GLuint state );
 
-/* for debugging */
-extern void gl_print_state( const char *msg, GLuint state );
+extern void
+gl_print_enable_flags( const char *msg, GLuint flags );
 
-/* for debugging */
-extern void gl_print_enable_flags( const char *msg, GLuint flags );
+extern void
+_mesa_update_image_transfer_state(GLcontext *ctx);
 
 
 #endif
index 98f62c8162c4faacf6b3e054548dd5c9d0816f22..14f9c60315c86ecdecc15fb24709f0807440f5c9 100644 (file)
@@ -1,7 +1,8 @@
+/* $Id: teximage.c,v 1.40 2000/08/21 14:22:24 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.3
+ * Version:  3.5
  * 
  * Copyright (C) 1999-2000  Brian Paul   All Rights Reserved.
  * 
@@ -33,6 +34,7 @@
 #include "mem.h"
 #include "mmath.h"
 #include "span.h"
+#include "state.h"
 #include "teximage.h"
 #include "texstate.h"
 #include "types.h"
@@ -688,7 +690,7 @@ _mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_unit *texUnit,
  * NOTE: All texture image parameters should have already been error checked.
  */
 static void
-make_texture_image( GLcontext *ctx,
+make_texture_image( GLcontext *ctx, GLint dimensions,
                     struct gl_texture_image *texImage,
                     GLenum srcFormat, GLenum srcType, const GLvoid *pixels,
                     const struct gl_pixelstore_attrib *unpacking)
@@ -730,10 +732,11 @@ make_texture_image( GLcontext *ctx,
     * This includes applying the pixel transfer operations.
     */
 
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
    /* try common 2D texture cases first */
-   if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag
-       && !ctx->Pixel.IndexOffset && !ctx->Pixel.IndexShift
-       && srcType == GL_UNSIGNED_BYTE && depth == 1) {
+   if (!ctx->ImageTransferState && srcType == GL_UNSIGNED_BYTE && depth == 1) {
 
       if (srcFormat == internalFormat ||
           (srcFormat == GL_LUMINANCE && internalFormat == 1) ||
@@ -799,7 +802,8 @@ make_texture_image( GLcontext *ctx,
             const GLvoid *source = _mesa_image_address(unpacking,
                 pixels, width, height, srcFormat, srcType, img, row, 0);
             _mesa_unpack_index_span(ctx, width, dstType, dest,
-                                    srcType, source, unpacking, GL_TRUE);
+                                    srcType, source, unpacking,
+                                    ctx->ImageTransferState);
             dest += destBytesPerRow;
          }
       }
@@ -810,12 +814,14 @@ make_texture_image( GLcontext *ctx,
       const GLenum dstFormat = texImage->Format;
       GLubyte *dest = texImage->Data;
       GLint img, row;
+      /* XXX convolution */
       for (img = 0; img < depth; img++) {
          for (row = 0; row < height; row++) {
             const GLvoid *source = _mesa_image_address(unpacking,
                    pixels, width, height, srcFormat, srcType, img, row, 0);
             _mesa_unpack_ubyte_color_span(ctx, width, dstFormat, dest,
-                   srcFormat, srcType, source, unpacking, GL_TRUE);
+                                          srcFormat, srcType, source,
+                                          unpacking, ctx->ImageTransferState);
             dest += destBytesPerRow;
          }
       }
@@ -1384,12 +1390,14 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
       /* setup the teximage struct's fields */
       init_texture_image(texImage, width, 1, 1, border, internalFormat);
 
+      if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+         _mesa_update_image_transfer_state(ctx);
+
       /* process the texture image */
       if (pixels) {
          GLboolean retain = GL_TRUE;
          GLboolean success = GL_FALSE;
-         if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
-             && ctx->Driver.TexImage1D) {
+         if (!ctx->ImageTransferState && ctx->Driver.TexImage1D) {
             /* let device driver try to use raw image */
             success = (*ctx->Driver.TexImage1D)( ctx, target, level, format,
                                                  type, pixels, &ctx->Unpack,
@@ -1397,7 +1405,7 @@ _mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat,
          }
          if (retain || !success) {
             /* make internal copy of the texture image */
-            make_texture_image(ctx, texImage, format, type,
+            make_texture_image(ctx, 1, texImage, format, type,
                                pixels, &ctx->Unpack);
             if (!success && ctx->Driver.TexImage1D) {
                /* let device driver try to use unpacked image */
@@ -1493,12 +1501,14 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
       /* setup the teximage struct's fields */
       init_texture_image(texImage, width, height, 1, border, internalFormat);
 
+      if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+         _mesa_update_image_transfer_state(ctx);
+
       /* process the texture image */
       if (pixels) {
          GLboolean retain = GL_TRUE;
          GLboolean success = GL_FALSE;
-         if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
-             && ctx->Driver.TexImage2D) {
+         if (!ctx->ImageTransferState && ctx->Driver.TexImage2D) {
             /* let device driver try to use raw image */
             success = (*ctx->Driver.TexImage2D)( ctx, target, level, format,
                                                  type, pixels, &ctx->Unpack,
@@ -1506,7 +1516,7 @@ _mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat,
          }
          if (retain || !success) {
             /* make internal copy of the texture image */
-            make_texture_image(ctx, texImage, format, type,
+            make_texture_image(ctx, 2, texImage, format, type,
                                pixels, &ctx->Unpack);
             if (!success && ctx->Driver.TexImage2D) {
                /* let device driver try to use unpacked image */
@@ -1612,12 +1622,14 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
       init_texture_image(texImage, width, height, depth,
                          border, internalFormat);
 
+      if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+         _mesa_update_image_transfer_state(ctx);
+
       /* process the texture image */
       if (pixels) {
          GLboolean retain = GL_TRUE;
          GLboolean success = GL_FALSE;
-         if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
-             && ctx->Driver.TexImage3D) {
+         if (!ctx->ImageTransferState && ctx->Driver.TexImage3D) {
             /* let device driver try to use raw image */
             success = (*ctx->Driver.TexImage3D)( ctx, target, level, format,
                                                  type, pixels, &ctx->Unpack,
@@ -1625,7 +1637,7 @@ _mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat,
          }
          if (retain || !success) {
             /* make internal copy of the texture image */
-            make_texture_image(ctx, texImage, format, type,
+            make_texture_image(ctx, 3, texImage, format, type,
                                pixels, &ctx->Unpack);
             if (!success && ctx->Driver.TexImage3D) {
                /* let device driver try to use unpacked image */
@@ -1755,7 +1767,7 @@ _mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level,
          for (img = 0; img < depth; img++) {
             for (row = 0; row < height; row++) {
                _mesa_unpack_index_span(ctx, width, dstType, destPtr,
-                             imgType, srcPtr, &_mesa_native_packing, GL_FALSE);
+                             imgType, srcPtr, &_mesa_native_packing, 0);
                destPtr += destBytesPerRow;
                srcPtr += srcBytesPerRow;
             }
@@ -1767,7 +1779,7 @@ _mesa_get_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level,
          for (img = 0; img < depth; img++) {
             for (row = 0; row < height; row++) {
                _mesa_unpack_ubyte_color_span(ctx, width, dstFormat, destPtr,
-                  imgFormat, imgType, srcPtr, &_mesa_native_packing, GL_FALSE);
+                  imgFormat, imgType, srcPtr, &_mesa_native_packing, 0);
                destPtr += destBytesPerRow;
                srcPtr += srcBytesPerRow;
             }
@@ -1870,6 +1882,9 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
       GLint height = texImage->Height;
       GLint row;
 
+      if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+         _mesa_update_image_transfer_state(ctx);
+
       for (row = 0; row < height; row++) {
          /* compute destination address in client memory */
          GLvoid *dest = _mesa_image_address( &ctx->Unpack, pixels,
@@ -1880,7 +1895,8 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
          if (texImage->Format == GL_RGBA) {
             const GLubyte *src = texImage->Data + row * width * 4 * sizeof(GLubyte);
             _mesa_pack_rgba_span( ctx, width, (CONST GLubyte (*)[4]) src,
-                                  format, type, dest, &ctx->Pack, GL_TRUE );
+                                  format, type, dest, &ctx->Pack,
+                                  ctx->ImageTransferState );
          }
          else {
             /* fetch RGBA row from texture image then pack it in client mem */
@@ -1944,7 +1960,8 @@ _mesa_GetTexImage( GLenum target, GLint level, GLenum format,
                   gl_problem( ctx, "bad format in gl_GetTexImage" );
             }
             _mesa_pack_rgba_span( ctx, width, (const GLubyte (*)[4])rgba,
-                                  format, type, dest, &ctx->Pack, GL_TRUE );
+                                  format, type, dest, &ctx->Pack,
+                                  ctx->ImageTransferState );
          }
       }
 
@@ -1983,9 +2000,10 @@ _mesa_TexSubImage1D( GLenum target, GLint level,
    if (width == 0 || !pixels)
       return;  /* no-op, not an error */
 
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
 
-   if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
-       && ctx->Driver.TexSubImage1D) {
+   if (!ctx->ImageTransferState && ctx->Driver.TexSubImage1D) {
       success = (*ctx->Driver.TexSubImage1D)( ctx, target, level, xoffset,
                                               width, format, type, pixels,
                                               &ctx->Unpack, texObj, texImage );
@@ -2012,15 +2030,18 @@ _mesa_TexSubImage1D( GLenum target, GLint level,
          const GLvoid *src = _mesa_image_address(&ctx->Unpack, pixels, width,
                                                  1, format, type, 0, 0, 0);
          _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst,
-                                 type, src, &ctx->Unpack, GL_TRUE);
+                                 type, src, &ctx->Unpack,
+                                 ctx->ImageTransferState);
       }
       else {
          /* color texture */
          GLubyte *dst = texImage->Data + xoffsetb * texComponents;
          const GLvoid *src = _mesa_image_address(&ctx->Unpack, pixels, width,
                                                  1, format, type, 0, 0, 0);
+         /* XXX change for convolution */
          _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, format,
-                                       type, src, &ctx->Unpack, GL_TRUE);
+                                       type, src, &ctx->Unpack,
+                                       ctx->ImageTransferState);
       }
 
       if (ctx->Driver.TexImage1D) {
@@ -2066,8 +2087,10 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
    if (width == 0 || height == 0 || !pixels)
       return;  /* no-op, not an error */
 
-   if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
-       && ctx->Driver.TexSubImage2D) {
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (!ctx->ImageTransferState && ctx->Driver.TexSubImage2D) {
       success = (*ctx->Driver.TexSubImage2D)( ctx, target, level, xoffset,
                                      yoffset, width, height, format, type,
                                      pixels, &ctx->Unpack, texObj, texImage );
@@ -2102,7 +2125,8 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
          GLint row;
          for (row = 0; row < height; row++) {
             _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst, type,
-                                 (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+                                    (const GLvoid *) src, &ctx->Unpack,
+                                    ctx->ImageTransferState);
             src += srcStride;
             dst += dstStride;
          }
@@ -2114,9 +2138,12 @@ _mesa_TexSubImage2D( GLenum target, GLint level,
          const GLubyte *src = _mesa_image_address(&ctx->Unpack, pixels,
                                      width, height, format, type, 0, 0, 0);
          GLint row;
+         /* XXX change for convolution */
          for (row = 0; row < height; row++) {
             _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, format,
-                           type, (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+                                          type, (const GLvoid *) src,
+                                          &ctx->Unpack,
+                                          ctx->ImageTransferState);
             src += srcStride;
             dst += dstStride;
          }
@@ -2177,8 +2204,10 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
    if (width == 0 || height == 0 || height == 0 || !pixels)
       return;  /* no-op, not an error */
 
-   if (!ctx->Pixel.MapColorFlag && !ctx->Pixel.ScaleOrBiasRGBA
-       && ctx->Driver.TexSubImage3D) {
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (!ctx->ImageTransferState && ctx->Driver.TexSubImage3D) {
       success = (*ctx->Driver.TexSubImage3D)( ctx, target, level, xoffset,
                                 yoffset, zoffset, width, height, depth, format,
                                 type, pixels, &ctx->Unpack, texObj, texImage );
@@ -2208,7 +2237,8 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
                      + yoffsetb * texWidth + xoffsetb) * texComponents;
             for (row = 0; row < height; row++) {
                _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst,
-                         type, (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+                                       type, (const GLvoid *) src,
+                                       &ctx->Unpack, ctx->ImageTransferState);
                src += srcStride;
                dst += dstStride;
             }
@@ -2224,7 +2254,10 @@ _mesa_TexSubImage3D( GLenum target, GLint level,
                      + yoffsetb * texWidth + xoffsetb) * texComponents;
             for (row = 0; row < height; row++) {
                _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst,
-                   format, type, (const GLvoid *) src, &ctx->Unpack, GL_TRUE);
+                                             format, type,
+                                             (const GLvoid *) src,
+                                             &ctx->Unpack,
+                                             ctx->ImageTransferState);
                src += srcStride;
                dst += dstStride;
             }
@@ -2302,8 +2335,10 @@ _mesa_CopyTexImage1D( GLenum target, GLint level,
                                width, 1, border))
       return;
 
-   if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
-       || !ctx->Driver.CopyTexImage1D 
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (ctx->ImageTransferState || !ctx->Driver.CopyTexImage1D 
        || !(*ctx->Driver.CopyTexImage1D)(ctx, target, level,
                          internalFormat, x, y, width, border))
    {
@@ -2341,8 +2376,10 @@ _mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat,
                                width, height, border))
       return;
 
-   if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
-       || !ctx->Driver.CopyTexImage2D
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (ctx->ImageTransferState || !ctx->Driver.CopyTexImage2D
        || !(*ctx->Driver.CopyTexImage2D)(ctx, target, level,
                          internalFormat, x, y, width, height, border))
    {
@@ -2379,8 +2416,10 @@ _mesa_CopyTexSubImage1D( GLenum target, GLint level,
                                    xoffset, 0, 0, width, 1))
       return;
 
-   if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
-       || !ctx->Driver.CopyTexSubImage1D
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (ctx->ImageTransferState || !ctx->Driver.CopyTexSubImage1D
        || !(*ctx->Driver.CopyTexSubImage1D)(ctx, target, level,
                                             xoffset, x, y, width)) {
       struct gl_texture_unit *texUnit;
@@ -2424,8 +2463,10 @@ _mesa_CopyTexSubImage2D( GLenum target, GLint level,
                                    xoffset, yoffset, 0, width, height))
       return;
 
-   if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
-       || !ctx->Driver.CopyTexSubImage2D
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (ctx->ImageTransferState || !ctx->Driver.CopyTexSubImage2D
        || !(*ctx->Driver.CopyTexSubImage2D)(ctx, target, level,
                                 xoffset, yoffset, x, y, width, height )) {
       struct gl_texture_unit *texUnit;
@@ -2469,8 +2510,10 @@ _mesa_CopyTexSubImage3D( GLenum target, GLint level,
                     xoffset, yoffset, zoffset, width, height))
       return;
 
-   if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA
-       || !ctx->Driver.CopyTexSubImage3D
+   if (ctx->ImageTransferState == UPDATE_IMAGE_TRANSFER_STATE)
+      _mesa_update_image_transfer_state(ctx);
+
+   if (ctx->ImageTransferState || !ctx->Driver.CopyTexSubImage3D
        || !(*ctx->Driver.CopyTexSubImage3D)(ctx, target, level,
                      xoffset, yoffset, zoffset, x, y, width, height )) {
       struct gl_texture_unit *texUnit;