From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Alexey Knyazev Date: Tue, 3 Aug 2021 01:57:49 +0400 Subject: Validate texStorage dimensions with compressed formats Bug: angleproject:6230 Change-Id: I501ec1e6974bdc7e6731dcb88045edb0aa22b888 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3067329 Commit-Queue: Alexey Knyazev Reviewed-by: Kenneth Russell Reviewed-by: Jamie Madill diff --git a/src/libANGLE/validationES3.cpp b/src/libANGLE/validationES3.cpp index 1d93a066580818c7616fa66252e6465f6137aceb..3935c52a894c5584eef66bea34a8684176909358 100644 --- a/src/libANGLE/validationES3.cpp +++ b/src/libANGLE/validationES3.cpp @@ -1339,17 +1339,26 @@ bool ValidateES3TexStorageParametersBase(const Context *context, return false; } - if (formatInfo.compressed && target == TextureType::Rectangle) + if (formatInfo.compressed) { - context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed); - return false; - } + if (target == TextureType::Rectangle) + { + context->validationError(GL_INVALID_ENUM, kRectangleTextureCompressed); + return false; + } - if (formatInfo.compressed && target == TextureType::_3D) - { - if (!ValidateES3CompressedFormatForTexture3D(context, formatInfo.internalFormat)) + if (target == TextureType::_3D) { - // Error already generated. + if (!ValidateES3CompressedFormatForTexture3D(context, formatInfo.internalFormat)) + { + // Error already generated. + return false; + } + } + + if (!ValidCompressedImageSize(context, formatInfo.internalFormat, 0, width, height, depth)) + { + context->validationError(GL_INVALID_OPERATION, kInvalidCompressedImageSize); return false; } } diff --git a/src/tests/gl_tests/SRGBTextureTest.cpp b/src/tests/gl_tests/SRGBTextureTest.cpp index 68fd9f7165ff237ed3c86a42be0b2a24dd9819c7..6c65740cb406e1c598dc41ff0e8998230a926883 100644 --- a/src/tests/gl_tests/SRGBTextureTest.cpp +++ b/src/tests/gl_tests/SRGBTextureTest.cpp @@ -340,7 +340,7 @@ TEST_P(SRGBTextureTestES3, SRGBOverrideFormats) { GLTexture tex; glBindTexture(GL_TEXTURE_2D, tex.get()); - glTexStorage2D(GL_TEXTURE_2D, 1, format, 1, 1); + glTexStorage2D(GL_TEXTURE_2D, 1, format, 4, 4); GLenum error = glGetError(); if (error == GL_INVALID_ENUM) { diff --git a/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/src/tests/gl_tests/WebGLCompatibilityTest.cpp index 89eb4d639a3853636524ad112a24f15d46fa1119..b9380bb10ad434acfc858c08db8a629db0bfaecf 100644 --- a/src/tests/gl_tests/WebGLCompatibilityTest.cpp +++ b/src/tests/gl_tests/WebGLCompatibilityTest.cpp @@ -5023,6 +5023,21 @@ void WebGLCompatibilityTest::testCompressedTexLevelDimension(GLenum format, { EXPECT_GL_ERROR(expectedError) << explanation; } + + if (level == 0 && width > 0 && getClientMajorVersion() >= 3) + { + GLTexture sourceTextureStorage; + glBindTexture(GL_TEXTURE_2D, sourceTextureStorage); + glTexStorage2D(GL_TEXTURE_2D, 1, format, width, height); + if (expectedError == 0) + { + EXPECT_GL_NO_ERROR() << explanation << " (texStorage)"; + } + else + { + EXPECT_GL_ERROR(expectedError) << explanation << " (texStorage)"; + } + } } void WebGLCompatibilityTest::testCompressedTexImage(GLenum format)