• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)40 TEST_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)131 TEST_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