1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2019 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 // GetImageTest:
7*8975f5c5SAndroid Build Coastguard Worker // Tests for the ANGLE_get_image extension.
8*8975f5c5SAndroid Build Coastguard Worker //
9*8975f5c5SAndroid Build Coastguard Worker
10*8975f5c5SAndroid Build Coastguard Worker #include "image_util/storeimage.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
13*8975f5c5SAndroid Build Coastguard Worker
14*8975f5c5SAndroid Build Coastguard Worker #include "util/random_utils.h"
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
17*8975f5c5SAndroid Build Coastguard Worker
18*8975f5c5SAndroid Build Coastguard Worker namespace
19*8975f5c5SAndroid Build Coastguard Worker {
20*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kSize = 32;
21*8975f5c5SAndroid Build Coastguard Worker constexpr char kExtensionName[] = "GL_ANGLE_get_image";
22*8975f5c5SAndroid Build Coastguard Worker constexpr uint32_t kSmallSize = 2;
23*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kUNormZero = 0x00;
24*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kUNormHalf = 0x7F;
25*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kUNormFull = 0xFF;
26*8975f5c5SAndroid Build Coastguard Worker
27*8975f5c5SAndroid Build Coastguard Worker class GetImageTest : public ANGLETest<>
28*8975f5c5SAndroid Build Coastguard Worker {
29*8975f5c5SAndroid Build Coastguard Worker public:
GetImageTest()30*8975f5c5SAndroid Build Coastguard Worker GetImageTest()
31*8975f5c5SAndroid Build Coastguard Worker {
32*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(kSize);
33*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(kSize);
34*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
35*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
36*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
37*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
38*8975f5c5SAndroid Build Coastguard Worker }
39*8975f5c5SAndroid Build Coastguard Worker };
40*8975f5c5SAndroid Build Coastguard Worker
41*8975f5c5SAndroid Build Coastguard Worker class GetImageTestNoExtensions : public ANGLETest<>
42*8975f5c5SAndroid Build Coastguard Worker {
43*8975f5c5SAndroid Build Coastguard Worker public:
GetImageTestNoExtensions()44*8975f5c5SAndroid Build Coastguard Worker GetImageTestNoExtensions() { setExtensionsEnabled(false); }
45*8975f5c5SAndroid Build Coastguard Worker };
46*8975f5c5SAndroid Build Coastguard Worker
47*8975f5c5SAndroid Build Coastguard Worker class GetImageTestES1 : public GetImageTest
48*8975f5c5SAndroid Build Coastguard Worker {
49*8975f5c5SAndroid Build Coastguard Worker public:
GetImageTestES1()50*8975f5c5SAndroid Build Coastguard Worker GetImageTestES1() {}
51*8975f5c5SAndroid Build Coastguard Worker };
52*8975f5c5SAndroid Build Coastguard Worker
53*8975f5c5SAndroid Build Coastguard Worker class GetImageTestES3 : public GetImageTest
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker public:
GetImageTestES3()56*8975f5c5SAndroid Build Coastguard Worker GetImageTestES3() {}
57*8975f5c5SAndroid Build Coastguard Worker };
58*8975f5c5SAndroid Build Coastguard Worker
59*8975f5c5SAndroid Build Coastguard Worker class GetImageTestES31 : public GetImageTest
60*8975f5c5SAndroid Build Coastguard Worker {
61*8975f5c5SAndroid Build Coastguard Worker public:
GetImageTestES31()62*8975f5c5SAndroid Build Coastguard Worker GetImageTestES31() {}
63*8975f5c5SAndroid Build Coastguard Worker };
64*8975f5c5SAndroid Build Coastguard Worker
65*8975f5c5SAndroid Build Coastguard Worker class GetImageTestES32 : public GetImageTest
66*8975f5c5SAndroid Build Coastguard Worker {
67*8975f5c5SAndroid Build Coastguard Worker public:
GetImageTestES32()68*8975f5c5SAndroid Build Coastguard Worker GetImageTestES32() {}
69*8975f5c5SAndroid Build Coastguard Worker };
70*8975f5c5SAndroid Build Coastguard Worker
InitTextureWithFormatAndSize(GLenum format,uint32_t size,void * pixelData)71*8975f5c5SAndroid Build Coastguard Worker GLTexture InitTextureWithFormatAndSize(GLenum format, uint32_t size, void *pixelData)
72*8975f5c5SAndroid Build Coastguard Worker {
73*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
74*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
75*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, format, size, size, 0, format, GL_UNSIGNED_BYTE, pixelData);
76*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
77*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
78*8975f5c5SAndroid Build Coastguard Worker return tex;
79*8975f5c5SAndroid Build Coastguard Worker }
80*8975f5c5SAndroid Build Coastguard Worker
InitTextureWithSize(uint32_t size,void * pixelData)81*8975f5c5SAndroid Build Coastguard Worker GLTexture InitTextureWithSize(uint32_t size, void *pixelData)
82*8975f5c5SAndroid Build Coastguard Worker {
83*8975f5c5SAndroid Build Coastguard Worker // Create a simple texture.
84*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
85*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
86*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size, size, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData);
87*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
88*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
89*8975f5c5SAndroid Build Coastguard Worker return tex;
90*8975f5c5SAndroid Build Coastguard Worker }
91*8975f5c5SAndroid Build Coastguard Worker
InitSimpleTexture()92*8975f5c5SAndroid Build Coastguard Worker GLTexture InitSimpleTexture()
93*8975f5c5SAndroid Build Coastguard Worker {
94*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> pixelData(kSize * kSize, GLColor::red);
95*8975f5c5SAndroid Build Coastguard Worker return InitTextureWithSize(kSize, pixelData.data());
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker
InitRenderbufferWithSize(uint32_t size)98*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer InitRenderbufferWithSize(uint32_t size)
99*8975f5c5SAndroid Build Coastguard Worker {
100*8975f5c5SAndroid Build Coastguard Worker // Create a simple renderbuffer.
101*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf;
102*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, renderbuf);
103*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA4, size, size);
104*8975f5c5SAndroid Build Coastguard Worker return renderbuf;
105*8975f5c5SAndroid Build Coastguard Worker }
106*8975f5c5SAndroid Build Coastguard Worker
InitSimpleRenderbuffer()107*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer InitSimpleRenderbuffer()
108*8975f5c5SAndroid Build Coastguard Worker {
109*8975f5c5SAndroid Build Coastguard Worker return InitRenderbufferWithSize(kSize);
110*8975f5c5SAndroid Build Coastguard Worker }
111*8975f5c5SAndroid Build Coastguard Worker
112*8975f5c5SAndroid Build Coastguard Worker // Test validation for the extension functions.
TEST_P(GetImageTest,NegativeAPI)113*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, NegativeAPI)
114*8975f5c5SAndroid Build Coastguard Worker {
115*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
116*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
117*8975f5c5SAndroid Build Coastguard Worker
118*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
119*8975f5c5SAndroid Build Coastguard Worker GLTexture tex = InitSimpleTexture();
120*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
121*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
122*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
123*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
124*8975f5c5SAndroid Build Coastguard Worker
125*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
126*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker // Verify GetTexImage can work with correct parameters.
129*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> buffer(kSize * kSize);
130*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
131*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
132*8975f5c5SAndroid Build Coastguard Worker
133*8975f5c5SAndroid Build Coastguard Worker // Test invalid texture target.
134*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_CUBE_MAP, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
135*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
136*8975f5c5SAndroid Build Coastguard Worker
137*8975f5c5SAndroid Build Coastguard Worker // Test invalid texture level.
138*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, -1, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
139*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
140*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 2000, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
141*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
142*8975f5c5SAndroid Build Coastguard Worker
143*8975f5c5SAndroid Build Coastguard Worker // Test invalid format and type.
144*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_NONE, GL_UNSIGNED_BYTE, buffer.data());
145*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
146*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_NONE, buffer.data());
147*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
148*8975f5c5SAndroid Build Coastguard Worker
149*8975f5c5SAndroid Build Coastguard Worker // Tests GetCompressed on an uncompressed texture.
150*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, 0, buffer.data());
151*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker // Create a simple renderbuffer.
154*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf = InitSimpleRenderbuffer();
155*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
156*8975f5c5SAndroid Build Coastguard Worker
157*8975f5c5SAndroid Build Coastguard Worker // Verify GetRenderbufferImage can work with correct parameters.
158*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
159*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
160*8975f5c5SAndroid Build Coastguard Worker
161*8975f5c5SAndroid Build Coastguard Worker // Test invalid renderbuffer target.
162*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_TEXTURE_2D, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
163*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
164*8975f5c5SAndroid Build Coastguard Worker
165*8975f5c5SAndroid Build Coastguard Worker // Test invalid renderbuffer format/type.
166*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_NONE, GL_UNSIGNED_BYTE, buffer.data());
167*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
168*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_NONE, buffer.data());
169*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
170*8975f5c5SAndroid Build Coastguard Worker
171*8975f5c5SAndroid Build Coastguard Worker // Pack buffer tests. Requires ES 3+ or extension.
172*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() >= 3 || IsGLExtensionEnabled("GL_NV_pixel_buffer_object"))
173*8975f5c5SAndroid Build Coastguard Worker {
174*8975f5c5SAndroid Build Coastguard Worker // Test valid pack buffer.
175*8975f5c5SAndroid Build Coastguard Worker GLBuffer packBuffer;
176*8975f5c5SAndroid Build Coastguard Worker glBindBuffer(GL_PIXEL_PACK_BUFFER, packBuffer);
177*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_PIXEL_PACK_BUFFER, kSize * kSize * sizeof(GLColor), nullptr,
178*8975f5c5SAndroid Build Coastguard Worker GL_STATIC_DRAW);
179*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
180*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
181*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
182*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker // Test too small pack buffer.
185*8975f5c5SAndroid Build Coastguard Worker glBufferData(GL_PIXEL_PACK_BUFFER, kSize, nullptr, GL_STATIC_DRAW);
186*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
187*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
188*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
189*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
190*8975f5c5SAndroid Build Coastguard Worker }
191*8975f5c5SAndroid Build Coastguard Worker }
192*8975f5c5SAndroid Build Coastguard Worker
193*8975f5c5SAndroid Build Coastguard Worker // Simple test for GetTexImage
TEST_P(GetImageTest,GetTexImage)194*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, GetTexImage)
195*8975f5c5SAndroid Build Coastguard Worker {
196*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
197*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
198*8975f5c5SAndroid Build Coastguard Worker
199*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedData = {GLColor::red, GLColor::blue, GLColor::green,
200*8975f5c5SAndroid Build Coastguard Worker GLColor::yellow};
201*8975f5c5SAndroid Build Coastguard Worker
202*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
203*8975f5c5SAndroid Build Coastguard Worker
204*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
205*8975f5c5SAndroid Build Coastguard Worker GLTexture tex = InitTextureWithSize(kSmallSize, expectedData.data());
206*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
207*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
208*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
209*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
210*8975f5c5SAndroid Build Coastguard Worker
211*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
212*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
213*8975f5c5SAndroid Build Coastguard Worker
214*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
215*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualData(kSmallSize * kSmallSize);
216*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
217*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
218*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
219*8975f5c5SAndroid Build Coastguard Worker }
220*8975f5c5SAndroid Build Coastguard Worker
221*8975f5c5SAndroid Build Coastguard Worker // Simple cube map test for GetTexImage
TEST_P(GetImageTest,CubeMap)222*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CubeMap)
223*8975f5c5SAndroid Build Coastguard Worker {
224*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
225*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
226*8975f5c5SAndroid Build Coastguard Worker
227*8975f5c5SAndroid Build Coastguard Worker const std::array<std::array<GLColor, kSmallSize * kSmallSize>, kCubeFaces.size()> expectedData =
228*8975f5c5SAndroid Build Coastguard Worker {{
229*8975f5c5SAndroid Build Coastguard Worker {GLColor::red, GLColor::red, GLColor::red, GLColor::red},
230*8975f5c5SAndroid Build Coastguard Worker {GLColor::green, GLColor::green, GLColor::green, GLColor::green},
231*8975f5c5SAndroid Build Coastguard Worker {GLColor::blue, GLColor::blue, GLColor::blue, GLColor::blue},
232*8975f5c5SAndroid Build Coastguard Worker {GLColor::yellow, GLColor::yellow, GLColor::yellow, GLColor::yellow},
233*8975f5c5SAndroid Build Coastguard Worker {GLColor::cyan, GLColor::cyan, GLColor::cyan, GLColor::cyan},
234*8975f5c5SAndroid Build Coastguard Worker {GLColor::magenta, GLColor::magenta, GLColor::magenta, GLColor::magenta},
235*8975f5c5SAndroid Build Coastguard Worker }};
236*8975f5c5SAndroid Build Coastguard Worker
237*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
238*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
239*8975f5c5SAndroid Build Coastguard Worker
240*8975f5c5SAndroid Build Coastguard Worker for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
241*8975f5c5SAndroid Build Coastguard Worker {
242*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(kCubeFaces[faceIndex], 0, GL_RGBA, kSmallSize, kSmallSize, 0, GL_RGBA,
243*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, expectedData[faceIndex].data());
244*8975f5c5SAndroid Build Coastguard Worker }
245*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
246*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
247*8975f5c5SAndroid Build Coastguard Worker
248*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
249*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
250*8975f5c5SAndroid Build Coastguard Worker
251*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
252*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, kSmallSize *kSmallSize> actualData = {};
253*8975f5c5SAndroid Build Coastguard Worker for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
254*8975f5c5SAndroid Build Coastguard Worker {
255*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(kCubeFaces[faceIndex], 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
256*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
257*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[faceIndex], actualData);
258*8975f5c5SAndroid Build Coastguard Worker }
259*8975f5c5SAndroid Build Coastguard Worker }
260*8975f5c5SAndroid Build Coastguard Worker
261*8975f5c5SAndroid Build Coastguard Worker // Simple test for GetRenderbufferImage
TEST_P(GetImageTest,GetRenderbufferImage)262*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, GetRenderbufferImage)
263*8975f5c5SAndroid Build Coastguard Worker {
264*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
265*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
266*8975f5c5SAndroid Build Coastguard Worker
267*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedData = {GLColor::red, GLColor::blue, GLColor::green,
268*8975f5c5SAndroid Build Coastguard Worker GLColor::yellow};
269*8975f5c5SAndroid Build Coastguard Worker
270*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
271*8975f5c5SAndroid Build Coastguard Worker
272*8975f5c5SAndroid Build Coastguard Worker // Set up a simple Framebuffer with a Renderbuffer.
273*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuffer = InitRenderbufferWithSize(kSmallSize);
274*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
275*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
276*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, renderbuffer);
277*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
278*8975f5c5SAndroid Build Coastguard Worker
279*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
280*8975f5c5SAndroid Build Coastguard Worker GLTexture tex = InitTextureWithSize(kSmallSize, expectedData.data());
281*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
282*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
283*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
284*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
285*8975f5c5SAndroid Build Coastguard Worker
286*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
287*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
288*8975f5c5SAndroid Build Coastguard Worker
289*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
290*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualData(kSmallSize * kSmallSize);
291*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
292*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
293*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
294*8975f5c5SAndroid Build Coastguard Worker }
295*8975f5c5SAndroid Build Coastguard Worker
296*8975f5c5SAndroid Build Coastguard Worker // Verifies that the extension enums and entry points are invalid when the extension is disabled.
TEST_P(GetImageTestNoExtensions,EntryPointsInactive)297*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestNoExtensions, EntryPointsInactive)
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is not enabled.
300*8975f5c5SAndroid Build Coastguard Worker ASSERT_FALSE(IsGLExtensionEnabled(kExtensionName));
301*8975f5c5SAndroid Build Coastguard Worker
302*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
303*8975f5c5SAndroid Build Coastguard Worker GLTexture tex = InitSimpleTexture();
304*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
305*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
306*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
307*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
308*8975f5c5SAndroid Build Coastguard Worker
309*8975f5c5SAndroid Build Coastguard Worker // Query implementation format and type. Should give invalid enum.
310*8975f5c5SAndroid Build Coastguard Worker GLint param;
311*8975f5c5SAndroid Build Coastguard Worker glGetTexParameteriv(GL_TEXTURE_2D, GL_IMPLEMENTATION_COLOR_READ_FORMAT, ¶m);
312*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
313*8975f5c5SAndroid Build Coastguard Worker
314*8975f5c5SAndroid Build Coastguard Worker glGetTexParameteriv(GL_TEXTURE_2D, GL_IMPLEMENTATION_COLOR_READ_TYPE, ¶m);
315*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
316*8975f5c5SAndroid Build Coastguard Worker
317*8975f5c5SAndroid Build Coastguard Worker // Verify calling GetTexImage produces an error.
318*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> buffer(kSize * kSize, 0);
319*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
320*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
321*8975f5c5SAndroid Build Coastguard Worker
322*8975f5c5SAndroid Build Coastguard Worker // Create a simple renderbuffer.
323*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer renderbuf = InitSimpleRenderbuffer();
324*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
325*8975f5c5SAndroid Build Coastguard Worker
326*8975f5c5SAndroid Build Coastguard Worker // Query implementation format and type. Should give invalid enum.
327*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_IMPLEMENTATION_COLOR_READ_FORMAT, ¶m);
328*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
329*8975f5c5SAndroid Build Coastguard Worker
330*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_IMPLEMENTATION_COLOR_READ_TYPE, ¶m);
331*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
332*8975f5c5SAndroid Build Coastguard Worker
333*8975f5c5SAndroid Build Coastguard Worker // Verify calling GetRenderbufferImage produces an error.
334*8975f5c5SAndroid Build Coastguard Worker glGetRenderbufferImageANGLE(GL_RENDERBUFFER, GL_RGBA, GL_UNSIGNED_BYTE, buffer.data());
335*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
336*8975f5c5SAndroid Build Coastguard Worker }
337*8975f5c5SAndroid Build Coastguard Worker
338*8975f5c5SAndroid Build Coastguard Worker // Test LUMINANCE_ALPHA (non-renderable) format with GetTexImage
TEST_P(GetImageTest,GetTexImageLuminanceAlpha)339*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, GetTexImageLuminanceAlpha)
340*8975f5c5SAndroid Build Coastguard Worker {
341*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
342*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
343*8975f5c5SAndroid Build Coastguard Worker
344*8975f5c5SAndroid Build Coastguard Worker constexpr GLColorRG kMediumLumAlpha = GLColorRG(kUNormHalf, kUNormHalf);
345*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorRG> expectedData = {kMediumLumAlpha, kMediumLumAlpha, kMediumLumAlpha,
346*8975f5c5SAndroid Build Coastguard Worker kMediumLumAlpha};
347*8975f5c5SAndroid Build Coastguard Worker
348*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
349*8975f5c5SAndroid Build Coastguard Worker
350*8975f5c5SAndroid Build Coastguard Worker // Set up a simple LUMINANCE_ALPHA texture
351*8975f5c5SAndroid Build Coastguard Worker GLTexture tex =
352*8975f5c5SAndroid Build Coastguard Worker InitTextureWithFormatAndSize(GL_LUMINANCE_ALPHA, kSmallSize, expectedData.data());
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
355*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
356*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
357*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(kUNormHalf, kUNormHalf, kUNormHalf, kUNormHalf));
358*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
359*8975f5c5SAndroid Build Coastguard Worker
360*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
361*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
362*8975f5c5SAndroid Build Coastguard Worker
363*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
364*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorRG> actualData(kSmallSize * kSmallSize);
365*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, actualData.data());
366*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
367*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kSmallSize * kSmallSize; ++i)
368*8975f5c5SAndroid Build Coastguard Worker {
369*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[i].R, actualData[i].R);
370*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[i].G, actualData[i].G);
371*8975f5c5SAndroid Build Coastguard Worker }
372*8975f5c5SAndroid Build Coastguard Worker }
373*8975f5c5SAndroid Build Coastguard Worker
374*8975f5c5SAndroid Build Coastguard Worker // Test LUMINANCE (non-renderable) format with GetTexImage
TEST_P(GetImageTest,GetTexImageLuminance)375*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, GetTexImageLuminance)
376*8975f5c5SAndroid Build Coastguard Worker {
377*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
378*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
379*8975f5c5SAndroid Build Coastguard Worker
380*8975f5c5SAndroid Build Coastguard Worker constexpr GLColorR kMediumLuminance = GLColorR(kUNormHalf);
381*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorR> expectedData = {kMediumLuminance, kMediumLuminance, kMediumLuminance,
382*8975f5c5SAndroid Build Coastguard Worker kMediumLuminance};
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
385*8975f5c5SAndroid Build Coastguard Worker
386*8975f5c5SAndroid Build Coastguard Worker // Set up a simple LUMINANCE texture
387*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
388*8975f5c5SAndroid Build Coastguard Worker GLTexture tex = InitTextureWithFormatAndSize(GL_LUMINANCE, kSmallSize, expectedData.data());
389*8975f5c5SAndroid Build Coastguard Worker
390*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
391*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
392*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
393*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(kUNormHalf, kUNormHalf, kUNormHalf, kUNormFull));
394*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
395*8975f5c5SAndroid Build Coastguard Worker
396*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
397*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
398*8975f5c5SAndroid Build Coastguard Worker
399*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
400*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorR> actualData(kSmallSize * kSmallSize);
401*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, actualData.data());
402*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
403*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kSmallSize * kSmallSize; ++i)
404*8975f5c5SAndroid Build Coastguard Worker {
405*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[i].R, actualData[i].R);
406*8975f5c5SAndroid Build Coastguard Worker }
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker
409*8975f5c5SAndroid Build Coastguard Worker // Test ALPHA (non-renderable) format with GetTexImage
TEST_P(GetImageTest,GetTexImageAlpha)410*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, GetTexImageAlpha)
411*8975f5c5SAndroid Build Coastguard Worker {
412*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
413*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
414*8975f5c5SAndroid Build Coastguard Worker
415*8975f5c5SAndroid Build Coastguard Worker constexpr GLColorR kMediumAlpha = GLColorR(kUNormHalf);
416*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorR> expectedData = {kMediumAlpha, kMediumAlpha, kMediumAlpha, kMediumAlpha};
417*8975f5c5SAndroid Build Coastguard Worker
418*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
419*8975f5c5SAndroid Build Coastguard Worker
420*8975f5c5SAndroid Build Coastguard Worker // Set up a simple ALPHA texture
421*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
422*8975f5c5SAndroid Build Coastguard Worker GLTexture tex = InitTextureWithFormatAndSize(GL_ALPHA, kSmallSize, expectedData.data());
423*8975f5c5SAndroid Build Coastguard Worker
424*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture
425*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
426*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
427*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(kUNormZero, kUNormZero, kUNormZero, kUNormHalf));
428*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
429*8975f5c5SAndroid Build Coastguard Worker
430*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
431*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
432*8975f5c5SAndroid Build Coastguard Worker
433*8975f5c5SAndroid Build Coastguard Worker // Verify we get back the correct pixels from GetTexImage
434*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorR> actualData(kSmallSize * kSmallSize);
435*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_ALPHA, GL_UNSIGNED_BYTE, actualData.data());
436*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
437*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kSmallSize * kSmallSize; ++i)
438*8975f5c5SAndroid Build Coastguard Worker {
439*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[i].R, actualData[i].R);
440*8975f5c5SAndroid Build Coastguard Worker }
441*8975f5c5SAndroid Build Coastguard Worker }
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker // Tests GetImage behaviour with an RGB image.
TEST_P(GetImageTest,GetImageRGB)444*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, GetImageRGB)
445*8975f5c5SAndroid Build Coastguard Worker {
446*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
447*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
448*8975f5c5SAndroid Build Coastguard Worker
449*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorRGB> expectedData = {GLColorRGB::red, GLColorRGB::blue, GLColorRGB::green,
450*8975f5c5SAndroid Build Coastguard Worker GLColorRGB::yellow};
451*8975f5c5SAndroid Build Coastguard Worker
452*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
453*8975f5c5SAndroid Build Coastguard Worker
454*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
455*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
456*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
457*8975f5c5SAndroid Build Coastguard Worker
458*8975f5c5SAndroid Build Coastguard Worker // Init simple texture.
459*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
460*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
461*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, kSmallSize, kSmallSize, 0, GL_RGB, GL_UNSIGNED_BYTE,
462*8975f5c5SAndroid Build Coastguard Worker expectedData.data());
463*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGB, kSmallSize / 2, kSmallSize / 2, 0, GL_RGB,
464*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, expectedData.data());
465*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
466*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
467*8975f5c5SAndroid Build Coastguard Worker
468*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
469*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColorRGB> actualData(kSmallSize * kSmallSize);
470*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGB, GL_UNSIGNED_BYTE, actualData.data());
471*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
472*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
473*8975f5c5SAndroid Build Coastguard Worker
474*8975f5c5SAndroid Build Coastguard Worker // Draw after the GetImage.
475*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
476*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5, 1.0f, true);
477*8975f5c5SAndroid Build Coastguard Worker
478*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
479*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::green);
480*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::blue);
481*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::yellow);
482*8975f5c5SAndroid Build Coastguard Worker }
483*8975f5c5SAndroid Build Coastguard Worker
484*8975f5c5SAndroid Build Coastguard Worker // Tests GetImage with 2D array textures.
TEST_P(GetImageTestES31,Texture2DArray)485*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestES31, Texture2DArray)
486*8975f5c5SAndroid Build Coastguard Worker {
487*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
488*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
489*8975f5c5SAndroid Build Coastguard Worker
490*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kTextureSize = 2;
491*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kLayers = 4;
492*8975f5c5SAndroid Build Coastguard Worker
493*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedPixels = {
494*8975f5c5SAndroid Build Coastguard Worker GLColor::red, GLColor::red, GLColor::red, GLColor::red,
495*8975f5c5SAndroid Build Coastguard Worker GLColor::green, GLColor::green, GLColor::green, GLColor::green,
496*8975f5c5SAndroid Build Coastguard Worker GLColor::blue, GLColor::blue, GLColor::blue, GLColor::blue,
497*8975f5c5SAndroid Build Coastguard Worker GLColor::yellow, GLColor::yellow, GLColor::yellow, GLColor::yellow,
498*8975f5c5SAndroid Build Coastguard Worker };
499*8975f5c5SAndroid Build Coastguard Worker
500*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
501*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex);
502*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, kTextureSize, kTextureSize, kLayers, 0, GL_RGBA,
503*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, expectedPixels.data());
504*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
505*8975f5c5SAndroid Build Coastguard Worker
506*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualPixels(expectedPixels.size(), GLColor::white);
507*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualPixels.data());
508*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
509*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedPixels, actualPixels);
510*8975f5c5SAndroid Build Coastguard Worker }
511*8975f5c5SAndroid Build Coastguard Worker
512*8975f5c5SAndroid Build Coastguard Worker // Tests GetImage with 3D textures.
TEST_P(GetImageTestES31,Texture3D)513*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestES31, Texture3D)
514*8975f5c5SAndroid Build Coastguard Worker {
515*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
516*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
517*8975f5c5SAndroid Build Coastguard Worker
518*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kTextureSize = 2;
519*8975f5c5SAndroid Build Coastguard Worker
520*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedPixels = {
521*8975f5c5SAndroid Build Coastguard Worker GLColor::red, GLColor::red, GLColor::green, GLColor::green,
522*8975f5c5SAndroid Build Coastguard Worker GLColor::blue, GLColor::blue, GLColor::yellow, GLColor::yellow,
523*8975f5c5SAndroid Build Coastguard Worker };
524*8975f5c5SAndroid Build Coastguard Worker
525*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
526*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, tex);
527*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, kTextureSize, kTextureSize, kTextureSize, 0, GL_RGBA,
528*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, expectedPixels.data());
529*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
530*8975f5c5SAndroid Build Coastguard Worker
531*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualPixels(expectedPixels.size(), GLColor::white);
532*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_3D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualPixels.data());
533*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
534*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedPixels, actualPixels);
535*8975f5c5SAndroid Build Coastguard Worker }
536*8975f5c5SAndroid Build Coastguard Worker
537*8975f5c5SAndroid Build Coastguard Worker // Tests GetImage with cube map array textures.
TEST_P(GetImageTestES31,TextureCubeMapArray)538*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestES31, TextureCubeMapArray)
539*8975f5c5SAndroid Build Coastguard Worker {
540*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_cube_map_array") &&
541*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_OES_texture_cube_map_array"));
542*8975f5c5SAndroid Build Coastguard Worker
543*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
544*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
545*8975f5c5SAndroid Build Coastguard Worker
546*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kTextureSize = 1;
547*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kLayers = 2;
548*8975f5c5SAndroid Build Coastguard Worker
549*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedPixels = {
550*8975f5c5SAndroid Build Coastguard Worker GLColor::red, GLColor::green, GLColor::blue, GLColor::yellow,
551*8975f5c5SAndroid Build Coastguard Worker GLColor::cyan, GLColor::magenta, GLColor::red, GLColor::green,
552*8975f5c5SAndroid Build Coastguard Worker GLColor::blue, GLColor::yellow, GLColor::cyan, GLColor::magenta,
553*8975f5c5SAndroid Build Coastguard Worker };
554*8975f5c5SAndroid Build Coastguard Worker
555*8975f5c5SAndroid Build Coastguard Worker ASSERT_EQ(expectedPixels.size(),
556*8975f5c5SAndroid Build Coastguard Worker static_cast<size_t>(6 * kTextureSize * kTextureSize * kLayers));
557*8975f5c5SAndroid Build Coastguard Worker
558*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
559*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
560*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, kTextureSize, kTextureSize, kLayers * 6, 0,
561*8975f5c5SAndroid Build Coastguard Worker GL_RGBA, GL_UNSIGNED_BYTE, expectedPixels.data());
562*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
563*8975f5c5SAndroid Build Coastguard Worker
564*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualPixels(expectedPixels.size(), GLColor::white);
565*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_CUBE_MAP_ARRAY, 0, GL_RGBA, GL_UNSIGNED_BYTE,
566*8975f5c5SAndroid Build Coastguard Worker actualPixels.data());
567*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
568*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedPixels, actualPixels);
569*8975f5c5SAndroid Build Coastguard Worker }
570*8975f5c5SAndroid Build Coastguard Worker
571*8975f5c5SAndroid Build Coastguard Worker // Tests GetImage with an inconsistent 2D texture.
TEST_P(GetImageTest,InconsistentTexture2D)572*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, InconsistentTexture2D)
573*8975f5c5SAndroid Build Coastguard Worker {
574*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
575*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
576*8975f5c5SAndroid Build Coastguard Worker
577*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedData = {GLColor::red, GLColor::blue, GLColor::green,
578*8975f5c5SAndroid Build Coastguard Worker GLColor::yellow};
579*8975f5c5SAndroid Build Coastguard Worker
580*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSmallSize, kSmallSize);
581*8975f5c5SAndroid Build Coastguard Worker
582*8975f5c5SAndroid Build Coastguard Worker // Draw once with simple texture.
583*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
584*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
585*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSmallSize, kSmallSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
586*8975f5c5SAndroid Build Coastguard Worker expectedData.data());
587*8975f5c5SAndroid Build Coastguard Worker // The texture becomes inconsistent because a second 2x2 image does not fit in the mip chain.
588*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, kSmallSize, kSmallSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
589*8975f5c5SAndroid Build Coastguard Worker expectedData.data());
590*8975f5c5SAndroid Build Coastguard Worker
591*8975f5c5SAndroid Build Coastguard Worker // Pack pixels tightly.
592*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_PACK_ALIGNMENT, 1);
593*8975f5c5SAndroid Build Coastguard Worker
594*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
595*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualData(kSmallSize * kSmallSize, GLColor::white);
596*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
597*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
598*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
599*8975f5c5SAndroid Build Coastguard Worker
600*8975f5c5SAndroid Build Coastguard Worker std::fill(actualData.begin(), actualData.end(), GLColor::white);
601*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 1, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
602*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
603*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
604*8975f5c5SAndroid Build Coastguard Worker }
605*8975f5c5SAndroid Build Coastguard Worker
606*8975f5c5SAndroid Build Coastguard Worker // Test GetImage with non-defined textures.
TEST_P(GetImageTest,EmptyTexture)607*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, EmptyTexture)
608*8975f5c5SAndroid Build Coastguard Worker {
609*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
610*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
611*8975f5c5SAndroid Build Coastguard Worker
612*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
613*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
614*8975f5c5SAndroid Build Coastguard Worker
615*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> expectedData(4, GLColor::white);
616*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> actualData(4, GLColor::white);
617*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, actualData.data());
618*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
619*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
620*8975f5c5SAndroid Build Coastguard Worker }
621*8975f5c5SAndroid Build Coastguard Worker
622*8975f5c5SAndroid Build Coastguard Worker struct CompressedFormat
623*8975f5c5SAndroid Build Coastguard Worker {
624*8975f5c5SAndroid Build Coastguard Worker const GLenum id;
625*8975f5c5SAndroid Build Coastguard Worker
626*8975f5c5SAndroid Build Coastguard Worker // Texel/Block size in bytes
627*8975f5c5SAndroid Build Coastguard Worker const GLsizei size;
628*8975f5c5SAndroid Build Coastguard Worker
629*8975f5c5SAndroid Build Coastguard Worker // Texel/Block dimensions
630*8975f5c5SAndroid Build Coastguard Worker const GLsizei w;
631*8975f5c5SAndroid Build Coastguard Worker const GLsizei h;
632*8975f5c5SAndroid Build Coastguard Worker };
633*8975f5c5SAndroid Build Coastguard Worker
634*8975f5c5SAndroid Build Coastguard Worker struct CompressionExtension
635*8975f5c5SAndroid Build Coastguard Worker {
636*8975f5c5SAndroid Build Coastguard Worker const char *name;
637*8975f5c5SAndroid Build Coastguard Worker const std::vector<CompressedFormat> formats;
638*8975f5c5SAndroid Build Coastguard Worker const bool supports2DArray;
639*8975f5c5SAndroid Build Coastguard Worker const bool supports3D;
640*8975f5c5SAndroid Build Coastguard Worker };
641*8975f5c5SAndroid Build Coastguard Worker
642*8975f5c5SAndroid Build Coastguard Worker // clang-format off
643*8975f5c5SAndroid Build Coastguard Worker const CompressionExtension kCompressionExtensions[] = {
644*8975f5c5SAndroid Build Coastguard Worker // BC / DXT
645*8975f5c5SAndroid Build Coastguard Worker {"GL_EXT_texture_compression_dxt1", {{GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 8, 4, 4},
646*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 8, 4, 4}},
647*8975f5c5SAndroid Build Coastguard Worker true, false},
648*8975f5c5SAndroid Build Coastguard Worker {"GL_ANGLE_texture_compression_dxt3", {{GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 16, 4, 4}},
649*8975f5c5SAndroid Build Coastguard Worker true, false},
650*8975f5c5SAndroid Build Coastguard Worker {"GL_ANGLE_texture_compression_dxt5", {{GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 16, 4, 4}},
651*8975f5c5SAndroid Build Coastguard Worker true, false},
652*8975f5c5SAndroid Build Coastguard Worker {"GL_EXT_texture_compression_s3tc_srgb", {{GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 8, 4, 4},
653*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 8, 4, 4},
654*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 16, 4, 4},
655*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 16, 4, 4}},
656*8975f5c5SAndroid Build Coastguard Worker true, false},
657*8975f5c5SAndroid Build Coastguard Worker {"GL_EXT_texture_compression_rgtc", {{GL_COMPRESSED_RED_RGTC1_EXT, 8, 4, 4},
658*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SIGNED_RED_RGTC1_EXT, 8, 4, 4},
659*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RED_GREEN_RGTC2_EXT, 16, 4, 4},
660*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT, 16, 4, 4}},
661*8975f5c5SAndroid Build Coastguard Worker true, false},
662*8975f5c5SAndroid Build Coastguard Worker {"GL_EXT_texture_compression_bptc", {{GL_COMPRESSED_RGBA_BPTC_UNORM_EXT, 16, 4, 4},
663*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT, 16, 4, 4},
664*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT, 16, 4, 4},
665*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT, 16, 4, 4}},
666*8975f5c5SAndroid Build Coastguard Worker true, true},
667*8975f5c5SAndroid Build Coastguard Worker
668*8975f5c5SAndroid Build Coastguard Worker // ETC
669*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC1_RGB8_texture", {{GL_ETC1_RGB8_OES, 8, 4, 4}},
670*8975f5c5SAndroid Build Coastguard Worker false, false},
671*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_EAC_R11_unsigned_texture", {{GL_COMPRESSED_R11_EAC, 8, 4, 4}},
672*8975f5c5SAndroid Build Coastguard Worker true, false},
673*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_EAC_R11_signed_texture", {{GL_COMPRESSED_SIGNED_R11_EAC, 8, 4, 4}},
674*8975f5c5SAndroid Build Coastguard Worker true, false},
675*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_EAC_RG11_unsigned_texture", {{GL_COMPRESSED_RG11_EAC, 16, 4, 4}},
676*8975f5c5SAndroid Build Coastguard Worker true, false},
677*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_EAC_RG11_signed_texture", {{GL_COMPRESSED_SIGNED_RG11_EAC, 16, 4, 4}},
678*8975f5c5SAndroid Build Coastguard Worker true, false},
679*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC2_RGB8_texture", {{GL_COMPRESSED_RGB8_ETC2, 8, 4, 4}},
680*8975f5c5SAndroid Build Coastguard Worker true, false},
681*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC2_sRGB8_texture", {{GL_COMPRESSED_SRGB8_ETC2, 8, 4, 4}},
682*8975f5c5SAndroid Build Coastguard Worker true, false},
683*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC2_punchthroughA_RGBA8_texture", {{GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 8, 4, 4}},
684*8975f5c5SAndroid Build Coastguard Worker true, false},
685*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC2_punchthroughA_sRGB8_alpha_texture", {{GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 8, 4, 4}},
686*8975f5c5SAndroid Build Coastguard Worker true, false},
687*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC2_RGBA8_texture", {{GL_COMPRESSED_RGBA8_ETC2_EAC, 16, 4, 4}},
688*8975f5c5SAndroid Build Coastguard Worker true, false},
689*8975f5c5SAndroid Build Coastguard Worker {"GL_OES_compressed_ETC2_sRGB8_alpha8_texture", {{GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 16, 4, 4}},
690*8975f5c5SAndroid Build Coastguard Worker true, false},
691*8975f5c5SAndroid Build Coastguard Worker
692*8975f5c5SAndroid Build Coastguard Worker // ASTC
693*8975f5c5SAndroid Build Coastguard Worker {"GL_KHR_texture_compression_astc_ldr", {{GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 16, 4, 4},
694*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 16, 5, 4},
695*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 16, 5, 5},
696*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 16, 6, 5},
697*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 16, 6, 6},
698*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 16, 8, 5},
699*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 16, 8, 6},
700*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 16, 8, 8},
701*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 16, 10, 5},
702*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 16, 10, 6},
703*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 16, 10, 8},
704*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 16, 10, 10},
705*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 16, 12, 10},
706*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 16, 12, 12},
707*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 16, 4, 4},
708*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 16, 5, 4},
709*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 16, 5, 5},
710*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 16, 6, 5},
711*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 16, 6, 6},
712*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 16, 8, 5},
713*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 16, 8, 6},
714*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 16, 8, 8},
715*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 16, 10, 5},
716*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 16, 10, 6},
717*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 16, 10, 8},
718*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 16, 10, 10},
719*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 16, 12, 10},
720*8975f5c5SAndroid Build Coastguard Worker {GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 16, 12, 12}},
721*8975f5c5SAndroid Build Coastguard Worker true, true},
722*8975f5c5SAndroid Build Coastguard Worker };
723*8975f5c5SAndroid Build Coastguard Worker // clang-format on
724*8975f5c5SAndroid Build Coastguard Worker
725*8975f5c5SAndroid Build Coastguard Worker // Basic GetCompressedTexImage.
TEST_P(GetImageTest,CompressedTexImage)726*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImage)
727*8975f5c5SAndroid Build Coastguard Worker {
728*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
729*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
730*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC1_RGB8_texture"));
731*8975f5c5SAndroid Build Coastguard Worker
732*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kRes = 4;
733*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kImageSize = 8;
734*8975f5c5SAndroid Build Coastguard Worker
735*8975f5c5SAndroid Build Coastguard Worker // This arbitrary 'compressed' data just has to be read back exactly as specified below.
736*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<uint8_t, kImageSize> kExpectedData = {1, 2, 3, 4, 5, 6, 7, 8};
737*8975f5c5SAndroid Build Coastguard Worker
738*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
739*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
740*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, kRes, kRes, 0, kImageSize,
741*8975f5c5SAndroid Build Coastguard Worker kExpectedData.data());
742*8975f5c5SAndroid Build Coastguard Worker
743*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_2D))
744*8975f5c5SAndroid Build Coastguard Worker {
745*8975f5c5SAndroid Build Coastguard Worker INFO()
746*8975f5c5SAndroid Build Coastguard Worker << "Skipping emulated format GL_ETC1_RGB8_OES from GL_OES_compressed_ETC1_RGB8_texture";
747*8975f5c5SAndroid Build Coastguard Worker return;
748*8975f5c5SAndroid Build Coastguard Worker }
749*8975f5c5SAndroid Build Coastguard Worker
750*8975f5c5SAndroid Build Coastguard Worker std::array<uint8_t, kImageSize> actualData = {};
751*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, 0, actualData.data());
752*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
753*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedData, actualData);
754*8975f5c5SAndroid Build Coastguard Worker }
755*8975f5c5SAndroid Build Coastguard Worker
756*8975f5c5SAndroid Build Coastguard Worker // Test validation for the compressed extension function.
TEST_P(GetImageTest,CompressedTexImageNegativeAPI)757*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImageNegativeAPI)
758*8975f5c5SAndroid Build Coastguard Worker {
759*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
760*8975f5c5SAndroid Build Coastguard Worker
761*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
762*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC2_RGB8_texture"));
763*8975f5c5SAndroid Build Coastguard Worker
764*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kRes = 4;
765*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kImageSize = 8;
766*8975f5c5SAndroid Build Coastguard Worker
767*8975f5c5SAndroid Build Coastguard Worker // This arbitrary 'compressed' data just has to be read back exactly as specified below.
768*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<uint8_t, kImageSize> kExpectedData = {1, 2, 3, 4, 5, 6, 7, 8};
769*8975f5c5SAndroid Build Coastguard Worker
770*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
771*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
772*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, kRes, kRes, 0, kImageSize,
773*8975f5c5SAndroid Build Coastguard Worker kExpectedData.data());
774*8975f5c5SAndroid Build Coastguard Worker
775*8975f5c5SAndroid Build Coastguard Worker std::array<uint8_t, kImageSize> actualData = {};
776*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, 0, actualData.data());
777*8975f5c5SAndroid Build Coastguard Worker
778*8975f5c5SAndroid Build Coastguard Worker // Verify GetTexImage works with correct parameters or fails if format is emulated.
779*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_2D))
780*8975f5c5SAndroid Build Coastguard Worker {
781*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
782*8975f5c5SAndroid Build Coastguard Worker }
783*8975f5c5SAndroid Build Coastguard Worker else
784*8975f5c5SAndroid Build Coastguard Worker {
785*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
786*8975f5c5SAndroid Build Coastguard Worker }
787*8975f5c5SAndroid Build Coastguard Worker
788*8975f5c5SAndroid Build Coastguard Worker // Test invalid texture target.
789*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_CUBE_MAP, 0, actualData.data());
790*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
791*8975f5c5SAndroid Build Coastguard Worker
792*8975f5c5SAndroid Build Coastguard Worker // Test invalid texture level.
793*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, -1, actualData.data());
794*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
795*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, 2000, actualData.data());
796*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
797*8975f5c5SAndroid Build Coastguard Worker
798*8975f5c5SAndroid Build Coastguard Worker // Tests GetTexImage on a compressed texture.
799*8975f5c5SAndroid Build Coastguard Worker if (!IsFormatEmulated(GL_TEXTURE_2D))
800*8975f5c5SAndroid Build Coastguard Worker {
801*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, GL_UNSIGNED_BYTE,
802*8975f5c5SAndroid Build Coastguard Worker actualData.data());
803*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
804*8975f5c5SAndroid Build Coastguard Worker }
805*8975f5c5SAndroid Build Coastguard Worker }
806*8975f5c5SAndroid Build Coastguard Worker
807*8975f5c5SAndroid Build Coastguard Worker using TestFormatFunction =
808*8975f5c5SAndroid Build Coastguard Worker std::function<void(const CompressionExtension &, const CompressedFormat &)>;
809*8975f5c5SAndroid Build Coastguard Worker
TestAllCompressedFormats(TestFormatFunction fun)810*8975f5c5SAndroid Build Coastguard Worker void TestAllCompressedFormats(TestFormatFunction fun)
811*8975f5c5SAndroid Build Coastguard Worker {
812*8975f5c5SAndroid Build Coastguard Worker for (CompressionExtension ext : kCompressionExtensions)
813*8975f5c5SAndroid Build Coastguard Worker {
814*8975f5c5SAndroid Build Coastguard Worker if (!IsGLExtensionEnabled(ext.name))
815*8975f5c5SAndroid Build Coastguard Worker {
816*8975f5c5SAndroid Build Coastguard Worker continue;
817*8975f5c5SAndroid Build Coastguard Worker }
818*8975f5c5SAndroid Build Coastguard Worker
819*8975f5c5SAndroid Build Coastguard Worker for (CompressedFormat format : ext.formats)
820*8975f5c5SAndroid Build Coastguard Worker {
821*8975f5c5SAndroid Build Coastguard Worker fun(ext, format);
822*8975f5c5SAndroid Build Coastguard Worker }
823*8975f5c5SAndroid Build Coastguard Worker }
824*8975f5c5SAndroid Build Coastguard Worker }
825*8975f5c5SAndroid Build Coastguard Worker
826*8975f5c5SAndroid Build Coastguard Worker // Test GetCompressedTexImage with all formats and
827*8975f5c5SAndroid Build Coastguard Worker // and multiple resolution of the format's block size.
TEST_P(GetImageTest,CompressedTexImageAll)828*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImageAll)
829*8975f5c5SAndroid Build Coastguard Worker {
830*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
831*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
832*8975f5c5SAndroid Build Coastguard Worker
833*8975f5c5SAndroid Build Coastguard Worker auto func = [](const CompressionExtension &ext, const CompressedFormat &format) {
834*8975f5c5SAndroid Build Coastguard Worker // Test with multiples of block size
835*8975f5c5SAndroid Build Coastguard Worker constexpr std::array<GLsizei, 2> multipliers = {1, 2};
836*8975f5c5SAndroid Build Coastguard Worker for (GLsizei multiplier : multipliers)
837*8975f5c5SAndroid Build Coastguard Worker {
838*8975f5c5SAndroid Build Coastguard Worker const GLsizei kImageSize = format.size * multiplier * multiplier;
839*8975f5c5SAndroid Build Coastguard Worker
840*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> expectedData;
841*8975f5c5SAndroid Build Coastguard Worker for (uint8_t i = 1; i < kImageSize + 1; i++)
842*8975f5c5SAndroid Build Coastguard Worker {
843*8975f5c5SAndroid Build Coastguard Worker expectedData.push_back(i);
844*8975f5c5SAndroid Build Coastguard Worker }
845*8975f5c5SAndroid Build Coastguard Worker
846*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
847*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
848*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, format.id, format.w * multiplier,
849*8975f5c5SAndroid Build Coastguard Worker format.h * multiplier, 0, kImageSize, expectedData.data());
850*8975f5c5SAndroid Build Coastguard Worker
851*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_2D))
852*8975f5c5SAndroid Build Coastguard Worker {
853*8975f5c5SAndroid Build Coastguard Worker INFO() << "Skipping emulated format 0x" << std::hex << format.id << " from "
854*8975f5c5SAndroid Build Coastguard Worker << ext.name;
855*8975f5c5SAndroid Build Coastguard Worker return;
856*8975f5c5SAndroid Build Coastguard Worker }
857*8975f5c5SAndroid Build Coastguard Worker
858*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> actualData(kImageSize);
859*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, 0, actualData.data());
860*8975f5c5SAndroid Build Coastguard Worker
861*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
862*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
863*8975f5c5SAndroid Build Coastguard Worker }
864*8975f5c5SAndroid Build Coastguard Worker };
865*8975f5c5SAndroid Build Coastguard Worker TestAllCompressedFormats(func);
866*8975f5c5SAndroid Build Coastguard Worker }
867*8975f5c5SAndroid Build Coastguard Worker
868*8975f5c5SAndroid Build Coastguard Worker // Test a resolution that is not a multiple of the block size with an ETC2 4x4 format.
TEST_P(GetImageTest,CompressedTexImageNotBlockMultiple)869*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImageNotBlockMultiple)
870*8975f5c5SAndroid Build Coastguard Worker {
871*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
872*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
873*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_compressed_ETC2_RGB8_texture"));
874*8975f5c5SAndroid Build Coastguard Worker
875*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kRes = 21;
876*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kImageSize = 288;
877*8975f5c5SAndroid Build Coastguard Worker
878*8975f5c5SAndroid Build Coastguard Worker // This arbitrary 'compressed' data just has to be read back exactly as specified below.
879*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> expectedData;
880*8975f5c5SAndroid Build Coastguard Worker for (uint16_t j = 0; j < kImageSize; j++)
881*8975f5c5SAndroid Build Coastguard Worker {
882*8975f5c5SAndroid Build Coastguard Worker expectedData.push_back(j % std::numeric_limits<uint8_t>::max());
883*8975f5c5SAndroid Build Coastguard Worker }
884*8975f5c5SAndroid Build Coastguard Worker
885*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
886*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
887*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB8_ETC2, kRes, kRes, 0, kImageSize,
888*8975f5c5SAndroid Build Coastguard Worker expectedData.data());
889*8975f5c5SAndroid Build Coastguard Worker
890*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_2D))
891*8975f5c5SAndroid Build Coastguard Worker {
892*8975f5c5SAndroid Build Coastguard Worker INFO() << "Skipping emulated format GL_COMPRESSED_RGB8_ETC2 from "
893*8975f5c5SAndroid Build Coastguard Worker "GL_OES_compressed_ETC2_RGB8_texture";
894*8975f5c5SAndroid Build Coastguard Worker return;
895*8975f5c5SAndroid Build Coastguard Worker }
896*8975f5c5SAndroid Build Coastguard Worker
897*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> actualData(kImageSize);
898*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, 0, actualData.data());
899*8975f5c5SAndroid Build Coastguard Worker
900*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
901*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
902*8975f5c5SAndroid Build Coastguard Worker }
903*8975f5c5SAndroid Build Coastguard Worker
TestCompressedTexImage3D(GLenum target,uint32_t numLayers)904*8975f5c5SAndroid Build Coastguard Worker void TestCompressedTexImage3D(GLenum target, uint32_t numLayers)
905*8975f5c5SAndroid Build Coastguard Worker {
906*8975f5c5SAndroid Build Coastguard Worker auto func = [target, numLayers](const CompressionExtension &ext,
907*8975f5c5SAndroid Build Coastguard Worker const CompressedFormat &format) {
908*8975f5c5SAndroid Build Coastguard Worker // Skip extensions lacking 2D array and 3D support
909*8975f5c5SAndroid Build Coastguard Worker if ((target == GL_TEXTURE_2D_ARRAY && !ext.supports2DArray) ||
910*8975f5c5SAndroid Build Coastguard Worker (target == GL_TEXTURE_3D && !ext.supports3D))
911*8975f5c5SAndroid Build Coastguard Worker {
912*8975f5c5SAndroid Build Coastguard Worker return;
913*8975f5c5SAndroid Build Coastguard Worker }
914*8975f5c5SAndroid Build Coastguard Worker
915*8975f5c5SAndroid Build Coastguard Worker // GL_TEXTURE_3D with ASTC requires additional extension
916*8975f5c5SAndroid Build Coastguard Worker if (target == GL_TEXTURE_3D &&
917*8975f5c5SAndroid Build Coastguard Worker strcmp(ext.name, "GL_KHR_texture_compression_astc_ldr") == 0 &&
918*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_KHR_texture_compression_astc_sliced_3d") &&
919*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_KHR_texture_compression_astc_hdr"))
920*8975f5c5SAndroid Build Coastguard Worker {
921*8975f5c5SAndroid Build Coastguard Worker return;
922*8975f5c5SAndroid Build Coastguard Worker }
923*8975f5c5SAndroid Build Coastguard Worker
924*8975f5c5SAndroid Build Coastguard Worker const size_t size = format.size * numLayers;
925*8975f5c5SAndroid Build Coastguard Worker
926*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
927*8975f5c5SAndroid Build Coastguard Worker glBindTexture(target, texture);
928*8975f5c5SAndroid Build Coastguard Worker
929*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> expectedData;
930*8975f5c5SAndroid Build Coastguard Worker for (uint8_t i = 0; i < size; i++)
931*8975f5c5SAndroid Build Coastguard Worker {
932*8975f5c5SAndroid Build Coastguard Worker expectedData.push_back(i);
933*8975f5c5SAndroid Build Coastguard Worker }
934*8975f5c5SAndroid Build Coastguard Worker
935*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage3D(target, 0, format.id, format.w, format.h, numLayers, 0, size,
936*8975f5c5SAndroid Build Coastguard Worker expectedData.data());
937*8975f5c5SAndroid Build Coastguard Worker
938*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(target))
939*8975f5c5SAndroid Build Coastguard Worker {
940*8975f5c5SAndroid Build Coastguard Worker INFO() << "Skipping emulated format 0x" << std::hex << format.id << " from "
941*8975f5c5SAndroid Build Coastguard Worker << ext.name;
942*8975f5c5SAndroid Build Coastguard Worker return;
943*8975f5c5SAndroid Build Coastguard Worker }
944*8975f5c5SAndroid Build Coastguard Worker
945*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> actualData(size);
946*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(target, 0, actualData.data());
947*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
948*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
949*8975f5c5SAndroid Build Coastguard Worker };
950*8975f5c5SAndroid Build Coastguard Worker TestAllCompressedFormats(func);
951*8975f5c5SAndroid Build Coastguard Worker }
952*8975f5c5SAndroid Build Coastguard Worker
953*8975f5c5SAndroid Build Coastguard Worker // Tests GetCompressedTexImage with 2D array textures.
TEST_P(GetImageTestES3,CompressedTexImage2DArray)954*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestES3, CompressedTexImage2DArray)
955*8975f5c5SAndroid Build Coastguard Worker {
956*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
957*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
958*8975f5c5SAndroid Build Coastguard Worker TestCompressedTexImage3D(GL_TEXTURE_2D_ARRAY, 8);
959*8975f5c5SAndroid Build Coastguard Worker }
960*8975f5c5SAndroid Build Coastguard Worker
961*8975f5c5SAndroid Build Coastguard Worker // Tests GetCompressedTexImage with 3D textures.
TEST_P(GetImageTest,CompressedTexImage3D)962*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImage3D)
963*8975f5c5SAndroid Build Coastguard Worker {
964*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
965*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
966*8975f5c5SAndroid Build Coastguard Worker TestCompressedTexImage3D(GL_TEXTURE_3D, 8);
967*8975f5c5SAndroid Build Coastguard Worker }
968*8975f5c5SAndroid Build Coastguard Worker
969*8975f5c5SAndroid Build Coastguard Worker // Simple cube map test for GetCompressedTexImage
TEST_P(GetImageTest,CompressedTexImageCubeMap)970*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImageCubeMap)
971*8975f5c5SAndroid Build Coastguard Worker {
972*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
973*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
974*8975f5c5SAndroid Build Coastguard Worker
975*8975f5c5SAndroid Build Coastguard Worker auto func = [](const CompressionExtension &ext, const CompressedFormat &format) {
976*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
977*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
978*8975f5c5SAndroid Build Coastguard Worker
979*8975f5c5SAndroid Build Coastguard Worker std::vector<std::vector<uint8_t>> expectedData;
980*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < kCubeFaces.size(); i++)
981*8975f5c5SAndroid Build Coastguard Worker {
982*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> face;
983*8975f5c5SAndroid Build Coastguard Worker for (uint8_t j = 0; j < format.size; j++)
984*8975f5c5SAndroid Build Coastguard Worker {
985*8975f5c5SAndroid Build Coastguard Worker face.push_back(static_cast<uint8_t>((i * format.size + j) %
986*8975f5c5SAndroid Build Coastguard Worker std::numeric_limits<uint8_t>::max()));
987*8975f5c5SAndroid Build Coastguard Worker }
988*8975f5c5SAndroid Build Coastguard Worker expectedData.push_back(face);
989*8975f5c5SAndroid Build Coastguard Worker }
990*8975f5c5SAndroid Build Coastguard Worker
991*8975f5c5SAndroid Build Coastguard Worker for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
992*8975f5c5SAndroid Build Coastguard Worker {
993*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(kCubeFaces[faceIndex], 0, format.id, 4, 4, 0, format.size,
994*8975f5c5SAndroid Build Coastguard Worker expectedData[faceIndex].data());
995*8975f5c5SAndroid Build Coastguard Worker }
996*8975f5c5SAndroid Build Coastguard Worker
997*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_CUBE_MAP))
998*8975f5c5SAndroid Build Coastguard Worker {
999*8975f5c5SAndroid Build Coastguard Worker INFO() << "Skipping emulated format 0x" << std::hex << format.id << " from "
1000*8975f5c5SAndroid Build Coastguard Worker << ext.name;
1001*8975f5c5SAndroid Build Coastguard Worker return;
1002*8975f5c5SAndroid Build Coastguard Worker }
1003*8975f5c5SAndroid Build Coastguard Worker
1004*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
1005*8975f5c5SAndroid Build Coastguard Worker for (size_t faceIndex = 0; faceIndex < kCubeFaces.size(); ++faceIndex)
1006*8975f5c5SAndroid Build Coastguard Worker {
1007*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> actualData(format.size);
1008*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(kCubeFaces[faceIndex], 0, actualData.data());
1009*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1010*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[faceIndex], actualData);
1011*8975f5c5SAndroid Build Coastguard Worker }
1012*8975f5c5SAndroid Build Coastguard Worker };
1013*8975f5c5SAndroid Build Coastguard Worker TestAllCompressedFormats(func);
1014*8975f5c5SAndroid Build Coastguard Worker }
1015*8975f5c5SAndroid Build Coastguard Worker
1016*8975f5c5SAndroid Build Coastguard Worker // Tests GetCompressedTexImage with cube map array textures.
TEST_P(GetImageTestES32,CompressedTexImageCubeMapArray)1017*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestES32, CompressedTexImageCubeMapArray)
1018*8975f5c5SAndroid Build Coastguard Worker {
1019*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
1020*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
1021*8975f5c5SAndroid Build Coastguard Worker
1022*8975f5c5SAndroid Build Coastguard Worker auto func = [](const CompressionExtension &ext, const CompressedFormat &format) {
1023*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> expectedData;
1024*8975f5c5SAndroid Build Coastguard Worker for (uint32_t i = 0; i < format.size * kCubeFaces.size(); i++)
1025*8975f5c5SAndroid Build Coastguard Worker {
1026*8975f5c5SAndroid Build Coastguard Worker expectedData.push_back(static_cast<uint8_t>(i % std::numeric_limits<uint8_t>::max()));
1027*8975f5c5SAndroid Build Coastguard Worker }
1028*8975f5c5SAndroid Build Coastguard Worker
1029*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
1030*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, tex);
1031*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 0, format.id, 4, 4, kCubeFaces.size(), 0,
1032*8975f5c5SAndroid Build Coastguard Worker expectedData.size() * sizeof(uint8_t), expectedData.data());
1033*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1034*8975f5c5SAndroid Build Coastguard Worker
1035*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_CUBE_MAP_ARRAY))
1036*8975f5c5SAndroid Build Coastguard Worker {
1037*8975f5c5SAndroid Build Coastguard Worker INFO() << "Skipping emulated format 0x" << std::hex << format.id << " from "
1038*8975f5c5SAndroid Build Coastguard Worker << ext.name;
1039*8975f5c5SAndroid Build Coastguard Worker return;
1040*8975f5c5SAndroid Build Coastguard Worker }
1041*8975f5c5SAndroid Build Coastguard Worker
1042*8975f5c5SAndroid Build Coastguard Worker // Verify GetImage.
1043*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> actualData(format.size * kCubeFaces.size());
1044*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_CUBE_MAP_ARRAY, 0, actualData.data());
1045*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1046*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData, actualData);
1047*8975f5c5SAndroid Build Coastguard Worker };
1048*8975f5c5SAndroid Build Coastguard Worker TestAllCompressedFormats(func);
1049*8975f5c5SAndroid Build Coastguard Worker }
1050*8975f5c5SAndroid Build Coastguard Worker
1051*8975f5c5SAndroid Build Coastguard Worker // Tests GetCompressedTexImage with multiple mip levels.
TEST_P(GetImageTest,CompressedTexImageMultiLevel)1052*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTest, CompressedTexImageMultiLevel)
1053*8975f5c5SAndroid Build Coastguard Worker {
1054*8975f5c5SAndroid Build Coastguard Worker // Verify the extension is enabled.
1055*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(IsGLExtensionEnabled(kExtensionName));
1056*8975f5c5SAndroid Build Coastguard Worker
1057*8975f5c5SAndroid Build Coastguard Worker auto func = [](const CompressionExtension &ext, const CompressedFormat &format) {
1058*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t kNumMipLevels = 8;
1059*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
1060*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
1061*8975f5c5SAndroid Build Coastguard Worker
1062*8975f5c5SAndroid Build Coastguard Worker std::vector<std::vector<uint8_t>> expectedData;
1063*8975f5c5SAndroid Build Coastguard Worker for (uint32_t mipLevel = 0; mipLevel < kNumMipLevels; mipLevel++)
1064*8975f5c5SAndroid Build Coastguard Worker {
1065*8975f5c5SAndroid Build Coastguard Worker uint32_t multiplier = static_cast<uint32_t>(pow(2, (kNumMipLevels - mipLevel) - 1));
1066*8975f5c5SAndroid Build Coastguard Worker size_t levelSize = format.size * multiplier * multiplier;
1067*8975f5c5SAndroid Build Coastguard Worker
1068*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> levelData;
1069*8975f5c5SAndroid Build Coastguard Worker for (size_t j = 0; j < levelSize; j++)
1070*8975f5c5SAndroid Build Coastguard Worker {
1071*8975f5c5SAndroid Build Coastguard Worker levelData.push_back(static_cast<uint8_t>(j % std::numeric_limits<uint8_t>::max()));
1072*8975f5c5SAndroid Build Coastguard Worker }
1073*8975f5c5SAndroid Build Coastguard Worker expectedData.push_back(levelData);
1074*8975f5c5SAndroid Build Coastguard Worker
1075*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, mipLevel, format.id, format.w * multiplier,
1076*8975f5c5SAndroid Build Coastguard Worker format.h * multiplier, 0, levelSize, levelData.data());
1077*8975f5c5SAndroid Build Coastguard Worker }
1078*8975f5c5SAndroid Build Coastguard Worker
1079*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1080*8975f5c5SAndroid Build Coastguard Worker
1081*8975f5c5SAndroid Build Coastguard Worker if (IsFormatEmulated(GL_TEXTURE_2D))
1082*8975f5c5SAndroid Build Coastguard Worker {
1083*8975f5c5SAndroid Build Coastguard Worker INFO() << "Skipping emulated format 0x" << std::hex << format.id << " from "
1084*8975f5c5SAndroid Build Coastguard Worker << ext.name;
1085*8975f5c5SAndroid Build Coastguard Worker return;
1086*8975f5c5SAndroid Build Coastguard Worker }
1087*8975f5c5SAndroid Build Coastguard Worker
1088*8975f5c5SAndroid Build Coastguard Worker for (uint32_t mipLevel = 0; mipLevel < kNumMipLevels; mipLevel++)
1089*8975f5c5SAndroid Build Coastguard Worker {
1090*8975f5c5SAndroid Build Coastguard Worker uint32_t multiplier = static_cast<uint32_t>(pow(2, (kNumMipLevels - mipLevel) - 1));
1091*8975f5c5SAndroid Build Coastguard Worker size_t levelSize = format.size * multiplier * multiplier;
1092*8975f5c5SAndroid Build Coastguard Worker
1093*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> actualData(levelSize);
1094*8975f5c5SAndroid Build Coastguard Worker glGetCompressedTexImageANGLE(GL_TEXTURE_2D, mipLevel, actualData.data());
1095*8975f5c5SAndroid Build Coastguard Worker
1096*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1097*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedData[mipLevel], actualData);
1098*8975f5c5SAndroid Build Coastguard Worker }
1099*8975f5c5SAndroid Build Coastguard Worker };
1100*8975f5c5SAndroid Build Coastguard Worker TestAllCompressedFormats(func);
1101*8975f5c5SAndroid Build Coastguard Worker }
1102*8975f5c5SAndroid Build Coastguard Worker
1103*8975f5c5SAndroid Build Coastguard Worker struct PalettedFormat
1104*8975f5c5SAndroid Build Coastguard Worker {
1105*8975f5c5SAndroid Build Coastguard Worker GLenum internalFormat;
1106*8975f5c5SAndroid Build Coastguard Worker uint32_t indexBits;
1107*8975f5c5SAndroid Build Coastguard Worker uint32_t redBlueBits;
1108*8975f5c5SAndroid Build Coastguard Worker uint32_t greenBits;
1109*8975f5c5SAndroid Build Coastguard Worker uint32_t alphaBits;
1110*8975f5c5SAndroid Build Coastguard Worker };
1111*8975f5c5SAndroid Build Coastguard Worker
1112*8975f5c5SAndroid Build Coastguard Worker const PalettedFormat kPalettedFormats[] = {
1113*8975f5c5SAndroid Build Coastguard Worker {GL_PALETTE4_RGB8_OES, 4, 8, 8, 0}, {GL_PALETTE4_RGBA8_OES, 4, 8, 8, 8},
1114*8975f5c5SAndroid Build Coastguard Worker {GL_PALETTE4_R5_G6_B5_OES, 4, 5, 6, 0}, {GL_PALETTE4_RGBA4_OES, 4, 4, 4, 4},
1115*8975f5c5SAndroid Build Coastguard Worker {GL_PALETTE4_RGB5_A1_OES, 4, 5, 5, 1}, {GL_PALETTE8_RGB8_OES, 8, 8, 8, 0},
1116*8975f5c5SAndroid Build Coastguard Worker {GL_PALETTE8_RGBA8_OES, 8, 8, 8, 8}, {GL_PALETTE8_R5_G6_B5_OES, 8, 5, 6, 0},
1117*8975f5c5SAndroid Build Coastguard Worker {GL_PALETTE8_RGBA4_OES, 8, 4, 4, 4}, {GL_PALETTE8_RGB5_A1_OES, 8, 5, 5, 1},
1118*8975f5c5SAndroid Build Coastguard Worker };
1119*8975f5c5SAndroid Build Coastguard Worker
1120*8975f5c5SAndroid Build Coastguard Worker // Tests that glGetTexImageANGLE captures paletted format images in
1121*8975f5c5SAndroid Build Coastguard Worker // R8G8B8A8_UNORM and StoreRGBA8ToPalettedImpl compresses such images to the
1122*8975f5c5SAndroid Build Coastguard Worker // same paletted image.
TEST_P(GetImageTestES1,PalettedTexImage)1123*8975f5c5SAndroid Build Coastguard Worker TEST_P(GetImageTestES1, PalettedTexImage)
1124*8975f5c5SAndroid Build Coastguard Worker {
1125*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsVulkan());
1126*8975f5c5SAndroid Build Coastguard Worker
1127*8975f5c5SAndroid Build Coastguard Worker glEnableClientState(GL_VERTEX_ARRAY);
1128*8975f5c5SAndroid Build Coastguard Worker glEnableClientState(GL_TEXTURE_COORD_ARRAY);
1129*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_TEXTURE_2D);
1130*8975f5c5SAndroid Build Coastguard Worker
1131*8975f5c5SAndroid Build Coastguard Worker glMatrixMode(GL_PROJECTION);
1132*8975f5c5SAndroid Build Coastguard Worker glLoadIdentity();
1133*8975f5c5SAndroid Build Coastguard Worker
1134*8975f5c5SAndroid Build Coastguard Worker glMatrixMode(GL_MODELVIEW);
1135*8975f5c5SAndroid Build Coastguard Worker glLoadIdentity();
1136*8975f5c5SAndroid Build Coastguard Worker
1137*8975f5c5SAndroid Build Coastguard Worker struct Vertex
1138*8975f5c5SAndroid Build Coastguard Worker {
1139*8975f5c5SAndroid Build Coastguard Worker GLfloat position[3];
1140*8975f5c5SAndroid Build Coastguard Worker GLfloat uv[2];
1141*8975f5c5SAndroid Build Coastguard Worker };
1142*8975f5c5SAndroid Build Coastguard Worker
1143*8975f5c5SAndroid Build Coastguard Worker std::vector<Vertex> vertices = {
1144*8975f5c5SAndroid Build Coastguard Worker {{-1.0f, -1.0f, 0.0f}, {0.0f, 0.0f}},
1145*8975f5c5SAndroid Build Coastguard Worker {{-1.0f, 1.0f, 0.0f}, {0.0f, 1.0f}},
1146*8975f5c5SAndroid Build Coastguard Worker {{1.0f, -1.0f, 0.0f}, {1.0f, 0.0f}},
1147*8975f5c5SAndroid Build Coastguard Worker {{1.0f, 1.0f, 0.0f}, {1.0f, 1.0f}},
1148*8975f5c5SAndroid Build Coastguard Worker };
1149*8975f5c5SAndroid Build Coastguard Worker glVertexPointer(3, GL_FLOAT, sizeof vertices[0], &vertices[0].position);
1150*8975f5c5SAndroid Build Coastguard Worker glTexCoordPointer(2, GL_FLOAT, sizeof vertices[0], &vertices[0].uv);
1151*8975f5c5SAndroid Build Coastguard Worker
1152*8975f5c5SAndroid Build Coastguard Worker GLTexture tex;
1153*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, tex);
1154*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1155*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1156*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1157*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1158*8975f5c5SAndroid Build Coastguard Worker
1159*8975f5c5SAndroid Build Coastguard Worker // Locations in the framebuffer where we will take the samples to compare
1160*8975f5c5SAndroid Build Coastguard Worker
1161*8975f5c5SAndroid Build Coastguard Worker const int width = 16;
1162*8975f5c5SAndroid Build Coastguard Worker const int height = width;
1163*8975f5c5SAndroid Build Coastguard Worker
1164*8975f5c5SAndroid Build Coastguard Worker for (PalettedFormat format : kPalettedFormats)
1165*8975f5c5SAndroid Build Coastguard Worker {
1166*8975f5c5SAndroid Build Coastguard Worker size_t paletteSizeInBytes =
1167*8975f5c5SAndroid Build Coastguard Worker (1 << format.indexBits) *
1168*8975f5c5SAndroid Build Coastguard Worker ((format.redBlueBits + format.greenBits + format.redBlueBits + format.alphaBits) / 8);
1169*8975f5c5SAndroid Build Coastguard Worker size_t imageSize = paletteSizeInBytes + width * height * format.indexBits / 8;
1170*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> testImage(imageSize);
1171*8975f5c5SAndroid Build Coastguard Worker FillVectorWithRandomUBytes(&testImage);
1172*8975f5c5SAndroid Build Coastguard Worker
1173*8975f5c5SAndroid Build Coastguard Worker // Upload a random paletted image
1174*8975f5c5SAndroid Build Coastguard Worker
1175*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, format.internalFormat, width, height, 0,
1176*8975f5c5SAndroid Build Coastguard Worker testImage.size(), testImage.data());
1177*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1178*8975f5c5SAndroid Build Coastguard Worker
1179*8975f5c5SAndroid Build Coastguard Worker // Render a quad using this texture and capture the entire framebuffer contents
1180*8975f5c5SAndroid Build Coastguard Worker
1181*8975f5c5SAndroid Build Coastguard Worker glDrawArrays(GL_TRIANGLE_STRIP, 0, vertices.size());
1182*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1183*8975f5c5SAndroid Build Coastguard Worker
1184*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> framebuffer(width * height);
1185*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer.data());
1186*8975f5c5SAndroid Build Coastguard Worker
1187*8975f5c5SAndroid Build Coastguard Worker // Read it back as R8G8B8A8 UNORM
1188*8975f5c5SAndroid Build Coastguard Worker
1189*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> readback(width * height * 4);
1190*8975f5c5SAndroid Build Coastguard Worker glGetTexImageANGLE(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, readback.data());
1191*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1192*8975f5c5SAndroid Build Coastguard Worker
1193*8975f5c5SAndroid Build Coastguard Worker // Recompress. This should produce the same, up to permutation of used
1194*8975f5c5SAndroid Build Coastguard Worker // palette entries, image, as the one we uploaded. Upload it again.
1195*8975f5c5SAndroid Build Coastguard Worker
1196*8975f5c5SAndroid Build Coastguard Worker std::vector<uint8_t> recompressedImage(imageSize);
1197*8975f5c5SAndroid Build Coastguard Worker angle::StoreRGBA8ToPalettedImpl(width, height, 1, format.indexBits, format.redBlueBits,
1198*8975f5c5SAndroid Build Coastguard Worker format.greenBits, format.alphaBits, readback.data(),
1199*8975f5c5SAndroid Build Coastguard Worker width * 4, width * height * 4, recompressedImage.data(),
1200*8975f5c5SAndroid Build Coastguard Worker width * format.indexBits / 8,
1201*8975f5c5SAndroid Build Coastguard Worker width * height * format.indexBits / 8);
1202*8975f5c5SAndroid Build Coastguard Worker
1203*8975f5c5SAndroid Build Coastguard Worker glCompressedTexImage2D(GL_TEXTURE_2D, 0, format.internalFormat, width, height, 0,
1204*8975f5c5SAndroid Build Coastguard Worker recompressedImage.size(), recompressedImage.data());
1205*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1206*8975f5c5SAndroid Build Coastguard Worker
1207*8975f5c5SAndroid Build Coastguard Worker // Read the framebuffer again
1208*8975f5c5SAndroid Build Coastguard Worker
1209*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> framebuffer2(width * height);
1210*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, framebuffer2.data());
1211*8975f5c5SAndroid Build Coastguard Worker
1212*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(framebuffer, framebuffer2);
1213*8975f5c5SAndroid Build Coastguard Worker }
1214*8975f5c5SAndroid Build Coastguard Worker }
1215*8975f5c5SAndroid Build Coastguard Worker
1216*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTest);
1217*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GetImageTest,
1218*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN(),
1219*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN(),
1220*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN_SWIFTSHADER(),
1221*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER());
1222*8975f5c5SAndroid Build Coastguard Worker
1223*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES1(GetImageTestES1);
1224*8975f5c5SAndroid Build Coastguard Worker
1225*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTestES3);
1226*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GetImageTestES3, ES3_VULKAN(), ES3_VULKAN_SWIFTSHADER());
1227*8975f5c5SAndroid Build Coastguard Worker
1228*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTestES31);
1229*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GetImageTestES31, ES31_VULKAN(), ES31_VULKAN_SWIFTSHADER());
1230*8975f5c5SAndroid Build Coastguard Worker
1231*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTestES32);
1232*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GetImageTestES32, ES32_VULKAN(), ES32_VULKAN_SWIFTSHADER());
1233*8975f5c5SAndroid Build Coastguard Worker
1234*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(GetImageTestNoExtensions);
1235*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(GetImageTestNoExtensions,
1236*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN(),
1237*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN(),
1238*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN_SWIFTSHADER(),
1239*8975f5c5SAndroid Build Coastguard Worker ES3_VULKAN_SWIFTSHADER());
1240*8975f5c5SAndroid Build Coastguard Worker
1241*8975f5c5SAndroid Build Coastguard Worker } // namespace