1 // 2 // Copyright 2021 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 // WebGLCompressedTextureAvailabilityTest: 7 // Compressed formats must be enabled on platforms that always support them. 8 // Compressed formats must be disabled on platforms that never support them. 9 // 10 11 #include "test_utils/ANGLETest.h" 12 13 using namespace angle; 14 15 namespace 16 { 17 18 class WebGLCompressedTextureAvailabilityTest : public ANGLETest 19 { 20 public: WebGLCompressedTextureAvailabilityTest()21 WebGLCompressedTextureAvailabilityTest() { setWebGLCompatibilityEnabled(true); } 22 }; 23 24 const char kDXT1[] = "GL_EXT_texture_compression_dxt1"; 25 const char kDXT3[] = "GL_ANGLE_texture_compression_dxt3"; 26 const char kDXT5[] = "GL_ANGLE_texture_compression_dxt5"; 27 const char kS3TCSRGB[] = "GL_EXT_texture_compression_s3tc_srgb"; 28 const char kRGTC[] = "GL_EXT_texture_compression_rgtc"; 29 const char kBPTC[] = "GL_EXT_texture_compression_bptc"; 30 31 const char kETC1[] = "GL_OES_compressed_ETC1_RGB8_texture"; 32 const char kETC2[] = "GL_ANGLE_compressed_texture_etc"; 33 34 const char kASTCLDR[] = "GL_KHR_texture_compression_astc_ldr"; 35 const char kASTCHDR[] = "GL_KHR_texture_compression_astc_hdr"; 36 37 const char kPVRTC1[] = "GL_IMG_texture_compression_pvrtc"; 38 39 // Test compressed formats availability TEST_P(WebGLCompressedTextureAvailabilityTest,Test)40TEST_P(WebGLCompressedTextureAvailabilityTest, Test) 41 { 42 if (IsD3D()) 43 { 44 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); 45 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); 46 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); 47 EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); 48 49 if (IsD3D9()) 50 { 51 EXPECT_FALSE(EnsureGLExtensionEnabled(kRGTC)); 52 EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC)); 53 } 54 else 55 { 56 EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); 57 } 58 59 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 60 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); 61 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); 62 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); 63 EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); 64 } 65 else if (IsMetal()) 66 { 67 if (IsOSX()) 68 { 69 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); 70 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); 71 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); 72 EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); 73 EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); 74 EXPECT_TRUE(EnsureGLExtensionEnabled(kBPTC)); 75 76 if (IsApple()) 77 { 78 // M1 or newer 79 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1)); 80 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC2)); 81 EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCLDR)); 82 EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCHDR)); 83 EXPECT_TRUE(EnsureGLExtensionEnabled(kPVRTC1)); 84 } 85 else 86 { 87 // macOS with non-Apple GPU 88 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 89 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); 90 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); 91 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); 92 EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); 93 } 94 } 95 else 96 { 97 // Need proper Catalyst detection to assert formats here. 98 } 99 } 100 else if (IsDesktopOpenGL()) 101 { 102 if (IsOSX()) 103 { 104 // OpenGL version is fixed to 4.1 on macOS, so the supported formats are the same on all 105 // devices. 106 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); 107 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); 108 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); 109 EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); 110 EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); 111 112 EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC)); 113 114 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 115 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); 116 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); 117 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); 118 EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); 119 } 120 } 121 } 122 123 // Regression test for emulated ETC1 being exposed to WebGL contexts. 124 // 125 // Relies on the fact that ETC1 is a strict subset of ETC2 and the ANGLE-specific ETC2 extension 126 // string is exposed only when the hardware support is available. Hardware support for ETC1 127 // without ETC2 exists only on native OpenGL ES. 128 // 129 // Note that non-WebGL contexts are allowed to expose emulated ETC1. 130 // https://crbug.com/1048244 TEST_P(WebGLCompressedTextureAvailabilityTest,EmulatedEtc1Test)131TEST_P(WebGLCompressedTextureAvailabilityTest, EmulatedEtc1Test) 132 { 133 if (!IsOpenGLES()) 134 { 135 if (EnsureGLExtensionEnabled(kETC2)) 136 { 137 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1)); 138 } 139 else 140 { 141 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 142 } 143 } 144 } 145 146 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompressedTextureAvailabilityTest); 147 148 } // namespace 149