Implement extensions exposing ETC2 compressed texture formats in ES2.

BUG=angleproject:2527

Change-Id: I000f68366de4119375b6d3c79bc2eff3ebd5db9e
Reviewed-on: https://chromium-review.googlesource.com/1042885
Commit-Queue: Geoff Lang <geofflang@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index 5e3460d..7d33b43 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -1192,70 +1192,34 @@
         GLenum actualInternalFormat =
             isSubImage ? texture->getFormat(target, level).info->sizedInternalFormat
                        : internalformat;
-        switch (actualInternalFormat)
+
+        const InternalFormat &internalFormatInfo = GetSizedInternalFormatInfo(actualInternalFormat);
+
+        if (!internalFormatInfo.compressed)
         {
-            case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-                if (!context->getExtensions().textureCompressionDXT1)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                    return false;
-                }
-                break;
-            case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
-                if (!context->getExtensions().textureCompressionDXT3)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                    return false;
-                }
-                break;
-            case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
-                if (!context->getExtensions().textureCompressionDXT5)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                    return false;
-                }
-                break;
-            case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
-            case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
-                if (!context->getExtensions().textureCompressionS3TCsRGB)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                    return false;
-                }
-                break;
-            case GL_ETC1_RGB8_OES:
-                if (!context->getExtensions().compressedETC1RGB8Texture)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                    return false;
-                }
-                if (isSubImage)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidInternalFormat);
-                    return false;
-                }
-                break;
-            case GL_ETC1_RGB8_LOSSY_DECODE_ANGLE:
-            case GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-            case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE:
-                if (!context->getExtensions().lossyETCDecode)
-                {
-                    ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                    return false;
-                }
-                break;
-            default:
-                ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
-                return false;
+            ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
+            return false;
+        }
+
+        if (!internalFormatInfo.textureSupport(context->getClientVersion(),
+                                               context->getExtensions()))
+        {
+            ANGLE_VALIDATION_ERR(context, InvalidEnum(), InvalidInternalFormat);
+            return false;
         }
 
         if (isSubImage)
         {
+            // From the OES_compressed_ETC1_RGB8_texture spec:
+            // INVALID_OPERATION is generated by CompressedTexSubImage2D, TexSubImage2D, or
+            // CopyTexSubImage2D if the texture image <level> bound to <target> has internal format
+            // ETC1_RGB8_OES.
+            if (actualInternalFormat == GL_ETC1_RGB8_OES)
+            {
+                ANGLE_VALIDATION_ERR(context, InvalidOperation(), InvalidInternalFormat);
+                return false;
+            }
+
             if (!ValidCompressedSubImageSize(context, actualInternalFormat, xoffset, yoffset, width,
                                              height, texture->getWidth(target, level),
                                              texture->getHeight(target, level)))