Minor tweaks to help out at a driver level.
[mesa.git] / src / mesa / main / texformat.c
index d9ec9376ae185182399a20ce8fedc7e07c8d711e..7af0b1cdf48341b18e860b86eae8f6b9d07f12e4 100644 (file)
@@ -1,10 +1,15 @@
-/* $Id: texformat.c,v 1.10 2001/04/20 16:46:04 brianp Exp $ */
+/**
+ * \file texformat.c
+ * Texture formats.
+ *
+ * \author Gareth Hughes
+ */
 
 /*
  * Mesa 3-D graphics library
- * Version:  3.5
+ * Version:  5.1
  *
- * Copyright (C) 1999-2001  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2003  Brian Paul   All Rights Reserved.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- * Author:
- *    Gareth Hughes <gareth@valinux.com>
  */
 
-#ifdef PC_HEADER
-#include "all.h"
-#else
+
 #include "glheader.h"
 #include "colormac.h"
 #include "context.h"
 #include "image.h"
-#include "mem.h"
-#include "mmath.h"
+#include "imports.h"
 #include "mtypes.h"
 #include "texformat.h"
 #include "teximage.h"
 #include "texstate.h"
-#include "swrast/s_span.h"
-#endif
 
 
-/* Texel fetch routines for all supported formats:
+/* Texel fetch routines for all supported formats
  */
 #define DIM 1
 #include "texformat_tmp.h"
 #define DIM 3
 #include "texformat_tmp.h"
 
-/* Have to have this so the FetchTexel function pointer is never NULL.
+/**
+ * Null texel fetch function.
+ *
+ * Have to have this so the FetchTexel function pointer is never NULL.
  */
 static void fetch_null_texel( const struct gl_texture_image *texImage,
                              GLint i, GLint j, GLint k, GLvoid *texel )
@@ -68,14 +68,13 @@ static void fetch_null_texel( const struct gl_texture_image *texImage,
 }
 
 
-/* =============================================================
- * Default GLchan-based formats:
- */
+/***************************************************************/
+/** \name Default GLchan-based formats */
+/*@{*/
 
 const struct gl_texture_format _mesa_texformat_rgba = {
    MESA_FORMAT_RGBA,                   /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    CHAN_BITS,                          /* RedBits */
    CHAN_BITS,                          /* GreenBits */
    CHAN_BITS,                          /* BlueBits */
@@ -93,7 +92,6 @@ const struct gl_texture_format _mesa_texformat_rgba = {
 const struct gl_texture_format _mesa_texformat_rgb = {
    MESA_FORMAT_RGB,                    /* MesaFormat */
    GL_RGB,                             /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    CHAN_BITS,                          /* RedBits */
    CHAN_BITS,                          /* GreenBits */
    CHAN_BITS,                          /* BlueBits */
@@ -111,7 +109,6 @@ const struct gl_texture_format _mesa_texformat_rgb = {
 const struct gl_texture_format _mesa_texformat_alpha = {
    MESA_FORMAT_ALPHA,                  /* MesaFormat */
    GL_ALPHA,                           /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -129,7 +126,6 @@ const struct gl_texture_format _mesa_texformat_alpha = {
 const struct gl_texture_format _mesa_texformat_luminance = {
    MESA_FORMAT_LUMINANCE,              /* MesaFormat */
    GL_LUMINANCE,                       /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -147,7 +143,6 @@ const struct gl_texture_format _mesa_texformat_luminance = {
 const struct gl_texture_format _mesa_texformat_luminance_alpha = {
    MESA_FORMAT_LUMINANCE_ALPHA,                /* MesaFormat */
    GL_LUMINANCE_ALPHA,                 /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -165,7 +160,6 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha = {
 const struct gl_texture_format _mesa_texformat_intensity = {
    MESA_FORMAT_INTENSITY,              /* MesaFormat */
    GL_INTENSITY,                       /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -183,7 +177,6 @@ const struct gl_texture_format _mesa_texformat_intensity = {
 const struct gl_texture_format _mesa_texformat_color_index = {
    MESA_FORMAT_COLOR_INDEX,            /* MesaFormat */
    GL_COLOR_INDEX,                     /* BaseFormat */
-   CHAN_TYPE,                          /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -201,7 +194,6 @@ const struct gl_texture_format _mesa_texformat_color_index = {
 const struct gl_texture_format _mesa_texformat_depth_component = {
    MESA_FORMAT_DEPTH_COMPONENT,                /* MesaFormat */
    GL_DEPTH_COMPONENT,                 /* BaseFormat */
-   GL_FLOAT,                           /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -216,15 +208,16 @@ const struct gl_texture_format _mesa_texformat_depth_component = {
    fetch_3d_texel_depth_component,     /* FetchTexel3D */
 };
 
+/*@}*/
 
-/* =============================================================
- * Hardware formats:
- */
+
+/***************************************************************/
+/** \name Hardware formats */
+/*@{*/
 
 const struct gl_texture_format _mesa_texformat_rgba8888 = {
    MESA_FORMAT_RGBA8888,               /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
-   GL_UNSIGNED_INT_8_8_8_8,            /* Type */
    8,                                  /* RedBits */
    8,                                  /* GreenBits */
    8,                                  /* BlueBits */
@@ -242,7 +235,6 @@ const struct gl_texture_format _mesa_texformat_rgba8888 = {
 const struct gl_texture_format _mesa_texformat_argb8888 = {
    MESA_FORMAT_ARGB8888,               /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
-   GL_UNSIGNED_INT_8_8_8_8_REV,                /* Type */
    8,                                  /* RedBits */
    8,                                  /* GreenBits */
    8,                                  /* BlueBits */
@@ -260,7 +252,6 @@ const struct gl_texture_format _mesa_texformat_argb8888 = {
 const struct gl_texture_format _mesa_texformat_rgb888 = {
    MESA_FORMAT_RGB888,                 /* MesaFormat */
    GL_RGB,                             /* BaseFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
    8,                                  /* RedBits */
    8,                                  /* GreenBits */
    8,                                  /* BlueBits */
@@ -278,7 +269,6 @@ const struct gl_texture_format _mesa_texformat_rgb888 = {
 const struct gl_texture_format _mesa_texformat_rgb565 = {
    MESA_FORMAT_RGB565,                 /* MesaFormat */
    GL_RGB,                             /* BaseFormat */
-   GL_UNSIGNED_SHORT_5_6_5,            /* Type */
    5,                                  /* RedBits */
    6,                                  /* GreenBits */
    5,                                  /* BlueBits */
@@ -296,7 +286,6 @@ const struct gl_texture_format _mesa_texformat_rgb565 = {
 const struct gl_texture_format _mesa_texformat_argb4444 = {
    MESA_FORMAT_ARGB4444,               /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
-   GL_UNSIGNED_SHORT_4_4_4_4_REV,      /* Type */
    4,                                  /* RedBits */
    4,                                  /* GreenBits */
    4,                                  /* BlueBits */
@@ -314,7 +303,6 @@ const struct gl_texture_format _mesa_texformat_argb4444 = {
 const struct gl_texture_format _mesa_texformat_argb1555 = {
    MESA_FORMAT_ARGB1555,               /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
-   GL_UNSIGNED_SHORT_1_5_5_5_REV,      /* Type */
    5,                                  /* RedBits */
    5,                                  /* GreenBits */
    5,                                  /* BlueBits */
@@ -332,7 +320,6 @@ const struct gl_texture_format _mesa_texformat_argb1555 = {
 const struct gl_texture_format _mesa_texformat_al88 = {
    MESA_FORMAT_AL88,                   /* MesaFormat */
    GL_LUMINANCE_ALPHA,                 /* BaseFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -350,7 +337,6 @@ const struct gl_texture_format _mesa_texformat_al88 = {
 const struct gl_texture_format _mesa_texformat_rgb332 = {
    MESA_FORMAT_RGB332,                 /* MesaFormat */
    GL_RGB,                             /* BaseFormat */
-   GL_UNSIGNED_BYTE_3_3_2,             /* Type */
    3,                                  /* RedBits */
    3,                                  /* GreenBits */
    2,                                  /* BlueBits */
@@ -368,7 +354,6 @@ const struct gl_texture_format _mesa_texformat_rgb332 = {
 const struct gl_texture_format _mesa_texformat_a8 = {
    MESA_FORMAT_A8,                     /* MesaFormat */
    GL_ALPHA,                           /* BaseFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -386,7 +371,6 @@ const struct gl_texture_format _mesa_texformat_a8 = {
 const struct gl_texture_format _mesa_texformat_l8 = {
    MESA_FORMAT_L8,                     /* MesaFormat */
    GL_LUMINANCE,                       /* BaseFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -404,7 +388,6 @@ const struct gl_texture_format _mesa_texformat_l8 = {
 const struct gl_texture_format _mesa_texformat_i8 = {
    MESA_FORMAT_I8,                     /* MesaFormat */
    GL_INTENSITY,                       /* BaseFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -422,7 +405,6 @@ const struct gl_texture_format _mesa_texformat_i8 = {
 const struct gl_texture_format _mesa_texformat_ci8 = {
    MESA_FORMAT_CI8,                    /* MesaFormat */
    GL_COLOR_INDEX,                     /* BaseFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -437,15 +419,300 @@ const struct gl_texture_format _mesa_texformat_ci8 = {
    fetch_3d_texel_ci8,                 /* FetchTexel3D */
 };
 
+const struct gl_texture_format _mesa_texformat_ycbcr = {
+   MESA_FORMAT_YCBCR,                  /* MesaFormat */
+   GL_YCBCR_MESA,                      /* BaseFormat */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   2,                                  /* TexelBytes */
+   fetch_1d_texel_ycbcr,               /* FetchTexel1D */
+   fetch_2d_texel_ycbcr,               /* FetchTexel2D */
+   fetch_3d_texel_ycbcr,               /* FetchTexel3D */
+};
 
-/* =============================================================
- * Null format:
- */
+const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
+   MESA_FORMAT_YCBCR_REV,              /* MesaFormat */
+   GL_YCBCR_MESA,                      /* BaseFormat */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   2,                                  /* TexelBytes */
+   fetch_1d_texel_ycbcr_rev,           /* FetchTexel1D */
+   fetch_2d_texel_ycbcr_rev,           /* FetchTexel2D */
+   fetch_3d_texel_ycbcr_rev,           /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_rgb_fxt1 = {
+   MESA_FORMAT_RGB_FXT1,               /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   4, /*approx*/                       /* RedBits */
+   4, /*approx*/                       /* GreenBits */
+   4, /*approx*/                       /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* TexelBytes */
+   NULL, /*impossible*/                /* FetchTexel1D */
+   fetch_2d_texel_rgb_fxt1,            /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_rgba_fxt1 = {
+   MESA_FORMAT_RGBA_FXT1,              /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   4, /*approx*/                       /* RedBits */
+   4, /*approx*/                       /* GreenBits */
+   4, /*approx*/                       /* BlueBits */
+   1, /*approx*/                       /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* TexelBytes */
+   NULL, /*impossible*/                /* FetchTexel1D */
+   fetch_2d_texel_rgba_fxt1,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_rgb_dxt1 = {
+   MESA_FORMAT_RGB_DXT1,               /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   4, /*approx*/                       /* RedBits */
+   4, /*approx*/                       /* GreenBits */
+   4, /*approx*/                       /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* TexelBytes */
+   NULL, /*impossible*/                /* FetchTexel1D */
+   fetch_2d_texel_rgb_dxt1,            /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_rgba_dxt1 = {
+   MESA_FORMAT_RGBA_DXT1,              /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   4, /*approx*/                       /* RedBits */
+   4, /*approx*/                       /* GreenBits */
+   4, /*approx*/                       /* BlueBits */
+   1, /*approx*/                       /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* TexelBytes */
+   NULL, /*impossible*/                /* FetchTexel1D */
+   fetch_2d_texel_rgba_dxt1,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_rgba_dxt3 = {
+   MESA_FORMAT_RGBA_DXT3,              /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   4, /*approx*/                       /* RedBits */
+   4, /*approx*/                       /* GreenBits */
+   4, /*approx*/                       /* BlueBits */
+   4, /*approx*/                       /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* TexelBytes */
+   NULL, /*impossible*/                /* FetchTexel1D */
+   fetch_2d_texel_rgba_dxt3,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_rgba_dxt5 = {
+   MESA_FORMAT_RGBA_DXT5,              /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   4,/*approx*/                                /* RedBits */
+   4,/*approx*/                                /* GreenBits */
+   4,/*approx*/                                /* BlueBits */
+   4,/*approx*/                                /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* TexelBytes */
+   NULL, /*impossible*/                /* FetchTexel1D */
+   fetch_2d_texel_rgba_dxt5,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+};
+
+
+/* Big-endian */
+#if 0
+const struct gl_texture_format _mesa_texformat_abgr8888 = {
+   MESA_FORMAT_ABGR8888,               /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_INT_8_8_8_8,            /* Type */
+   8,                                  /* RedBits */
+   8,                                  /* GreenBits */
+   8,                                  /* BlueBits */
+   8,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4,                                  /* TexelBytes */
+   fetch_1d_texel_abgr8888,            /* FetchTexel1D */
+   fetch_2d_texel_abgr8888,            /* FetchTexel2D */
+   fetch_3d_texel_abgr8888,            /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgra8888 = {
+   MESA_FORMAT_BGRA8888,               /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_INT_8_8_8_8,            /* Type */
+   8,                                  /* RedBits */
+   8,                                  /* GreenBits */
+   8,                                  /* BlueBits */
+   8,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4,                                  /* TexelBytes */
+   fetch_1d_texel_bgra8888,            /* FetchTexel1D */
+   fetch_2d_texel_bgra8888,            /* FetchTexel2D */
+   fetch_3d_texel_bgra8888,            /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgr888 = {
+   MESA_FORMAT_BGR888,                 /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   GL_UNSIGNED_BYTE,                   /* Type */
+   8,                                  /* RedBits */
+   8,                                  /* GreenBits */
+   8,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   3,                                  /* TexelBytes */
+   fetch_1d_texel_bgr888,              /* FetchTexel1D */
+   fetch_2d_texel_bgr888,              /* FetchTexel2D */
+   fetch_3d_texel_bgr888,              /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgr565 = {
+   MESA_FORMAT_BGR565,                 /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   GL_UNSIGNED_SHORT_5_6_5,            /* Type */
+   5,                                  /* RedBits */
+   6,                                  /* GreenBits */
+   5,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   2,                                  /* TexelBytes */
+   fetch_1d_texel_bgr565,              /* FetchTexel1D */
+   fetch_2d_texel_bgr565,              /* FetchTexel2D */
+   fetch_3d_texel_bgr565,              /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgra4444 = {
+   MESA_FORMAT_BGRA4444,               /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_SHORT_4_4_4_4_REV,      /* Type */
+   4,                                  /* RedBits */
+   4,                                  /* GreenBits */
+   4,                                  /* BlueBits */
+   4,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   2,                                  /* TexelBytes */
+   fetch_1d_texel_bgra4444,            /* FetchTexel1D */
+   fetch_2d_texel_bgra4444,            /* FetchTexel2D */
+   fetch_3d_texel_bgra4444,            /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgra5551 = {
+   MESA_FORMAT_BGRA5551,               /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_SHORT_1_5_5_5_REV,      /* Type */
+   5,                                  /* RedBits */
+   5,                                  /* GreenBits */
+   5,                                  /* BlueBits */
+   1,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   2,                                  /* TexelBytes */
+   fetch_1d_texel_bgra1555,            /* FetchTexel1D */
+   fetch_2d_texel_bgra1555,            /* FetchTexel2D */
+   fetch_3d_texel_bgra1555,            /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_la88 = {
+   MESA_FORMAT_LA88,                   /* MesaFormat */
+   GL_LUMINANCE_ALPHA,                 /* BaseFormat */
+   GL_UNSIGNED_BYTE,                   /* Type */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   8,                                  /* AlphaBits */
+   8,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   2,                                  /* TexelBytes */
+   fetch_1d_texel_la88,                        /* FetchTexel1D */
+   fetch_2d_texel_la88,                        /* FetchTexel2D */
+   fetch_3d_texel_la88,                        /* FetchTexel3D */
+};
+
+const struct gl_texture_format _mesa_texformat_bgr233 = {
+   MESA_FORMAT_BGR233,                 /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   GL_UNSIGNED_BYTE_3_3_2,             /* Type */
+   3,                                  /* RedBits */
+   3,                                  /* GreenBits */
+   2,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   1,                                  /* TexelBytes */
+   fetch_1d_texel_bgr233,              /* FetchTexel1D */
+   fetch_2d_texel_bgr233,              /* FetchTexel2D */
+   fetch_3d_texel_bgr233,              /* FetchTexel3D */
+};
+#endif
+
+/*@}*/
+
+
+/***************************************************************/
+/** \name Null format (useful for proxy textures) */
+/*@{*/
 
 const struct gl_texture_format _mesa_null_texformat = {
    -1,                                 /* MesaFormat */
    0,                                  /* BaseFormat */
-   0,                                  /* Type */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -460,8 +727,21 @@ const struct gl_texture_format _mesa_null_texformat = {
    fetch_null_texel,                   /* FetchTexel3D */
 };
 
+/*@}*/
 
 
+/**
+ * Determine whether a given texture format is a hardware texture
+ * format.
+ *
+ * \param format texture format.
+ * 
+ * \return GL_TRUE if \p format is a hardware texture format, or GL_FALSE
+ * otherwise.
+ *
+ * \p format is a hardware texture format if gl_texture_format::MesaFormat is
+ * lower than _format::MESA_FORMAT_RGBA.
+ */
 GLboolean
 _mesa_is_hardware_tex_format( const struct gl_texture_format *format )
 {
@@ -469,10 +749,19 @@ _mesa_is_hardware_tex_format( const struct gl_texture_format *format )
 }
 
 
-/* Given an internal texture format or 1, 2, 3, 4 initialize the texture
- * image structure's default format and type information.  Drivers will
- * initialize these fields accordingly if they override the default
- * storage format.
+/**
+ * Choose an appropriate texture format.
+ *
+ * \param ctx GL context.
+ * \param internalFormat internal texture format.
+ * \param format pixel format.
+ * \param type data type.
+ *
+ * \return a pointer to a gl_texture_format in which to store the texture on
+ * success, or NULL on failure.
+ * 
+ * This is called via dd_function_table::ChooseTextureFormat.  Hardware drivers
+ * typically override this function with a specialized version.
  */
 const struct gl_texture_format *
 _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
@@ -560,13 +849,130 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
    case GL_DEPTH_COMPONENT16_SGIX:
    case GL_DEPTH_COMPONENT24_SGIX:
    case GL_DEPTH_COMPONENT32_SGIX:
-      if ( !ctx->Extensions.SGIX_depth_texture )
-        _mesa_problem( ctx, "depth format without GL_SGIX_depth_texture" );
+      if (!ctx->Extensions.SGIX_depth_texture)
+        _mesa_problem(ctx, "depth format without GL_SGIX_depth_texture");
       return &_mesa_texformat_depth_component;
 
+   case GL_COMPRESSED_ALPHA_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      return &_mesa_texformat_alpha;
+   case GL_COMPRESSED_LUMINANCE_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      return &_mesa_texformat_luminance;
+   case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      return &_mesa_texformat_luminance_alpha;
+   case GL_COMPRESSED_INTENSITY_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      return &_mesa_texformat_intensity;
+   case GL_COMPRESSED_RGB_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      if (ctx->Extensions.TDFX_texture_compression_FXT1)
+         return &_mesa_texformat_rgb_fxt1;
+      else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc)
+         return &_mesa_texformat_rgb_dxt1;
+      return &_mesa_texformat_rgb;
+   case GL_COMPRESSED_RGBA_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      if (ctx->Extensions.TDFX_texture_compression_FXT1)
+         return &_mesa_texformat_rgba_fxt1;
+      else if (ctx->Extensions.EXT_texture_compression_s3tc || ctx->Extensions.S3_s3tc)
+         return &_mesa_texformat_rgba_dxt3;  /* Not rgba_dxt1!  See the spec */
+      return &_mesa_texformat_rgba;
+
+   /* GL_MESA_ycrcr_texture */
+   case GL_YCBCR_MESA:
+      if (type == GL_UNSIGNED_SHORT_8_8_MESA)
+         return &_mesa_texformat_ycbcr;
+      else
+         return &_mesa_texformat_ycbcr_rev;
+
+   /* GL_3DFX_texture_compression_FXT1 */
+   case GL_COMPRESSED_RGB_FXT1_3DFX:
+      if (ctx->Extensions.TDFX_texture_compression_FXT1)
+         return &_mesa_texformat_rgb_fxt1;
+      else
+         return NULL;
+   case GL_COMPRESSED_RGBA_FXT1_3DFX:
+      if (ctx->Extensions.TDFX_texture_compression_FXT1)
+         return &_mesa_texformat_rgba_fxt1;
+      else
+         return NULL;
+
+   /* GL_EXT_texture_compression_s3tc */
+   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+      if (ctx->Extensions.EXT_texture_compression_s3tc)
+         return &_mesa_texformat_rgb_dxt1;
+      else
+         return NULL;
+   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+      if (ctx->Extensions.EXT_texture_compression_s3tc)
+         return &_mesa_texformat_rgba_dxt1;
+      else
+         return NULL;
+   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+      if (ctx->Extensions.EXT_texture_compression_s3tc)
+         return &_mesa_texformat_rgba_dxt3;
+      else
+         return NULL;
+   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+      if (ctx->Extensions.EXT_texture_compression_s3tc)
+         return &_mesa_texformat_rgba_dxt5;
+      else
+         return NULL;
+
+   /* GL_S3_s3tc */
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
+      if (ctx->Extensions.S3_s3tc)
+         return &_mesa_texformat_rgb_dxt1;
+      else
+         return NULL;
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
+      if (ctx->Extensions.S3_s3tc)
+         return &_mesa_texformat_rgba_dxt3;
+      else
+         return NULL;
+
    default:
-      _mesa_problem( ctx, "unexpected format in _mesa_choose_tex_format()" );
-      printf("intformat = %d %x\n", internalFormat, internalFormat );
+      _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
       return NULL;
    }
 }
+
+
+/**
+ * Return the base texture format for the given compressed format
+ * 
+ * Called via dd_function_table::Driver.BaseCompressedTexFormat.
+ * This function is used by software rasterizers.  Hardware drivers
+ * which support texture compression should not use this function but
+ * a specialized function instead.
+ */
+GLint
+_mesa_base_compressed_texformat(GLcontext *ctx, GLint intFormat)
+{
+   switch (intFormat) {
+   case GL_COMPRESSED_ALPHA_ARB:
+      return GL_ALPHA;
+   case GL_COMPRESSED_LUMINANCE_ARB:
+      return GL_LUMINANCE;
+   case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
+      return GL_LUMINANCE_ALPHA;
+   case GL_COMPRESSED_INTENSITY_ARB:
+      return GL_INTENSITY;
+   case GL_COMPRESSED_RGB_ARB:
+      return GL_RGB;
+   case GL_COMPRESSED_RGBA_ARB:
+      return GL_RGBA;
+   default:
+      return -1;  /* not a recognized compressed format */
+   }
+}