Merge commit 'origin/gallium-master-merge'
[mesa.git] / src / mesa / main / texformat.c
index 794dea313aa41331dfcaa44267f847741853792c..16d05cc7d0702e55697e15da1966ea5ce8d4b819 100644 (file)
@@ -1,8 +1,9 @@
 /*
  * Mesa 3-D graphics library
- * Version:  6.5
+ * Version:  6.5.1
  *
- * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
+ * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
+ * Copyright (c) 2008 VMware, Inc.
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
 #include "texstore.h"
 
 
+#if FEATURE_EXT_texture_sRGB
+
+/**
+ * Convert an 8-bit sRGB value from non-linear space to a
+ * linear RGB value in [0, 1].
+ * Implemented with a 256-entry lookup table.
+ */
+static INLINE GLfloat
+nonlinear_to_linear(GLubyte cs8)
+{
+   static GLfloat table[256];
+   static GLboolean tableReady = GL_FALSE;
+   if (!tableReady) {
+      /* compute lookup table now */
+      GLuint i;
+      for (i = 0; i < 256; i++) {
+         const GLfloat cs = UBYTE_TO_FLOAT(i);
+         if (cs <= 0.04045) {
+            table[i] = cs / 12.92f;
+         }
+         else {
+            table[i] = (GLfloat) _mesa_pow((cs + 0.055) / 1.055, 2.4);
+         }
+      }
+      tableReady = GL_TRUE;
+   }
+   return table[cs8];
+}
+
+
+#endif /* FEATURE_EXT_texture_sRGB */
+
 
 /* Texel fetch routines for all supported formats
  */
@@ -79,6 +112,11 @@ static void fetch_null_texelf( const struct gl_texture_image *texImage,
 static void store_null_texel(struct gl_texture_image *texImage,
                              GLint i, GLint j, GLint k, const void *texel)
 {
+   (void) texImage;
+   (void) i;
+   (void) j;
+   (void) k;
+   (void) texel;
    /* no-op */
 }
 
@@ -113,6 +151,7 @@ const struct gl_texture_format _mesa_texformat_rgba = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4 * sizeof(GLchan),                 /* TexelBytes */
    _mesa_texstore_rgba,                        /* StoreTexImageFunc */
    fetch_texel_1d_rgba,                        /* FetchTexel1D */
@@ -136,6 +175,7 @@ const struct gl_texture_format _mesa_texformat_rgb = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    3 * sizeof(GLchan),                 /* TexelBytes */
    _mesa_texstore_rgba,/*yes*/         /* StoreTexImageFunc */
    fetch_texel_1d_rgb,                 /* FetchTexel1D */
@@ -159,6 +199,7 @@ const struct gl_texture_format _mesa_texformat_alpha = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    sizeof(GLchan),                     /* TexelBytes */
    _mesa_texstore_rgba,/*yes*/         /* StoreTexImageFunc */
    fetch_texel_1d_alpha,               /* FetchTexel1D */
@@ -182,6 +223,7 @@ const struct gl_texture_format _mesa_texformat_luminance = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    sizeof(GLchan),                     /* TexelBytes */
    _mesa_texstore_rgba,/*yes*/         /* StoreTexImageFunc */
    fetch_texel_1d_luminance,           /* FetchTexel1D */
@@ -205,6 +247,7 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2 * sizeof(GLchan),                 /* TexelBytes */
    _mesa_texstore_rgba,/*yes*/         /* StoreTexImageFunc */
    fetch_texel_1d_luminance_alpha,     /* FetchTexel1D */
@@ -228,6 +271,7 @@ const struct gl_texture_format _mesa_texformat_intensity = {
    CHAN_BITS,                          /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    sizeof(GLchan),                     /* TexelBytes */
    _mesa_texstore_rgba,/*yes*/         /* StoreTexImageFunc */
    fetch_texel_1d_intensity,           /* FetchTexel1D */
@@ -239,52 +283,131 @@ const struct gl_texture_format _mesa_texformat_intensity = {
    store_texel_intensity               /* StoreTexel */
 };
 
-const struct gl_texture_format _mesa_texformat_depth_component_float32 = {
-   MESA_FORMAT_DEPTH_COMPONENT_FLOAT32,        /* MesaFormat */
-   GL_DEPTH_COMPONENT,                 /* BaseFormat */
+
+#if FEATURE_EXT_texture_sRGB
+
+const struct gl_texture_format _mesa_texformat_srgb8 = {
+   MESA_FORMAT_SRGB8,                  /* MesaFormat */
+   GL_RGB,                             /* BaseFormat */
    GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
-   0,                                  /* RedBits */
-   0,                                  /* GreenBits */
-   0,                                  /* BlueBits */
+   8,                                  /* RedBits */
+   8,                                  /* GreenBits */
+   8,                                  /* BlueBits */
    0,                                  /* AlphaBits */
    0,                                  /* LuminanceBits */
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
-   sizeof(GLfloat) * 8,                        /* DepthBits */
-   sizeof(GLfloat),                    /* TexelBytes */
-   _mesa_texstore_depth_component_float32,/* StoreTexImageFunc */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   3,                                  /* TexelBytes */
+   _mesa_texstore_srgb8,               /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_srgb8,               /* FetchTexel1Df */
+   fetch_texel_2d_srgb8,               /* FetchTexel2Df */
+   fetch_texel_3d_srgb8,               /* FetchTexel3Df */
+   store_texel_srgb8                   /* StoreTexel */
+};
+
+const struct gl_texture_format _mesa_texformat_srgba8 = {
+   MESA_FORMAT_SRGBA8,                 /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   8,                                  /* RedBits */
+   8,                                  /* GreenBits */
+   8,                                  /* BlueBits */
+   8,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   4,                                  /* TexelBytes */
+   _mesa_texstore_srgba8,              /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_srgba8,              /* FetchTexel1Df */
+   fetch_texel_2d_srgba8,              /* FetchTexel2Df */
+   fetch_texel_3d_srgba8,              /* FetchTexel3Df */
+   store_texel_srgba8                  /* StoreTexel */
+};
+
+const struct gl_texture_format _mesa_texformat_sargb8 = {
+   MESA_FORMAT_SARGB8,                 /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   8,                                  /* RedBits */
+   8,                                  /* GreenBits */
+   8,                                  /* BlueBits */
+   8,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   4,                                  /* TexelBytes */
+   _mesa_texstore_sargb8,              /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
-   fetch_texel_1d_f_depth_component_f32,/* FetchTexel1Df */
-   fetch_texel_2d_f_depth_component_f32,/* FetchTexel2Df */
-   fetch_texel_3d_f_depth_component_f32,/* FetchTexel3Df */
-   store_texel_depth_component_f32     /* StoreTexel */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_sargb8,              /* FetchTexel1Df */
+   fetch_texel_2d_sargb8,              /* FetchTexel2Df */
+   fetch_texel_3d_sargb8,              /* FetchTexel3Df */
+   store_texel_sargb8                  /* StoreTexel */
 };
 
-const struct gl_texture_format _mesa_texformat_depth_component16 = {
-   MESA_FORMAT_DEPTH_COMPONENT16,      /* MesaFormat */
-   GL_DEPTH_COMPONENT,                 /* BaseFormat */
+const struct gl_texture_format _mesa_texformat_sl8 = {
+   MESA_FORMAT_SL8,                    /* MesaFormat */
+   GL_LUMINANCE,                       /* BaseFormat */
    GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
    0,                                  /* RedBits */
    0,                                  /* GreenBits */
    0,                                  /* BlueBits */
    0,                                  /* AlphaBits */
-   0,                                  /* LuminanceBits */
+   8,                                  /* LuminanceBits */
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
-   sizeof(GLushort) * 8,               /* DepthBits */
-   sizeof(GLushort),                   /* TexelBytes */
-   _mesa_texstore_depth_component16,   /* StoreTexImageFunc */
-   NULL,                               /* FetchTexel1D */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   1,                                  /* TexelBytes */
+   _mesa_texstore_sl8,                 /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_sl8,                 /* FetchTexel1Df */
+   fetch_texel_2d_sl8,                 /* FetchTexel2Df */
+   fetch_texel_3d_sl8,                 /* FetchTexel3Df */
+   store_texel_sl8                     /* StoreTexel */
+};
+
+const struct gl_texture_format _mesa_texformat_sla8 = {
+   MESA_FORMAT_SLA8,                   /* MesaFormat */
+   GL_LUMINANCE_ALPHA,                 /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   8,                                  /* AlphaBits */
+   8,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   2,                                  /* TexelBytes */
+   _mesa_texstore_sla8,                        /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
-   fetch_texel_1d_f_depth_component16, /* FetchTexel1Df */
-   fetch_texel_2d_f_depth_component16, /* FetchTexel2Df */
-   fetch_texel_3d_f_depth_component16, /* FetchTexel3Df */
-   store_texel_depth_component16       /* StoreTexel */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_sla8,                        /* FetchTexel1Df */
+   fetch_texel_2d_sla8,                        /* FetchTexel2Df */
+   fetch_texel_3d_sla8,                        /* FetchTexel3Df */
+   store_texel_sla8                    /* StoreTexel */
 };
 
+#endif /* FEATURE_EXT_texture_sRGB */
+
 const struct gl_texture_format _mesa_texformat_rgba_float32 = {
    MESA_FORMAT_RGBA_FLOAT32,           /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
@@ -297,6 +420,7 @@ const struct gl_texture_format _mesa_texformat_rgba_float32 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4 * sizeof(GLfloat),                        /* TexelBytes */
    _mesa_texstore_rgba_float32,                /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -320,6 +444,7 @@ const struct gl_texture_format _mesa_texformat_rgba_float16 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4 * sizeof(GLhalfARB),              /* TexelBytes */
    _mesa_texstore_rgba_float16,                /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -343,6 +468,7 @@ const struct gl_texture_format _mesa_texformat_rgb_float32 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    3 * sizeof(GLfloat),                        /* TexelBytes */
    _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -366,6 +492,7 @@ const struct gl_texture_format _mesa_texformat_rgb_float16 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    3 * sizeof(GLhalfARB),              /* TexelBytes */
    _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -389,6 +516,7 @@ const struct gl_texture_format _mesa_texformat_alpha_float32 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1 * sizeof(GLfloat),                        /* TexelBytes */
    _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -412,6 +540,7 @@ const struct gl_texture_format _mesa_texformat_alpha_float16 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1 * sizeof(GLhalfARB),              /* TexelBytes */
    _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -435,6 +564,7 @@ const struct gl_texture_format _mesa_texformat_luminance_float32 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1 * sizeof(GLfloat),                        /* TexelBytes */
    _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -458,6 +588,7 @@ const struct gl_texture_format _mesa_texformat_luminance_float16 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1 * sizeof(GLhalfARB),              /* TexelBytes */
    _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -481,6 +612,7 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha_float32 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2 * sizeof(GLfloat),                        /* TexelBytes */
    _mesa_texstore_rgba_float32,                /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -504,6 +636,7 @@ const struct gl_texture_format _mesa_texformat_luminance_alpha_float16 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2 * sizeof(GLhalfARB),              /* TexelBytes */
    _mesa_texstore_rgba_float16,                /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -527,6 +660,7 @@ const struct gl_texture_format _mesa_texformat_intensity_float32 = {
    8 * sizeof(GLfloat),                        /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1 * sizeof(GLfloat),                        /* TexelBytes */
    _mesa_texstore_rgba_float32,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -550,6 +684,7 @@ const struct gl_texture_format _mesa_texformat_intensity_float16 = {
    8 * sizeof(GLhalfARB),              /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1 * sizeof(GLhalfARB),              /* TexelBytes */
    _mesa_texstore_rgba_float16,/*yes*/ /* StoreTexImageFunc */
    NULL,                               /* FetchTexel1D */
@@ -581,6 +716,7 @@ const struct gl_texture_format _mesa_texformat_rgba8888 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4,                                  /* TexelBytes */
    _mesa_texstore_rgba8888,            /* StoreTexImageFunc */
    fetch_texel_1d_rgba8888,            /* FetchTexel1D */
@@ -604,6 +740,7 @@ const struct gl_texture_format _mesa_texformat_rgba8888_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4,                                  /* TexelBytes */
    _mesa_texstore_rgba8888,            /* StoreTexImageFunc */
    fetch_texel_1d_rgba8888_rev,                /* FetchTexel1D */
@@ -627,6 +764,7 @@ const struct gl_texture_format _mesa_texformat_argb8888 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4,                                  /* TexelBytes */
    _mesa_texstore_argb8888,            /* StoreTexImageFunc */
    fetch_texel_1d_argb8888,            /* FetchTexel1D */
@@ -650,6 +788,7 @@ const struct gl_texture_format _mesa_texformat_argb8888_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    4,                                  /* TexelBytes */
    _mesa_texstore_argb8888,            /* StoreTexImageFunc */
    fetch_texel_1d_argb8888_rev,                /* FetchTexel1D */
@@ -673,6 +812,7 @@ const struct gl_texture_format _mesa_texformat_rgb888 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    3,                                  /* TexelBytes */
    _mesa_texstore_rgb888,              /* StoreTexImageFunc */
    fetch_texel_1d_rgb888,              /* FetchTexel1D */
@@ -696,6 +836,7 @@ const struct gl_texture_format _mesa_texformat_bgr888 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    3,                                  /* TexelBytes */
    _mesa_texstore_bgr888,              /* StoreTexImageFunc */
    fetch_texel_1d_bgr888,              /* FetchTexel1D */
@@ -719,6 +860,7 @@ const struct gl_texture_format _mesa_texformat_rgb565 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_rgb565,              /* StoreTexImageFunc */
    fetch_texel_1d_rgb565,              /* FetchTexel1D */
@@ -742,6 +884,7 @@ const struct gl_texture_format _mesa_texformat_rgb565_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_rgb565,              /* StoreTexImageFunc */
    fetch_texel_1d_rgb565_rev,          /* FetchTexel1D */
@@ -753,6 +896,30 @@ const struct gl_texture_format _mesa_texformat_rgb565_rev = {
    store_texel_rgb565_rev              /* StoreTexel */
 };
 
+const struct gl_texture_format _mesa_texformat_rgba4444 = {
+   MESA_FORMAT_RGBA4444,               /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   4,                                  /* RedBits */
+   4,                                  /* GreenBits */
+   4,                                  /* BlueBits */
+   4,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   2,                                  /* TexelBytes */
+   _mesa_texstore_rgba4444,            /* StoreTexImageFunc */
+   fetch_texel_1d_rgba4444,            /* FetchTexel1D */
+   fetch_texel_2d_rgba4444,            /* FetchTexel2D */
+   fetch_texel_3d_rgba4444,            /* FetchTexel3D */
+   NULL,                               /* FetchTexel1Df */
+   NULL,                               /* FetchTexel2Df */
+   NULL,                               /* FetchTexel3Df */
+   store_texel_rgba4444                        /* StoreTexel */
+};
+
 const struct gl_texture_format _mesa_texformat_argb4444 = {
    MESA_FORMAT_ARGB4444,               /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
@@ -765,6 +932,7 @@ const struct gl_texture_format _mesa_texformat_argb4444 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_argb4444,            /* StoreTexImageFunc */
    fetch_texel_1d_argb4444,            /* FetchTexel1D */
@@ -788,6 +956,7 @@ const struct gl_texture_format _mesa_texformat_argb4444_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_argb4444,            /* StoreTexImageFunc */
    fetch_texel_1d_argb4444_rev,                /* FetchTexel1D */
@@ -799,6 +968,30 @@ const struct gl_texture_format _mesa_texformat_argb4444_rev = {
    store_texel_argb4444_rev            /* StoreTexel */
 };
 
+const struct gl_texture_format _mesa_texformat_rgba5551 = {
+   MESA_FORMAT_RGBA5551,               /* MesaFormat */
+   GL_RGBA,                            /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   5,                                  /* RedBits */
+   5,                                  /* GreenBits */
+   5,                                  /* BlueBits */
+   1,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
+   2,                                  /* TexelBytes */
+   _mesa_texstore_rgba5551,            /* StoreTexImageFunc */
+   fetch_texel_1d_rgba5551,            /* FetchTexel1D */
+   fetch_texel_2d_rgba5551,            /* FetchTexel2D */
+   fetch_texel_3d_rgba5551,            /* FetchTexel3D */
+   NULL,                               /* FetchTexel1Df */
+   NULL,                               /* FetchTexel2Df */
+   NULL,                               /* FetchTexel3Df */
+   store_texel_rgba5551                        /* StoreTexel */
+};
+
 const struct gl_texture_format _mesa_texformat_argb1555 = {
    MESA_FORMAT_ARGB1555,               /* MesaFormat */
    GL_RGBA,                            /* BaseFormat */
@@ -811,6 +1004,7 @@ const struct gl_texture_format _mesa_texformat_argb1555 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_argb1555,            /* StoreTexImageFunc */
    fetch_texel_1d_argb1555,            /* FetchTexel1D */
@@ -834,6 +1028,7 @@ const struct gl_texture_format _mesa_texformat_argb1555_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_argb1555,            /* StoreTexImageFunc */
    fetch_texel_1d_argb1555_rev,                /* FetchTexel1D */
@@ -857,6 +1052,7 @@ const struct gl_texture_format _mesa_texformat_al88 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_al88,                        /* StoreTexImageFunc */
    fetch_texel_1d_al88,                        /* FetchTexel1D */
@@ -880,6 +1076,7 @@ const struct gl_texture_format _mesa_texformat_al88_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_al88,                        /* StoreTexImageFunc */
    fetch_texel_1d_al88_rev,            /* FetchTexel1D */
@@ -903,6 +1100,7 @@ const struct gl_texture_format _mesa_texformat_rgb332 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1,                                  /* TexelBytes */
    _mesa_texstore_rgb332,              /* StoreTexImageFunc */
    fetch_texel_1d_rgb332,              /* FetchTexel1D */
@@ -926,6 +1124,7 @@ const struct gl_texture_format _mesa_texformat_a8 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1,                                  /* TexelBytes */
    _mesa_texstore_a8,                  /* StoreTexImageFunc */
    fetch_texel_1d_a8,                  /* FetchTexel1D */
@@ -949,6 +1148,7 @@ const struct gl_texture_format _mesa_texformat_l8 = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1,                                  /* TexelBytes */
    _mesa_texstore_a8,/*yes*/           /* StoreTexImageFunc */
    fetch_texel_1d_l8,                  /* FetchTexel1D */
@@ -972,6 +1172,7 @@ const struct gl_texture_format _mesa_texformat_i8 = {
    8,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1,                                  /* TexelBytes */
    _mesa_texstore_a8,/*yes*/           /* StoreTexImageFunc */
    fetch_texel_1d_i8,                  /* FetchTexel1D */
@@ -995,6 +1196,7 @@ const struct gl_texture_format _mesa_texformat_ci8 = {
    0,                                  /* IntensityBits */
    8,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    1,                                  /* TexelBytes */
    _mesa_texstore_ci8,                 /* StoreTexImageFunc */
    fetch_texel_1d_ci8,                 /* FetchTexel1D */
@@ -1018,6 +1220,7 @@ const struct gl_texture_format _mesa_texformat_ycbcr = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_ycbcr,               /* StoreTexImageFunc */
    fetch_texel_1d_ycbcr,               /* FetchTexel1D */
@@ -1041,6 +1244,7 @@ const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    2,                                  /* TexelBytes */
    _mesa_texstore_ycbcr,               /* StoreTexImageFunc */
    fetch_texel_1d_ycbcr_rev,           /* FetchTexel1D */
@@ -1052,6 +1256,102 @@ const struct gl_texture_format _mesa_texformat_ycbcr_rev = {
    store_texel_ycbcr_rev               /* StoreTexel */
 };
 
+const struct gl_texture_format _mesa_texformat_z24_s8 = {
+   MESA_FORMAT_Z24_S8,                 /* MesaFormat */
+   GL_DEPTH_STENCIL_EXT,               /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   24,                                 /* DepthBits */
+   8,                                  /* StencilBits */
+   4,                                  /* TexelBytes */
+   _mesa_texstore_z24_s8,              /* StoreTexImageFunc */
+   NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_f_z24_s8,            /* FetchTexel1Df */
+   fetch_texel_2d_f_z24_s8,            /* FetchTexel2Df */
+   fetch_texel_3d_f_z24_s8,            /* FetchTexel3Df */
+   store_texel_z24_s8                  /* StoreTexel */
+};
+
+const struct gl_texture_format _mesa_texformat_s8_z24 = {
+   MESA_FORMAT_S8_Z24,                 /* MesaFormat */
+   GL_DEPTH_STENCIL_EXT,               /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   24,                                 /* DepthBits */
+   8,                                  /* StencilBits */
+   4,                                  /* TexelBytes */
+   _mesa_texstore_s8_z24,              /* StoreTexImageFunc */
+   NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel2D */
+   NULL,                               /* FetchTexel3D */
+   fetch_texel_1d_f_s8_z24,            /* FetchTexel1Df */
+   fetch_texel_2d_f_s8_z24,            /* FetchTexel2Df */
+   fetch_texel_3d_f_s8_z24,            /* FetchTexel3Df */
+   store_texel_s8_z24                  /* StoreTexel */
+};
+
+const struct gl_texture_format _mesa_texformat_z16 = {
+   MESA_FORMAT_Z16,                    /* MesaFormat */
+   GL_DEPTH_COMPONENT,                 /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   sizeof(GLushort) * 8,               /* DepthBits */
+   0,                                  /* StencilBits */
+   sizeof(GLushort),                   /* TexelBytes */
+   _mesa_texstore_z16,                 /* StoreTexImageFunc */
+   NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel1D */
+   fetch_texel_1d_f_z16,               /* FetchTexel1Df */
+   fetch_texel_2d_f_z16,               /* FetchTexel2Df */
+   fetch_texel_3d_f_z16,               /* FetchTexel3Df */
+   store_texel_z16                     /* StoreTexel */
+};
+
+const struct gl_texture_format _mesa_texformat_z32 = {
+   MESA_FORMAT_Z32,                    /* MesaFormat */
+   GL_DEPTH_COMPONENT,                 /* BaseFormat */
+   GL_UNSIGNED_NORMALIZED_ARB,         /* DataType */
+   0,                                  /* RedBits */
+   0,                                  /* GreenBits */
+   0,                                  /* BlueBits */
+   0,                                  /* AlphaBits */
+   0,                                  /* LuminanceBits */
+   0,                                  /* IntensityBits */
+   0,                                  /* IndexBits */
+   sizeof(GLuint) * 8,                 /* DepthBits */
+   0,                                  /* StencilBits */
+   sizeof(GLuint),                     /* TexelBytes */
+   _mesa_texstore_z32,                 /* StoreTexImageFunc */
+   NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel1D */
+   NULL,                               /* FetchTexel1D */
+   fetch_texel_1d_f_z32,               /* FetchTexel1Df */
+   fetch_texel_2d_f_z32,               /* FetchTexel2Df */
+   fetch_texel_3d_f_z32,               /* FetchTexel3Df */
+   store_texel_z32                     /* StoreTexel */
+};
+
 /*@}*/
 
 
@@ -1071,6 +1371,7 @@ const struct gl_texture_format _mesa_null_texformat = {
    0,                                  /* IntensityBits */
    0,                                  /* IndexBits */
    0,                                  /* DepthBits */
+   0,                                  /* StencilBits */
    0,                                  /* TexelBytes */
    NULL,                               /* StoreTexImageFunc */
    fetch_null_texel,                   /* FetchTexel1D */
@@ -1192,49 +1493,52 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
          ; /* fallthrough */
    }
 
-   if (ctx->Extensions.SGIX_depth_texture ||
-       ctx->Extensions.ARB_depth_texture) {
+   if (ctx->Extensions.ARB_depth_texture) {
       switch (internalFormat) {
          case GL_DEPTH_COMPONENT:
-         case GL_DEPTH_COMPONENT24_SGIX:
-         case GL_DEPTH_COMPONENT32_SGIX:
-            return &_mesa_texformat_depth_component_float32;
-         case GL_DEPTH_COMPONENT16_SGIX:
-            return &_mesa_texformat_depth_component16;
+         case GL_DEPTH_COMPONENT24:
+         case GL_DEPTH_COMPONENT32:
+            return &_mesa_texformat_z32;
+         case GL_DEPTH_COMPONENT16:
+            return &_mesa_texformat_z16;
          default:
             ; /* fallthrough */
       }
    }
 
-   if (ctx->Extensions.ARB_texture_compression) {
-      switch (internalFormat) {
-         case GL_COMPRESSED_ALPHA_ARB:
-            return &_mesa_texformat_alpha;
-         case GL_COMPRESSED_LUMINANCE_ARB:
-            return &_mesa_texformat_luminance;
-         case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
-            return &_mesa_texformat_luminance_alpha;
-         case GL_COMPRESSED_INTENSITY_ARB:
-            return &_mesa_texformat_intensity;
-         case GL_COMPRESSED_RGB_ARB:
-            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;
-            else
-               return &_mesa_texformat_rgb;
-         case GL_COMPRESSED_RGBA_ARB:
-            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 spec */
-            else
-               return &_mesa_texformat_rgba;
-         default:
-            ; /* fallthrough */
-      }
+   switch (internalFormat) {
+      case GL_COMPRESSED_ALPHA_ARB:
+         return &_mesa_texformat_alpha;
+      case GL_COMPRESSED_LUMINANCE_ARB:
+         return &_mesa_texformat_luminance;
+      case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
+         return &_mesa_texformat_luminance_alpha;
+      case GL_COMPRESSED_INTENSITY_ARB:
+         return &_mesa_texformat_intensity;
+      case GL_COMPRESSED_RGB_ARB:
+#if FEATURE_texture_fxt1
+         if (ctx->Extensions.TDFX_texture_compression_FXT1)
+            return &_mesa_texformat_rgb_fxt1;
+#endif
+#if FEATURE_texture_s3tc
+         if (ctx->Extensions.EXT_texture_compression_s3tc ||
+             ctx->Extensions.S3_s3tc)
+            return &_mesa_texformat_rgb_dxt1;
+#endif
+         return &_mesa_texformat_rgb;
+      case GL_COMPRESSED_RGBA_ARB:
+#if FEATURE_texture_fxt1
+         if (ctx->Extensions.TDFX_texture_compression_FXT1)
+            return &_mesa_texformat_rgba_fxt1;
+#endif
+#if FEATURE_texture_s3tc
+         if (ctx->Extensions.EXT_texture_compression_s3tc ||
+             ctx->Extensions.S3_s3tc)
+            return &_mesa_texformat_rgba_dxt3; /* Not rgba_dxt1, see spec */
+#endif
+         return &_mesa_texformat_rgba;
+      default:
+         ; /* fallthrough */
    }
 
    if (ctx->Extensions.MESA_ycbcr_texture) {
@@ -1246,6 +1550,7 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
       }
    }
 
+#if FEATURE_texture_fxt1
    if (ctx->Extensions.TDFX_texture_compression_FXT1) {
       switch (internalFormat) {
          case GL_COMPRESSED_RGB_FXT1_3DFX:
@@ -1256,7 +1561,9 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
             ; /* fallthrough */
       }
    }
+#endif
 
+#if FEATURE_texture_s3tc
    if (ctx->Extensions.EXT_texture_compression_s3tc) {
       switch (internalFormat) {
          case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
@@ -1284,6 +1591,7 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
             ; /* fallthrough */
       }
    }
+#endif
 
    if (ctx->Extensions.ARB_texture_float) {
       switch (internalFormat) {
@@ -1316,6 +1624,260 @@ _mesa_choose_tex_format( GLcontext *ctx, GLint internalFormat,
       }
    }
 
+   if (ctx->Extensions.EXT_packed_depth_stencil) {
+      switch (internalFormat) {
+         case GL_DEPTH_STENCIL_EXT:
+         case GL_DEPTH24_STENCIL8_EXT:
+            return &_mesa_texformat_z24_s8;
+         default:
+            ; /* fallthrough */
+      }
+   }
+
+#if FEATURE_EXT_texture_sRGB
+   if (ctx->Extensions.EXT_texture_sRGB) {
+      switch (internalFormat) {
+         case GL_SRGB_EXT:
+         case GL_SRGB8_EXT:
+            return &_mesa_texformat_srgb8;
+         case GL_SRGB_ALPHA_EXT:
+         case GL_SRGB8_ALPHA8_EXT:
+            return &_mesa_texformat_srgba8;
+         case GL_SLUMINANCE_EXT:
+         case GL_SLUMINANCE8_EXT:
+            return &_mesa_texformat_sl8;
+         case GL_SLUMINANCE_ALPHA_EXT:
+         case GL_SLUMINANCE8_ALPHA8_EXT:
+            return &_mesa_texformat_sla8;
+         case GL_COMPRESSED_SLUMINANCE_EXT:
+            return &_mesa_texformat_sl8;
+         case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
+            return &_mesa_texformat_sla8;
+         case GL_COMPRESSED_SRGB_EXT:
+#if FEATURE_texture_s3tc
+            if (ctx->Extensions.EXT_texture_compression_s3tc)
+               return &_mesa_texformat_srgb_dxt1;
+#endif
+            return &_mesa_texformat_srgb8;
+         case GL_COMPRESSED_SRGB_ALPHA_EXT:
+#if FEATURE_texture_s3tc
+            if (ctx->Extensions.EXT_texture_compression_s3tc)
+               return &_mesa_texformat_srgba_dxt3; /* Not srgba_dxt1, see spec */
+#endif
+            return &_mesa_texformat_srgba8;
+#if FEATURE_texture_s3tc
+         case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
+            if (ctx->Extensions.EXT_texture_compression_s3tc)
+               return &_mesa_texformat_srgb_dxt1;
+            break;
+         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
+            if (ctx->Extensions.EXT_texture_compression_s3tc)
+               return &_mesa_texformat_srgba_dxt1;
+            break;
+         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
+            if (ctx->Extensions.EXT_texture_compression_s3tc)
+               return &_mesa_texformat_srgba_dxt3;
+            break;
+         case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
+            if (ctx->Extensions.EXT_texture_compression_s3tc)
+               return &_mesa_texformat_srgba_dxt5;
+            break;
+#endif
+         default:
+            ; /* fallthrough */
+      }
+   }
+#endif /* FEATURE_EXT_texture_sRGB */
+
    _mesa_problem(ctx, "unexpected format in _mesa_choose_tex_format()");
    return NULL;
 }
+
+
+
+/**
+ * Return datatype and number of components per texel for the
+ * given gl_texture_format.
+ */
+void
+_mesa_format_to_type_and_comps(const struct gl_texture_format *format,
+                               GLenum *datatype, GLuint *comps)
+{
+   switch (format->MesaFormat) {
+   case MESA_FORMAT_RGBA8888:
+   case MESA_FORMAT_RGBA8888_REV:
+   case MESA_FORMAT_ARGB8888:
+   case MESA_FORMAT_ARGB8888_REV:
+      *datatype = CHAN_TYPE;
+      *comps = 4;
+      return;
+   case MESA_FORMAT_RGB888:
+   case MESA_FORMAT_BGR888:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 3;
+      return;
+   case MESA_FORMAT_RGB565:
+   case MESA_FORMAT_RGB565_REV:
+      *datatype = GL_UNSIGNED_SHORT_5_6_5;
+      *comps = 3;
+      return;
+
+   case MESA_FORMAT_ARGB4444:
+   case MESA_FORMAT_ARGB4444_REV:
+      *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
+      *comps = 4;
+      return;
+
+   case MESA_FORMAT_ARGB1555:
+   case MESA_FORMAT_ARGB1555_REV:
+      *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+      *comps = 4;
+      return;
+
+   case MESA_FORMAT_AL88:
+   case MESA_FORMAT_AL88_REV:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 2;
+      return;
+   case MESA_FORMAT_RGB332:
+      *datatype = GL_UNSIGNED_BYTE_3_3_2;
+      *comps = 3;
+      return;
+
+   case MESA_FORMAT_A8:
+   case MESA_FORMAT_L8:
+   case MESA_FORMAT_I8:
+   case MESA_FORMAT_CI8:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 1;
+      return;
+
+   case MESA_FORMAT_YCBCR:
+   case MESA_FORMAT_YCBCR_REV:
+      *datatype = GL_UNSIGNED_SHORT;
+      *comps = 2;
+      return;
+
+   case MESA_FORMAT_Z24_S8:
+      *datatype = GL_UNSIGNED_INT;
+      *comps = 1; /* XXX OK? */
+      return;
+
+   case MESA_FORMAT_S8_Z24:
+      *datatype = GL_UNSIGNED_INT;
+      *comps = 1; /* XXX OK? */
+      return;
+
+   case MESA_FORMAT_Z16:
+      *datatype = GL_UNSIGNED_SHORT;
+      *comps = 1;
+      return;
+
+   case MESA_FORMAT_Z32:
+      *datatype = GL_UNSIGNED_INT;
+      *comps = 1;
+      return;
+
+#if FEATURE_EXT_texture_sRGB
+   case MESA_FORMAT_SRGB8:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 3;
+      return;
+   case MESA_FORMAT_SRGBA8:
+   case MESA_FORMAT_SARGB8:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 4;
+      return;
+   case MESA_FORMAT_SL8:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 1;
+      return;
+   case MESA_FORMAT_SLA8:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 2;
+      return;
+#endif
+
+#if FEATURE_texture_fxt1
+   case MESA_FORMAT_RGB_FXT1:
+   case MESA_FORMAT_RGBA_FXT1:
+#endif
+#if FEATURE_texture_s3tc
+   case MESA_FORMAT_RGB_DXT1:
+   case MESA_FORMAT_RGBA_DXT1:
+   case MESA_FORMAT_RGBA_DXT3:
+   case MESA_FORMAT_RGBA_DXT5:
+#if FEATURE_EXT_texture_sRGB
+   case MESA_FORMAT_SRGB_DXT1:
+   case MESA_FORMAT_SRGBA_DXT1:
+   case MESA_FORMAT_SRGBA_DXT3:
+   case MESA_FORMAT_SRGBA_DXT5:
+#endif
+      /* XXX generate error instead? */
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 0;
+      return;
+#endif
+
+   case MESA_FORMAT_RGBA:
+      *datatype = CHAN_TYPE;
+      *comps = 4;
+      return;
+   case MESA_FORMAT_RGB:
+      *datatype = CHAN_TYPE;
+      *comps = 3;
+      return;
+   case MESA_FORMAT_LUMINANCE_ALPHA:
+      *datatype = CHAN_TYPE;
+      *comps = 2;
+      return;
+   case MESA_FORMAT_ALPHA:
+   case MESA_FORMAT_LUMINANCE:
+   case MESA_FORMAT_INTENSITY:
+      *datatype = CHAN_TYPE;
+      *comps = 1;
+      return;
+
+   case MESA_FORMAT_RGBA_FLOAT32:
+      *datatype = GL_FLOAT;
+      *comps = 4;
+      return;
+   case MESA_FORMAT_RGBA_FLOAT16:
+      *datatype = GL_HALF_FLOAT_ARB;
+      *comps = 4;
+      return;
+   case MESA_FORMAT_RGB_FLOAT32:
+      *datatype = GL_FLOAT;
+      *comps = 3;
+      return;
+   case MESA_FORMAT_RGB_FLOAT16:
+      *datatype = GL_HALF_FLOAT_ARB;
+      *comps = 3;
+      return;
+   case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
+      *datatype = GL_FLOAT;
+      *comps = 2;
+      return;
+   case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
+      *datatype = GL_HALF_FLOAT_ARB;
+      *comps = 2;
+      return;
+   case MESA_FORMAT_ALPHA_FLOAT32:
+   case MESA_FORMAT_LUMINANCE_FLOAT32:
+   case MESA_FORMAT_INTENSITY_FLOAT32:
+      *datatype = GL_FLOAT;
+      *comps = 1;
+      return;
+   case MESA_FORMAT_ALPHA_FLOAT16:
+   case MESA_FORMAT_LUMINANCE_FLOAT16:
+   case MESA_FORMAT_INTENSITY_FLOAT16:
+      *datatype = GL_HALF_FLOAT_ARB;
+      *comps = 1;
+      return;
+
+   default:
+      _mesa_problem(NULL, "bad format in _mesa_format_to_type_and_comps");
+      *datatype = 0;
+      *comps = 1;
+   }
+}