OSDN Git Service

Handling ETC2, EAC and ASTC related enums
authorAlexis Hetu <sugoi@google.com>
Tue, 1 Sep 2015 14:58:37 +0000 (10:58 -0400)
committerAlexis Hétu <sugoi@google.com>
Thu, 3 Sep 2015 17:55:09 +0000 (17:55 +0000)
Note that no decoding functionality is added here.
This cl merely acknowledges textures of the ETC2, EAC
and ASTC format by handling their related enums in
SwiftShader, and the byte data is then allowed to be
passed down all the way to the Surface object, where
the decoding code will be added. Also note that this
cl does not add the extensions strings required for
ASTC support, so ASTC is still unsupported after this cl.

Change-Id: I1d8aed0fb64b0d4c72846e87410750d1e485c46b
Reviewed-on: https://swiftshader-review.googlesource.com/3938
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
src/OpenGL/common/Image.cpp
src/OpenGL/libGLESv2/Context.h
src/OpenGL/libGLESv2/Framebuffer.cpp
src/OpenGL/libGLESv2/Texture.cpp
src/OpenGL/libGLESv2/libGLESv2.cpp
src/OpenGL/libGLESv2/libGLESv3.cpp
src/OpenGL/libGLESv2/utilities.cpp
src/OpenGL/libGLESv2/utilities.h
src/Renderer/Surface.cpp
src/Renderer/Surface.hpp

index 78122d2..fd9ab52 100644 (file)
 
 namespace
 {
+       int getNumBlocks(int w, int h, int blockSizeX, int blockSizeY)
+       {
+               return ((w + blockSizeX - 1) / blockSizeX) * ((h + blockSizeY - 1) / blockSizeY);
+       }
+
        enum DataType
        {
                Alpha,
@@ -415,27 +420,99 @@ namespace egl
 
        sw::Format SelectInternalFormat(GLenum format, GLenum type)
        {
-               if(format == GL_ETC1_RGB8_OES)
+               switch(format)
                {
+               case GL_ETC1_RGB8_OES:
                        return sw::FORMAT_ETC1;
-               }
-               else
+               case GL_COMPRESSED_R11_EAC:
+                       return sw::FORMAT_R11_EAC;
+               case GL_COMPRESSED_SIGNED_R11_EAC:
+                       return sw::FORMAT_SIGNED_R11_EAC;
+               case GL_COMPRESSED_RG11_EAC:
+                       return sw::FORMAT_RG11_EAC;
+               case GL_COMPRESSED_SIGNED_RG11_EAC:
+                       return sw::FORMAT_SIGNED_RG11_EAC;
+               case GL_COMPRESSED_RGB8_ETC2:
+                       return sw::FORMAT_RGB8_ETC2;
+               case GL_COMPRESSED_SRGB8_ETC2:
+                       return sw::FORMAT_SRGB8_ETC2;
+               case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+                       return sw::FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+               case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+                       return sw::FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
+               case GL_COMPRESSED_RGBA8_ETC2_EAC:
+                       return sw::FORMAT_RGBA8_ETC2_EAC;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+                       return sw::FORMAT_SRGB8_ALPHA8_ETC2_EAC;
+               case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+                       return sw::FORMAT_RGBA_ASTC_4x4_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+                       return sw::FORMAT_RGBA_ASTC_5x4_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+                       return sw::FORMAT_RGBA_ASTC_5x5_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+                       return sw::FORMAT_RGBA_ASTC_6x5_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+                       return sw::FORMAT_RGBA_ASTC_6x6_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+                       return sw::FORMAT_RGBA_ASTC_8x5_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+                       return sw::FORMAT_RGBA_ASTC_8x6_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+                       return sw::FORMAT_RGBA_ASTC_8x8_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+                       return sw::FORMAT_RGBA_ASTC_10x5_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+                       return sw::FORMAT_RGBA_ASTC_10x6_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+                       return sw::FORMAT_RGBA_ASTC_10x8_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+                       return sw::FORMAT_RGBA_ASTC_10x10_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+                       return sw::FORMAT_RGBA_ASTC_12x10_KHR;
+               case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+                       return sw::FORMAT_RGBA_ASTC_12x12_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR;
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                       return sw::FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR;
                #if S3TC_SUPPORT
-               if(format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||
-                  format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT)
-               {
-                       return sw::FORMAT_DXT1;
-               }
-               else if(format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE)
-               {
-                       return sw::FORMAT_DXT3;
-               }
-               else if(format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE)
-               {
-                       return sw::FORMAT_DXT5;
-               }
-               else
+               case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+               case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+                               return sw::FORMAT_DXT1;
+               case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+                               return sw::FORMAT_DXT3;
+               case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+                               return sw::FORMAT_DXT5;
                #endif
+               default:
+                       break;
+               }
+
                if(type == GL_FLOAT)
                {
                        return sw::FORMAT_A32B32G32R32F;
@@ -598,14 +675,55 @@ namespace egl
                case GL_COMPRESSED_SRGB8_ETC2:
                case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
                case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
-                       return 8 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
+                       return 8 * getNumBlocks(width, height, 4, 4);
                case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
                case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
                case GL_COMPRESSED_RG11_EAC:
                case GL_COMPRESSED_SIGNED_RG11_EAC:
                case GL_COMPRESSED_RGBA8_ETC2_EAC:
                case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
-                       return 16 * (GLsizei)ceil((float)width / 4.0f) * (GLsizei)ceil((float)height / 4.0f);
+               case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+                       return 16 * getNumBlocks(width, height, 4, 4);
+               case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+                       return 16 * getNumBlocks(width, height, 5, 4);
+               case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+                       return 16 * getNumBlocks(width, height, 5, 5);
+               case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+                       return 16 * getNumBlocks(width, height, 6, 5);
+               case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+                       return 16 * getNumBlocks(width, height, 6, 6);
+               case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+                       return 16 * getNumBlocks(width, height, 8, 5);
+               case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+                       return 16 * getNumBlocks(width, height, 8, 6);
+               case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+                       return 16 * getNumBlocks(width, height, 8, 8);
+               case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+                       return 16 * getNumBlocks(width, height, 10, 5);
+               case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+                       return 16 * getNumBlocks(width, height, 10, 6);
+               case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+                       return 16 * getNumBlocks(width, height, 10, 8);
+               case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+                       return 16 * getNumBlocks(width, height, 10, 10);
+               case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+                       return 16 * getNumBlocks(width, height, 12, 10);
+               case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                       return 16 * getNumBlocks(width, height, 12, 12);
                default:
                        return 0;
                }
index 6e4240d..ef7769b 100644 (file)
@@ -109,6 +109,34 @@ const GLenum compressedTextureFormats[] =
        GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,\r
        GL_COMPRESSED_RGBA8_ETC2_EAC,\r
        GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC,\r
+       GL_COMPRESSED_RGBA_ASTC_4x4_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_5x4_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_5x5_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_6x5_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_6x6_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_8x5_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_8x6_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_8x8_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_10x5_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_10x6_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_10x8_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_10x10_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_12x10_KHR,\r
+       GL_COMPRESSED_RGBA_ASTC_12x12_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR,\r
+       GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR,\r
 #endif\r
 };\r
 \r
index 90b4db2..6d13d89 100644 (file)
@@ -293,7 +293,7 @@ GLenum Framebuffer::completeness(int &width, int &height, int &samples)
                        {
                                GLenum format = colorbuffer->getFormat();
 
-                               if(IsCompressed(format) ||
+                               if(IsCompressed(format, egl::getClientVersion()) ||
                                        format == GL_ALPHA ||
                                        format == GL_LUMINANCE ||
                                        format == GL_LUMINANCE_ALPHA)
index b0e8553..de835c4 100644 (file)
@@ -428,7 +428,7 @@ void Texture::subImage(GLint xoffset, GLint yoffset, GLint zoffset, GLsizei widt
         return error(GL_INVALID_VALUE);\r
     }\r
 \r
-    if(IsCompressed(image->getFormat()))\r
+    if(IsCompressed(image->getFormat(), egl::getClientVersion()))\r
     {\r
         return error(GL_INVALID_OPERATION);\r
     }\r
@@ -860,7 +860,7 @@ bool Texture2D::isMipmapComplete() const
 \r
 bool Texture2D::isCompressed(GLenum target, GLint level) const\r
 {\r
-    return IsCompressed(getFormat(target, level));\r
+    return IsCompressed(getFormat(target, level), egl::getClientVersion());\r
 }\r
 \r
 bool Texture2D::isDepth(GLenum target, GLint level) const\r
@@ -1198,7 +1198,7 @@ bool TextureCubeMap::isMipmapCubeComplete() const
 \r
 bool TextureCubeMap::isCompressed(GLenum target, GLint level) const\r
 {\r
-    return IsCompressed(getFormat(target, level));\r
+    return IsCompressed(getFormat(target, level), egl::getClientVersion());\r
 }\r
 \r
 bool TextureCubeMap::isDepth(GLenum target, GLint level) const\r
@@ -1766,7 +1766,7 @@ bool Texture3D::isMipmapComplete() const
 \r
 bool Texture3D::isCompressed(GLenum target, GLint level) const\r
 {\r
-       return IsCompressed(getFormat(target, level));\r
+       return IsCompressed(getFormat(target, level), egl::getClientVersion());\r
 }\r
 \r
 bool Texture3D::isDepth(GLenum target, GLint level) const\r
index 311037b..8dab13d 100644 (file)
@@ -131,6 +131,12 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh
 \r
 static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)\r
 {\r
+       GLenum formatError = ValidateCompressedFormat(textureFormat, egl::getClientVersion(), false);\r
+       if(formatError != GL_NONE)\r
+       {\r
+               return error(formatError, false);\r
+       }\r
+\r
        // [OpenGL ES 2.0.24] table 3.9\r
        switch(textureFormat)\r
        {\r
@@ -167,20 +173,6 @@ static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFo
                        return error(GL_INVALID_OPERATION, false);\r
                }\r
                break;\r
-       case GL_ETC1_RGB8_OES:\r
-               return error(GL_INVALID_OPERATION, false);\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_OPERATION, false);\r
-               }\r
-               else\r
-               {\r
-                       return error(GL_INVALID_ENUM, false);\r
-               }\r
        case GL_DEPTH_COMPONENT:\r
        case GL_DEPTH_STENCIL_OES:\r
                return error(GL_INVALID_OPERATION, false);\r
@@ -973,36 +965,8 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       egl::GLint clientVersion = egl::getClientVersion();\r
-\r
        switch(internalformat)\r
        {\r
-       case GL_ETC1_RGB8_OES:\r
-               break;\r
-       case GL_COMPRESSED_R11_EAC:\r
-       case GL_COMPRESSED_SIGNED_R11_EAC:\r
-       case GL_COMPRESSED_RG11_EAC:\r
-       case GL_COMPRESSED_SIGNED_RG11_EAC:\r
-       case GL_COMPRESSED_RGB8_ETC2:\r
-       case GL_COMPRESSED_SRGB8_ETC2:\r
-       case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
-       case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
-               if(clientVersion >= 3)\r
-               {\r
-                       break;\r
-               }\r
-               return error(GL_INVALID_ENUM);\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(!S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
        case GL_DEPTH_COMPONENT:\r
        case GL_DEPTH_COMPONENT16:\r
        case GL_DEPTH_COMPONENT32_OES:\r
@@ -1010,7 +974,14 @@ void CompressedTexImage2D(GLenum target, GLint level, GLenum internalformat, GLs
        case GL_DEPTH24_STENCIL8_OES:\r
                return error(GL_INVALID_OPERATION);\r
        default:\r
-               return error(GL_INVALID_ENUM);\r
+               {\r
+                       GLenum formatError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);\r
+                       if(formatError != GL_NONE)\r
+                       {\r
+                               return error(formatError);\r
+                       }\r
+               }\r
+               break;\r
        }\r
 \r
        if(border != 0)\r
@@ -1116,38 +1087,10 @@ void CompressedTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yo
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       egl::GLint clientVersion = egl::getClientVersion();\r
-\r
-       switch(format)\r
+       GLenum formatError = ValidateCompressedFormat(format, egl::getClientVersion(), true);\r
+       if(formatError != GL_NONE)\r
        {\r
-       case GL_ETC1_RGB8_OES:\r
-               break;\r
-       case GL_COMPRESSED_R11_EAC:\r
-       case GL_COMPRESSED_SIGNED_R11_EAC:\r
-       case GL_COMPRESSED_RG11_EAC:\r
-       case GL_COMPRESSED_SIGNED_RG11_EAC:\r
-       case GL_COMPRESSED_RGB8_ETC2:\r
-       case GL_COMPRESSED_SRGB8_ETC2:\r
-       case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
-       case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
-               if(clientVersion >= 3)\r
-               {\r
-                       break;\r
-               }\r
-               return error(GL_INVALID_ENUM);\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(!S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       default:\r
-               return error(GL_INVALID_ENUM);\r
+               return error(formatError);\r
        }\r
 \r
        if(width == 0 || height == 0 || data == NULL)\r
@@ -5143,6 +5086,12 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
                        }\r
                }\r
 \r
+               GLenum formatError = ValidateCompressedFormat(format, clientVersion, false);\r
+               if(formatError != GL_NONE)\r
+               {\r
+                       return error(formatError);\r
+               }\r
+\r
                switch(format)\r
                {\r
                case GL_ALPHA:\r
@@ -5755,35 +5704,6 @@ void TexImage2D(GLenum target, GLint level, GLint internalformat, GLsizei width,
                                return error(GL_INVALID_ENUM);\r
                        }\r
                        break;\r
-               case GL_ETC1_RGB8_OES:\r
-                       return error(GL_INVALID_OPERATION);\r
-               case GL_COMPRESSED_R11_EAC:\r
-               case GL_COMPRESSED_SIGNED_R11_EAC:\r
-               case GL_COMPRESSED_RG11_EAC:\r
-               case GL_COMPRESSED_SIGNED_RG11_EAC:\r
-               case GL_COMPRESSED_RGB8_ETC2:\r
-               case GL_COMPRESSED_SRGB8_ETC2:\r
-               case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-               case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-               case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
-               case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
-                       if(clientVersion >= 3)\r
-                       {\r
-                               return error(GL_INVALID_OPERATION);\r
-                       }\r
-                       return error(GL_INVALID_ENUM);\r
-               case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-               case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-               case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-               case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-                       if(S3TC_SUPPORT)\r
-                       {\r
-                               return error(GL_INVALID_OPERATION);\r
-                       }\r
-                       else\r
-                       {\r
-                               return error(GL_INVALID_ENUM);\r
-                       }\r
                case GL_DEPTH_COMPONENT:\r
                        switch(internalformat)\r
                        {\r
@@ -7216,17 +7136,6 @@ void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat,
 \r
        switch(internalformat)\r
        {\r
-       case GL_ETC1_RGB8_OES:\r
-               break;\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(!S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
        case GL_DEPTH_COMPONENT:\r
        case GL_DEPTH_COMPONENT16:\r
        case GL_DEPTH_COMPONENT32_OES:\r
@@ -7234,7 +7143,13 @@ void CompressedTexImage3DOES(GLenum target, GLint level, GLenum internalformat,
        case GL_DEPTH24_STENCIL8_OES:\r
                return error(GL_INVALID_OPERATION);\r
        default:\r
-               return error(GL_INVALID_ENUM);\r
+               {\r
+                       GLenum formatError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);\r
+                       if(formatError != GL_NONE)\r
+                       {\r
+                               return error(formatError);\r
+                       }\r
+               }\r
        }\r
 \r
        if(imageSize != egl::ComputeCompressedSize(width, height, internalformat) * depth)\r
@@ -7277,21 +7192,10 @@ void CompressedTexSubImage3DOES(GLenum target, GLint level, GLint xoffset, GLint
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       switch(format)\r
+       GLenum formatError = ValidateCompressedFormat(format, egl::getClientVersion(), true);\r
+       if(formatError != GL_NONE)\r
        {\r
-       case GL_ETC1_RGB8_OES:\r
-               break;\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(!S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       default:\r
-               return error(GL_INVALID_ENUM);\r
+               return error(formatError);\r
        }\r
 \r
        if(width == 0 || height == 0 || depth == 0 || data == NULL)\r
index 9d807fc..2660a8e 100644 (file)
@@ -120,6 +120,12 @@ static bool validateSubImageParams(bool compressed, GLsizei width, GLsizei heigh
 \r
 static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFormat)\r
 {\r
+       GLenum formatError = ValidateCompressedFormat(textureFormat, egl::getClientVersion(), false);\r
+       if(formatError != GL_NONE)\r
+       {\r
+               return error(formatError, false);\r
+       }\r
+\r
        switch(textureFormat)\r
        {\r
        case GL_ALPHA:\r
@@ -155,30 +161,6 @@ static bool validateColorBufferFormat(GLenum textureFormat, GLenum colorbufferFo
                        return error(GL_INVALID_OPERATION, false);\r
                }\r
                break;\r
-       case GL_ETC1_RGB8_OES:\r
-       case GL_COMPRESSED_R11_EAC:\r
-       case GL_COMPRESSED_SIGNED_R11_EAC:\r
-       case GL_COMPRESSED_RG11_EAC:\r
-       case GL_COMPRESSED_SIGNED_RG11_EAC:\r
-       case GL_COMPRESSED_RGB8_ETC2:\r
-       case GL_COMPRESSED_SRGB8_ETC2:\r
-       case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
-       case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
-               return error(GL_INVALID_OPERATION, false);\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_OPERATION, false);\r
-               }\r
-               else\r
-               {\r
-                       return error(GL_INVALID_ENUM, false);\r
-               }\r
        case GL_DEPTH_COMPONENT:\r
        case GL_DEPTH_STENCIL:\r
                return error(GL_INVALID_OPERATION, false);\r
@@ -899,27 +881,6 @@ GL_APICALL void GL_APIENTRY glCompressedTexImage3D(GLenum target, GLint level, G
 \r
        switch(internalformat)\r
        {\r
-       case GL_ETC1_RGB8_OES:\r
-       case GL_COMPRESSED_R11_EAC:\r
-       case GL_COMPRESSED_SIGNED_R11_EAC:\r
-       case GL_COMPRESSED_RG11_EAC:\r
-       case GL_COMPRESSED_SIGNED_RG11_EAC:\r
-       case GL_COMPRESSED_RGB8_ETC2:\r
-       case GL_COMPRESSED_SRGB8_ETC2:\r
-       case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
-       case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
-               break;\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(!S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
        case GL_DEPTH_COMPONENT:\r
        case GL_DEPTH_COMPONENT16:\r
        case GL_DEPTH_COMPONENT32_OES:\r
@@ -927,7 +888,13 @@ GL_APICALL void GL_APIENTRY glCompressedTexImage3D(GLenum target, GLint level, G
        case GL_DEPTH24_STENCIL8:\r
                return error(GL_INVALID_OPERATION);\r
        default:\r
-               return error(GL_INVALID_ENUM);\r
+               {\r
+                       GLenum formatError = ValidateCompressedFormat(internalformat, egl::getClientVersion(), true);\r
+                       if(formatError != GL_NONE)\r
+                       {\r
+                               return error(formatError);\r
+                       }\r
+               }\r
        }\r
 \r
        if(imageSize != egl::ComputeCompressedSize(width, height, internalformat) * depth)\r
@@ -971,31 +938,10 @@ GL_APICALL void GL_APIENTRY glCompressedTexSubImage3D(GLenum target, GLint level
                return error(GL_INVALID_VALUE);\r
        }\r
 \r
-       switch(format)\r
+       GLenum formatError = ValidateCompressedFormat(format, egl::getClientVersion(), true);\r
+       if(formatError != GL_NONE)\r
        {\r
-       case GL_ETC1_RGB8_OES:\r
-       case GL_COMPRESSED_R11_EAC:\r
-       case GL_COMPRESSED_SIGNED_R11_EAC:\r
-       case GL_COMPRESSED_RG11_EAC:\r
-       case GL_COMPRESSED_SIGNED_RG11_EAC:\r
-       case GL_COMPRESSED_RGB8_ETC2:\r
-       case GL_COMPRESSED_SRGB8_ETC2:\r
-       case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:\r
-       case GL_COMPRESSED_RGBA8_ETC2_EAC:\r
-       case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:\r
-               break;\r
-       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:\r
-       case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:\r
-               if(!S3TC_SUPPORT)\r
-               {\r
-                       return error(GL_INVALID_ENUM);\r
-               }\r
-               break;\r
-       default:\r
-               return error(GL_INVALID_ENUM);\r
+               return error(formatError);\r
        }\r
 \r
        if(width == 0 || height == 0 || depth == 0 || data == NULL)\r
index bdb8e46..9c93dbc 100644 (file)
@@ -316,23 +316,64 @@ namespace es2
                return static_cast<GLint>((static_cast<GLfloat>(0xFFFFFFFF) * value - 1.0f) * 0.5f);\r
        }\r
 \r
-       bool IsCompressed(GLenum format)\r
+       bool IsCompressed(GLenum format, egl::GLint clientVersion)\r
        {\r
-               return format == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ||\r
-                      format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT ||\r
-               format == GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE ||\r
-               format == GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE ||\r
-               format == GL_ETC1_RGB8_OES ||\r
-               format == GL_COMPRESSED_R11_EAC ||\r
-               format == GL_COMPRESSED_SIGNED_R11_EAC ||\r
-               format == GL_COMPRESSED_RG11_EAC ||\r
-               format == GL_COMPRESSED_SIGNED_RG11_EAC ||\r
-               format == GL_COMPRESSED_RGB8_ETC2 ||\r
-               format == GL_COMPRESSED_SRGB8_ETC2 ||\r
-               format == GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 ||\r
-               format == GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 ||\r
-               format == GL_COMPRESSED_RGBA8_ETC2_EAC ||\r
-               format == GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;\r
+               return ValidateCompressedFormat(format, clientVersion, true) == GL_NONE;\r
+       }\r
+\r
+       GLenum ValidateCompressedFormat(GLenum format, egl::GLint clientVersion, bool expectCompressedFormats)\r
+       {\r
+               switch(format)\r
+               {\r
+               case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+               case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+               case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
+               case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
+                       return S3TC_SUPPORT ? (expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION) : GL_INVALID_ENUM;
+               case GL_ETC1_RGB8_OES:
+                       return expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION;
+               case GL_COMPRESSED_R11_EAC:
+               case GL_COMPRESSED_SIGNED_R11_EAC:
+               case GL_COMPRESSED_RG11_EAC:
+               case GL_COMPRESSED_SIGNED_RG11_EAC:
+               case GL_COMPRESSED_RGB8_ETC2:
+               case GL_COMPRESSED_SRGB8_ETC2:
+               case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case GL_COMPRESSED_RGBA8_ETC2_EAC:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
+               case GL_COMPRESSED_RGBA_ASTC_4x4_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_5x4_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_5x5_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_6x5_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_6x6_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_8x5_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_8x6_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_8x8_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_10x5_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_10x6_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_10x8_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_10x10_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_12x10_KHR:
+               case GL_COMPRESSED_RGBA_ASTC_12x12_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:
+               case GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:\r
+                       return (clientVersion >= 3) ? (expectCompressedFormats ? GL_NONE : GL_INVALID_OPERATION) : GL_INVALID_ENUM;\r
+               default:\r
+                       return expectCompressedFormats ? GL_INVALID_ENUM : GL_NONE; // Not compressed format\r
+               }\r
        }\r
 \r
        bool IsDepthTexture(GLenum format)\r
index 82f5fa9..27ff9df 100644 (file)
@@ -40,7 +40,8 @@ namespace es2
 \r
        GLint floatToInt(GLfloat value);\r
 \r
-       bool IsCompressed(GLenum format);\r
+       bool IsCompressed(GLenum format, egl::GLint clientVersion);\r
+       GLenum ValidateCompressedFormat(GLenum format, egl::GLint clientVersion, bool expectCompressedFormats);\r
        bool IsDepthTexture(GLenum format);\r
        bool IsStencilTexture(GLenum format);\r
        bool IsCubemapTextureTarget(GLenum target);\r
index 99dafd3..3a72601 100644 (file)
@@ -764,7 +764,59 @@ namespace sw
                        #endif
                        case FORMAT_ATI1:
                        case FORMAT_ETC1:
+                       case FORMAT_R11_EAC:
+                       case FORMAT_SIGNED_R11_EAC:
+                       case FORMAT_RGB8_ETC2:
+                       case FORMAT_SRGB8_ETC2:
+                       case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+                       case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
                                return (unsigned char*)buffer + 8 * (x / 4) + (y / 4) * pitchB + z * sliceB;
+                       case FORMAT_RG11_EAC:
+                       case FORMAT_SIGNED_RG11_EAC:
+                       case FORMAT_RGBA8_ETC2_EAC:
+                       case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+                       case FORMAT_RGBA_ASTC_4x4_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 4) + (y / 4) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_5x4_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 5) + (y / 4) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_5x5_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 5) + (y / 5) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_6x5_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 6) + (y / 5) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_6x6_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 6) + (y / 6) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_8x5_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 8) + (y / 5) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_8x6_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 8) + (y / 6) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_8x8_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 8) + (y / 8) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_10x5_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 10) + (y / 5) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_10x6_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 10) + (y / 6) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_10x8_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 10) + (y / 8) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_10x10_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 10) + (y / 10) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_12x10_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 12) + (y / 10) * pitchB + z * sliceB;
+                       case FORMAT_RGBA_ASTC_12x12_KHR:
+                       case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                               return (unsigned char*)buffer + 16 * (x / 12) + (y / 12) * pitchB + z * sliceB;
                        #if S3TC_SUPPORT
                        case FORMAT_DXT3:
                        case FORMAT_DXT5:
@@ -1104,6 +1156,44 @@ namespace sw
                case FORMAT_ATI1:                               return 2;   // Column of four pixels
                case FORMAT_ATI2:                               return 4;   // Column of four pixels
                case FORMAT_ETC1:                               return 2;   // Column of four pixels
+               case FORMAT_R11_EAC:                    return 2;
+               case FORMAT_SIGNED_R11_EAC:             return 2;
+               case FORMAT_RG11_EAC:                   return 4;
+               case FORMAT_SIGNED_RG11_EAC:    return 4;
+               case FORMAT_RGB8_ETC2:                  return 2;
+               case FORMAT_SRGB8_ETC2:                 return 2;
+               case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:      return 2;
+               case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:     return 2;
+               case FORMAT_RGBA8_ETC2_EAC:                     return 4;
+               case FORMAT_SRGB8_ALPHA8_ETC2_EAC:      return 4;
+               case FORMAT_RGBA_ASTC_4x4_KHR:
+               case FORMAT_RGBA_ASTC_5x4_KHR:
+               case FORMAT_RGBA_ASTC_5x5_KHR:
+               case FORMAT_RGBA_ASTC_6x5_KHR:
+               case FORMAT_RGBA_ASTC_6x6_KHR:
+               case FORMAT_RGBA_ASTC_8x5_KHR:
+               case FORMAT_RGBA_ASTC_8x6_KHR:
+               case FORMAT_RGBA_ASTC_8x8_KHR:
+               case FORMAT_RGBA_ASTC_10x5_KHR:
+               case FORMAT_RGBA_ASTC_10x6_KHR:
+               case FORMAT_RGBA_ASTC_10x8_KHR:
+               case FORMAT_RGBA_ASTC_10x10_KHR:
+               case FORMAT_RGBA_ASTC_12x10_KHR:
+               case FORMAT_RGBA_ASTC_12x12_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR: return 0; // FIXME
                // Bumpmap formats
                case FORMAT_V8U8:                               return 2;
                case FORMAT_L6V5U5:                             return 2;
@@ -1171,7 +1261,51 @@ namespace sw
                case FORMAT_DXT1:
                #endif
                case FORMAT_ETC1:
+               case FORMAT_R11_EAC:
+               case FORMAT_SIGNED_R11_EAC:
+               case FORMAT_RGB8_ETC2:
+               case FORMAT_SRGB8_ETC2:
+               case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
                        return 8 * ((width + 3) / 4);    // 64 bit per 4x4 block, computed per 4 rows
+               case FORMAT_RG11_EAC:
+               case FORMAT_SIGNED_RG11_EAC:
+               case FORMAT_RGBA8_ETC2_EAC:
+               case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+               case FORMAT_RGBA_ASTC_4x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+                       return 16 * ((width + 3) / 4);    // 128 bit per 4x4 block, computed per 4 rows
+               case FORMAT_RGBA_ASTC_5x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+               case FORMAT_RGBA_ASTC_5x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+                       return 16 * ((width + 4) / 5);
+               case FORMAT_RGBA_ASTC_6x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+               case FORMAT_RGBA_ASTC_6x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+                       return 16 * ((width + 5) / 6);
+               case FORMAT_RGBA_ASTC_8x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+               case FORMAT_RGBA_ASTC_8x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+               case FORMAT_RGBA_ASTC_8x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+                       return 16 * ((width + 7) / 8);
+               case FORMAT_RGBA_ASTC_10x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+               case FORMAT_RGBA_ASTC_10x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+               case FORMAT_RGBA_ASTC_10x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+               case FORMAT_RGBA_ASTC_10x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+                       return 16 * ((width + 9) / 10);
+               case FORMAT_RGBA_ASTC_12x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+               case FORMAT_RGBA_ASTC_12x12_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                       return 16 * ((width + 11) / 12);
                #if S3TC_SUPPORT
                case FORMAT_DXT3:
                case FORMAT_DXT5:
@@ -1212,7 +1346,50 @@ namespace sw
                case FORMAT_DXT5:
                #endif
                case FORMAT_ETC1:
+               case FORMAT_R11_EAC:
+               case FORMAT_SIGNED_R11_EAC:
+               case FORMAT_RG11_EAC:
+               case FORMAT_SIGNED_RG11_EAC:
+               case FORMAT_RGB8_ETC2:
+               case FORMAT_SRGB8_ETC2:
+               case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_RGBA8_ETC2_EAC:
+               case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+               case FORMAT_RGBA_ASTC_4x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+               case FORMAT_RGBA_ASTC_5x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
                        return pitchB(width, format, target) * ((height + 3) / 4);   // Pitch computed per 4 rows
+               case FORMAT_RGBA_ASTC_5x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+               case FORMAT_RGBA_ASTC_6x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+               case FORMAT_RGBA_ASTC_8x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+               case FORMAT_RGBA_ASTC_10x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+                       return pitchB(width, format, target) * ((height + 4) / 5);   // Pitch computed per 5 rows
+               case FORMAT_RGBA_ASTC_6x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+               case FORMAT_RGBA_ASTC_8x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+               case FORMAT_RGBA_ASTC_10x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+                       return pitchB(width, format, target) * ((height + 5) / 6);   // Pitch computed per 6 rows
+               case FORMAT_RGBA_ASTC_8x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+               case FORMAT_RGBA_ASTC_10x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+                       return pitchB(width, format, target) * ((height + 7) / 8);   // Pitch computed per 8 rows
+               case FORMAT_RGBA_ASTC_10x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+               case FORMAT_RGBA_ASTC_12x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+                       return pitchB(width, format, target) * ((height + 9) / 10);   // Pitch computed per 10 rows
+               case FORMAT_RGBA_ASTC_12x12_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                       return pitchB(width, format, target) * ((height + 11) / 12);   // Pitch computed per 12 rows
                case FORMAT_ATI1:
                case FORMAT_ATI2:
                default:
@@ -1253,6 +1430,44 @@ namespace sw
                        case FORMAT_ATI1:               decodeATI1(destination, source);                break;   // FIXME: Check destination format
                        case FORMAT_ATI2:               decodeATI2(destination, source);                break;   // FIXME: Check destination format
                        case FORMAT_ETC1:               decodeETC1(destination, source);                break;   // FIXME: Check destination format
+                       case FORMAT_R11_EAC:         decodeEAC(destination, source, 1, false); break; // FIXME: Check destination format
+                       case FORMAT_SIGNED_R11_EAC:  decodeEAC(destination, source, 1, true);  break; // FIXME: Check destination format
+                       case FORMAT_RG11_EAC:        decodeEAC(destination, source, 2, false); break; // FIXME: Check destination format
+                       case FORMAT_SIGNED_RG11_EAC: decodeEAC(destination, source, 2, true);  break; // FIXME: Check destination format
+                       case FORMAT_RGB8_ETC2:                      decodeETC2(destination, source, 0, false); break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ETC2:                     decodeETC2(destination, source, 0, true);  break; // FIXME: Check destination format
+                       case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:  decodeETC2(destination, source, 1, false); break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2: decodeETC2(destination, source, 1, true);  break; // FIXME: Check destination format
+                       case FORMAT_RGBA8_ETC2_EAC:                 decodeETC2(destination, source, 8, false); break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ETC2_EAC:          decodeETC2(destination, source, 8, true);  break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_4x4_KHR:           decodeASTC(destination, source, 4,  4,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_5x4_KHR:           decodeASTC(destination, source, 5,  4,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_5x5_KHR:           decodeASTC(destination, source, 5,  5,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_6x5_KHR:           decodeASTC(destination, source, 6,  5,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_6x6_KHR:           decodeASTC(destination, source, 6,  6,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_8x5_KHR:           decodeASTC(destination, source, 8,  5,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_8x6_KHR:           decodeASTC(destination, source, 8,  6,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_8x8_KHR:           decodeASTC(destination, source, 8,  8,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_10x5_KHR:          decodeASTC(destination, source, 10, 5,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_10x6_KHR:          decodeASTC(destination, source, 10, 6,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_10x8_KHR:          decodeASTC(destination, source, 10, 8,  1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_10x10_KHR:         decodeASTC(destination, source, 10, 10, 1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_12x10_KHR:         decodeASTC(destination, source, 12, 10, 1, false); break; // FIXME: Check destination format
+                       case FORMAT_RGBA_ASTC_12x12_KHR:         decodeASTC(destination, source, 12, 12, 1, false); break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:   decodeASTC(destination, source, 4,  4,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:   decodeASTC(destination, source, 5,  4,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:   decodeASTC(destination, source, 5,  5,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:   decodeASTC(destination, source, 6,  5,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:   decodeASTC(destination, source, 6,  6,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:   decodeASTC(destination, source, 8,  5,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:   decodeASTC(destination, source, 8,  6,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:   decodeASTC(destination, source, 8,  8,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:  decodeASTC(destination, source, 10, 5,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:  decodeASTC(destination, source, 10, 6,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:  decodeASTC(destination, source, 10, 8,  1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR: decodeASTC(destination, source, 10, 10, 1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR: decodeASTC(destination, source, 12, 10, 1, true);  break; // FIXME: Check destination format
+                       case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR: decodeASTC(destination, source, 12, 12, 1, true);  break; // FIXME: Check destination format
                        default:                                genericUpdate(destination, source);             break;
                        }
                }
@@ -2077,6 +2292,19 @@ namespace sw
                }
        }
 
+       void Surface::decodeEAC(Buffer &internal, const Buffer &external, int nbChannels, bool isSigned)
+       {
+               ASSERT((nbChannels == 1) || (nbChannels == 2));
+       }
+
+       void Surface::decodeETC2(Buffer &internal, const Buffer &external, int nbAlphaBits, bool isSRGB)
+       {
+       }
+
+       void Surface::decodeASTC(Buffer &internal, const Buffer &external, int xBlockSize, int yBlockSize, int zBlockSize, bool isSRGB)
+       {
+       }
+
        unsigned int Surface::size(int width, int height, int depth, Format format)
        {
                // Dimensions rounded up to multiples of 4, used for compressed formats
@@ -2090,13 +2318,64 @@ namespace sw
                #endif
                case FORMAT_ATI1:
                case FORMAT_ETC1:
+               case FORMAT_R11_EAC:
+               case FORMAT_SIGNED_R11_EAC:
+               case FORMAT_RGB8_ETC2:
+               case FORMAT_SRGB8_ETC2:
+               case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
                        return width4 * height4 * depth / 2;
                #if S3TC_SUPPORT
                case FORMAT_DXT3:
                case FORMAT_DXT5:
                #endif
                case FORMAT_ATI2:
+               case FORMAT_RG11_EAC:
+               case FORMAT_SIGNED_RG11_EAC:
+               case FORMAT_RGBA8_ETC2_EAC:
+               case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+               case FORMAT_RGBA_ASTC_4x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
                        return width4 * height4 * depth;
+               case FORMAT_RGBA_ASTC_5x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+                       return align(width, 5) * height4 * depth;
+               case FORMAT_RGBA_ASTC_5x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+                       return align(width, 5) * align(height, 5) * depth;
+               case FORMAT_RGBA_ASTC_6x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+                       return align(width, 6) * align(height, 5) * depth;
+               case FORMAT_RGBA_ASTC_6x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+                       return align(width, 6) * align(height, 6) * depth;
+               case FORMAT_RGBA_ASTC_8x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+                       return align(width, 8) * align(height, 5) * depth;
+               case FORMAT_RGBA_ASTC_8x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+                       return align(width, 8) * align(height, 6) * depth;
+               case FORMAT_RGBA_ASTC_8x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+                       return align(width, 8) * align(height, 8) * depth;
+               case FORMAT_RGBA_ASTC_10x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+                       return align(width, 10) * align(height, 5) * depth;
+               case FORMAT_RGBA_ASTC_10x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+                       return align(width, 10) * align(height, 6) * depth;
+               case FORMAT_RGBA_ASTC_10x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+                       return align(width, 10) * align(height, 8) * depth;
+               case FORMAT_RGBA_ASTC_10x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+                       return align(width, 10) * align(height, 10) * depth;
+               case FORMAT_RGBA_ASTC_12x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+                       return align(width, 12) * align(height, 10) * depth;
+               case FORMAT_RGBA_ASTC_12x12_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                       return align(width, 12) * align(height, 12) * depth;
                case FORMAT_YV12_BT601:
                case FORMAT_YV12_BT709:
                case FORMAT_YV12_JFIF:
@@ -2359,6 +2638,44 @@ namespace sw
                case FORMAT_ATI1:
                case FORMAT_ATI2:
                case FORMAT_ETC1:
+               case FORMAT_R11_EAC:
+               case FORMAT_SIGNED_R11_EAC:
+               case FORMAT_RG11_EAC:
+               case FORMAT_SIGNED_RG11_EAC:
+               case FORMAT_RGB8_ETC2:
+               case FORMAT_SRGB8_ETC2:
+               case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_RGBA8_ETC2_EAC:
+               case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+               case FORMAT_RGBA_ASTC_4x4_KHR:
+               case FORMAT_RGBA_ASTC_5x4_KHR:
+               case FORMAT_RGBA_ASTC_5x5_KHR:
+               case FORMAT_RGBA_ASTC_6x5_KHR:
+               case FORMAT_RGBA_ASTC_6x6_KHR:
+               case FORMAT_RGBA_ASTC_8x5_KHR:
+               case FORMAT_RGBA_ASTC_8x6_KHR:
+               case FORMAT_RGBA_ASTC_8x8_KHR:
+               case FORMAT_RGBA_ASTC_10x5_KHR:
+               case FORMAT_RGBA_ASTC_10x6_KHR:
+               case FORMAT_RGBA_ASTC_10x8_KHR:
+               case FORMAT_RGBA_ASTC_10x10_KHR:
+               case FORMAT_RGBA_ASTC_12x10_KHR:
+               case FORMAT_RGBA_ASTC_12x12_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
                        return true;
                default:
                        return false;
@@ -3306,13 +3623,53 @@ namespace sw
                case FORMAT_DXT1:
                case FORMAT_DXT3:
                case FORMAT_DXT5:
-                       return FORMAT_A8R8G8B8;
                #endif
+               case FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
+               case FORMAT_RGBA8_ETC2_EAC:
+               case FORMAT_SRGB8_ALPHA8_ETC2_EAC:
+               case FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR:
+               case FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR:
+                       return FORMAT_A8R8G8B8;
+               case FORMAT_RGBA_ASTC_4x4_KHR:
+               case FORMAT_RGBA_ASTC_5x4_KHR:
+               case FORMAT_RGBA_ASTC_5x5_KHR:
+               case FORMAT_RGBA_ASTC_6x5_KHR:
+               case FORMAT_RGBA_ASTC_6x6_KHR:
+               case FORMAT_RGBA_ASTC_8x5_KHR:
+               case FORMAT_RGBA_ASTC_8x6_KHR:
+               case FORMAT_RGBA_ASTC_8x8_KHR:
+               case FORMAT_RGBA_ASTC_10x5_KHR:
+               case FORMAT_RGBA_ASTC_10x6_KHR:
+               case FORMAT_RGBA_ASTC_10x8_KHR:
+               case FORMAT_RGBA_ASTC_10x10_KHR:
+               case FORMAT_RGBA_ASTC_12x10_KHR:
+               case FORMAT_RGBA_ASTC_12x12_KHR:
+                       // ASTC supports HDR, so a floating point format is required to represent it properly
+                       return FORMAT_A32B32G32R32F; // FIXME: 16FP is probably sufficient, but it's currently unsupported
                case FORMAT_ATI1:
+               case FORMAT_R11_EAC:
+               case FORMAT_SIGNED_R11_EAC:
                        return FORMAT_R8;
                case FORMAT_ATI2:
+               case FORMAT_RG11_EAC:
+               case FORMAT_SIGNED_RG11_EAC:
                        return FORMAT_G8R8;
                case FORMAT_ETC1:
+               case FORMAT_RGB8_ETC2:
+               case FORMAT_SRGB8_ETC2:
                        return FORMAT_X8R8G8B8;
                // Bumpmap formats
                case FORMAT_V8U8:                       return FORMAT_V8U8;
index 2111e3f..48502c4 100644 (file)
@@ -77,7 +77,45 @@ namespace sw
                FORMAT_DXT5,\r
                FORMAT_ATI1,\r
                FORMAT_ATI2,\r
-        FORMAT_ETC1,\r
+               FORMAT_ETC1,\r
+               FORMAT_R11_EAC,\r
+               FORMAT_SIGNED_R11_EAC,\r
+               FORMAT_RG11_EAC,\r
+               FORMAT_SIGNED_RG11_EAC,\r
+               FORMAT_RGB8_ETC2,\r
+               FORMAT_SRGB8_ETC2,\r
+               FORMAT_RGB8_PUNCHTHROUGH_ALPHA1_ETC2,\r
+               FORMAT_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2,\r
+               FORMAT_RGBA8_ETC2_EAC,\r
+               FORMAT_SRGB8_ALPHA8_ETC2_EAC,\r
+               FORMAT_RGBA_ASTC_4x4_KHR,\r
+               FORMAT_RGBA_ASTC_5x4_KHR,\r
+               FORMAT_RGBA_ASTC_5x5_KHR,\r
+               FORMAT_RGBA_ASTC_6x5_KHR,\r
+               FORMAT_RGBA_ASTC_6x6_KHR,\r
+               FORMAT_RGBA_ASTC_8x5_KHR,\r
+               FORMAT_RGBA_ASTC_8x6_KHR,\r
+               FORMAT_RGBA_ASTC_8x8_KHR,\r
+               FORMAT_RGBA_ASTC_10x5_KHR,\r
+               FORMAT_RGBA_ASTC_10x6_KHR,\r
+               FORMAT_RGBA_ASTC_10x8_KHR,\r
+               FORMAT_RGBA_ASTC_10x10_KHR,\r
+               FORMAT_RGBA_ASTC_12x10_KHR,\r
+               FORMAT_RGBA_ASTC_12x12_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_4x4_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_5x4_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_5x5_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_6x5_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_6x6_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_8x5_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_8x6_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_8x8_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_10x5_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_10x6_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_10x8_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_10x10_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_12x10_KHR,\r
+               FORMAT_SRGB8_ALPHA8_ASTC_12x12_KHR,\r
                // Floating-point formats\r
                FORMAT_A16F,\r
                FORMAT_R16F,\r
@@ -365,6 +403,9 @@ namespace sw
                static void decodeATI1(Buffer &internal, const Buffer &external);\r
                static void decodeATI2(Buffer &internal, const Buffer &external);\r
                static void decodeETC1(Buffer &internal, const Buffer &external);\r
+               static void decodeEAC(Buffer &internal, const Buffer &external, int nbChannels, bool isSigned);\r
+               static void decodeETC2(Buffer &internal, const Buffer &external, int nbAlphaBits, bool isSRGB);\r
+               static void decodeASTC(Buffer &internal, const Buffer &external, int xSize, int ySize, int zSize, bool isSRGB);\r
 \r
                static void update(Buffer &destination, Buffer &source);\r
                static void genericUpdate(Buffer &destination, Buffer &source);\r