xref: /aosp_15_r20/external/angle/src/tests/gl_tests/WebGLCompressedTextureAvailabilityTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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)41 TEST_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)136 TEST_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