Imported the Savage DRI driver from the savage-2-0-0-branch of DRI CVS
[mesa.git] / src / mesa / main / texformat.c
index 54257732e2133aeda412c75647bf2c3f691a3df4..7222b77eb597608f225e27462c40aef516f01027 100644 (file)
@@ -1,10 +1,15 @@
-/* $Id: texformat.c,v 1.17 2002/10/24 23:57:21 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>
  */
 
+
 #include "glheader.h"
 #include "colormac.h"
 #include "context.h"
 #include "image.h"
 #include "imports.h"
-#include "mmath.h"
 #include "mtypes.h"
 #include "texformat.h"
 #include "teximage.h"
 #include "texstate.h"
 
 
-/* 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 )
+                             GLint i, GLint j, GLint k, GLchan *texel )
 {
-   GLchan *rgba = (GLchan *) texel;
-   rgba[RCOMP] = 0;
-   rgba[GCOMP] = 0;
-   rgba[BCOMP] = 0;
-   rgba[ACOMP] = 0;
+   texel[RCOMP] = 0;
+   texel[GCOMP] = 0;
+   texel[BCOMP] = 0;
+   texel[ACOMP] = 0;
+   _mesa_warning(NULL, "fetch_null_texel() called!");
 }
 
+static void fetch_null_texelf( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   texel[RCOMP] = 0.0;
+   texel[GCOMP] = 0.0;
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 0.0;
+   _mesa_warning(NULL, "fetch_null_texelf() called!");
+}
 
-/* =============================================================
- * Default GLchan-based formats:
- */
+
+/***************************************************************/
+/** \name Default GLchan-based formats */
+/*@{*/
 
 const struct gl_texture_format _mesa_texformat_rgba = {
    MESA_FORMAT_RGBA,                   /* MesaFormat */
@@ -79,9 +94,12 @@ const struct gl_texture_format _mesa_texformat_rgba = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    4 * CHAN_BITS / 8,                  /* TexelBytes */
-   fetch_1d_texel_rgba,                        /* FetchTexel1D */
-   fetch_2d_texel_rgba,                        /* FetchTexel2D */
-   fetch_3d_texel_rgba,                        /* FetchTexel3D */
+   fetch_texel_1d_rgba,                        /* FetchTexel1D */
+   fetch_texel_2d_rgba,                        /* FetchTexel2D */
+   fetch_texel_3d_rgba,                        /* FetchTexel3D */
+   fetch_texel_1d_f_rgba,              /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba,              /* FetchTexel2Df */
+   fetch_texel_3d_f_rgba,              /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_rgb = {
@@ -96,9 +114,12 @@ const struct gl_texture_format _mesa_texformat_rgb = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    3 * CHAN_BITS / 8,                  /* TexelBytes */
-   fetch_1d_texel_rgb,                 /* FetchTexel1D */
-   fetch_2d_texel_rgb,                 /* FetchTexel2D */
-   fetch_3d_texel_rgb,                 /* FetchTexel3D */
+   fetch_texel_1d_rgb,                 /* FetchTexel1D */
+   fetch_texel_2d_rgb,                 /* FetchTexel2D */
+   fetch_texel_3d_rgb,                 /* FetchTexel3D */
+   fetch_texel_1d_f_rgb,               /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb,               /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb,               /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_alpha = {
@@ -113,9 +134,12 @@ const struct gl_texture_format _mesa_texformat_alpha = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    CHAN_BITS / 8,                      /* TexelBytes */
-   fetch_1d_texel_alpha,               /* FetchTexel1D */
-   fetch_2d_texel_alpha,               /* FetchTexel2D */
-   fetch_3d_texel_alpha,               /* FetchTexel3D */
+   fetch_texel_1d_alpha,               /* FetchTexel1D */
+   fetch_texel_2d_alpha,               /* FetchTexel2D */
+   fetch_texel_3d_alpha,               /* FetchTexel3D */
+   fetch_texel_1d_f_alpha,             /* FetchTexel1Df */
+   fetch_texel_2d_f_alpha,             /* FetchTexel2Df */
+   fetch_texel_3d_f_alpha,             /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_luminance = {
@@ -130,9 +154,12 @@ const struct gl_texture_format _mesa_texformat_luminance = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    CHAN_BITS / 8,                      /* TexelBytes */
-   fetch_1d_texel_luminance,           /* FetchTexel1D */
-   fetch_2d_texel_luminance,           /* FetchTexel2D */
-   fetch_3d_texel_luminance,           /* FetchTexel3D */
+   fetch_texel_1d_luminance,           /* FetchTexel1D */
+   fetch_texel_2d_luminance,           /* FetchTexel2D */
+   fetch_texel_3d_luminance,           /* FetchTexel3D */
+   fetch_texel_1d_f_luminance,         /* FetchTexel1Df */
+   fetch_texel_2d_f_luminance,         /* FetchTexel2Df */
+   fetch_texel_3d_f_luminance,         /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_luminance_alpha = {
@@ -147,9 +174,12 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2 * CHAN_BITS / 8,                  /* TexelBytes */
-   fetch_1d_texel_luminance_alpha,     /* FetchTexel1D */
-   fetch_2d_texel_luminance_alpha,     /* FetchTexel2D */
-   fetch_3d_texel_luminance_alpha,     /* FetchTexel3D */
+   fetch_texel_1d_luminance_alpha,     /* FetchTexel1D */
+   fetch_texel_2d_luminance_alpha,     /* FetchTexel2D */
+   fetch_texel_3d_luminance_alpha,     /* FetchTexel3D */
+   fetch_texel_1d_f_luminance_alpha,   /* FetchTexel1Df */
+   fetch_texel_2d_f_luminance_alpha,   /* FetchTexel2Df */
+   fetch_texel_3d_f_luminance_alpha,   /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_intensity = {
@@ -164,9 +194,12 @@ const struct gl_texture_format _mesa_texformat_intensity = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    CHAN_BITS / 8,                      /* TexelBytes */
-   fetch_1d_texel_intensity,           /* FetchTexel1D */
-   fetch_2d_texel_intensity,           /* FetchTexel2D */
-   fetch_3d_texel_intensity,           /* FetchTexel3D */
+   fetch_texel_1d_intensity,           /* FetchTexel1D */
+   fetch_texel_2d_intensity,           /* FetchTexel2D */
+   fetch_texel_3d_intensity,           /* FetchTexel3D */
+   fetch_texel_1d_f_intensity,         /* FetchTexel1Df */
+   fetch_texel_2d_f_intensity,         /* FetchTexel2Df */
+   fetch_texel_3d_f_intensity,         /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_color_index = {
@@ -181,11 +214,15 @@ const struct gl_texture_format _mesa_texformat_color_index = {
    CHAN_BITS,                          /* IndexBits */
    0,                                  /* DepthBits */
    CHAN_BITS / 8,                      /* TexelBytes */
-   fetch_1d_texel_color_index,         /* FetchTexel1D */
-   fetch_2d_texel_color_index,         /* FetchTexel2D */
-   fetch_3d_texel_color_index,         /* FetchTexel3D */
+   fetch_texel_1d_color_index,         /* FetchTexel1D */
+   fetch_texel_2d_color_index,         /* FetchTexel2D */
+   fetch_texel_3d_color_index,         /* FetchTexel3D */
+   fetch_texel_1d_f_color_index,       /* FetchTexel1Df */
+   fetch_texel_2d_f_color_index,       /* FetchTexel2Df */
+   fetch_texel_3d_f_color_index,       /* FetchTexel3Df */
 };
 
+/* XXX someday implement 16, 24 and 32-bit integer depth images */
 const struct gl_texture_format _mesa_texformat_depth_component = {
    MESA_FORMAT_DEPTH_COMPONENT,                /* MesaFormat */
    GL_DEPTH_COMPONENT,                 /* BaseFormat */
@@ -198,15 +235,101 @@ const struct gl_texture_format _mesa_texformat_depth_component = {
    0,                                  /* IndexBits */
    sizeof(GLfloat) * 8,                        /* DepthBits */
    sizeof(GLfloat),                    /* TexelBytes */
-   fetch_1d_texel_depth_component,     /* FetchTexel1D */
-   fetch_2d_texel_depth_component,     /* FetchTexel2D */
-   fetch_3d_texel_depth_component,     /* FetchTexel3D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_depth_component,   /* FetchTexel1Df */
+   fetch_texel_2d_f_depth_component,   /* FetchTexel2Df */
+   fetch_texel_3d_f_depth_component,   /* FetchTexel3Df */
 };
 
+const struct gl_texture_format _mesa_texformat_rgba_float32 = {
+   MESA_FORMAT_RGBA_FLOAT32,           /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   8 * sizeof(GLfloat),                        /* RedBits */
+   8 * sizeof(GLfloat),                        /* GreenBits */
+   8 * sizeof(GLfloat),                        /* BlueBits */
+   8 * sizeof(GLfloat),                        /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLfloat),                        /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgba_f32,          /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_f32,          /* FetchTexel2Df */
+   fetch_texel_3d_f_rgba_f32,          /* FetchTexel3Df */
+};
 
-/* =============================================================
- * Hardware formats:
- */
+const struct gl_texture_format _mesa_texformat_rgba_float16 = {
+   MESA_FORMAT_RGBA_FLOAT16,           /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   8 * sizeof(GLhalfNV),               /* RedBits */
+   8 * sizeof(GLhalfNV),               /* GreenBits */
+   8 * sizeof(GLhalfNV),               /* BlueBits */
+   8 * sizeof(GLhalfNV),               /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLhalfNV),                       /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgba_f16,          /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_f16,          /* FetchTexel2Df */
+   fetch_texel_3d_f_rgba_f16,          /* FetchTexel3Df */
+};
+
+const struct gl_texture_format _mesa_texformat_rgb_float32 = {
+   MESA_FORMAT_RGB_FLOAT32,            /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   8 * sizeof(GLfloat),                        /* RedBits */
+   8 * sizeof(GLfloat),                        /* GreenBits */
+   8 * sizeof(GLfloat),                        /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLfloat),                        /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgb_f32,           /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb_f32,           /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb_f32,           /* FetchTexel3Df */
+};
+
+const struct gl_texture_format _mesa_texformat_rgb_float16 = {
+   MESA_FORMAT_RGB_FLOAT16,            /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
+   8 * sizeof(GLhalfNV),               /* RedBits */
+   8 * sizeof(GLhalfNV),               /* GreenBits */
+   8 * sizeof(GLhalfNV),               /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   4 * sizeof(GLhalfNV),                       /* TexelBytes */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_null_texel,                   /* FetchTexel1D */
+   fetch_texel_1d_f_rgb_f16,           /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb_f16,           /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb_f16,           /* FetchTexel3Df */
+};
+
+
+/*@}*/
+
+
+/***************************************************************/
+/** \name Hardware formats */
+/*@{*/
 
 const struct gl_texture_format _mesa_texformat_rgba8888 = {
    MESA_FORMAT_RGBA8888,               /* MesaFormat */
@@ -220,9 +343,12 @@ const struct gl_texture_format _mesa_texformat_rgba8888 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    4,                                  /* TexelBytes */
-   fetch_1d_texel_rgba8888,            /* FetchTexel1D */
-   fetch_2d_texel_rgba8888,            /* FetchTexel2D */
-   fetch_3d_texel_rgba8888,            /* FetchTexel3D */
+   fetch_texel_1d_rgba8888,            /* FetchTexel1D */
+   fetch_texel_2d_rgba8888,            /* FetchTexel2D */
+   fetch_texel_3d_rgba8888,            /* FetchTexel3D */
+   fetch_texel_1d_f_rgba8888,          /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba8888,          /* FetchTexel2Df */
+   fetch_texel_3d_f_rgba8888,          /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_argb8888 = {
@@ -237,9 +363,12 @@ const struct gl_texture_format _mesa_texformat_argb8888 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    4,                                  /* TexelBytes */
-   fetch_1d_texel_argb8888,            /* FetchTexel1D */
-   fetch_2d_texel_argb8888,            /* FetchTexel2D */
-   fetch_3d_texel_argb8888,            /* FetchTexel3D */
+   fetch_texel_1d_argb8888,            /* FetchTexel1D */
+   fetch_texel_2d_argb8888,            /* FetchTexel2D */
+   fetch_texel_3d_argb8888,            /* FetchTexel3D */
+   fetch_texel_1d_f_argb8888,          /* FetchTexel1Df */
+   fetch_texel_2d_f_argb8888,          /* FetchTexel2Df */
+   fetch_texel_3d_f_argb8888,          /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_rgb888 = {
@@ -254,9 +383,12 @@ const struct gl_texture_format _mesa_texformat_rgb888 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    3,                                  /* TexelBytes */
-   fetch_1d_texel_rgb888,              /* FetchTexel1D */
-   fetch_2d_texel_rgb888,              /* FetchTexel2D */
-   fetch_3d_texel_rgb888,              /* FetchTexel3D */
+   fetch_texel_1d_rgb888,              /* FetchTexel1D */
+   fetch_texel_2d_rgb888,              /* FetchTexel2D */
+   fetch_texel_3d_rgb888,              /* FetchTexel3D */
+   fetch_texel_1d_f_rgb888,            /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb888,            /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb888,            /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_rgb565 = {
@@ -271,9 +403,12 @@ const struct gl_texture_format _mesa_texformat_rgb565 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_rgb565,              /* FetchTexel1D */
-   fetch_2d_texel_rgb565,              /* FetchTexel2D */
-   fetch_3d_texel_rgb565,              /* FetchTexel3D */
+   fetch_texel_1d_rgb565,              /* FetchTexel1D */
+   fetch_texel_2d_rgb565,              /* FetchTexel2D */
+   fetch_texel_3d_rgb565,              /* FetchTexel3D */
+   fetch_texel_1d_f_rgb565,            /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb565,            /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb565,            /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_argb4444 = {
@@ -288,9 +423,12 @@ const struct gl_texture_format _mesa_texformat_argb4444 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_argb4444,            /* FetchTexel1D */
-   fetch_2d_texel_argb4444,            /* FetchTexel2D */
-   fetch_3d_texel_argb4444,            /* FetchTexel3D */
+   fetch_texel_1d_argb4444,            /* FetchTexel1D */
+   fetch_texel_2d_argb4444,            /* FetchTexel2D */
+   fetch_texel_3d_argb4444,            /* FetchTexel3D */
+   fetch_texel_1d_f_argb4444,          /* FetchTexel1Df */
+   fetch_texel_2d_f_argb4444,          /* FetchTexel2Df */
+   fetch_texel_3d_f_argb4444,          /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_argb1555 = {
@@ -305,9 +443,12 @@ const struct gl_texture_format _mesa_texformat_argb1555 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_argb1555,            /* FetchTexel1D */
-   fetch_2d_texel_argb1555,            /* FetchTexel2D */
-   fetch_3d_texel_argb1555,            /* FetchTexel3D */
+   fetch_texel_1d_argb1555,            /* FetchTexel1D */
+   fetch_texel_2d_argb1555,            /* FetchTexel2D */
+   fetch_texel_3d_argb1555,            /* FetchTexel3D */
+   fetch_texel_1d_f_argb1555,          /* FetchTexel1Df */
+   fetch_texel_2d_f_argb1555,          /* FetchTexel2Df */
+   fetch_texel_3d_f_argb1555,          /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_al88 = {
@@ -322,9 +463,12 @@ const struct gl_texture_format _mesa_texformat_al88 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_al88,                        /* FetchTexel1D */
-   fetch_2d_texel_al88,                        /* FetchTexel2D */
-   fetch_3d_texel_al88,                        /* FetchTexel3D */
+   fetch_texel_1d_al88,                        /* FetchTexel1D */
+   fetch_texel_2d_al88,                        /* FetchTexel2D */
+   fetch_texel_3d_al88,                        /* FetchTexel3D */
+   fetch_texel_1d_f_al88,              /* FetchTexel1Df */
+   fetch_texel_2d_f_al88,              /* FetchTexel2Df */
+   fetch_texel_3d_f_al88,              /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_rgb332 = {
@@ -339,9 +483,12 @@ const struct gl_texture_format _mesa_texformat_rgb332 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    1,                                  /* TexelBytes */
-   fetch_1d_texel_rgb332,              /* FetchTexel1D */
-   fetch_2d_texel_rgb332,              /* FetchTexel2D */
-   fetch_3d_texel_rgb332,              /* FetchTexel3D */
+   fetch_texel_1d_rgb332,              /* FetchTexel1D */
+   fetch_texel_2d_rgb332,              /* FetchTexel2D */
+   fetch_texel_3d_rgb332,              /* FetchTexel3D */
+   fetch_texel_1d_f_rgb332,            /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb332,            /* FetchTexel2Df */
+   fetch_texel_3d_f_rgb332,            /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_a8 = {
@@ -356,9 +503,12 @@ const struct gl_texture_format _mesa_texformat_a8 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    1,                                  /* TexelBytes */
-   fetch_1d_texel_a8,                  /* FetchTexel1D */
-   fetch_2d_texel_a8,                  /* FetchTexel2D */
-   fetch_3d_texel_a8,                  /* FetchTexel3D */
+   fetch_texel_1d_a8,                  /* FetchTexel1D */
+   fetch_texel_2d_a8,                  /* FetchTexel2D */
+   fetch_texel_3d_a8,                  /* FetchTexel3D */
+   fetch_texel_1d_f_a8,                        /* FetchTexel1Df */
+   fetch_texel_2d_f_a8,                        /* FetchTexel2Df */
+   fetch_texel_3d_f_a8,                        /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_l8 = {
@@ -373,9 +523,12 @@ const struct gl_texture_format _mesa_texformat_l8 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    1,                                  /* TexelBytes */
-   fetch_1d_texel_l8,                  /* FetchTexel1D */
-   fetch_2d_texel_l8,                  /* FetchTexel2D */
-   fetch_3d_texel_l8,                  /* FetchTexel3D */
+   fetch_texel_1d_l8,                  /* FetchTexel1D */
+   fetch_texel_2d_l8,                  /* FetchTexel2D */
+   fetch_texel_3d_l8,                  /* FetchTexel3D */
+   fetch_texel_1d_f_l8,                        /* FetchTexel1Df */
+   fetch_texel_2d_f_l8,                        /* FetchTexel2Df */
+   fetch_texel_3d_f_l8,                        /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_i8 = {
@@ -390,9 +543,12 @@ const struct gl_texture_format _mesa_texformat_i8 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    1,                                  /* TexelBytes */
-   fetch_1d_texel_i8,                  /* FetchTexel1D */
-   fetch_2d_texel_i8,                  /* FetchTexel2D */
-   fetch_3d_texel_i8,                  /* FetchTexel3D */
+   fetch_texel_1d_i8,                  /* FetchTexel1D */
+   fetch_texel_2d_i8,                  /* FetchTexel2D */
+   fetch_texel_3d_i8,                  /* FetchTexel3D */
+   fetch_texel_1d_f_i8,                        /* FetchTexel1Df */
+   fetch_texel_2d_f_i8,                        /* FetchTexel2Df */
+   fetch_texel_3d_f_i8,                        /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_ci8 = {
@@ -407,9 +563,12 @@ const struct gl_texture_format _mesa_texformat_ci8 = {
    8,                                  /* IndexBits */
    0,                                  /* DepthBits */
    1,                                  /* TexelBytes */
-   fetch_1d_texel_ci8,                 /* FetchTexel1D */
-   fetch_2d_texel_ci8,                 /* FetchTexel2D */
-   fetch_3d_texel_ci8,                 /* FetchTexel3D */
+   fetch_texel_1d_ci8,                 /* FetchTexel1D */
+   fetch_texel_2d_ci8,                 /* FetchTexel2D */
+   fetch_texel_3d_ci8,                 /* FetchTexel3D */
+   fetch_texel_1d_f_ci8,               /* FetchTexel1Df */
+   fetch_texel_2d_f_ci8,               /* FetchTexel2Df */
+   fetch_texel_3d_f_ci8,               /* FetchTexel3Df */
 };
 
 const struct gl_texture_format _mesa_texformat_ycbcr = {
@@ -424,12 +583,14 @@ const struct gl_texture_format _mesa_texformat_ycbcr = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_ycbcr,               /* FetchTexel1D */
-   fetch_2d_texel_ycbcr,               /* FetchTexel2D */
-   fetch_3d_texel_ycbcr,               /* FetchTexel3D */
+   fetch_texel_1d_ycbcr,               /* FetchTexel1D */
+   fetch_texel_2d_ycbcr,               /* FetchTexel2D */
+   fetch_texel_3d_ycbcr,               /* FetchTexel3D */
+   fetch_texel_1d_f_ycbcr,             /* FetchTexel1Df */
+   fetch_texel_2d_f_ycbcr,             /* FetchTexel2Df */
+   fetch_texel_3d_f_ycbcr,             /* FetchTexel3Df */
 };
 
-
 const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
    MESA_FORMAT_YCBCR_REV,              /* MesaFormat */
    GL_YCBCR_MESA,                      /* BaseFormat */
@@ -442,9 +603,132 @@ const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_ycbcr_rev,           /* FetchTexel1D */
-   fetch_2d_texel_ycbcr_rev,           /* FetchTexel2D */
-   fetch_3d_texel_ycbcr_rev,           /* FetchTexel3D */
+   fetch_texel_1d_ycbcr_rev,           /* FetchTexel1D */
+   fetch_texel_2d_ycbcr_rev,           /* FetchTexel2D */
+   fetch_texel_3d_ycbcr_rev,           /* FetchTexel3D */
+   fetch_texel_1d_f_ycbcr_rev,         /* FetchTexel1Df */
+   fetch_texel_2d_f_ycbcr_rev,         /* FetchTexel2Df */
+   fetch_texel_3d_f_ycbcr_rev,         /* FetchTexel3Df */
+};
+
+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_texel_2d_rgb_fxt1,            /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+   NULL, /*impossible*/                /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb_fxt1,          /* FetchTexel2Df */
+   NULL, /*impossible*/                /* FetchTexel3Df */
+};
+
+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_texel_2d_rgba_fxt1,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+   NULL, /*impossible*/                /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_fxt1,                 /* FetchTexel2Df */
+   NULL, /*impossible*/                /* FetchTexel3Df */
+};
+
+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_texel_2d_rgb_dxt1,            /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+   NULL, /*impossible*/                /* FetchTexel1Df */
+   fetch_texel_2d_f_rgb_dxt1,          /* FetchTexel2Df */
+   NULL, /*impossible*/                /* FetchTexel3Df */
+};
+
+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_texel_2d_rgba_dxt1,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+   NULL, /*impossible*/                /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_dxt1,                 /* FetchTexel2Df */
+   NULL, /*impossible*/                /* FetchTexel3Df */
+};
+
+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_texel_2d_rgba_dxt3,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+   NULL, /*impossible*/                /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_dxt3,                 /* FetchTexel2Df */
+   NULL, /*impossible*/                /* FetchTexel3Df */
+};
+
+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_texel_2d_rgba_dxt5,           /* FetchTexel2D */
+   NULL, /*impossible*/                /* FetchTexel3D */
+   NULL, /*impossible*/                /* FetchTexel1Df */
+   fetch_texel_2d_f_rgba_dxt5,                 /* FetchTexel2Df */
+   NULL, /*impossible*/                /* FetchTexel3Df */
 };
 
 
@@ -463,9 +747,10 @@ const struct gl_texture_format _mesa_texformat_abgr8888 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    4,                                  /* TexelBytes */
-   fetch_1d_texel_abgr8888,            /* FetchTexel1D */
-   fetch_2d_texel_abgr8888,            /* FetchTexel2D */
-   fetch_3d_texel_abgr8888,            /* FetchTexel3D */
+   fetch_texel_1d_abgr8888,            /* FetchTexel1D */
+   fetch_texel_2d_abgr8888,            /* FetchTexel2D */
+   fetch_texel_3d_abgr8888,            /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_bgra8888 = {
@@ -481,9 +766,10 @@ const struct gl_texture_format _mesa_texformat_bgra8888 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    4,                                  /* TexelBytes */
-   fetch_1d_texel_bgra8888,            /* FetchTexel1D */
-   fetch_2d_texel_bgra8888,            /* FetchTexel2D */
-   fetch_3d_texel_bgra8888,            /* FetchTexel3D */
+   fetch_texel_1d_bgra8888,            /* FetchTexel1D */
+   fetch_texel_2d_bgra8888,            /* FetchTexel2D */
+   fetch_texel_3d_bgra8888,            /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_bgr888 = {
@@ -499,9 +785,10 @@ const struct gl_texture_format _mesa_texformat_bgr888 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    3,                                  /* TexelBytes */
-   fetch_1d_texel_bgr888,              /* FetchTexel1D */
-   fetch_2d_texel_bgr888,              /* FetchTexel2D */
-   fetch_3d_texel_bgr888,              /* FetchTexel3D */
+   fetch_texel_1d_bgr888,              /* FetchTexel1D */
+   fetch_texel_2d_bgr888,              /* FetchTexel2D */
+   fetch_texel_3d_bgr888,              /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_bgr565 = {
@@ -517,9 +804,10 @@ const struct gl_texture_format _mesa_texformat_bgr565 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_bgr565,              /* FetchTexel1D */
-   fetch_2d_texel_bgr565,              /* FetchTexel2D */
-   fetch_3d_texel_bgr565,              /* FetchTexel3D */
+   fetch_texel_1d_bgr565,              /* FetchTexel1D */
+   fetch_texel_2d_bgr565,              /* FetchTexel2D */
+   fetch_texel_3d_bgr565,              /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_bgra4444 = {
@@ -535,9 +823,10 @@ const struct gl_texture_format _mesa_texformat_bgra4444 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_bgra4444,            /* FetchTexel1D */
-   fetch_2d_texel_bgra4444,            /* FetchTexel2D */
-   fetch_3d_texel_bgra4444,            /* FetchTexel3D */
+   fetch_texel_1d_bgra4444,            /* FetchTexel1D */
+   fetch_texel_2d_bgra4444,            /* FetchTexel2D */
+   fetch_texel_3d_bgra4444,            /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_bgra5551 = {
@@ -553,9 +842,10 @@ const struct gl_texture_format _mesa_texformat_bgra5551 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_bgra1555,            /* FetchTexel1D */
-   fetch_2d_texel_bgra1555,            /* FetchTexel2D */
-   fetch_3d_texel_bgra1555,            /* FetchTexel3D */
+   fetch_texel_1d_bgra1555,            /* FetchTexel1D */
+   fetch_texel_2d_bgra1555,            /* FetchTexel2D */
+   fetch_texel_3d_bgra1555,            /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_la88 = {
@@ -571,9 +861,10 @@ const struct gl_texture_format _mesa_texformat_la88 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    2,                                  /* TexelBytes */
-   fetch_1d_texel_la88,                        /* FetchTexel1D */
-   fetch_2d_texel_la88,                        /* FetchTexel2D */
-   fetch_3d_texel_la88,                        /* FetchTexel3D */
+   fetch_texel_1d_la88,                        /* FetchTexel1D */
+   fetch_texel_2d_la88,                        /* FetchTexel2D */
+   fetch_texel_3d_la88,                        /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 
 const struct gl_texture_format _mesa_texformat_bgr233 = {
@@ -589,15 +880,19 @@ const struct gl_texture_format _mesa_texformat_bgr233 = {
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
    1,                                  /* TexelBytes */
-   fetch_1d_texel_bgr233,              /* FetchTexel1D */
-   fetch_2d_texel_bgr233,              /* FetchTexel2D */
-   fetch_3d_texel_bgr233,              /* FetchTexel3D */
+   fetch_texel_1d_bgr233,              /* FetchTexel1D */
+   fetch_texel_2d_bgr233,              /* FetchTexel2D */
+   fetch_texel_3d_bgr233,              /* FetchTexel3D */
+   /* XXX float fetchers */
 };
 #endif
 
-/* =============================================================
- * Null format (useful for proxy textures):
- */
+/*@}*/
+
+
+/***************************************************************/
+/** \name Null format (useful for proxy textures) */
+/*@{*/
 
 const struct gl_texture_format _mesa_null_texformat = {
    -1,                                 /* MesaFormat */
@@ -614,9 +909,26 @@ const struct gl_texture_format _mesa_null_texformat = {
    fetch_null_texel,                   /* FetchTexel1D */
    fetch_null_texel,                   /* FetchTexel2D */
    fetch_null_texel,                   /* FetchTexel3D */
+   fetch_null_texelf,                  /* FetchTexel1Df */
+   fetch_null_texelf,                  /* FetchTexel2Df */
+   fetch_null_texelf,                  /* FetchTexel3Df */
 };
 
+/*@}*/
 
+
+/**
+ * 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 )
 {
@@ -624,11 +936,20 @@ _mesa_is_hardware_tex_format( const struct gl_texture_format *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.
+/**
+ * Choose an appropriate texture format given the format, type and
+ * internalFormat parameters passed to glTexImage().
+ *
+ * \param ctx  the GL context.
+ * \param internalFormat  user's prefered internal texture format.
+ * \param format  incoming image pixel format.
+ * \param type  incoming image data type.
+ *
+ * \return a pointer to a gl_texture_format object which describes the
+ * choosen texture format, 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,
@@ -739,10 +1060,18 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
    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 */
@@ -752,6 +1081,65 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
       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;
+
+   /* XXX prototype/example code */
+   /* GL_ATI_texture_float or GL_NV_float_buffer */
+   case GL_RGBA_FLOAT32_ATI:
+      return &_mesa_texformat_rgba_float32;
+   case GL_RGBA_FLOAT16_ATI:
+      return &_mesa_texformat_rgba_float16;
+   case GL_RGB_FLOAT32_ATI:
+      return &_mesa_texformat_rgb_float32;
+   case GL_RGB_FLOAT16_ATI:
+      return &_mesa_texformat_rgb_float16;
+
    default:
       _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
       return NULL;
@@ -759,11 +1147,10 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
 }
 
 
-
-
-/*
+/**
  * Return the base texture format for the given compressed format
- * Called via ctx->Driver.BaseCompressedTexFormat().
+ * 
+ * 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.