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