Cleanup ValidateES2CopyTexImageParameters; add test
Compressed and depth formats are rejected earlier with
ValidateCopyTexImageParametersBase.
Added a new Texture2DTest.CopyAfterCompressed test to
ensure that validation code for non-subImage case does not
fail new assertions.
Bug: angleproject:5731, chromium:1216276
Change-Id: I11d2ac3389418731b6cc6e2bd5c9655b1590b02d
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3122156
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
Commit-Queue: Alexey Knyazev <lexa.knyazev@gmail.com>
diff --git a/src/libANGLE/validationES.cpp b/src/libANGLE/validationES.cpp
index a01d65c..b868eff 100644
--- a/src/libANGLE/validationES.cpp
+++ b/src/libANGLE/validationES.cpp
@@ -3694,7 +3694,8 @@
}
}
- if (textureFormatOut)
+ // Do not leak the previous texture format for non-subImage case.
+ if (textureFormatOut && isSubImage)
{
*textureFormatOut = texture->getFormat(target, level);
}
diff --git a/src/libANGLE/validationES2.cpp b/src/libANGLE/validationES2.cpp
index a733750..7594a3f 100644
--- a/src/libANGLE/validationES2.cpp
+++ b/src/libANGLE/validationES2.cpp
@@ -384,11 +384,21 @@
return false;
}
+ ASSERT(textureFormat.valid() || !isSubImage);
+
const Framebuffer *framebuffer = context->getState().getReadFramebuffer();
GLenum colorbufferFormat =
framebuffer->getReadColorAttachment()->getFormat().info->sizedInternalFormat;
const auto &formatInfo = *textureFormat.info;
+ // ValidateCopyTexImageParametersBase rejects compressed formats with GL_INVALID_OPERATION.
+ ASSERT(!formatInfo.compressed);
+ ASSERT(!GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE).compressed);
+
+ // ValidateCopyTexImageParametersBase rejects depth formats with GL_INVALID_OPERATION.
+ ASSERT(!formatInfo.depthBits);
+ ASSERT(!GetInternalFormatInfo(internalformat, GL_UNSIGNED_BYTE).depthBits);
+
// [OpenGL ES 2.0.24] table 3.9
if (isSubImage)
{
@@ -467,26 +477,6 @@
return false;
}
break;
- 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:
- case GL_ETC1_RGB8_OES:
- 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:
- case GL_COMPRESSED_RGBA_BPTC_UNORM_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:
- case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT:
- case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT:
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_STENCIL_OES:
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
default:
context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
return false;
@@ -558,94 +548,6 @@
return false;
}
break;
- case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
- case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
- if (context->getExtensions().textureCompressionDXT1)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
- if (context->getExtensions().textureCompressionDXT3)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
- if (context->getExtensions().textureCompressionDXT5)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_ETC1_RGB8_OES:
- if (context->getExtensions().compressedETC1RGB8TextureOES)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- 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)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_COMPRESSED_RGB_PVRTC_4BPPV1_IMG:
- case GL_COMPRESSED_RGB_PVRTC_2BPPV1_IMG:
- case GL_COMPRESSED_RGBA_PVRTC_4BPPV1_IMG:
- case GL_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG:
- if (context->getExtensions().compressedTexturePVRTC)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_COMPRESSED_SRGB_PVRTC_2BPPV1_EXT:
- case GL_COMPRESSED_SRGB_PVRTC_4BPPV1_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT:
- case GL_COMPRESSED_SRGB_ALPHA_PVRTC_4BPPV1_EXT:
- if (context->getExtensions().compressedTexturePVRTCsRGB)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_DEPTH_COMPONENT:
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT32_OES:
- if (context->getExtensions().depthTextureAny())
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
- case GL_DEPTH_STENCIL_OES:
- case GL_DEPTH24_STENCIL8_OES:
- if (context->getExtensions().depthTextureAny() ||
- context->getExtensions().packedDepthStencilOES ||
- context->getExtensions().depthTextureCubeMapOES)
- {
- context->validationError(GL_INVALID_OPERATION, kInvalidFormat);
- return false;
- }
- context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
- return false;
default:
context->validationError(GL_INVALID_ENUM, kEnumNotSupported);
return false;
diff --git a/src/tests/gl_tests/TextureTest.cpp b/src/tests/gl_tests/TextureTest.cpp
index 7353553..8e2bf08 100644
--- a/src/tests/gl_tests/TextureTest.cpp
+++ b/src/tests/gl_tests/TextureTest.cpp
@@ -5649,6 +5649,20 @@
EXPECT_PIXEL_ALPHA_EQ(0, 0, 255);
}
+// Test that CopyTexImage2D does not trigger assertion after CompressedTexImage2D.
+// https://crbug.com/1216276
+TEST_P(Texture2DTest, CopyAfterCompressed)
+{
+ ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
+
+ glBindTexture(GL_TEXTURE_2D, mTexture2D);
+ glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 4, 4, 0, 8, nullptr);
+ EXPECT_GL_NO_ERROR();
+
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 0, 0, 4, 4, 0);
+ EXPECT_GL_NO_ERROR();
+}
+
// When sampling a texture without an alpha channel, "1" is returned as the alpha value.
// ES 3.0.4 table 3.24
TEST_P(Texture2DUnsignedIntegerAlpha1TestES3, TextureRGB8UIImplicitAlpha1)