xref: /aosp_15_r20/external/angle/src/tests/gl_tests/ETCTextureTest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2015 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 // ETCTextureTest:
7*8975f5c5SAndroid Build Coastguard Worker //   Tests for ETC lossy decode formats.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker 
10*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
11*8975f5c5SAndroid Build Coastguard Worker 
12*8975f5c5SAndroid Build Coastguard Worker #include "media/etc2bc_srgb8_alpha8.inc"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
15*8975f5c5SAndroid Build Coastguard Worker 
16*8975f5c5SAndroid Build Coastguard Worker namespace
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker 
19*8975f5c5SAndroid Build Coastguard Worker class ETCTextureTest : public ANGLETest<>
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker   protected:
ETCTextureTest()22*8975f5c5SAndroid Build Coastguard Worker     ETCTextureTest() : mTexture(0u)
23*8975f5c5SAndroid Build Coastguard Worker     {
24*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(128);
25*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(128);
26*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
27*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
28*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
29*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
30*8975f5c5SAndroid Build Coastguard Worker     }
31*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()32*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
33*8975f5c5SAndroid Build Coastguard Worker     {
34*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mTexture);
35*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
36*8975f5c5SAndroid Build Coastguard Worker     }
37*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()38*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { glDeleteTextures(1, &mTexture); }
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker     GLuint mTexture;
41*8975f5c5SAndroid Build Coastguard Worker };
42*8975f5c5SAndroid Build Coastguard Worker 
43*8975f5c5SAndroid Build Coastguard Worker // Tests a texture with ETC1 lossy decode format
TEST_P(ETCTextureTest,ETC1Validation)44*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCTextureTest, ETC1Validation)
45*8975f5c5SAndroid Build Coastguard Worker {
46*8975f5c5SAndroid Build Coastguard Worker     bool supported = IsGLExtensionEnabled("GL_ANGLE_lossy_etc_decode");
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
49*8975f5c5SAndroid Build Coastguard Worker 
50*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixel[8] = {0x0, 0x0, 0xf8, 0x2, 0x43, 0xff, 0x4, 0x12};
51*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 4, 4, 0,
52*8975f5c5SAndroid Build Coastguard Worker                            sizeof(pixel), pixel);
53*8975f5c5SAndroid Build Coastguard Worker     if (supported)
54*8975f5c5SAndroid Build Coastguard Worker     {
55*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
56*8975f5c5SAndroid Build Coastguard Worker 
57*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 4, 4, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE,
58*8975f5c5SAndroid Build Coastguard Worker                                   sizeof(pixel), pixel);
59*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
60*8975f5c5SAndroid Build Coastguard Worker 
61*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 2, 2, 0,
62*8975f5c5SAndroid Build Coastguard Worker                                sizeof(pixel), pixel);
63*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
64*8975f5c5SAndroid Build Coastguard Worker 
65*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_ETC1_RGB8_LOSSY_DECODE_ANGLE, 1, 1, 0,
66*8975f5c5SAndroid Build Coastguard Worker                                sizeof(pixel), pixel);
67*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
68*8975f5c5SAndroid Build Coastguard Worker     }
69*8975f5c5SAndroid Build Coastguard Worker     else
70*8975f5c5SAndroid Build Coastguard Worker     {
71*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
72*8975f5c5SAndroid Build Coastguard Worker     }
73*8975f5c5SAndroid Build Coastguard Worker }
74*8975f5c5SAndroid Build Coastguard Worker 
75*8975f5c5SAndroid Build Coastguard Worker // Tests a texture with ETC2 RGB8 lossy decode format
TEST_P(ETCTextureTest,ETC2RGB8Validation)76*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCTextureTest, ETC2RGB8Validation)
77*8975f5c5SAndroid Build Coastguard Worker {
78*8975f5c5SAndroid Build Coastguard Worker     bool supported = IsGLExtensionEnabled("GL_ANGLE_lossy_etc_decode");
79*8975f5c5SAndroid Build Coastguard Worker 
80*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixel[] = {
83*8975f5c5SAndroid Build Coastguard Worker         0x00, 0x00, 0xf8, 0x02, 0x43, 0xff, 0x04, 0x12,  // Individual/differential block
84*8975f5c5SAndroid Build Coastguard Worker         0x1c, 0x65, 0xc6, 0x62, 0xff, 0xf0, 0xff, 0x00,  // T block
85*8975f5c5SAndroid Build Coastguard Worker         0x62, 0xf2, 0xe3, 0x32, 0xff, 0x0f, 0xff, 0x00,  // H block
86*8975f5c5SAndroid Build Coastguard Worker         0x71, 0x88, 0xfb, 0xee, 0x87, 0x07, 0x11, 0x1f   // Planar block
87*8975f5c5SAndroid Build Coastguard Worker     };
88*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 8, 8, 0,
89*8975f5c5SAndroid Build Coastguard Worker                            sizeof(pixel), pixel);
90*8975f5c5SAndroid Build Coastguard Worker     if (supported)
91*8975f5c5SAndroid Build Coastguard Worker     {
92*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
93*8975f5c5SAndroid Build Coastguard Worker 
94*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8,
95*8975f5c5SAndroid Build Coastguard Worker                                   GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, sizeof(pixel), pixel);
96*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker         const GLsizei imageSize = 8;
99*8975f5c5SAndroid Build Coastguard Worker 
100*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4,
101*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
102*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
103*8975f5c5SAndroid Build Coastguard Worker 
104*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 2, 2,
105*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
106*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
107*8975f5c5SAndroid Build Coastguard Worker 
108*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGB8_LOSSY_DECODE_ETC2_ANGLE, 1, 1,
109*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
110*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
111*8975f5c5SAndroid Build Coastguard Worker     }
112*8975f5c5SAndroid Build Coastguard Worker     else
113*8975f5c5SAndroid Build Coastguard Worker     {
114*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
115*8975f5c5SAndroid Build Coastguard Worker     }
116*8975f5c5SAndroid Build Coastguard Worker }
117*8975f5c5SAndroid Build Coastguard Worker 
118*8975f5c5SAndroid Build Coastguard Worker // Tests a cube map array texture with compressed ETC2 RGB8 format
TEST_P(ETCTextureTest,ETC2RGB8_CubeMapValidation)119*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCTextureTest, ETC2RGB8_CubeMapValidation)
120*8975f5c5SAndroid Build Coastguard Worker {
121*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!(IsGLExtensionEnabled("GL_EXT_texture_cube_map_array") &&
122*8975f5c5SAndroid Build Coastguard Worker                          (getClientMajorVersion() >= 3 && getClientMinorVersion() > 1)));
123*8975f5c5SAndroid Build Coastguard Worker 
124*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kInvalidTextureWidth  = 8;
125*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kInvalidTextureHeight = 8;
126*8975f5c5SAndroid Build Coastguard Worker     constexpr GLsizei kCubemapFaceCount     = 6;
127*8975f5c5SAndroid Build Coastguard Worker     const std::vector<GLubyte> kInvalidTextureData(
128*8975f5c5SAndroid Build Coastguard Worker         kInvalidTextureWidth * kInvalidTextureHeight * kCubemapFaceCount, 0);
129*8975f5c5SAndroid Build Coastguard Worker 
130*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mTexture);
131*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGB, kInvalidTextureWidth,
134*8975f5c5SAndroid Build Coastguard Worker                            kInvalidTextureHeight, kCubemapFaceCount, 0, kInvalidTextureData.size(),
135*8975f5c5SAndroid Build Coastguard Worker                            kInvalidTextureData.data());
136*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_ENUM);
137*8975f5c5SAndroid Build Coastguard Worker 
138*8975f5c5SAndroid Build Coastguard Worker     constexpr GLenum kFormat = GL_COMPRESSED_RGB8_ETC2;
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker     std::vector<GLubyte> arrayData;
141*8975f5c5SAndroid Build Coastguard Worker 
142*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kWidth       = 4u;
143*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kHeight      = 4u;
144*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kDepth       = 6u;
145*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kPixelBytes  = 8u;
146*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kBlockWidth  = 4u;
147*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kBlockHeight = 4u;
148*8975f5c5SAndroid Build Coastguard Worker 
149*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kNumBlocksWide = (kWidth + kBlockWidth - 1u) / kBlockWidth;
150*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kNumBlocksHigh = (kHeight + kBlockHeight - 1u) / kBlockHeight;
151*8975f5c5SAndroid Build Coastguard Worker     constexpr GLuint kBytes         = kNumBlocksWide * kNumBlocksHigh * kPixelBytes * kDepth;
152*8975f5c5SAndroid Build Coastguard Worker 
153*8975f5c5SAndroid Build Coastguard Worker     arrayData.reserve(kBytes);
154*8975f5c5SAndroid Build Coastguard Worker 
155*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, kFormat, kWidth, kHeight, kDepth, 0,
156*8975f5c5SAndroid Build Coastguard Worker                            kBytes, arrayData.data());
157*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
158*8975f5c5SAndroid Build Coastguard Worker 
159*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, kInvalidTextureWidth,
160*8975f5c5SAndroid Build Coastguard Worker                               kInvalidTextureHeight, kDepth, GL_RGB, kInvalidTextureData.size(),
161*8975f5c5SAndroid Build Coastguard Worker                               kInvalidTextureData.data());
162*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, 0, 0, 0, kInvalidTextureWidth,
163*8975f5c5SAndroid Build Coastguard Worker                               kInvalidTextureHeight, kDepth, GL_RGB, kInvalidTextureData.size(),
164*8975f5c5SAndroid Build Coastguard Worker                               kInvalidTextureData.data());
165*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
166*8975f5c5SAndroid Build Coastguard Worker }
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker // Tests a texture with ETC2 SRGB8 lossy decode format
TEST_P(ETCTextureTest,ETC2SRGB8Validation)169*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCTextureTest, ETC2SRGB8Validation)
170*8975f5c5SAndroid Build Coastguard Worker {
171*8975f5c5SAndroid Build Coastguard Worker     bool supported = IsGLExtensionEnabled("GL_ANGLE_lossy_etc_decode");
172*8975f5c5SAndroid Build Coastguard Worker 
173*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
174*8975f5c5SAndroid Build Coastguard Worker 
175*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixel[] = {
176*8975f5c5SAndroid Build Coastguard Worker         0x00, 0x00, 0xf8, 0x02, 0x43, 0xff, 0x04, 0x12,  // Individual/differential block
177*8975f5c5SAndroid Build Coastguard Worker         0x1c, 0x65, 0xc6, 0x62, 0xff, 0xf0, 0xff, 0x00,  // T block
178*8975f5c5SAndroid Build Coastguard Worker         0x62, 0xf2, 0xe3, 0x32, 0xff, 0x0f, 0xff, 0x00,  // H block
179*8975f5c5SAndroid Build Coastguard Worker         0x71, 0x88, 0xfb, 0xee, 0x87, 0x07, 0x11, 0x1f   // Planar block
180*8975f5c5SAndroid Build Coastguard Worker     };
181*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 8, 8, 0,
182*8975f5c5SAndroid Build Coastguard Worker                            sizeof(pixel), pixel);
183*8975f5c5SAndroid Build Coastguard Worker     if (supported)
184*8975f5c5SAndroid Build Coastguard Worker     {
185*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
186*8975f5c5SAndroid Build Coastguard Worker 
187*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8,
188*8975f5c5SAndroid Build Coastguard Worker                                   GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, sizeof(pixel),
189*8975f5c5SAndroid Build Coastguard Worker                                   pixel);
190*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
191*8975f5c5SAndroid Build Coastguard Worker 
192*8975f5c5SAndroid Build Coastguard Worker         const GLsizei imageSize = 8;
193*8975f5c5SAndroid Build Coastguard Worker 
194*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 4, 4,
195*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
196*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
197*8975f5c5SAndroid Build Coastguard Worker 
198*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 2, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 2, 2,
199*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
200*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
201*8975f5c5SAndroid Build Coastguard Worker 
202*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_SRGB8_LOSSY_DECODE_ETC2_ANGLE, 1, 1,
203*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
204*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
205*8975f5c5SAndroid Build Coastguard Worker     }
206*8975f5c5SAndroid Build Coastguard Worker     else
207*8975f5c5SAndroid Build Coastguard Worker     {
208*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
209*8975f5c5SAndroid Build Coastguard Worker     }
210*8975f5c5SAndroid Build Coastguard Worker }
211*8975f5c5SAndroid Build Coastguard Worker 
212*8975f5c5SAndroid Build Coastguard Worker // Tests a texture with ETC2 RGB8 punchthrough A1 lossy decode format
TEST_P(ETCTextureTest,ETC2RGB8A1Validation)213*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCTextureTest, ETC2RGB8A1Validation)
214*8975f5c5SAndroid Build Coastguard Worker {
215*8975f5c5SAndroid Build Coastguard Worker     bool supported = IsGLExtensionEnabled("GL_ANGLE_lossy_etc_decode");
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
218*8975f5c5SAndroid Build Coastguard Worker 
219*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixel[] = {
220*8975f5c5SAndroid Build Coastguard Worker         0x80, 0x98, 0x59, 0x02, 0x6e, 0xe7, 0x44, 0x47,  // Individual/differential block
221*8975f5c5SAndroid Build Coastguard Worker         0xeb, 0x85, 0x68, 0x30, 0x77, 0x73, 0x44, 0x44,  // T block
222*8975f5c5SAndroid Build Coastguard Worker         0xb4, 0x05, 0xab, 0x92, 0xf8, 0x8c, 0x07, 0x73,  // H block
223*8975f5c5SAndroid Build Coastguard Worker         0xbb, 0x90, 0x15, 0xba, 0x8a, 0x8c, 0xd5, 0x5f   // Planar block
224*8975f5c5SAndroid Build Coastguard Worker     };
225*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0,
226*8975f5c5SAndroid Build Coastguard Worker                            GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 8, 8, 0,
227*8975f5c5SAndroid Build Coastguard Worker                            sizeof(pixel), pixel);
228*8975f5c5SAndroid Build Coastguard Worker     if (supported)
229*8975f5c5SAndroid Build Coastguard Worker     {
230*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8,
233*8975f5c5SAndroid Build Coastguard Worker                                   GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE,
234*8975f5c5SAndroid Build Coastguard Worker                                   sizeof(pixel), pixel);
235*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker         const GLsizei imageSize = 8;
238*8975f5c5SAndroid Build Coastguard Worker 
239*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 1,
240*8975f5c5SAndroid Build Coastguard Worker                                GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4, 4,
241*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
242*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
243*8975f5c5SAndroid Build Coastguard Worker 
244*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 2,
245*8975f5c5SAndroid Build Coastguard Worker                                GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 2, 2,
246*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
247*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
248*8975f5c5SAndroid Build Coastguard Worker 
249*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 3,
250*8975f5c5SAndroid Build Coastguard Worker                                GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 1, 1,
251*8975f5c5SAndroid Build Coastguard Worker                                0, imageSize, pixel);
252*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
253*8975f5c5SAndroid Build Coastguard Worker     }
254*8975f5c5SAndroid Build Coastguard Worker     else
255*8975f5c5SAndroid Build Coastguard Worker     {
256*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
257*8975f5c5SAndroid Build Coastguard Worker     }
258*8975f5c5SAndroid Build Coastguard Worker }
259*8975f5c5SAndroid Build Coastguard Worker 
260*8975f5c5SAndroid Build Coastguard Worker // Tests a texture with ETC2 SRGB8 punchthrough A1 lossy decode format
TEST_P(ETCTextureTest,ETC2SRGB8A1Validation)261*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCTextureTest, ETC2SRGB8A1Validation)
262*8975f5c5SAndroid Build Coastguard Worker {
263*8975f5c5SAndroid Build Coastguard Worker     bool supported = IsGLExtensionEnabled("GL_ANGLE_lossy_etc_decode");
264*8975f5c5SAndroid Build Coastguard Worker 
265*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mTexture);
266*8975f5c5SAndroid Build Coastguard Worker 
267*8975f5c5SAndroid Build Coastguard Worker     GLubyte pixel[] = {
268*8975f5c5SAndroid Build Coastguard Worker         0x80, 0x98, 0x59, 0x02, 0x6e, 0xe7, 0x44, 0x47,  // Individual/differential block
269*8975f5c5SAndroid Build Coastguard Worker         0xeb, 0x85, 0x68, 0x30, 0x77, 0x73, 0x44, 0x44,  // T block
270*8975f5c5SAndroid Build Coastguard Worker         0xb4, 0x05, 0xab, 0x92, 0xf8, 0x8c, 0x07, 0x73,  // H block
271*8975f5c5SAndroid Build Coastguard Worker         0xbb, 0x90, 0x15, 0xba, 0x8a, 0x8c, 0xd5, 0x5f   // Planar block
272*8975f5c5SAndroid Build Coastguard Worker     };
273*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0,
274*8975f5c5SAndroid Build Coastguard Worker                            GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 8, 8, 0,
275*8975f5c5SAndroid Build Coastguard Worker                            sizeof(pixel), pixel);
276*8975f5c5SAndroid Build Coastguard Worker     if (supported)
277*8975f5c5SAndroid Build Coastguard Worker     {
278*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
279*8975f5c5SAndroid Build Coastguard Worker 
280*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 8, 8,
281*8975f5c5SAndroid Build Coastguard Worker                                   GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE,
282*8975f5c5SAndroid Build Coastguard Worker                                   sizeof(pixel), pixel);
283*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
284*8975f5c5SAndroid Build Coastguard Worker 
285*8975f5c5SAndroid Build Coastguard Worker         const GLsizei imageSize = 8;
286*8975f5c5SAndroid Build Coastguard Worker 
287*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 1,
288*8975f5c5SAndroid Build Coastguard Worker                                GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 4,
289*8975f5c5SAndroid Build Coastguard Worker                                4, 0, imageSize, pixel);
290*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
291*8975f5c5SAndroid Build Coastguard Worker 
292*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 2,
293*8975f5c5SAndroid Build Coastguard Worker                                GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 2,
294*8975f5c5SAndroid Build Coastguard Worker                                2, 0, imageSize, pixel);
295*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker         glCompressedTexImage2D(GL_TEXTURE_2D, 3,
298*8975f5c5SAndroid Build Coastguard Worker                                GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_LOSSY_DECODE_ETC2_ANGLE, 1,
299*8975f5c5SAndroid Build Coastguard Worker                                1, 0, imageSize, pixel);
300*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_NO_ERROR();
301*8975f5c5SAndroid Build Coastguard Worker     }
302*8975f5c5SAndroid Build Coastguard Worker     else
303*8975f5c5SAndroid Build Coastguard Worker     {
304*8975f5c5SAndroid Build Coastguard Worker         EXPECT_GL_ERROR(GL_INVALID_ENUM);
305*8975f5c5SAndroid Build Coastguard Worker     }
306*8975f5c5SAndroid Build Coastguard Worker }
307*8975f5c5SAndroid Build Coastguard Worker 
308*8975f5c5SAndroid Build Coastguard Worker class ETCToBCTextureTest : public ANGLETest<>
309*8975f5c5SAndroid Build Coastguard Worker {
310*8975f5c5SAndroid Build Coastguard Worker   protected:
311*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kWidth    = 4;
312*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kHeight   = 4;
313*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kTexSize  = 4;
314*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kAbsError = 6;
315*8975f5c5SAndroid Build Coastguard Worker     // the transcoded BC1 data
316*8975f5c5SAndroid Build Coastguard Worker     // {0x0000a534, 0x05055555}
317*8975f5c5SAndroid Build Coastguard Worker     // then decoded RGBA data are
318*8975f5c5SAndroid Build Coastguard Worker     // 0xff000000 0xff000000 0xff000000 0xff000000
319*8975f5c5SAndroid Build Coastguard Worker     // 0xff000000 0xff000000 0xff000000 0xff000000
320*8975f5c5SAndroid Build Coastguard Worker     // 0xff000000 0xff000000 0xffa5a6a5 0xffa5a6a5
321*8975f5c5SAndroid Build Coastguard Worker     // 0xff000000 0xff000000 0xffa5a6a5 0xffa5a6a5
322*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kEtcAllZero[2]        = {0x0, 0x0};
323*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kEtcRGBData[2]        = {0x14050505, 0x00ffff33};
324*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kExpectedRGBColor[16] = {
325*8975f5c5SAndroid Build Coastguard Worker         0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xff000000,
326*8975f5c5SAndroid Build Coastguard Worker         0xff000000, 0xff000000, 0xff000000, 0xff000000, 0xffa5a6a5, 0xffa5a6a5,
327*8975f5c5SAndroid Build Coastguard Worker         0xff000000, 0xff000000, 0xffa5a6a5, 0xffa5a6a5,
328*8975f5c5SAndroid Build Coastguard Worker     };
329*8975f5c5SAndroid Build Coastguard Worker     // the transcoded RGB data (BC1)
330*8975f5c5SAndroid Build Coastguard Worker     // {0x0000a534 0x58585c5f}
331*8975f5c5SAndroid Build Coastguard Worker     // the 16 ETC2 decoded alpha value are
332*8975f5c5SAndroid Build Coastguard Worker     // 20,  20, 182, 182
333*8975f5c5SAndroid Build Coastguard Worker     // 128, 128, 110, 110
334*8975f5c5SAndroid Build Coastguard Worker     // 128, 47,   47, 47
335*8975f5c5SAndroid Build Coastguard Worker     // 128, 65,   65, 65
336*8975f5c5SAndroid Build Coastguard Worker     // max alpha value = 0xb6
337*8975f5c5SAndroid Build Coastguard Worker     // min alpha value = 0x14
338*8975f5c5SAndroid Build Coastguard Worker     // Result BC4 data are 0xb00914b6, 0xdb3ffb91
339*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kEtcRGBAData[4] = {0xd556975c, 0x088ff048, 0x9e6c6c6c, 0x3f11f1ff};
340*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kExpectedRGBAColor[16] = {
341*8975f5c5SAndroid Build Coastguard Worker         0x14373737, 0x14373737, 0xb6000000, 0xb6000000, 0x88a5a6a5, 0x88373737,
342*8975f5c5SAndroid Build Coastguard Worker         0x70000000, 0x70000000, 0x88a5a6a5, 0x2b6e6f6e, 0x2b000000, 0x2b000000,
343*8975f5c5SAndroid Build Coastguard Worker         0x88a5a6a5, 0x426e6f6e, 0x42000000, 0x42000000,
344*8975f5c5SAndroid Build Coastguard Worker     };
345*8975f5c5SAndroid Build Coastguard Worker     // Result BC4 data as {0xf6f1836f, 0xc41c5e7c}
346*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kEacR11Signed[2]            = {0xb068efff, 0x00b989e7};
347*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kExpectedR11SignedColor[16] = {
348*8975f5c5SAndroid Build Coastguard Worker         0xff000003, 0xff000046, 0xff0000ac, 0xff0000ac, 0xff000025, 0xff000003,
349*8975f5c5SAndroid Build Coastguard Worker         0xff000025, 0xff0000ac, 0xff000046, 0xff0000ac, 0xff000003, 0xff000046,
350*8975f5c5SAndroid Build Coastguard Worker         0xff000003, 0xff0000ef, 0xff000003, 0xff000046,
351*8975f5c5SAndroid Build Coastguard Worker     };
352*8975f5c5SAndroid Build Coastguard Worker 
353*8975f5c5SAndroid Build Coastguard Worker     // Result BC1 data as {0xa65a7b55, 0xcc3c4f43}
354*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kRgb8a1[2]          = {0x95938c6a, 0x0030e384};
355*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kExpectedRgb8a1[16] = {
356*8975f5c5SAndroid Build Coastguard Worker         0x00000000, 0xffab697b, 0xffab697b, 0xffd6cba5, 0x00000000, 0x00000000,
357*8975f5c5SAndroid Build Coastguard Worker         0xffab697b, 0xffd6cba5, 0xffab697b, 0x00000000, 0x00000000, 0xffab697b,
358*8975f5c5SAndroid Build Coastguard Worker         0xffab697b, 0x00000000, 0xffab697b, 0x00000000,
359*8975f5c5SAndroid Build Coastguard Worker     };
360*8975f5c5SAndroid Build Coastguard Worker 
361*8975f5c5SAndroid Build Coastguard Worker     static constexpr char kVS[] =
362*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
363*8975f5c5SAndroid Build Coastguard Worker         "in vec4 position;\n"
364*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
365*8975f5c5SAndroid Build Coastguard Worker         "{\n"
366*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
367*8975f5c5SAndroid Build Coastguard Worker         "}\n";
ETCToBCTextureTest()368*8975f5c5SAndroid Build Coastguard Worker     ETCToBCTextureTest() : mEtcTexture(0u)
369*8975f5c5SAndroid Build Coastguard Worker     {
370*8975f5c5SAndroid Build Coastguard Worker         setWindowWidth(256);
371*8975f5c5SAndroid Build Coastguard Worker         setWindowHeight(256);
372*8975f5c5SAndroid Build Coastguard Worker         setConfigRedBits(8);
373*8975f5c5SAndroid Build Coastguard Worker         setConfigGreenBits(8);
374*8975f5c5SAndroid Build Coastguard Worker         setConfigBlueBits(8);
375*8975f5c5SAndroid Build Coastguard Worker         setConfigAlphaBits(8);
376*8975f5c5SAndroid Build Coastguard Worker     }
377*8975f5c5SAndroid Build Coastguard Worker 
testSetUp()378*8975f5c5SAndroid Build Coastguard Worker     void testSetUp() override
379*8975f5c5SAndroid Build Coastguard Worker     {
380*8975f5c5SAndroid Build Coastguard Worker         glGenTextures(1, &mEtcTexture);
381*8975f5c5SAndroid Build Coastguard Worker         ASSERT_GL_NO_ERROR();
382*8975f5c5SAndroid Build Coastguard Worker     }
383*8975f5c5SAndroid Build Coastguard Worker 
testTearDown()384*8975f5c5SAndroid Build Coastguard Worker     void testTearDown() override { glDeleteTextures(1, &mEtcTexture); }
385*8975f5c5SAndroid Build Coastguard Worker     GLuint mEtcTexture;
386*8975f5c5SAndroid Build Coastguard Worker };
387*8975f5c5SAndroid Build Coastguard Worker 
388*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_RGB8 to BC1
TEST_P(ETCToBCTextureTest,ETC2Rgb8UnormToBC1_2D)389*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgb8UnormToBC1_2D)
390*8975f5c5SAndroid Build Coastguard Worker {
391*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
392*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
393*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
394*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
395*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
396*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
397*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, kTexSize, kTexSize);
398*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize, GL_COMPRESSED_RGB8_ETC2,
399*8975f5c5SAndroid Build Coastguard Worker                               sizeof(kEtcRGBData), kEtcRGBData);
400*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
401*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
402*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, false);
403*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(kExpectedRGBColor[0]), kAbsError);
404*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(kExpectedRGBColor[5]), kAbsError);
405*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(2, 2, GLColor(kExpectedRGBColor[10]), kAbsError);
406*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(3, 3, GLColor(kExpectedRGBColor[15]), kAbsError);
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_RGB8 to BC1 with cube texture type
TEST_P(ETCToBCTextureTest,ETC2Rgb8UnormToBC1_Cube)410*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgb8UnormToBC1_Cube)
411*8975f5c5SAndroid Build Coastguard Worker {
412*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
413*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
414*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
415*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
416*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
417*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
418*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_CUBE_MAP, mEtcTexture);
419*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_CUBE_MAP, 1, GL_COMPRESSED_RGB8_ETC2, kTexSize, kTexSize);
420*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, 0, 0, kTexSize, kTexSize,
421*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcAllZero), kEtcAllZero);
422*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, 0, 0, kTexSize, kTexSize,
423*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcAllZero), kEtcAllZero);
424*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, 0, 0, 0, kTexSize, kTexSize,
425*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcRGBData), kEtcRGBData);
426*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, 0, 0, kTexSize, kTexSize,
427*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcAllZero), kEtcAllZero);
428*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, 0, 0, 0, kTexSize, kTexSize,
429*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcAllZero), kEtcAllZero);
430*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, 0, 0, kTexSize, kTexSize,
431*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcAllZero), kEtcAllZero);
432*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
433*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
434*8975f5c5SAndroid Build Coastguard Worker     constexpr char kTextureCubeFS[] =
435*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
436*8975f5c5SAndroid Build Coastguard Worker         "precision highp float;\n"
437*8975f5c5SAndroid Build Coastguard Worker         "uniform highp samplerCube texCube;\n"
438*8975f5c5SAndroid Build Coastguard Worker         "uniform vec3 faceCoord;\n"
439*8975f5c5SAndroid Build Coastguard Worker         "out vec4 fragColor;\n"
440*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
441*8975f5c5SAndroid Build Coastguard Worker         "{\n"
442*8975f5c5SAndroid Build Coastguard Worker         "    fragColor = texture(texCube, faceCoord);\n"
443*8975f5c5SAndroid Build Coastguard Worker         "}\n";
444*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(kVS, kTextureCubeFS);
445*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
446*8975f5c5SAndroid Build Coastguard Worker     GLint texCubePos = glGetUniformLocation(program, "texCube");
447*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texCubePos, 0);
448*8975f5c5SAndroid Build Coastguard Worker     GLint faceCoordpos = glGetUniformLocation(program, "faceCoord");
449*8975f5c5SAndroid Build Coastguard Worker     // sample at (2, 2) on y plane.
450*8975f5c5SAndroid Build Coastguard Worker     glUniform3f(faceCoordpos, 0.25f, 1.0f, 0.25f);
451*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
452*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(kExpectedRGBColor[10]), kAbsError);
453*8975f5c5SAndroid Build Coastguard Worker }
454*8975f5c5SAndroid Build Coastguard Worker 
455*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_RGB8 to BC1 with 2DArray texture type
TEST_P(ETCToBCTextureTest,ETC2Rgb8UnormToBC1_2DArray)456*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgb8UnormToBC1_2DArray)
457*8975f5c5SAndroid Build Coastguard Worker {
458*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
459*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
460*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
461*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
462*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
463*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
464*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D_ARRAY, mEtcTexture);
465*8975f5c5SAndroid Build Coastguard Worker     static constexpr int kArraySize = 6;
466*8975f5c5SAndroid Build Coastguard Worker     uint32_t data[2 * kArraySize]   = {
467*8975f5c5SAndroid Build Coastguard Worker         kEtcAllZero[0], kEtcAllZero[1],  // array 0
468*8975f5c5SAndroid Build Coastguard Worker         kEtcRGBData[0], kEtcRGBData[1],  // array 1
469*8975f5c5SAndroid Build Coastguard Worker         kEtcRGBData[0], kEtcRGBData[1],  // array 2
470*8975f5c5SAndroid Build Coastguard Worker         kEtcAllZero[0], kEtcAllZero[1],  // array 3
471*8975f5c5SAndroid Build Coastguard Worker         kEtcAllZero[0], kEtcAllZero[1],  // array 4
472*8975f5c5SAndroid Build Coastguard Worker         kEtcAllZero[0], kEtcAllZero[1],  // array 5
473*8975f5c5SAndroid Build Coastguard Worker     };
474*8975f5c5SAndroid Build Coastguard Worker     glTexStorage3D(GL_TEXTURE_2D_ARRAY, 1, GL_COMPRESSED_RGB8_ETC2, kTexSize, kTexSize, kArraySize);
475*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, kTexSize, kTexSize, kArraySize,
476*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(data), data);
477*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
478*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
479*8975f5c5SAndroid Build Coastguard Worker     constexpr char kTexture2DArrayFS[] =
480*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
481*8975f5c5SAndroid Build Coastguard Worker         "precision highp float;\n"
482*8975f5c5SAndroid Build Coastguard Worker         "uniform highp sampler2DArray tex2DArray;\n"
483*8975f5c5SAndroid Build Coastguard Worker         "uniform vec3 coord;\n"
484*8975f5c5SAndroid Build Coastguard Worker         "out vec4 fragColor;\n"
485*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
486*8975f5c5SAndroid Build Coastguard Worker         "{\n"
487*8975f5c5SAndroid Build Coastguard Worker         "    fragColor = texture(tex2DArray, coord);\n"
488*8975f5c5SAndroid Build Coastguard Worker         "}\n";
489*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(kVS, kTexture2DArrayFS);
490*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
491*8975f5c5SAndroid Build Coastguard Worker     GLint texCubePos = glGetUniformLocation(program, "tex2DArray");
492*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texCubePos, 0);
493*8975f5c5SAndroid Build Coastguard Worker     GLint faceCoordpos = glGetUniformLocation(program, "coord");
494*8975f5c5SAndroid Build Coastguard Worker     // sample at (2, 2) on y plane.
495*8975f5c5SAndroid Build Coastguard Worker     glUniform3f(faceCoordpos, 0.625f, 0.625f, 2.0f);
496*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
497*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(kExpectedRGBColor[10]), kAbsError);
498*8975f5c5SAndroid Build Coastguard Worker }
499*8975f5c5SAndroid Build Coastguard Worker 
500*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_RGB8 to BC1 with partial updates
TEST_P(ETCToBCTextureTest,ETC2Rgb8UnormToBC1_partial)501*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgb8UnormToBC1_partial)
502*8975f5c5SAndroid Build Coastguard Worker {
503*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(!IsVulkan() || !IsNVIDIA() ||
504*8975f5c5SAndroid Build Coastguard Worker                        getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
505*8975f5c5SAndroid Build Coastguard Worker                        !IsGLExtensionEnabled("GL_EXT_texture_compression_dxt1"));
506*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
507*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
508*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_ETC2, kTexSize * 3, kTexSize * 3);
509*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize, GL_COMPRESSED_RGB8_ETC2,
510*8975f5c5SAndroid Build Coastguard Worker                               sizeof(kEtcAllZero), kEtcAllZero);
511*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 2 * kTexSize, 2 * kTexSize, kTexSize, kTexSize,
512*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_ETC2, sizeof(kEtcRGBData), kEtcRGBData);
513*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
514*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
515*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
516*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
517*8975f5c5SAndroid Build Coastguard Worker         "precision highp float;\n"
518*8975f5c5SAndroid Build Coastguard Worker         "uniform highp sampler2D tex2D;\n"
519*8975f5c5SAndroid Build Coastguard Worker         "uniform vec2 coord;\n"
520*8975f5c5SAndroid Build Coastguard Worker         "out vec4 fragColor;\n"
521*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
522*8975f5c5SAndroid Build Coastguard Worker         "{\n"
523*8975f5c5SAndroid Build Coastguard Worker         "    fragColor = texture(tex2D, coord);\n"
524*8975f5c5SAndroid Build Coastguard Worker         "}\n";
525*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(kVS, kFS);
526*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
527*8975f5c5SAndroid Build Coastguard Worker     GLint texCubePos = glGetUniformLocation(program, "tex2D");
528*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texCubePos, 0);
529*8975f5c5SAndroid Build Coastguard Worker     GLint faceCoordpos = glGetUniformLocation(program, "coord");
530*8975f5c5SAndroid Build Coastguard Worker     // sample at (2, 2) on y plane.
531*8975f5c5SAndroid Build Coastguard Worker     glUniform2f(faceCoordpos, 21.0f / 24.0f, 21.0f / 24.0f);
532*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
533*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(kExpectedRGBColor[10]), kAbsError);
534*8975f5c5SAndroid Build Coastguard Worker }
535*8975f5c5SAndroid Build Coastguard Worker 
536*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_RGBA8 to BC3
TEST_P(ETCToBCTextureTest,ETC2Rgba8UnormToBC3)537*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgba8UnormToBC3)
538*8975f5c5SAndroid Build Coastguard Worker {
539*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
540*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
541*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
542*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc"));
543*8975f5c5SAndroid Build Coastguard Worker 
544*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
545*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
546*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGBA8_ETC2_EAC, kTexSize, kTexSize);
547*8975f5c5SAndroid Build Coastguard Worker 
548*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize,
549*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA8_ETC2_EAC, sizeof(kEtcRGBAData), kEtcRGBAData);
550*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
551*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
552*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, false);
553*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; ++i)
554*8975f5c5SAndroid Build Coastguard Worker     {
555*8975f5c5SAndroid Build Coastguard Worker         for (int j = 0; j < 4; ++j)
556*8975f5c5SAndroid Build Coastguard Worker         {
557*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_NEAR(j, i, GLColor(kExpectedRGBAColor[i * 4 + j]), kAbsError);
558*8975f5c5SAndroid Build Coastguard Worker         }
559*8975f5c5SAndroid Build Coastguard Worker     }
560*8975f5c5SAndroid Build Coastguard Worker }
561*8975f5c5SAndroid Build Coastguard Worker 
562*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_RGBA8 to BC3 texture with lod.
TEST_P(ETCToBCTextureTest,ETC2Rgba8UnormToBC3_Lod)563*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgba8UnormToBC3_Lod)
564*8975f5c5SAndroid Build Coastguard Worker {
565*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
566*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
567*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
568*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc"));
569*8975f5c5SAndroid Build Coastguard Worker 
570*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
571*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
572*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 3, GL_COMPRESSED_RGBA8_ETC2_EAC, kTexSize, kTexSize);
573*8975f5c5SAndroid Build Coastguard Worker 
574*8975f5c5SAndroid Build Coastguard Worker     static constexpr uint32_t kAllZero[] = {0, 0, 0, 0};
575*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize,
576*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA8_ETC2_EAC, sizeof(kAllZero), kAllZero);
577*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, kTexSize / 2, kTexSize / 2,
578*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA8_ETC2_EAC, sizeof(kAllZero), kAllZero);
579*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 2, 0, 0, kTexSize / 4, kTexSize / 4,
580*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGBA8_ETC2_EAC, sizeof(kEtcRGBAData), kEtcRGBAData);
581*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
582*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
583*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
584*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
585*8975f5c5SAndroid Build Coastguard Worker         "in vec2 position;\n"
586*8975f5c5SAndroid Build Coastguard Worker         "out vec2 texCoord;\n"
587*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
588*8975f5c5SAndroid Build Coastguard Worker         "{\n"
589*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
590*8975f5c5SAndroid Build Coastguard Worker         "    texCoord = position * 0.5 + vec2(0.5);\n"
591*8975f5c5SAndroid Build Coastguard Worker         "}\n";
592*8975f5c5SAndroid Build Coastguard Worker 
593*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
594*8975f5c5SAndroid Build Coastguard Worker         "#version 300 es\n"
595*8975f5c5SAndroid Build Coastguard Worker         "precision highp float;\n"
596*8975f5c5SAndroid Build Coastguard Worker         "uniform highp sampler2D tex2D;\n"
597*8975f5c5SAndroid Build Coastguard Worker         "in vec2 texCoord;\n"
598*8975f5c5SAndroid Build Coastguard Worker         "out vec4 fragColor;\n"
599*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
600*8975f5c5SAndroid Build Coastguard Worker         "{\n"
601*8975f5c5SAndroid Build Coastguard Worker         "    fragColor = textureLod(tex2D, texCoord, 2.0);\n"
602*8975f5c5SAndroid Build Coastguard Worker         "}\n";
603*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(kVS, kFS);
604*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
605*8975f5c5SAndroid Build Coastguard Worker     GLint texPos = glGetUniformLocation(program, "tex2D");
606*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(texPos, 0);
607*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
608*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(kExpectedRGBAColor[0]), kAbsError);
609*8975f5c5SAndroid Build Coastguard Worker }
610*8975f5c5SAndroid Build Coastguard Worker 
611*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode ETC2_SRGB8_ALPHA8 to BC3
TEST_P(ETCToBCTextureTest,ETC2SrgbAlpha8UnormToBC3)612*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2SrgbAlpha8UnormToBC3)
613*8975f5c5SAndroid Build Coastguard Worker {
614*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
615*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
616*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
617*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc_srgb"));
618*8975f5c5SAndroid Build Coastguard Worker 
619*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, pixel_width, pixel_height);
620*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
621*8975f5c5SAndroid Build Coastguard Worker     EXPECT_GL_NO_ERROR();
622*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, pixel_width,
623*8975f5c5SAndroid Build Coastguard Worker                            pixel_height, 0, sizeof(etc2bc_srgb8_alpha8), etc2bc_srgb8_alpha8);
624*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
625*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
626*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, false);
627*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_NEAR(96, 160, 255, kAbsError);
628*8975f5c5SAndroid Build Coastguard Worker     EXPECT_PIXEL_ALPHA_NEAR(88, 148, 0, kAbsError);
629*8975f5c5SAndroid Build Coastguard Worker }
630*8975f5c5SAndroid Build Coastguard Worker 
631*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode R11 Signed to BC4
TEST_P(ETCToBCTextureTest,ETC2R11SignedToBC4)632*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2R11SignedToBC4)
633*8975f5c5SAndroid Build Coastguard Worker {
634*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
635*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
636*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
637*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_rgtc"));
638*8975f5c5SAndroid Build Coastguard Worker 
639*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
640*8975f5c5SAndroid Build Coastguard Worker     glActiveTexture(GL_TEXTURE0);
641*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
642*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_SIGNED_R11_EAC, kTexSize, kTexSize);
643*8975f5c5SAndroid Build Coastguard Worker 
644*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize,
645*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_SIGNED_R11_EAC, sizeof(kEacR11Signed), kEacR11Signed);
646*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
647*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
648*8975f5c5SAndroid Build Coastguard Worker     constexpr char kVS[] =
649*8975f5c5SAndroid Build Coastguard Worker         "attribute vec2 position;\n"
650*8975f5c5SAndroid Build Coastguard Worker         "varying mediump vec2 texCoord;\n"
651*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
652*8975f5c5SAndroid Build Coastguard Worker         "{\n"
653*8975f5c5SAndroid Build Coastguard Worker         "    gl_Position = vec4(position, 0, 1);\n"
654*8975f5c5SAndroid Build Coastguard Worker         "    texCoord = position * 0.5 + vec2(0.5);\n"
655*8975f5c5SAndroid Build Coastguard Worker         "}\n";
656*8975f5c5SAndroid Build Coastguard Worker 
657*8975f5c5SAndroid Build Coastguard Worker     constexpr char kFS[] =
658*8975f5c5SAndroid Build Coastguard Worker         "varying mediump vec2 texCoord;\n"
659*8975f5c5SAndroid Build Coastguard Worker         "uniform sampler2D tex;\n"
660*8975f5c5SAndroid Build Coastguard Worker         "void main()\n"
661*8975f5c5SAndroid Build Coastguard Worker         "{\n"
662*8975f5c5SAndroid Build Coastguard Worker         "    gl_FragColor = texture2D(tex, texCoord)/2.0 + vec4(0.5, 0.0, 0.0, 0.5);\n"
663*8975f5c5SAndroid Build Coastguard Worker         "}\n";
664*8975f5c5SAndroid Build Coastguard Worker     GLuint program = CompileProgram(kVS, kFS);
665*8975f5c5SAndroid Build Coastguard Worker     glUseProgram(program);
666*8975f5c5SAndroid Build Coastguard Worker     GLint pos = glGetUniformLocation(program, "tex");
667*8975f5c5SAndroid Build Coastguard Worker     glUniform1i(pos, 0);
668*8975f5c5SAndroid Build Coastguard Worker     drawQuad(program, "position", 0.5f);
669*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; ++i)
670*8975f5c5SAndroid Build Coastguard Worker     {
671*8975f5c5SAndroid Build Coastguard Worker         for (int j = 0; j < 4; ++j)
672*8975f5c5SAndroid Build Coastguard Worker         {
673*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_NEAR(j, i, GLColor(kExpectedR11SignedColor[i * 4 + j]), kAbsError);
674*8975f5c5SAndroid Build Coastguard Worker         }
675*8975f5c5SAndroid Build Coastguard Worker     }
676*8975f5c5SAndroid Build Coastguard Worker }
677*8975f5c5SAndroid Build Coastguard Worker 
678*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode RG11 to BC5
TEST_P(ETCToBCTextureTest,ETC2RG11ToBC5)679*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2RG11ToBC5)
680*8975f5c5SAndroid Build Coastguard Worker {
681*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
682*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
683*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
684*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_rgtc"));
685*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
686*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
687*8975f5c5SAndroid Build Coastguard Worker     uint32_t data[4] = {
688*8975f5c5SAndroid Build Coastguard Worker         kEtcRGBAData[0],
689*8975f5c5SAndroid Build Coastguard Worker         kEtcRGBAData[1],
690*8975f5c5SAndroid Build Coastguard Worker         kEtcRGBAData[0],
691*8975f5c5SAndroid Build Coastguard Worker         kEtcRGBAData[1],
692*8975f5c5SAndroid Build Coastguard Worker     };
693*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RG11_EAC, kTexSize, kTexSize);
694*8975f5c5SAndroid Build Coastguard Worker 
695*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize, GL_COMPRESSED_RG11_EAC,
696*8975f5c5SAndroid Build Coastguard Worker                               sizeof(data), data);
697*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
698*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
699*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, false);
700*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; ++i)
701*8975f5c5SAndroid Build Coastguard Worker     {
702*8975f5c5SAndroid Build Coastguard Worker         for (int j = 0; j < 4; ++j)
703*8975f5c5SAndroid Build Coastguard Worker         {
704*8975f5c5SAndroid Build Coastguard Worker             uint32_t color = (kExpectedRGBAColor[i * 4 + j] & 0xff000000) >> 24;
705*8975f5c5SAndroid Build Coastguard Worker             color |= color << 8;
706*8975f5c5SAndroid Build Coastguard Worker             color |= 0xff000000;
707*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_NEAR(j, i, GLColor(color), kAbsError);
708*8975f5c5SAndroid Build Coastguard Worker         }
709*8975f5c5SAndroid Build Coastguard Worker     }
710*8975f5c5SAndroid Build Coastguard Worker }
711*8975f5c5SAndroid Build Coastguard Worker 
712*8975f5c5SAndroid Build Coastguard Worker // Tests GPU compute transcode RGB8A1 to BC1_RGBA
TEST_P(ETCToBCTextureTest,ETC2Rgb8a1UnormToBC1)713*8975f5c5SAndroid Build Coastguard Worker TEST_P(ETCToBCTextureTest, ETC2Rgb8a1UnormToBC1)
714*8975f5c5SAndroid Build Coastguard Worker {
715*8975f5c5SAndroid Build Coastguard Worker     ANGLE_SKIP_TEST_IF(
716*8975f5c5SAndroid Build Coastguard Worker         !IsVulkan() || !IsNVIDIA() ||
717*8975f5c5SAndroid Build Coastguard Worker         !getEGLWindow()->isFeatureEnabled(Feature::SupportsComputeTranscodeEtcToBc) ||
718*8975f5c5SAndroid Build Coastguard Worker         !IsGLExtensionEnabled("GL_EXT_texture_compression_s3tc"));
719*8975f5c5SAndroid Build Coastguard Worker     glViewport(0, 0, kWidth, kHeight);
720*8975f5c5SAndroid Build Coastguard Worker     glBindTexture(GL_TEXTURE_2D, mEtcTexture);
721*8975f5c5SAndroid Build Coastguard Worker     glTexStorage2D(GL_TEXTURE_2D, 1, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, kTexSize,
722*8975f5c5SAndroid Build Coastguard Worker                    kTexSize);
723*8975f5c5SAndroid Build Coastguard Worker     glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kTexSize, kTexSize,
724*8975f5c5SAndroid Build Coastguard Worker                               GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, sizeof(kRgb8a1),
725*8975f5c5SAndroid Build Coastguard Worker                               kRgb8a1);
726*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
727*8975f5c5SAndroid Build Coastguard Worker     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
728*8975f5c5SAndroid Build Coastguard Worker     draw2DTexturedQuad(0.5f, 1.0f, false);
729*8975f5c5SAndroid Build Coastguard Worker     for (int i = 0; i < 4; ++i)
730*8975f5c5SAndroid Build Coastguard Worker     {
731*8975f5c5SAndroid Build Coastguard Worker         for (int j = 0; j < 4; ++j)
732*8975f5c5SAndroid Build Coastguard Worker         {
733*8975f5c5SAndroid Build Coastguard Worker             EXPECT_PIXEL_COLOR_NEAR(j, i, GLColor(kExpectedRgb8a1[i * 4 + j]), kAbsError);
734*8975f5c5SAndroid Build Coastguard Worker         }
735*8975f5c5SAndroid Build Coastguard Worker     }
736*8975f5c5SAndroid Build Coastguard Worker }
737*8975f5c5SAndroid Build Coastguard Worker 
738*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2_AND_ES3(ETCTextureTest);
739*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3_AND(ETCToBCTextureTest,
740*8975f5c5SAndroid Build Coastguard Worker                                ES3_VULKAN().enable(Feature::SupportsComputeTranscodeEtcToBc));
741*8975f5c5SAndroid Build Coastguard Worker }  // anonymous namespace
742