| // |
| // Copyright 2021 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| // WebGLCompressedTextureAvailabilityTest: |
| // Compressed formats must be enabled on platforms that always support them. |
| // Compressed formats must be disabled on platforms that never support them. |
| // |
| |
| #include "test_utils/ANGLETest.h" |
| |
| using namespace angle; |
| |
| namespace |
| { |
| |
| class WebGLCompressedTextureAvailabilityTest : public ANGLETest<> |
| { |
| public: |
| WebGLCompressedTextureAvailabilityTest() { setWebGLCompatibilityEnabled(true); } |
| }; |
| |
| const char kDXT1[] = "GL_EXT_texture_compression_dxt1"; |
| const char kDXT3[] = "GL_ANGLE_texture_compression_dxt3"; |
| const char kDXT5[] = "GL_ANGLE_texture_compression_dxt5"; |
| const char kS3TCSRGB[] = "GL_EXT_texture_compression_s3tc_srgb"; |
| const char kRGTC[] = "GL_EXT_texture_compression_rgtc"; |
| const char kBPTC[] = "GL_EXT_texture_compression_bptc"; |
| |
| const char kETC1[] = "GL_OES_compressed_ETC1_RGB8_texture"; |
| const char kETC1Sub[] = "GL_EXT_compressed_ETC1_RGB8_sub_texture"; // Not exposed to WebGL apps |
| const char kETC2[] = "GL_ANGLE_compressed_texture_etc"; |
| |
| const char kASTCLDR[] = "GL_KHR_texture_compression_astc_ldr"; |
| const char kASTCHDR[] = "GL_KHR_texture_compression_astc_hdr"; |
| |
| const char kPVRTC1[] = "GL_IMG_texture_compression_pvrtc"; |
| |
| // Test compressed formats availability |
| TEST_P(WebGLCompressedTextureAvailabilityTest, Test) |
| { |
| if (IsD3D()) |
| { |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); |
| |
| if (IsD3D9()) |
| { |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kRGTC)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC)); |
| } |
| else |
| { |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); |
| } |
| |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); |
| } |
| else if (IsMetal()) |
| { |
| if (IsMac()) |
| { |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kBPTC)); |
| |
| if (IsAppleGPU()) |
| { |
| // M1 or newer |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1Sub)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kETC2)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCLDR)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCHDR)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kPVRTC1)); |
| } |
| else |
| { |
| // macOS with non-Apple GPU |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); |
| } |
| } |
| else |
| { |
| // Need proper Catalyst detection to assert formats here. |
| } |
| } |
| else if (IsDesktopOpenGL()) |
| { |
| if (IsMac()) |
| { |
| // OpenGL version is fixed to 4.1 on macOS, so the supported formats are the same on all |
| // devices. |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); |
| |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC)); |
| |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); |
| } |
| } |
| } |
| |
| // Regression test for emulated ETC1 being exposed to WebGL contexts. |
| // |
| // Relies on the fact that ETC1 is a strict subset of ETC2 and the ANGLE-specific ETC2 extension |
| // string is exposed only when the hardware support is available. Hardware support for ETC1 |
| // without ETC2 exists only on native OpenGL ES. |
| // |
| // Note that non-WebGL contexts are allowed to expose emulated ETC1. |
| // https://crbug.com/1048244 |
| TEST_P(WebGLCompressedTextureAvailabilityTest, EmulatedEtc1Test) |
| { |
| if (!IsOpenGLES()) |
| { |
| if (EnsureGLExtensionEnabled(kETC2)) |
| { |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1)); |
| EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1Sub)); |
| } |
| else |
| { |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); |
| EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); |
| } |
| } |
| } |
| |
| ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompressedTextureAvailabilityTest); |
| |
| } // namespace |