mesa: add ARB_clear_texture.xml to file list, remove duplicate decls
[mesa.git] / src / mesa / main / texstore.c
index 4c1d789eb76331a8e2fe9dc509e6757526020c3c..aea53f8d12073e33f75ec66a2a0e8f21e495c170 100644 (file)
@@ -1049,7 +1049,7 @@ _mesa_texstore_x8_z24(TEXSTORE_PARAMS)
    const GLuint depthScale = 0xffffff;
 
    (void) dims;
-   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
+   ASSERT(dstFormat == MESA_FORMAT_Z24_UNORM_X8_UINT);
 
    {
       /* general path */
@@ -1079,7 +1079,7 @@ _mesa_texstore_z24_x8(TEXSTORE_PARAMS)
    const GLuint depthScale = 0xffffff;
 
    (void) dims;
-   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
+   ASSERT(dstFormat == MESA_FORMAT_X8_UINT_Z24_UNORM);
 
    {
       /* general path */
@@ -1141,8 +1141,8 @@ _mesa_texstore_z16(TEXSTORE_PARAMS)
 static GLboolean
 _mesa_texstore_rgb565(TEXSTORE_PARAMS)
 {
-   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
-          dstFormat == MESA_FORMAT_RGB565_REV);
+   ASSERT(dstFormat == MESA_FORMAT_B5G6R5_UNORM ||
+          dstFormat == MESA_FORMAT_R5G6B5_UNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
 
    if (!ctx->_ImageTransferState &&
@@ -1163,7 +1163,7 @@ _mesa_texstore_rgb565(TEXSTORE_PARAMS)
          const GLubyte *srcUB = (const GLubyte *) src;
          GLushort *dstUS = (GLushort *) dst;
          /* check for byteswapped format */
-         if (dstFormat == MESA_FORMAT_RGB565) {
+         if (dstFormat == MESA_FORMAT_B5G6R5_UNORM) {
             for (col = 0; col < srcWidth; col++) {
                dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
                srcUB += 3;
@@ -1525,8 +1525,8 @@ _mesa_texstore_bgr888(TEXSTORE_PARAMS)
 static GLboolean
 _mesa_texstore_argb2101010(TEXSTORE_PARAMS)
 {
-   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010 ||
-          dstFormat == MESA_FORMAT_XRGB2101010_UNORM);
+   ASSERT(dstFormat == MESA_FORMAT_B10G10R10A2_UNORM ||
+          dstFormat == MESA_FORMAT_B10G10R10X2_UNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -1579,7 +1579,7 @@ _mesa_texstore_unorm44(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_AL44);
+   ASSERT(dstFormat == MESA_FORMAT_L4A4_UNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
 
    {
@@ -1622,10 +1622,10 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS)
    const GLboolean littleEndian = _mesa_little_endian();
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
-          dstFormat == MESA_FORMAT_AL88_REV ||
-          dstFormat == MESA_FORMAT_GR88 ||
-          dstFormat == MESA_FORMAT_RG88);
+   ASSERT(dstFormat == MESA_FORMAT_L8A8_UNORM ||
+          dstFormat == MESA_FORMAT_A8L8_UNORM ||
+          dstFormat == MESA_FORMAT_R8G8_UNORM ||
+          dstFormat == MESA_FORMAT_G8R8_UNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
 
    if (!ctx->_ImageTransferState &&
@@ -1637,9 +1637,9 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS)
 
       /* dstmap - how to swizzle from RGBA to dst format:
        */
-      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
-        if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
-            (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
+      if (dstFormat == MESA_FORMAT_L8A8_UNORM || dstFormat == MESA_FORMAT_A8L8_UNORM) {
+        if ((littleEndian && dstFormat == MESA_FORMAT_L8A8_UNORM) ||
+            (!littleEndian && dstFormat == MESA_FORMAT_A8L8_UNORM)) {
            dstmap[0] = 0;
            dstmap[1] = 3;
         }
@@ -1649,8 +1649,8 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS)
         }
       }
       else {
-        if ((littleEndian && dstFormat == MESA_FORMAT_GR88) ||
-            (!littleEndian && dstFormat == MESA_FORMAT_RG88)) {
+        if ((littleEndian && dstFormat == MESA_FORMAT_R8G8_UNORM) ||
+            (!littleEndian && dstFormat == MESA_FORMAT_G8R8_UNORM)) {
            dstmap[0] = 0;
            dstmap[1] = 1;
         }
@@ -1687,8 +1687,8 @@ _mesa_texstore_unorm88(TEXSTORE_PARAMS)
          GLubyte *dstRow = dstSlices[img];
          for (row = 0; row < srcHeight; row++) {
             GLushort *dstUS = (GLushort *) dstRow;
-            if (dstFormat == MESA_FORMAT_AL88 ||
-               dstFormat == MESA_FORMAT_GR88) {
+            if (dstFormat == MESA_FORMAT_L8A8_UNORM ||
+               dstFormat == MESA_FORMAT_R8G8_UNORM) {
                for (col = 0; col < srcWidth; col++) {
                   /* src[0] is luminance (or R), src[1] is alpha (or G) */
                  dstUS[col] = PACK_COLOR_88( src[1],
@@ -1721,10 +1721,10 @@ _mesa_texstore_unorm1616(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
-          dstFormat == MESA_FORMAT_AL1616_REV ||
-         dstFormat == MESA_FORMAT_GR1616 ||
-          dstFormat == MESA_FORMAT_RG1616);
+   ASSERT(dstFormat == MESA_FORMAT_L16A16_UNORM ||
+          dstFormat == MESA_FORMAT_A16L16_UNORM ||
+         dstFormat == MESA_FORMAT_R16G16_UNORM ||
+          dstFormat == MESA_FORMAT_G16R16_UNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -1744,8 +1744,8 @@ _mesa_texstore_unorm1616(TEXSTORE_PARAMS)
          GLubyte *dstRow = dstSlices[img];
          for (row = 0; row < srcHeight; row++) {
             GLuint *dstUI = (GLuint *) dstRow;
-            if (dstFormat == MESA_FORMAT_AL1616 ||
-               dstFormat == MESA_FORMAT_GR1616) {
+            if (dstFormat == MESA_FORMAT_L16A16_UNORM ||
+               dstFormat == MESA_FORMAT_R16G16_UNORM) {
                for (col = 0; col < srcWidth; col++) {
                  GLushort l, a;
 
@@ -1874,8 +1874,8 @@ _mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
-          dstFormat == MESA_FORMAT_SIGNED_RGBA_16 ||
+   ASSERT(dstFormat == MESA_FORMAT_RGB_SNORM16 ||
+          dstFormat == MESA_FORMAT_RGBA_SNORM16 ||
           dstFormat == MESA_FORMAT_RGBX_SNORM16);
 
    {
@@ -1901,7 +1901,7 @@ _mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
          GLubyte *dstRow = dstSlices[img];
          for (row = 0; row < srcHeight; row++) {
             GLshort *dstRowS = (GLshort *) dstRow;
-            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
+            if (dstFormat == MESA_FORMAT_RGBA_SNORM16) {
                for (col = 0; col < srcWidth; col++) {
                   GLuint c;
                   for (c = 0; c < comps; c++) {
@@ -2061,83 +2061,6 @@ _mesa_texstore_ycbcr(TEXSTORE_PARAMS)
    return GL_TRUE;
 }
 
-static GLboolean
-_mesa_texstore_dudv8(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
-   ASSERT(texelBytes == 2);
-   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
-   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
-         (srcFormat == GL_DUDV_ATI));
-   ASSERT(baseInternalFormat == GL_DUDV_ATI);
-
-   if (srcType == GL_BYTE) {
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if (littleEndian) {
-        dstmap[0] = 0;
-        dstmap[1] = 3;
-      }
-      else {
-        dstmap[0] = 3;
-        dstmap[1] = 0;
-      }
-      dstmap[2] = ZERO;                /* ? */
-      dstmap[3] = ONE;         /* ? */
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-                               GL_LUMINANCE_ALPHA, /* hack */
-                               GL_UNSIGNED_BYTE, /* hack */
-                               GL_LUMINANCE_ALPHA, /* hack */
-                               dstmap, 2,
-                               dstRowStride, dstSlices,
-                               srcWidth, srcHeight, srcDepth, srcAddr,
-                               srcPacking);      
-   }   
-   else {
-      /* general path - note this is defined for 2d textures only */
-      const GLint components = _mesa_components_in_format(baseInternalFormat);
-      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
-                                                     srcFormat, srcType);
-      GLbyte *tempImage, *dst, *src;
-      GLint row;
-
-      tempImage = malloc(srcWidth * srcHeight * srcDepth
-                                          * components * sizeof(GLbyte));
-      if (!tempImage)
-         return GL_FALSE;
-
-      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
-                                           srcWidth, srcHeight,
-                                           srcFormat, srcType,
-                                           0, 0, 0);
-
-      dst = tempImage;
-      for (row = 0; row < srcHeight; row++) {
-         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
-                                     dst, srcFormat, srcType, src,
-                                     srcPacking, 0);
-         dst += srcWidth * components;
-         src += srcStride;
-      }
-      src = tempImage;
-      dst = (GLbyte *) dstSlices[0];
-      for (row = 0; row < srcHeight; row++) {
-         memcpy(dst, src, srcWidth * texelBytes);
-         dst += dstRowStride;
-         src += srcWidth * texelBytes;
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
 
 /**
  * Store a texture in a signed normalized 8-bit format.
@@ -2147,10 +2070,10 @@ _mesa_texstore_snorm8(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
-          dstFormat == MESA_FORMAT_SIGNED_L8 ||
-          dstFormat == MESA_FORMAT_SIGNED_I8 ||
-          dstFormat == MESA_FORMAT_SIGNED_R8);
+   ASSERT(dstFormat == MESA_FORMAT_A_SNORM8 ||
+          dstFormat == MESA_FORMAT_L_SNORM8 ||
+          dstFormat == MESA_FORMAT_I_SNORM8 ||
+          dstFormat == MESA_FORMAT_R_SNORM8);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 1);
 
    {
@@ -2190,9 +2113,9 @@ _mesa_texstore_snorm88(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
-          dstFormat == MESA_FORMAT_SIGNED_RG88 ||
-          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
+   ASSERT(dstFormat == MESA_FORMAT_L8A8_SNORM ||
+          dstFormat == MESA_FORMAT_G8R8_SNORM ||
+          dstFormat == MESA_FORMAT_R8G8_SNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
 
    {
@@ -2213,8 +2136,8 @@ _mesa_texstore_snorm88(TEXSTORE_PARAMS)
          for (row = 0; row < srcHeight; row++) {
             GLushort *dst = (GLushort *) dstRow;
 
-            if (dstFormat == MESA_FORMAT_SIGNED_AL88 ||
-                dstFormat == MESA_FORMAT_SIGNED_RG88_REV) {
+            if (dstFormat == MESA_FORMAT_L8A8_SNORM ||
+                dstFormat == MESA_FORMAT_R8G8_SNORM) {
                for (col = 0; col < srcWidth; col++) {
                   GLubyte l = FLOAT_TO_BYTE_TEX(src[0]);
                   GLubyte a = FLOAT_TO_BYTE_TEX(src[1]);
@@ -2246,10 +2169,10 @@ _mesa_texstore_snorm16(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
-          dstFormat == MESA_FORMAT_SIGNED_A16 ||
-          dstFormat == MESA_FORMAT_SIGNED_L16 ||
-          dstFormat == MESA_FORMAT_SIGNED_I16);
+   ASSERT(dstFormat == MESA_FORMAT_R_SNORM16 ||
+          dstFormat == MESA_FORMAT_A_SNORM16 ||
+          dstFormat == MESA_FORMAT_L_SNORM16 ||
+          dstFormat == MESA_FORMAT_I_SNORM16);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 2);
 
    {
@@ -2292,9 +2215,9 @@ _mesa_texstore_snorm1616(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
-          dstFormat == MESA_FORMAT_SIGNED_RG1616 ||
-          dstFormat == MESA_FORMAT_SIGNED_GR1616);
+   ASSERT(dstFormat == MESA_FORMAT_LA_SNORM16 ||
+          dstFormat == MESA_FORMAT_G16R16_SNORM ||
+          dstFormat == MESA_FORMAT_R16G16_SNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -2315,8 +2238,8 @@ _mesa_texstore_snorm1616(TEXSTORE_PARAMS)
          for (row = 0; row < srcHeight; row++) {
             GLuint *dst = (GLuint *) dstRow;
 
-            if (dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
-                dstFormat == MESA_FORMAT_SIGNED_GR1616) {
+            if (dstFormat == MESA_FORMAT_LA_SNORM16 ||
+                dstFormat == MESA_FORMAT_R16G16_SNORM) {
                for (col = 0; col < srcWidth; col++) {
                   GLushort l, a;
 
@@ -2345,16 +2268,16 @@ _mesa_texstore_snorm1616(TEXSTORE_PARAMS)
 }
 
 /**
- * Store a texture in MESA_FORMAT_SIGNED_RGBX8888 or
- * MESA_FORMAT_XBGR8888_SNORM.
+ * Store a texture in MESA_FORMAT_X8B8G8R8_SNORM or
+ * MESA_FORMAT_R8G8B8X8_SNORM.
  */
 static GLboolean
 _mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888 ||
-          dstFormat == MESA_FORMAT_XBGR8888_SNORM);
+   ASSERT(dstFormat == MESA_FORMAT_X8B8G8R8_SNORM ||
+          dstFormat == MESA_FORMAT_R8G8B8X8_SNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -2374,7 +2297,7 @@ _mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
          GLbyte *dstRow = (GLbyte *) dstSlices[img];
          for (row = 0; row < srcHeight; row++) {
             GLbyte *dst = dstRow;
-            if (dstFormat == MESA_FORMAT_SIGNED_RGBX8888) {
+            if (dstFormat == MESA_FORMAT_X8B8G8R8_SNORM) {
                for (col = 0; col < srcWidth; col++) {
                   dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
                   dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
@@ -2405,16 +2328,16 @@ _mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
 
 
 /**
- * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
- * MESA_FORMAT_SIGNED_RGBA8888_REV
+ * Store a texture in MESA_FORMAT_A8B8G8R8_SNORM or
+ * MESA_FORMAT_R8G8B8A8_SNORM
  */
 static GLboolean
 _mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
-          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
+   ASSERT(dstFormat == MESA_FORMAT_A8B8G8R8_SNORM ||
+          dstFormat == MESA_FORMAT_R8G8B8A8_SNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -2434,7 +2357,7 @@ _mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
          GLbyte *dstRow = (GLbyte *) dstSlices[img];
          for (row = 0; row < srcHeight; row++) {
             GLbyte *dst = dstRow;
-            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
+            if (dstFormat == MESA_FORMAT_A8B8G8R8_SNORM) {
                for (col = 0; col < srcWidth; col++) {
                   dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
                   dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
@@ -2473,74 +2396,71 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS)
    const GLint srcRowStride
       = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
    GLint img, row;
+   GLuint *depth = malloc(srcWidth * sizeof(GLuint));
+   GLubyte *stencil = malloc(srcWidth * sizeof(GLubyte));
 
-   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
+   ASSERT(dstFormat == MESA_FORMAT_S8_UINT_Z24_UNORM);
    ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
           srcFormat == GL_DEPTH_COMPONENT ||
           srcFormat == GL_STENCIL_INDEX);
-   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
+   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
+          srcType == GL_UNSIGNED_INT_24_8_EXT ||
+          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
 
-   if (srcFormat == GL_DEPTH_COMPONENT ||
-       srcFormat == GL_STENCIL_INDEX) {
-      GLuint *depth = malloc(srcWidth * sizeof(GLuint));
-      GLubyte *stencil = malloc(srcWidth * sizeof(GLubyte));
+   if (!depth || !stencil) {
+      free(depth);
+      free(stencil);
+      return GL_FALSE;
+   }
 
-      if (!depth || !stencil) {
-         free(depth);
-         free(stencil);
-         return GL_FALSE;
-      }
+   /* In case we only upload depth we need to preserve the stencil */
+   for (img = 0; img < srcDepth; img++) {
+      GLuint *dstRow = (GLuint *) dstSlices[img];
+      const GLubyte *src
+         = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
+               srcWidth, srcHeight,
+               srcFormat, srcType,
+               img, 0, 0);
+      for (row = 0; row < srcHeight; row++) {
+         GLint i;
+         GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
 
-      /* In case we only upload depth we need to preserve the stencil */
-      for (img = 0; img < srcDepth; img++) {
-        GLuint *dstRow = (GLuint *) dstSlices[img];
-         const GLubyte *src
-            = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
-                  srcWidth, srcHeight,
-                  srcFormat, srcType,
-                  img, 0, 0);
-         for (row = 0; row < srcHeight; row++) {
-            GLint i;
-           GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
+         if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
+            keepstencil = GL_TRUE;
+         }
+         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
+            keepdepth = GL_TRUE;
+         }
 
-           if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
-              keepstencil = GL_TRUE;
-           }
-            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
-              keepdepth = GL_TRUE;
-           }
+         if (keepdepth == GL_FALSE)
+            /* the 24 depth bits will be in the low position: */
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_UNSIGNED_INT, /* dst type */
+                                    keepstencil ? depth : dstRow, /* dst addr */
+                                    depthScale,
+                                    srcType, src, srcPacking);
 
-           if (keepdepth == GL_FALSE)
-              /* the 24 depth bits will be in the low position: */
-              _mesa_unpack_depth_span(ctx, srcWidth,
-                                      GL_UNSIGNED_INT, /* dst type */
-                                      keepstencil ? depth : dstRow, /* dst addr */
-                                      depthScale,
-                                      srcType, src, srcPacking);
-
-           if (keepstencil == GL_FALSE)
-              /* get the 8-bit stencil values */
-              _mesa_unpack_stencil_span(ctx, srcWidth,
-                                        GL_UNSIGNED_BYTE, /* dst type */
-                                        stencil, /* dst addr */
-                                        srcType, src, srcPacking,
-                                        ctx->_ImageTransferState);
-
-           for (i = 0; i < srcWidth; i++) {
-              if (keepstencil)
-                 dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
-              else
-                 dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
-           }
+         if (keepstencil == GL_FALSE)
+            /* get the 8-bit stencil values */
+            _mesa_unpack_stencil_span(ctx, srcWidth,
+                                      GL_UNSIGNED_BYTE, /* dst type */
+                                      stencil, /* dst addr */
+                                      srcType, src, srcPacking,
+                                      ctx->_ImageTransferState);
 
-            src += srcRowStride;
-            dstRow += dstRowStride / sizeof(GLuint);
+         for (i = 0; i < srcWidth; i++) {
+            if (keepstencil)
+               dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
+            else
+               dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
          }
+         src += srcRowStride;
+         dstRow += dstRowStride / sizeof(GLuint);
       }
-
-      free(depth);
-      free(stencil);
    }
+
+   free(depth);
+   free(stencil);
    return GL_TRUE;
 }
 
@@ -2558,12 +2478,13 @@ _mesa_texstore_s8_z24(TEXSTORE_PARAMS)
    GLuint *depth;
    GLubyte *stencil;
 
-   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
+   ASSERT(dstFormat == MESA_FORMAT_Z24_UNORM_S8_UINT);
    ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
           srcFormat == GL_DEPTH_COMPONENT ||
           srcFormat == GL_STENCIL_INDEX);
    ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
-          srcType == GL_UNSIGNED_INT_24_8_EXT);
+          srcType == GL_UNSIGNED_INT_24_8_EXT ||
+          srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
 
    depth = malloc(srcWidth * sizeof(GLuint));
    stencil = malloc(srcWidth * sizeof(GLubyte));
@@ -2701,10 +2622,10 @@ _mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
 
    ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
           dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
-          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
-          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 ||
+          dstFormat == MESA_FORMAT_A_FLOAT32 ||
+          dstFormat == MESA_FORMAT_L_FLOAT32 ||
+          dstFormat == MESA_FORMAT_LA_FLOAT32 ||
+          dstFormat == MESA_FORMAT_I_FLOAT32 ||
           dstFormat == MESA_FORMAT_R_FLOAT32 ||
           dstFormat == MESA_FORMAT_RG_FLOAT32 ||
           dstFormat == MESA_FORMAT_RGBX_FLOAT32);
@@ -2766,10 +2687,10 @@ _mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
 
    ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
           dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
-          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
-          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 ||
+          dstFormat == MESA_FORMAT_A_FLOAT16 ||
+          dstFormat == MESA_FORMAT_L_FLOAT16 ||
+          dstFormat == MESA_FORMAT_LA_FLOAT16 ||
+          dstFormat == MESA_FORMAT_I_FLOAT16 ||
           dstFormat == MESA_FORMAT_R_FLOAT16 ||
           dstFormat == MESA_FORMAT_RG_FLOAT16 ||
           dstFormat == MESA_FORMAT_RGBX_FLOAT16);
@@ -2828,14 +2749,14 @@ _mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
       components = 4;
    }
 
-   ASSERT(dstFormat == MESA_FORMAT_R_INT8 ||
-          dstFormat == MESA_FORMAT_RG_INT8 ||
-          dstFormat == MESA_FORMAT_RGB_INT8 ||
-          dstFormat == MESA_FORMAT_RGBA_INT8 ||
-          dstFormat == MESA_FORMAT_ALPHA_INT8 ||
-          dstFormat == MESA_FORMAT_INTENSITY_INT8 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_INT8 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8 ||
+   ASSERT(dstFormat == MESA_FORMAT_R_SINT8 ||
+          dstFormat == MESA_FORMAT_RG_SINT8 ||
+          dstFormat == MESA_FORMAT_RGB_SINT8 ||
+          dstFormat == MESA_FORMAT_RGBA_SINT8 ||
+          dstFormat == MESA_FORMAT_A_SINT8 ||
+          dstFormat == MESA_FORMAT_I_SINT8 ||
+          dstFormat == MESA_FORMAT_L_SINT8 ||
+          dstFormat == MESA_FORMAT_LA_SINT8 ||
           dstFormat == MESA_FORMAT_RGBX_SINT8);
    ASSERT(baseInternalFormat == GL_RGBA ||
           baseInternalFormat == GL_RGB ||
@@ -2899,14 +2820,14 @@ _mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
       components = 4;
    }
 
-   ASSERT(dstFormat == MESA_FORMAT_R_INT16 ||
-          dstFormat == MESA_FORMAT_RG_INT16 ||
-          dstFormat == MESA_FORMAT_RGB_INT16 ||
-          dstFormat == MESA_FORMAT_RGBA_INT16 ||
-          dstFormat == MESA_FORMAT_ALPHA_INT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_INT16 ||
-          dstFormat == MESA_FORMAT_INTENSITY_INT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16 ||
+   ASSERT(dstFormat == MESA_FORMAT_R_SINT16 ||
+          dstFormat == MESA_FORMAT_RG_SINT16 ||
+          dstFormat == MESA_FORMAT_RGB_SINT16 ||
+          dstFormat == MESA_FORMAT_RGBA_SINT16 ||
+          dstFormat == MESA_FORMAT_A_SINT16 ||
+          dstFormat == MESA_FORMAT_L_SINT16 ||
+          dstFormat == MESA_FORMAT_I_SINT16 ||
+          dstFormat == MESA_FORMAT_LA_SINT16 ||
           dstFormat == MESA_FORMAT_RGBX_SINT16);
    ASSERT(baseInternalFormat == GL_RGBA ||
           baseInternalFormat == GL_RGB ||
@@ -2970,14 +2891,14 @@ _mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
       components = 4;
    }
 
-   ASSERT(dstFormat == MESA_FORMAT_R_INT32 ||
-          dstFormat == MESA_FORMAT_RG_INT32 ||
-          dstFormat == MESA_FORMAT_RGB_INT32 ||
-          dstFormat == MESA_FORMAT_RGBA_INT32 ||
-          dstFormat == MESA_FORMAT_ALPHA_INT32 ||
-          dstFormat == MESA_FORMAT_INTENSITY_INT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_INT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32 ||
+   ASSERT(dstFormat == MESA_FORMAT_R_SINT32 ||
+          dstFormat == MESA_FORMAT_RG_SINT32 ||
+          dstFormat == MESA_FORMAT_RGB_SINT32 ||
+          dstFormat == MESA_FORMAT_RGBA_SINT32 ||
+          dstFormat == MESA_FORMAT_A_SINT32 ||
+          dstFormat == MESA_FORMAT_I_SINT32 ||
+          dstFormat == MESA_FORMAT_L_SINT32 ||
+          dstFormat == MESA_FORMAT_LA_SINT32 ||
           dstFormat == MESA_FORMAT_RGBX_SINT32);
    ASSERT(baseInternalFormat == GL_RGBA ||
           baseInternalFormat == GL_RGB ||
@@ -3045,10 +2966,10 @@ _mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
           dstFormat == MESA_FORMAT_RG_UINT8 ||
           dstFormat == MESA_FORMAT_RGB_UINT8 ||
           dstFormat == MESA_FORMAT_RGBA_UINT8 ||
-          dstFormat == MESA_FORMAT_ALPHA_UINT8 ||
-          dstFormat == MESA_FORMAT_INTENSITY_UINT8 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_UINT8 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8 ||
+          dstFormat == MESA_FORMAT_A_UINT8 ||
+          dstFormat == MESA_FORMAT_I_UINT8 ||
+          dstFormat == MESA_FORMAT_L_UINT8 ||
+          dstFormat == MESA_FORMAT_LA_UINT8 ||
           dstFormat == MESA_FORMAT_RGBX_UINT8);
    ASSERT(baseInternalFormat == GL_RGBA ||
           baseInternalFormat == GL_RGB ||
@@ -3113,10 +3034,10 @@ _mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
           dstFormat == MESA_FORMAT_RG_UINT16 ||
           dstFormat == MESA_FORMAT_RGB_UINT16 ||
           dstFormat == MESA_FORMAT_RGBA_UINT16 ||
-          dstFormat == MESA_FORMAT_ALPHA_UINT16 ||
-          dstFormat == MESA_FORMAT_INTENSITY_UINT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_UINT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16 ||
+          dstFormat == MESA_FORMAT_A_UINT16 ||
+          dstFormat == MESA_FORMAT_I_UINT16 ||
+          dstFormat == MESA_FORMAT_L_UINT16 ||
+          dstFormat == MESA_FORMAT_LA_UINT16 ||
           dstFormat == MESA_FORMAT_RGBX_UINT16);
    ASSERT(baseInternalFormat == GL_RGBA ||
           baseInternalFormat == GL_RGB ||
@@ -3181,10 +3102,10 @@ _mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
           dstFormat == MESA_FORMAT_RG_UINT32 ||
           dstFormat == MESA_FORMAT_RGB_UINT32 ||
           dstFormat == MESA_FORMAT_RGBA_UINT32 ||
-          dstFormat == MESA_FORMAT_ALPHA_UINT32 ||
-          dstFormat == MESA_FORMAT_INTENSITY_UINT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_UINT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32 ||
+          dstFormat == MESA_FORMAT_A_UINT32 ||
+          dstFormat == MESA_FORMAT_I_UINT32 ||
+          dstFormat == MESA_FORMAT_L_UINT32 ||
+          dstFormat == MESA_FORMAT_LA_UINT32 ||
           dstFormat == MESA_FORMAT_RGBX_UINT32);
    ASSERT(baseInternalFormat == GL_RGBA ||
           baseInternalFormat == GL_RGB ||
@@ -3259,20 +3180,11 @@ _mesa_texstore_srgba8(TEXSTORE_PARAMS)
    mesa_format newDstFormat;
    GLboolean k;
 
-   ASSERT(dstFormat == MESA_FORMAT_SRGBA8 ||
-          dstFormat == MESA_FORMAT_XBGR8888_SRGB);
+   ASSERT(dstFormat == MESA_FORMAT_A8B8G8R8_SRGB ||
+          dstFormat == MESA_FORMAT_R8G8B8X8_SRGB ||
+          dstFormat == MESA_FORMAT_R8G8B8A8_SRGB);
 
-   /* reuse normal rgba texstore code */
-   if (dstFormat == MESA_FORMAT_SRGBA8) {
-      newDstFormat = MESA_FORMAT_A8B8G8R8_UNORM;
-   }
-   else if (dstFormat == MESA_FORMAT_XBGR8888_SRGB) {
-      newDstFormat = MESA_FORMAT_R8G8B8X8_UNORM;
-   }
-   else {
-      ASSERT(0);
-      return GL_TRUE;
-   }
+   newDstFormat = _mesa_get_srgb_format_linear(dstFormat);
 
    k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
                                newDstFormat,
@@ -3290,10 +3202,10 @@ _mesa_texstore_sargb8(TEXSTORE_PARAMS)
    mesa_format newDstFormat;
    GLboolean k;
 
-   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
+   assert(dstFormat == MESA_FORMAT_B8G8R8A8_SRGB ||
+          dstFormat == MESA_FORMAT_B8G8R8X8_SRGB);
 
-   /* reuse normal rgba texstore code */
-   newDstFormat = MESA_FORMAT_B8G8R8A8_UNORM;
+   newDstFormat = _mesa_get_srgb_format_linear(dstFormat);
 
    k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
                                newDstFormat,
@@ -3332,10 +3244,10 @@ _mesa_texstore_sla8(TEXSTORE_PARAMS)
    mesa_format newDstFormat;
    GLboolean k;
 
-   ASSERT(dstFormat == MESA_FORMAT_SLA8);
+   ASSERT(dstFormat == MESA_FORMAT_L8A8_SRGB);
 
    /* reuse normal luminance/alpha texstore code */
-   newDstFormat = MESA_FORMAT_AL88;
+   newDstFormat = MESA_FORMAT_L8A8_UNORM;
 
    k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
                              newDstFormat,
@@ -3351,7 +3263,7 @@ _mesa_texstore_rgb9_e5(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT);
+   ASSERT(dstFormat == MESA_FORMAT_R9G9B9E5_FLOAT);
    ASSERT(baseInternalFormat == GL_RGB);
 
    {
@@ -3389,7 +3301,7 @@ _mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT);
+   ASSERT(dstFormat == MESA_FORMAT_R11G11B10_FLOAT);
    ASSERT(baseInternalFormat == GL_RGB);
 
    {
@@ -3426,49 +3338,47 @@ _mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS)
 static GLboolean
 _mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS)
 {
-   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8);
+   GLint img, row;
+   const GLint srcRowStride
+      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
+      / sizeof(uint64_t);
+
+   ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_S8X24_UINT);
    ASSERT(srcFormat == GL_DEPTH_STENCIL ||
           srcFormat == GL_DEPTH_COMPONENT ||
           srcFormat == GL_STENCIL_INDEX);
    ASSERT(srcFormat != GL_DEPTH_STENCIL ||
+          srcType == GL_UNSIGNED_INT_24_8 ||
           srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV);
 
-   if (srcFormat == GL_DEPTH_COMPONENT ||
-       srcFormat == GL_STENCIL_INDEX) {
-      GLint img, row;
-      const GLint srcRowStride
-         = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
-         / sizeof(uint64_t);
+   /* In case we only upload depth we need to preserve the stencil */
+   for (img = 0; img < srcDepth; img++) {
+      uint64_t *dstRow = (uint64_t *) dstSlices[img];
+      const uint64_t *src
+         = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
+               srcWidth, srcHeight,
+               srcFormat, srcType,
+               img, 0, 0);
+      for (row = 0; row < srcHeight; row++) {
+         /* The unpack functions with:
+          *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
+          * only write their own dword, so the other dword (stencil
+          * or depth) is preserved. */
+         if (srcFormat != GL_STENCIL_INDEX)
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
+                                    dstRow, /* dst addr */
+                                    ~0U, srcType, src, srcPacking);
 
-      /* In case we only upload depth we need to preserve the stencil */
-      for (img = 0; img < srcDepth; img++) {
-         uint64_t *dstRow = (uint64_t *) dstSlices[img];
-         const uint64_t *src
-            = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr,
-                  srcWidth, srcHeight,
-                  srcFormat, srcType,
-                  img, 0, 0);
-         for (row = 0; row < srcHeight; row++) {
-            /* The unpack functions with:
-             *    dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV
-             * only write their own dword, so the other dword (stencil
-             * or depth) is preserved. */
-            if (srcFormat != GL_STENCIL_INDEX)
-               _mesa_unpack_depth_span(ctx, srcWidth,
-                                       GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
-                                       dstRow, /* dst addr */
-                                       ~0U, srcType, src, srcPacking);
-
-            if (srcFormat != GL_DEPTH_COMPONENT)
-               _mesa_unpack_stencil_span(ctx, srcWidth,
-                                         GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
-                                         dstRow, /* dst addr */
-                                         srcType, src, srcPacking,
-                                         ctx->_ImageTransferState);
+         if (srcFormat != GL_DEPTH_COMPONENT)
+            _mesa_unpack_stencil_span(ctx, srcWidth,
+                                      GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */
+                                      dstRow, /* dst addr */
+                                      srcType, src, srcPacking,
+                                      ctx->_ImageTransferState);
 
-            src += srcRowStride;
-            dstRow += dstRowStride / sizeof(uint64_t);
-         }
+         src += srcRowStride;
+         dstRow += dstRowStride / sizeof(uint64_t);
       }
    }
    return GL_TRUE;
@@ -3479,7 +3389,7 @@ _mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT);
+   ASSERT(dstFormat == MESA_FORMAT_B10G10R10A2_UINT);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -3535,7 +3445,7 @@ _mesa_texstore_abgr2101010_uint(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_ABGR2101010_UINT);
+   ASSERT(dstFormat == MESA_FORMAT_R10G10B10A2_UINT);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -3591,7 +3501,7 @@ _mesa_texstore_abgr2101010(TEXSTORE_PARAMS)
 {
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
-   ASSERT(dstFormat == MESA_FORMAT_ABGR2101010);
+   ASSERT(dstFormat == MESA_FORMAT_R10G10B10A2_UNORM);
    ASSERT(_mesa_get_format_bytes(dstFormat) == 4);
 
    {
@@ -3670,19 +3580,19 @@ _mesa_get_texstore_func(mesa_format format)
       table[MESA_FORMAT_X8R8G8B8_UNORM] = _mesa_texstore_argb8888;
       table[MESA_FORMAT_BGR_UNORM8] = _mesa_texstore_rgb888;
       table[MESA_FORMAT_RGB_UNORM8] = _mesa_texstore_bgr888;
-      table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565;
-      table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565;
-      table[MESA_FORMAT_ARGB4444] = store_ubyte_texture;
-      table[MESA_FORMAT_ARGB4444_REV] = store_ubyte_texture;
-      table[MESA_FORMAT_RGBA5551] = store_ubyte_texture;
-      table[MESA_FORMAT_ARGB1555] = store_ubyte_texture;
-      table[MESA_FORMAT_ARGB1555_REV] = store_ubyte_texture;
-      table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44;
-      table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88;
-      table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88;
-      table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616;
-      table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616;
-      table[MESA_FORMAT_RGB332] = store_ubyte_texture;
+      table[MESA_FORMAT_B5G6R5_UNORM] = _mesa_texstore_rgb565;
+      table[MESA_FORMAT_R5G6B5_UNORM] = _mesa_texstore_rgb565;
+      table[MESA_FORMAT_B4G4R4A4_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_A4R4G4B4_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_A1B5G5R5_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_B5G5R5A1_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_A1R5G5B5_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_L4A4_UNORM] = _mesa_texstore_unorm44;
+      table[MESA_FORMAT_L8A8_UNORM] = _mesa_texstore_unorm88;
+      table[MESA_FORMAT_A8L8_UNORM] = _mesa_texstore_unorm88;
+      table[MESA_FORMAT_L16A16_UNORM] = _mesa_texstore_unorm1616;
+      table[MESA_FORMAT_A16L16_UNORM] = _mesa_texstore_unorm1616;
+      table[MESA_FORMAT_B2G3R3_UNORM] = store_ubyte_texture;
       table[MESA_FORMAT_A_UNORM8] = _mesa_texstore_unorm8;
       table[MESA_FORMAT_A_UNORM16] = _mesa_texstore_unorm16;
       table[MESA_FORMAT_L_UNORM8] = _mesa_texstore_unorm8;
@@ -3692,24 +3602,24 @@ _mesa_get_texstore_func(mesa_format format)
       table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr;
       table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr;
       table[MESA_FORMAT_R_UNORM8] = _mesa_texstore_unorm8;
-      table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88;
-      table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88;
+      table[MESA_FORMAT_R8G8_UNORM] = _mesa_texstore_unorm88;
+      table[MESA_FORMAT_G8R8_UNORM] = _mesa_texstore_unorm88;
       table[MESA_FORMAT_R_UNORM16] = _mesa_texstore_unorm16;
-      table[MESA_FORMAT_GR1616] = _mesa_texstore_unorm1616;
-      table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616;
-      table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010;
-      table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8;
-      table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24;
+      table[MESA_FORMAT_R16G16_UNORM] = _mesa_texstore_unorm1616;
+      table[MESA_FORMAT_G16R16_UNORM] = _mesa_texstore_unorm1616;
+      table[MESA_FORMAT_B10G10R10A2_UNORM] = _mesa_texstore_argb2101010;
+      table[MESA_FORMAT_S8_UINT_Z24_UNORM] = _mesa_texstore_z24_s8;
+      table[MESA_FORMAT_Z24_UNORM_S8_UINT] = _mesa_texstore_s8_z24;
       table[MESA_FORMAT_Z_UNORM16] = _mesa_texstore_z16;
-      table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24;
-      table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8;
+      table[MESA_FORMAT_Z24_UNORM_X8_UINT] = _mesa_texstore_x8_z24;
+      table[MESA_FORMAT_X8_UINT_Z24_UNORM] = _mesa_texstore_z24_x8;
       table[MESA_FORMAT_Z_UNORM32] = _mesa_texstore_z32;
       table[MESA_FORMAT_S_UINT8] = _mesa_texstore_s8;
       table[MESA_FORMAT_BGR_SRGB8] = _mesa_texstore_srgb8;
-      table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8;
-      table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8;
+      table[MESA_FORMAT_A8B8G8R8_SRGB] = _mesa_texstore_srgba8;
+      table[MESA_FORMAT_B8G8R8A8_SRGB] = _mesa_texstore_sargb8;
       table[MESA_FORMAT_L_SRGB8] = _mesa_texstore_sl8;
-      table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8;
+      table[MESA_FORMAT_L8A8_SRGB] = _mesa_texstore_sla8;
       table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1;
       table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1;
       table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3;
@@ -3724,37 +3634,36 @@ _mesa_get_texstore_func(mesa_format format)
       table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16;
       table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32;
       table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16;
-      table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
-      table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
-      table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32;
-      table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16;
-      table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32;
-      table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16;
+      table[MESA_FORMAT_A_FLOAT32] = _mesa_texstore_rgba_float32;
+      table[MESA_FORMAT_A_FLOAT16] = _mesa_texstore_rgba_float16;
+      table[MESA_FORMAT_L_FLOAT32] = _mesa_texstore_rgba_float32;
+      table[MESA_FORMAT_L_FLOAT16] = _mesa_texstore_rgba_float16;
+      table[MESA_FORMAT_LA_FLOAT32] = _mesa_texstore_rgba_float32;
+      table[MESA_FORMAT_LA_FLOAT16] = _mesa_texstore_rgba_float16;
+      table[MESA_FORMAT_I_FLOAT32] = _mesa_texstore_rgba_float32;
+      table[MESA_FORMAT_I_FLOAT16] = _mesa_texstore_rgba_float16;
       table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32;
       table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16;
       table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32;
       table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16;
-      table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8;
-      table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8;
-      table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88;
-      table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888;
-      table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888;
-      table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888;
-      table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16;
-      table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616;
-      table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16;
-      table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16;
+      table[MESA_FORMAT_R_SNORM8] = _mesa_texstore_snorm8;
+      table[MESA_FORMAT_R8G8_SNORM] = _mesa_texstore_snorm88;
+      table[MESA_FORMAT_X8B8G8R8_SNORM] = _mesa_texstore_signed_rgbx8888;
+      table[MESA_FORMAT_A8B8G8R8_SNORM] = _mesa_texstore_signed_rgba8888;
+      table[MESA_FORMAT_R8G8B8A8_SNORM] = _mesa_texstore_signed_rgba8888;
+      table[MESA_FORMAT_R_SNORM16] = _mesa_texstore_snorm16;
+      table[MESA_FORMAT_R16G16_SNORM] = _mesa_texstore_snorm1616;
+      table[MESA_FORMAT_RGB_SNORM16] = _mesa_texstore_signed_rgba_16;
+      table[MESA_FORMAT_RGBA_SNORM16] = _mesa_texstore_signed_rgba_16;
       table[MESA_FORMAT_RGBA_UNORM16] = _mesa_texstore_rgba_16;
-      table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1;
-      table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1;
-      table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2;
-      table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2;
-      table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1;
-      table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1;
-      table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2;
-      table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2;
+      table[MESA_FORMAT_R_RGTC1_UNORM] = _mesa_texstore_red_rgtc1;
+      table[MESA_FORMAT_R_RGTC1_SNORM] = _mesa_texstore_signed_red_rgtc1;
+      table[MESA_FORMAT_RG_RGTC2_UNORM] = _mesa_texstore_rg_rgtc2;
+      table[MESA_FORMAT_RG_RGTC2_SNORM] = _mesa_texstore_signed_rg_rgtc2;
+      table[MESA_FORMAT_L_LATC1_UNORM] = _mesa_texstore_red_rgtc1;
+      table[MESA_FORMAT_L_LATC1_SNORM] = _mesa_texstore_signed_red_rgtc1;
+      table[MESA_FORMAT_LA_LATC2_UNORM] = _mesa_texstore_rg_rgtc2;
+      table[MESA_FORMAT_LA_LATC2_SNORM] = _mesa_texstore_signed_rg_rgtc2;
       table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8;
       table[MESA_FORMAT_ETC2_RGB8] = _mesa_texstore_etc2_rgb8;
       table[MESA_FORMAT_ETC2_SRGB8] = _mesa_texstore_etc2_srgb8;
@@ -3768,59 +3677,59 @@ _mesa_get_texstore_func(mesa_format format)
          _mesa_texstore_etc2_rgb8_punchthrough_alpha1;
       table[MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1] =
          _mesa_texstore_etc2_srgb8_punchthrough_alpha1;
-      table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8;
-      table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8;
-      table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88;
-      table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8;
-      table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16;
-      table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16;
-      table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616;
-      table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16;
-      table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5;
-      table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f;
+      table[MESA_FORMAT_A_SNORM8] = _mesa_texstore_snorm8;
+      table[MESA_FORMAT_L_SNORM8] = _mesa_texstore_snorm8;
+      table[MESA_FORMAT_L8A8_SNORM] = _mesa_texstore_snorm88;
+      table[MESA_FORMAT_I_SNORM8] = _mesa_texstore_snorm8;
+      table[MESA_FORMAT_A_SNORM16] = _mesa_texstore_snorm16;
+      table[MESA_FORMAT_L_SNORM16] = _mesa_texstore_snorm16;
+      table[MESA_FORMAT_LA_SNORM16] = _mesa_texstore_snorm1616;
+      table[MESA_FORMAT_I_SNORM16] = _mesa_texstore_snorm16;
+      table[MESA_FORMAT_R9G9B9E5_FLOAT] = _mesa_texstore_rgb9_e5;
+      table[MESA_FORMAT_R11G11B10_FLOAT] = _mesa_texstore_r11_g11_b10f;
       table[MESA_FORMAT_Z_FLOAT32] = _mesa_texstore_z32;
-      table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8;
-
-      table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
-      table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
-      table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
-      table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32;
-
-      table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8;
-      table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16;
-      table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32;
-      table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32;
-
-      table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8;
-      table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16;
-      table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32;
-      table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32;
-
-      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32;
-
-      table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16;
-      table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32;
-      table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32;
-      table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32;
-      table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32;
+      table[MESA_FORMAT_Z32_FLOAT_S8X24_UINT] = _mesa_texstore_z32f_x24s8;
+
+      table[MESA_FORMAT_A_UINT8] = _mesa_texstore_rgba_uint8;
+      table[MESA_FORMAT_A_UINT16] = _mesa_texstore_rgba_uint16;
+      table[MESA_FORMAT_A_UINT32] = _mesa_texstore_rgba_uint32;
+      table[MESA_FORMAT_A_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_A_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_A_SINT32] = _mesa_texstore_rgba_int32;
+
+      table[MESA_FORMAT_I_UINT8] = _mesa_texstore_rgba_uint8;
+      table[MESA_FORMAT_I_UINT16] = _mesa_texstore_rgba_uint16;
+      table[MESA_FORMAT_I_UINT32] = _mesa_texstore_rgba_uint32;
+      table[MESA_FORMAT_I_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_I_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_I_SINT32] = _mesa_texstore_rgba_int32;
+
+      table[MESA_FORMAT_L_UINT8] = _mesa_texstore_rgba_uint8;
+      table[MESA_FORMAT_L_UINT16] = _mesa_texstore_rgba_uint16;
+      table[MESA_FORMAT_L_UINT32] = _mesa_texstore_rgba_uint32;
+      table[MESA_FORMAT_L_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_L_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_L_SINT32] = _mesa_texstore_rgba_int32;
+
+      table[MESA_FORMAT_LA_UINT8] = _mesa_texstore_rgba_uint8;
+      table[MESA_FORMAT_LA_UINT16] = _mesa_texstore_rgba_uint16;
+      table[MESA_FORMAT_LA_UINT32] = _mesa_texstore_rgba_uint32;
+      table[MESA_FORMAT_LA_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_LA_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_LA_SINT32] = _mesa_texstore_rgba_int32;
+
+      table[MESA_FORMAT_R_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_RG_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_RGB_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_RGBA_SINT8] = _mesa_texstore_rgba_int8;
+      table[MESA_FORMAT_R_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_RG_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_RGB_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_RGBA_SINT16] = _mesa_texstore_rgba_int16;
+      table[MESA_FORMAT_R_SINT32] = _mesa_texstore_rgba_int32;
+      table[MESA_FORMAT_RG_SINT32] = _mesa_texstore_rgba_int32;
+      table[MESA_FORMAT_RGB_SINT32] = _mesa_texstore_rgba_int32;
+      table[MESA_FORMAT_RGBA_SINT32] = _mesa_texstore_rgba_int32;
 
       table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8;
       table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8;
@@ -3835,16 +3744,17 @@ _mesa_get_texstore_func(mesa_format format)
       table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32;
       table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32;
 
-      table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint;
-      table[MESA_FORMAT_ABGR2101010_UINT] = _mesa_texstore_abgr2101010_uint;
+      table[MESA_FORMAT_B10G10R10A2_UINT] = _mesa_texstore_argb2101010_uint;
+      table[MESA_FORMAT_R10G10B10A2_UINT] = _mesa_texstore_abgr2101010_uint;
 
-      table[MESA_FORMAT_XRGB4444_UNORM] = store_ubyte_texture;
-      table[MESA_FORMAT_XRGB1555_UNORM] = store_ubyte_texture;
-      table[MESA_FORMAT_XBGR8888_SNORM] = _mesa_texstore_signed_rgbx8888;
-      table[MESA_FORMAT_XBGR8888_SRGB] = _mesa_texstore_srgba8;
+      table[MESA_FORMAT_B4G4R4X4_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_B5G5R5X1_UNORM] = store_ubyte_texture;
+      table[MESA_FORMAT_R8G8B8X8_SNORM] = _mesa_texstore_signed_rgbx8888;
+      table[MESA_FORMAT_R8G8B8X8_SRGB] = _mesa_texstore_srgba8;
+      table[MESA_FORMAT_R8G8B8A8_SRGB] = _mesa_texstore_srgba8;
       table[MESA_FORMAT_RGBX_UINT8] = _mesa_texstore_rgba_uint8;
       table[MESA_FORMAT_RGBX_SINT8] = _mesa_texstore_rgba_int8;
-      table[MESA_FORMAT_XRGB2101010_UNORM] = _mesa_texstore_argb2101010;
+      table[MESA_FORMAT_B10G10R10X2_UNORM] = _mesa_texstore_argb2101010;
       table[MESA_FORMAT_RGBX_UNORM16] = _mesa_texstore_rgba_16;
       table[MESA_FORMAT_RGBX_SNORM16] = _mesa_texstore_signed_rgba_16;
       table[MESA_FORMAT_RGBX_FLOAT16] = _mesa_texstore_rgba_float16;
@@ -3854,10 +3764,12 @@ _mesa_get_texstore_func(mesa_format format)
       table[MESA_FORMAT_RGBX_UINT32] = _mesa_texstore_rgba_uint32;
       table[MESA_FORMAT_RGBX_SINT32] = _mesa_texstore_rgba_int32;
 
-      table[MESA_FORMAT_ABGR2101010] = _mesa_texstore_abgr2101010;
+      table[MESA_FORMAT_R10G10B10A2_UNORM] = _mesa_texstore_abgr2101010;
 
-      table[MESA_FORMAT_SIGNED_RG88] = _mesa_texstore_snorm88;
-      table[MESA_FORMAT_SIGNED_RG1616] = _mesa_texstore_snorm1616;
+      table[MESA_FORMAT_G8R8_SNORM] = _mesa_texstore_snorm88;
+      table[MESA_FORMAT_G16R16_SNORM] = _mesa_texstore_snorm1616;
+
+      table[MESA_FORMAT_B8G8R8X8_SRGB] = _mesa_texstore_sargb8;
 
       initialized = GL_TRUE;
    }
@@ -3918,6 +3830,21 @@ _mesa_texstore_can_use_memcpy(struct gl_context *ctx,
       return GL_FALSE;
    }
 
+   /* Depth texture data needs clamping in following cases:
+    * - Floating point dstFormat with signed srcType: clamp to [0.0, 1.0].
+    * - Fixed point dstFormat with signed srcType: clamp to [0, 2^n -1].
+    *
+    * All the cases except one (float dstFormat with float srcType) are ruled
+    * out by _mesa_format_matches_format_and_type() check above. Handle the
+    * remaining case here.
+    */
+   if ((baseInternalFormat == GL_DEPTH_COMPONENT ||
+        baseInternalFormat == GL_DEPTH_STENCIL) &&
+       (srcType == GL_FLOAT ||
+        srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)) {
+      return GL_FALSE;
+   }
+
    return GL_TRUE;
 }
 
@@ -4167,6 +4094,78 @@ _mesa_store_texsubimage(struct gl_context *ctx, GLuint dims,
                      format, type, pixels, packing, "glTexSubImage");
 }
 
+static void
+clear_image_to_zero(GLubyte *dstMap, GLint dstRowStride,
+                    GLsizei width, GLsizei height,
+                    GLsizei clearValueSize)
+{
+   GLsizei y;
+
+   for (y = 0; y < height; y++) {
+      memset(dstMap, 0, clearValueSize * width);
+      dstMap += dstRowStride;
+   }
+}
+
+static void
+clear_image_to_value(GLubyte *dstMap, GLint dstRowStride,
+                     GLsizei width, GLsizei height,
+                     const GLvoid *clearValue,
+                     GLsizei clearValueSize)
+{
+   GLsizei y, x;
+
+   for (y = 0; y < height; y++) {
+      for (x = 0; x < width; x++) {
+         memcpy(dstMap, clearValue, clearValueSize);
+         dstMap += clearValueSize;
+      }
+      dstMap += dstRowStride - clearValueSize * width;
+   }
+}
+
+/*
+ * Fallback for Driver.ClearTexSubImage().
+ */
+void
+_mesa_store_cleartexsubimage(struct gl_context *ctx,
+                             struct gl_texture_image *texImage,
+                             GLint xoffset, GLint yoffset, GLint zoffset,
+                             GLsizei width, GLsizei height, GLsizei depth,
+                             const GLvoid *clearValue)
+{
+   GLubyte *dstMap;
+   GLint dstRowStride;
+   GLsizeiptr clearValueSize;
+   GLsizei z;
+
+   clearValueSize = _mesa_get_format_bytes(texImage->TexFormat);
+
+   for (z = 0; z < depth; z++) {
+      ctx->Driver.MapTextureImage(ctx, texImage,
+                                  z + zoffset, xoffset, yoffset,
+                                  width, height,
+                                  GL_MAP_WRITE_BIT,
+                                  &dstMap, &dstRowStride);
+      if (dstMap == NULL) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClearTex*Image");
+         return;
+      }
+
+      if (clearValue) {
+         clear_image_to_value(dstMap, dstRowStride,
+                              width, height,
+                              clearValue,
+                              clearValueSize);
+      } else {
+         clear_image_to_zero(dstMap, dstRowStride,
+                             width, height,
+                             clearValueSize);
+      }
+
+      ctx->Driver.UnmapTextureImage(ctx, texImage, z + zoffset);
+   }
+}
 
 /**
  * Fallback for Driver.CompressedTexImage()
@@ -4205,6 +4204,61 @@ _mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims,
 }
 
 
+void
+_mesa_compute_compressed_pixelstore(GLuint dims, struct gl_texture_image *texImage,
+                              GLsizei width, GLsizei height, GLsizei depth,
+                              const struct gl_pixelstore_attrib *packing,
+                              struct compressed_pixelstore *store)
+{
+   GLuint bw, bh;
+   const mesa_format texFormat = texImage->TexFormat;
+
+   _mesa_get_format_block_size(texFormat, &bw, &bh);
+
+   store->SkipBytes = 0;
+   store->TotalBytesPerRow = store->CopyBytesPerRow =
+         _mesa_format_row_stride(texFormat, width);
+   store->TotalRowsPerSlice = store->CopyRowsPerSlice =
+         (height + bh - 1) / bh;
+   store->CopySlices = depth;
+
+   if (packing->CompressedBlockWidth &&
+       packing->CompressedBlockSize) {
+
+      bw = packing->CompressedBlockWidth;
+
+      if (packing->RowLength) {
+         store->TotalBytesPerRow = packing->CompressedBlockSize *
+            (packing->RowLength + bw - 1) / bw;
+      }
+
+      store->SkipBytes += packing->SkipPixels * packing->CompressedBlockSize / bw;
+   }
+
+   if (dims > 1 && packing->CompressedBlockHeight &&
+       packing->CompressedBlockSize) {
+
+      bh = packing->CompressedBlockHeight;
+
+      store->SkipBytes += packing->SkipRows * store->TotalBytesPerRow / bh;
+      store->CopyRowsPerSlice = (height + bh - 1) / bh;  /* rows in blocks */
+
+      if (packing->ImageHeight) {
+         store->TotalRowsPerSlice = (packing->ImageHeight + bh - 1) / bh;
+      }
+   }
+
+   if (dims > 2 && packing->CompressedBlockDepth &&
+       packing->CompressedBlockSize) {
+
+      int bd = packing->CompressedBlockDepth;
+
+      store->SkipBytes += packing->SkipImages * store->TotalBytesPerRow *
+            store->TotalRowsPerSlice / bd;
+   }
+}
+
+
 /**
  * Fallback for Driver.CompressedTexSubImage()
  */
@@ -4216,20 +4270,19 @@ _mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
                                    GLenum format,
                                    GLsizei imageSize, const GLvoid *data)
 {
-   GLint bytesPerRow, dstRowStride, srcRowStride;
-   GLint i, rows;
+   struct compressed_pixelstore store;
+   GLint dstRowStride;
+   GLint i, slice;
    GLubyte *dstMap;
    const GLubyte *src;
-   const mesa_format texFormat = texImage->TexFormat;
-   GLuint bw, bh;
-   GLint slice;
 
    if (dims == 1) {
       _mesa_problem(ctx, "Unexpected 1D compressed texsubimage call");
       return;
    }
 
-   _mesa_get_format_block_size(texFormat, &bw, &bh);
+   _mesa_compute_compressed_pixelstore(dims, texImage, width, height, depth,
+                                 &ctx->Unpack, &store);
 
    /* get pointer to src pixels (may be in a pbo which we'll map here) */
    data = _mesa_validate_pbo_compressed_teximage(ctx, dims, imageSize, data,
@@ -4238,10 +4291,9 @@ _mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
    if (!data)
       return;
 
-   srcRowStride = _mesa_format_row_stride(texFormat, width);
-   src = (const GLubyte *) data;
+   src = (const GLubyte *) data + store.SkipBytes;
 
-   for (slice = 0; slice < depth; slice++) {
+   for (slice = 0; slice < store.CopySlices; slice++) {
       /* Map dest texture buffer */
       ctx->Driver.MapTextureImage(ctx, texImage, slice + zoffset,
                                   xoffset, yoffset, width, height,
@@ -4249,17 +4301,18 @@ _mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims,
                                   &dstMap, &dstRowStride);
 
       if (dstMap) {
-         bytesPerRow = srcRowStride;  /* bytes per row of blocks */
-         rows = (height + bh - 1) / bh;  /* rows in blocks */
 
          /* copy rows of blocks */
-         for (i = 0; i < rows; i++) {
-            memcpy(dstMap, src, bytesPerRow);
+         for (i = 0; i < store.CopyRowsPerSlice; i++) {
+            memcpy(dstMap, src, store.CopyBytesPerRow);
             dstMap += dstRowStride;
-            src += srcRowStride;
+            src += store.TotalBytesPerRow;
          }
 
          ctx->Driver.UnmapTextureImage(ctx, texImage, slice + zoffset);
+
+         /* advance to next slice */
+         src += store.TotalBytesPerRow * (store.TotalRowsPerSlice - store.CopyRowsPerSlice);
       }
       else {
          _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage%uD",