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)))