Header file clean-up:
[mesa.git] / src / mesa / main / texformat.c
index 8c770f664a47d43628c54ffbc5a38cdc5def524e..54257732e2133aeda412c75647bf2c3f691a3df4 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: texformat.c,v 1.7 2001/03/30 14:44:43 gareth Exp $ */
+/* $Id: texformat.c,v 1.17 2002/10/24 23:57:21 brianp Exp $ */
 
 /*
  * Mesa 3-D graphics library
  *    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 "imports.h"
 #include "mmath.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:
@@ -74,8 +69,7 @@ static void fetch_null_texel( const struct gl_texture_image *texImage,
 
 const struct gl_texture_format _mesa_texformat_rgba = {
    MESA_FORMAT_RGBA,                   /* MesaFormat */
-   GL_RGBA,                            /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_RGBA,                            /* BaseFormat */
    CHAN_BITS,                          /* RedBits */
    CHAN_BITS,                          /* GreenBits */
    CHAN_BITS,                          /* BlueBits */
@@ -92,8 +86,7 @@ const struct gl_texture_format _mesa_texformat_rgba = {
 
 const struct gl_texture_format _mesa_texformat_rgb = {
    MESA_FORMAT_RGB,                    /* MesaFormat */
-   GL_RGB,                             /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_RGB,                             /* BaseFormat */
    CHAN_BITS,                          /* RedBits */
    CHAN_BITS,                          /* GreenBits */
    CHAN_BITS,                          /* BlueBits */
@@ -110,8 +103,7 @@ const struct gl_texture_format _mesa_texformat_rgb = {
 
 const struct gl_texture_format _mesa_texformat_alpha = {
    MESA_FORMAT_ALPHA,                  /* MesaFormat */
-   GL_ALPHA,                           /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_ALPHA,                           /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -128,8 +120,7 @@ const struct gl_texture_format _mesa_texformat_alpha = {
 
 const struct gl_texture_format _mesa_texformat_luminance = {
    MESA_FORMAT_LUMINANCE,              /* MesaFormat */
-   GL_LUMINANCE,                       /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_LUMINANCE,                       /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -146,8 +137,7 @@ 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,                 /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_LUMINANCE_ALPHA,                 /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -164,8 +154,7 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha = {
 
 const struct gl_texture_format _mesa_texformat_intensity = {
    MESA_FORMAT_INTENSITY,              /* MesaFormat */
-   GL_INTENSITY,                       /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_INTENSITY,                       /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -182,8 +171,7 @@ 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,                     /* IntFormat */
-   CHAN_TYPE,                          /* Type */
+   GL_COLOR_INDEX,                     /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -200,8 +188,7 @@ 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,                 /* IntFormat */
-   GL_FLOAT,                           /* Type */
+   GL_DEPTH_COMPONENT,                 /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -223,8 +210,7 @@ const struct gl_texture_format _mesa_texformat_depth_component = {
 
 const struct gl_texture_format _mesa_texformat_rgba8888 = {
    MESA_FORMAT_RGBA8888,               /* MesaFormat */
-   GL_RGBA,                            /* IntFormat */
-   GL_UNSIGNED_INT_8_8_8_8,            /* Type */
+   GL_RGBA,                            /* BaseFormat */
    8,                                  /* RedBits */
    8,                                  /* GreenBits */
    8,                                  /* BlueBits */
@@ -241,8 +227,7 @@ const struct gl_texture_format _mesa_texformat_rgba8888 = {
 
 const struct gl_texture_format _mesa_texformat_argb8888 = {
    MESA_FORMAT_ARGB8888,               /* MesaFormat */
-   GL_BGRA,                            /* IntFormat */
-   GL_UNSIGNED_INT_8_8_8_8_REV,                /* Type */
+   GL_RGBA,                            /* BaseFormat */
    8,                                  /* RedBits */
    8,                                  /* GreenBits */
    8,                                  /* BlueBits */
@@ -259,8 +244,7 @@ const struct gl_texture_format _mesa_texformat_argb8888 = {
 
 const struct gl_texture_format _mesa_texformat_rgb888 = {
    MESA_FORMAT_RGB888,                 /* MesaFormat */
-   GL_BGR,                             /* IntFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
+   GL_RGB,                             /* BaseFormat */
    8,                                  /* RedBits */
    8,                                  /* GreenBits */
    8,                                  /* BlueBits */
@@ -277,8 +261,7 @@ const struct gl_texture_format _mesa_texformat_rgb888 = {
 
 const struct gl_texture_format _mesa_texformat_rgb565 = {
    MESA_FORMAT_RGB565,                 /* MesaFormat */
-   GL_RGB,                             /* IntFormat */
-   GL_UNSIGNED_SHORT_5_6_5,            /* Type */
+   GL_RGB,                             /* BaseFormat */
    5,                                  /* RedBits */
    6,                                  /* GreenBits */
    5,                                  /* BlueBits */
@@ -295,8 +278,7 @@ const struct gl_texture_format _mesa_texformat_rgb565 = {
 
 const struct gl_texture_format _mesa_texformat_argb4444 = {
    MESA_FORMAT_ARGB4444,               /* MesaFormat */
-   GL_BGRA,                            /* IntFormat */
-   GL_UNSIGNED_SHORT_4_4_4_4_REV,      /* Type */
+   GL_RGBA,                            /* BaseFormat */
    4,                                  /* RedBits */
    4,                                  /* GreenBits */
    4,                                  /* BlueBits */
@@ -313,8 +295,7 @@ const struct gl_texture_format _mesa_texformat_argb4444 = {
 
 const struct gl_texture_format _mesa_texformat_argb1555 = {
    MESA_FORMAT_ARGB1555,               /* MesaFormat */
-   GL_BGRA,                            /* IntFormat */
-   GL_UNSIGNED_SHORT_1_5_5_5_REV,      /* Type */
+   GL_RGBA,                            /* BaseFormat */
    5,                                  /* RedBits */
    5,                                  /* GreenBits */
    5,                                  /* BlueBits */
@@ -331,8 +312,7 @@ const struct gl_texture_format _mesa_texformat_argb1555 = {
 
 const struct gl_texture_format _mesa_texformat_al88 = {
    MESA_FORMAT_AL88,                   /* MesaFormat */
-   GL_LUMINANCE_ALPHA,                 /* IntFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
+   GL_LUMINANCE_ALPHA,                 /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -349,8 +329,7 @@ const struct gl_texture_format _mesa_texformat_al88 = {
 
 const struct gl_texture_format _mesa_texformat_rgb332 = {
    MESA_FORMAT_RGB332,                 /* MesaFormat */
-   GL_RGB,                             /* IntFormat */
-   GL_UNSIGNED_BYTE_3_3_2,             /* Type */
+   GL_RGB,                             /* BaseFormat */
    3,                                  /* RedBits */
    3,                                  /* GreenBits */
    2,                                  /* BlueBits */
@@ -367,8 +346,7 @@ const struct gl_texture_format _mesa_texformat_rgb332 = {
 
 const struct gl_texture_format _mesa_texformat_a8 = {
    MESA_FORMAT_A8,                     /* MesaFormat */
-   GL_ALPHA,                           /* IntFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
+   GL_ALPHA,                           /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -385,8 +363,7 @@ const struct gl_texture_format _mesa_texformat_a8 = {
 
 const struct gl_texture_format _mesa_texformat_l8 = {
    MESA_FORMAT_L8,                     /* MesaFormat */
-   GL_LUMINANCE,                       /* IntFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
+   GL_LUMINANCE,                       /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -403,8 +380,7 @@ const struct gl_texture_format _mesa_texformat_l8 = {
 
 const struct gl_texture_format _mesa_texformat_i8 = {
    MESA_FORMAT_I8,                     /* MesaFormat */
-   GL_INTENSITY,                       /* IntFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
+   GL_INTENSITY,                       /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -421,8 +397,7 @@ const struct gl_texture_format _mesa_texformat_i8 = {
 
 const struct gl_texture_format _mesa_texformat_ci8 = {
    MESA_FORMAT_CI8,                    /* MesaFormat */
-   GL_COLOR_INDEX,                     /* IntFormat */
-   GL_UNSIGNED_BYTE,                   /* Type */
+   GL_COLOR_INDEX,                     /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -437,15 +412,196 @@ 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 */
+};
+
+
+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 */
+};
+
+
+/* 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
 
 /* =============================================================
- * Null format:
+ * Null format (useful for proxy textures):
  */
 
 const struct gl_texture_format _mesa_null_texformat = {
    -1,                                 /* MesaFormat */
-   0,                                  /* IntFormat */
-   0,                                  /* Type */
+   0,                                  /* BaseFormat */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
@@ -461,27 +617,25 @@ const struct gl_texture_format _mesa_null_texformat = {
 };
 
 
+GLboolean
+_mesa_is_hardware_tex_format( const struct gl_texture_format *format )
+{
+   return (format->MesaFormat < MESA_FORMAT_RGBA);
+}
 
-/* 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.
+
+/* Given an internal texture format (or 1, 2, 3, 4) return a pointer
+ * to a gl_texture_format which which to store the texture.
+ * This is called via ctx->Driver.ChooseTextureFormat().
+ * Hardware drivers typically override this function with a specialized
+ * version.
  */
-void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
-                           struct gl_texture_image *texImage )
+const struct gl_texture_format *
+_mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
+                         GLenum format, GLenum type )
 {
-   const struct gl_texture_format *texFormat;
-
-   /* Ask the driver for the base format, if it doesn't know, it will
-    * return -1;
-    */
-   if ( ctx->Driver.BaseCompressedTexFormat ) {
-      GLint format = 0;                        /* Silence compiler warning */
-      format = (*ctx->Driver.BaseCompressedTexFormat)( ctx, format );
-      if ( format >= 0 ) {
-        internalFormat = format;
-      }
-   }
+   (void) format;
+   (void) type;
 
    switch ( internalFormat ) {
       /* GH: Bias towards GL_RGB, GL_RGBA texture formats.  This has
@@ -490,13 +644,11 @@ void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
        */
    case 4:                             /* Quake3 uses this... */
    case GL_RGBA:
-      texFormat = &_mesa_texformat_rgba;
-      break;
+      return &_mesa_texformat_rgba;
 
    case 3:                             /* ... and this. */
    case GL_RGB:
-      texFormat = &_mesa_texformat_rgb;
-      break;
+      return &_mesa_texformat_rgb;
 
       /* GH: Okay, keep checking as normal.  Still test for GL_RGB,
        * GL_RGBA formats first.
@@ -508,8 +660,7 @@ void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
    case GL_RGB10_A2:
    case GL_RGBA12:
    case GL_RGBA16:
-      texFormat = &_mesa_texformat_rgba;
-      break;
+      return &_mesa_texformat_rgba;
 
    case GL_R3_G3_B2:
    case GL_RGB4:
@@ -518,16 +669,14 @@ void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
    case GL_RGB10:
    case GL_RGB12:
    case GL_RGB16:
-      texFormat = &_mesa_texformat_rgb;
-      break;
+      return &_mesa_texformat_rgb;
 
    case GL_ALPHA:
    case GL_ALPHA4:
    case GL_ALPHA8:
    case GL_ALPHA12:
    case GL_ALPHA16:
-      texFormat = &_mesa_texformat_alpha;
-      break;
+      return &_mesa_texformat_alpha;
 
    case 1:
    case GL_LUMINANCE:
@@ -535,8 +684,7 @@ void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
    case GL_LUMINANCE8:
    case GL_LUMINANCE12:
    case GL_LUMINANCE16:
-      texFormat = &_mesa_texformat_luminance;
-      break;
+      return &_mesa_texformat_luminance;
 
    case 2:
    case GL_LUMINANCE_ALPHA:
@@ -546,16 +694,14 @@ void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
    case GL_LUMINANCE12_ALPHA4:
    case GL_LUMINANCE12_ALPHA12:
    case GL_LUMINANCE16_ALPHA16:
-      texFormat = &_mesa_texformat_luminance_alpha;
-      break;
+      return &_mesa_texformat_luminance_alpha;
 
    case GL_INTENSITY:
    case GL_INTENSITY4:
    case GL_INTENSITY8:
    case GL_INTENSITY12:
    case GL_INTENSITY16:
-      texFormat = &_mesa_texformat_intensity;
-      break;
+      return &_mesa_texformat_intensity;
 
    case GL_COLOR_INDEX:
    case GL_COLOR_INDEX1_EXT:
@@ -564,22 +710,81 @@ void _mesa_init_tex_format( GLcontext *ctx, GLenum internalFormat,
    case GL_COLOR_INDEX8_EXT:
    case GL_COLOR_INDEX12_EXT:
    case GL_COLOR_INDEX16_EXT:
-      texFormat = &_mesa_texformat_color_index;
-      break;
+      return &_mesa_texformat_color_index;
 
    case GL_DEPTH_COMPONENT:
    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" );
-      texFormat = &_mesa_texformat_depth_component;
-      break;
+      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");
+      return &_mesa_texformat_rgb;
+   case GL_COMPRESSED_RGBA_ARB:
+      if (!ctx->Extensions.ARB_texture_compression)
+        _mesa_problem(ctx, "texture compression extension not enabled");
+      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;
 
    default:
-      _mesa_problem( ctx, "unexpected format in _mesa_init_tex_format" );
-      return;
+      _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
+      return NULL;
    }
+}
+
+
 
-   texImage->TexFormat = texFormat;
+
+/*
+ * Return the base texture format for the given compressed format
+ * Called via ctx->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 */
+   }
 }