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 kETC1Sub[] = "GL_EXT_compressed_ETC1_RGB8_sub_texture"; // Not exposed to WebGL apps 33 const char kETC2[] = "GL_ANGLE_compressed_texture_etc"; 34 35 const char kASTCLDR[] = "GL_KHR_texture_compression_astc_ldr"; 36 const char kASTCHDR[] = "GL_KHR_texture_compression_astc_hdr"; 37 38 const char kPVRTC1[] = "GL_IMG_texture_compression_pvrtc"; 39 40 // Test compressed formats availability TEST_P(WebGLCompressedTextureAvailabilityTest,Test)41TEST_P(WebGLCompressedTextureAvailabilityTest, Test) 42 { 43 if (IsD3D()) 44 { 45 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); 46 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); 47 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); 48 EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); 49 50 if (IsD3D9()) 51 { 52 EXPECT_FALSE(EnsureGLExtensionEnabled(kRGTC)); 53 EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC)); 54 } 55 else 56 { 57 EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); 58 } 59 60 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 61 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); 62 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); 63 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); 64 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); 65 EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); 66 } 67 else if (IsMetal()) 68 { 69 if (IsMac()) 70 { 71 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); 72 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); 73 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); 74 EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); 75 EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); 76 EXPECT_TRUE(EnsureGLExtensionEnabled(kBPTC)); 77 78 if (IsAppleGPU()) 79 { 80 // M1 or newer 81 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1)); 82 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1Sub)); 83 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC2)); 84 EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCLDR)); 85 EXPECT_TRUE(EnsureGLExtensionEnabled(kASTCHDR)); 86 EXPECT_TRUE(EnsureGLExtensionEnabled(kPVRTC1)); 87 } 88 else 89 { 90 // macOS with non-Apple GPU 91 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 92 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); 93 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); 94 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); 95 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); 96 EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); 97 } 98 } 99 else 100 { 101 // Need proper Catalyst detection to assert formats here. 102 } 103 } 104 else if (IsDesktopOpenGL()) 105 { 106 if (IsMac()) 107 { 108 // OpenGL version is fixed to 4.1 on macOS, so the supported formats are the same on all 109 // devices. 110 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT1)); 111 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT3)); 112 EXPECT_TRUE(EnsureGLExtensionEnabled(kDXT5)); 113 EXPECT_TRUE(EnsureGLExtensionEnabled(kS3TCSRGB)); 114 EXPECT_TRUE(EnsureGLExtensionEnabled(kRGTC)); 115 116 EXPECT_FALSE(EnsureGLExtensionEnabled(kBPTC)); 117 118 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 119 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); 120 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC2)); 121 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCLDR)); 122 EXPECT_FALSE(EnsureGLExtensionEnabled(kASTCHDR)); 123 EXPECT_FALSE(EnsureGLExtensionEnabled(kPVRTC1)); 124 } 125 } 126 } 127 128 // Regression test for emulated ETC1 being exposed to WebGL contexts. 129 // 130 // Relies on the fact that ETC1 is a strict subset of ETC2 and the ANGLE-specific ETC2 extension 131 // string is exposed only when the hardware support is available. Hardware support for ETC1 132 // without ETC2 exists only on native OpenGL ES. 133 // 134 // Note that non-WebGL contexts are allowed to expose emulated ETC1. 135 // https://crbug.com/1048244 TEST_P(WebGLCompressedTextureAvailabilityTest,EmulatedEtc1Test)136TEST_P(WebGLCompressedTextureAvailabilityTest, EmulatedEtc1Test) 137 { 138 if (!IsOpenGLES()) 139 { 140 if (EnsureGLExtensionEnabled(kETC2)) 141 { 142 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1)); 143 EXPECT_TRUE(EnsureGLExtensionEnabled(kETC1Sub)); 144 } 145 else 146 { 147 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1)); 148 EXPECT_FALSE(EnsureGLExtensionEnabled(kETC1Sub)); 149 } 150 } 151 } 152 153 ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(WebGLCompressedTextureAvailabilityTest); 154 155 } // namespace 156