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