1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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
7*8975f5c5SAndroid Build Coastguard Worker // CopyTextureTest.cpp: Tests of the GL_CHROMIUM_copy_texture extension
8*8975f5c5SAndroid Build Coastguard Worker
9*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/ANGLETest.h"
10*8975f5c5SAndroid Build Coastguard Worker
11*8975f5c5SAndroid Build Coastguard Worker #include "test_utils/gl_raii.h"
12*8975f5c5SAndroid Build Coastguard Worker
13*8975f5c5SAndroid Build Coastguard Worker namespace angle
14*8975f5c5SAndroid Build Coastguard Worker {
15*8975f5c5SAndroid Build Coastguard Worker
16*8975f5c5SAndroid Build Coastguard Worker class CopyTextureTest : public ANGLETest<>
17*8975f5c5SAndroid Build Coastguard Worker {
18*8975f5c5SAndroid Build Coastguard Worker protected:
CopyTextureTest()19*8975f5c5SAndroid Build Coastguard Worker CopyTextureTest()
20*8975f5c5SAndroid Build Coastguard Worker {
21*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(256);
22*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(256);
23*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
24*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
25*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
26*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
27*8975f5c5SAndroid Build Coastguard Worker }
28*8975f5c5SAndroid Build Coastguard Worker
testSetUp()29*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
30*8975f5c5SAndroid Build Coastguard Worker {
31*8975f5c5SAndroid Build Coastguard Worker glGenTextures(2, mTextures);
32*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
33*8975f5c5SAndroid Build Coastguard Worker
34*8975f5c5SAndroid Build Coastguard Worker glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
35*8975f5c5SAndroid Build Coastguard Worker glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
36*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
37*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
38*8975f5c5SAndroid Build Coastguard Worker
39*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mFramebuffer);
40*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
41*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
42*8975f5c5SAndroid Build Coastguard Worker 0);
43*8975f5c5SAndroid Build Coastguard Worker }
44*8975f5c5SAndroid Build Coastguard Worker
testTearDown()45*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
46*8975f5c5SAndroid Build Coastguard Worker {
47*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(2, mTextures);
48*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mFramebuffer);
49*8975f5c5SAndroid Build Coastguard Worker }
50*8975f5c5SAndroid Build Coastguard Worker
checkExtensions() const51*8975f5c5SAndroid Build Coastguard Worker bool checkExtensions() const
52*8975f5c5SAndroid Build Coastguard Worker {
53*8975f5c5SAndroid Build Coastguard Worker if (!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"))
54*8975f5c5SAndroid Build Coastguard Worker {
55*8975f5c5SAndroid Build Coastguard Worker std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available."
56*8975f5c5SAndroid Build Coastguard Worker << std::endl;
57*8975f5c5SAndroid Build Coastguard Worker return false;
58*8975f5c5SAndroid Build Coastguard Worker }
59*8975f5c5SAndroid Build Coastguard Worker
60*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(nullptr, glCopyTextureCHROMIUM);
61*8975f5c5SAndroid Build Coastguard Worker EXPECT_NE(nullptr, glCopySubTextureCHROMIUM);
62*8975f5c5SAndroid Build Coastguard Worker return true;
63*8975f5c5SAndroid Build Coastguard Worker }
64*8975f5c5SAndroid Build Coastguard Worker
testGradientDownsampleUniqueValues(GLenum destFormat,GLenum destType,const std::array<size_t,4> & expectedUniqueValues)65*8975f5c5SAndroid Build Coastguard Worker void testGradientDownsampleUniqueValues(GLenum destFormat,
66*8975f5c5SAndroid Build Coastguard Worker GLenum destType,
67*8975f5c5SAndroid Build Coastguard Worker const std::array<size_t, 4> &expectedUniqueValues)
68*8975f5c5SAndroid Build Coastguard Worker {
69*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 256> sourceGradient;
70*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < sourceGradient.size(); i++)
71*8975f5c5SAndroid Build Coastguard Worker {
72*8975f5c5SAndroid Build Coastguard Worker GLubyte value = static_cast<GLubyte>(i);
73*8975f5c5SAndroid Build Coastguard Worker sourceGradient[i] = GLColor(value, value, value, value);
74*8975f5c5SAndroid Build Coastguard Worker }
75*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
76*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
77*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
78*8975f5c5SAndroid Build Coastguard Worker sourceGradient.data());
79*8975f5c5SAndroid Build Coastguard Worker
80*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
81*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
82*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destFormat, destType,
83*8975f5c5SAndroid Build Coastguard Worker GL_FALSE, GL_FALSE, GL_FALSE);
84*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
85*8975f5c5SAndroid Build Coastguard Worker
86*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
87*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
88*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);
89*8975f5c5SAndroid Build Coastguard Worker
90*8975f5c5SAndroid Build Coastguard Worker std::array<GLColor, 256> destData;
91*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, destData.data());
92*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
93*8975f5c5SAndroid Build Coastguard Worker
94*8975f5c5SAndroid Build Coastguard Worker std::set<GLubyte> uniqueValues[4];
95*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < destData.size(); i++)
96*8975f5c5SAndroid Build Coastguard Worker {
97*8975f5c5SAndroid Build Coastguard Worker GLColor color = destData[i];
98*8975f5c5SAndroid Build Coastguard Worker uniqueValues[0].insert(color.R);
99*8975f5c5SAndroid Build Coastguard Worker uniqueValues[1].insert(color.G);
100*8975f5c5SAndroid Build Coastguard Worker uniqueValues[2].insert(color.B);
101*8975f5c5SAndroid Build Coastguard Worker uniqueValues[3].insert(color.A);
102*8975f5c5SAndroid Build Coastguard Worker }
103*8975f5c5SAndroid Build Coastguard Worker
104*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedUniqueValues[0], uniqueValues[0].size());
105*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedUniqueValues[1], uniqueValues[1].size());
106*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedUniqueValues[2], uniqueValues[2].size());
107*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(expectedUniqueValues[3], uniqueValues[3].size());
108*8975f5c5SAndroid Build Coastguard Worker }
109*8975f5c5SAndroid Build Coastguard Worker
testSrgbToRgb(GLenum internalformat,GLenum format)110*8975f5c5SAndroid Build Coastguard Worker void testSrgbToRgb(GLenum internalformat, GLenum format)
111*8975f5c5SAndroid Build Coastguard Worker {
112*8975f5c5SAndroid Build Coastguard Worker const size_t kTestCount = 4;
113*8975f5c5SAndroid Build Coastguard Worker const GLColor kSourceColor[kTestCount] = {
114*8975f5c5SAndroid Build Coastguard Worker GLColor(89, 67, 45, 123),
115*8975f5c5SAndroid Build Coastguard Worker GLColor(87, 69, 45, 123),
116*8975f5c5SAndroid Build Coastguard Worker GLColor(180, 143, 93, 123),
117*8975f5c5SAndroid Build Coastguard Worker GLColor(89, 67, 45, 123),
118*8975f5c5SAndroid Build Coastguard Worker };
119*8975f5c5SAndroid Build Coastguard Worker const GLColor kExpectedColor[kTestCount] = {
120*8975f5c5SAndroid Build Coastguard Worker GLColor(89, 67, 45, 123),
121*8975f5c5SAndroid Build Coastguard Worker GLColor(180, 143, 93, 123),
122*8975f5c5SAndroid Build Coastguard Worker GLColor(87, 69, 45, 123),
123*8975f5c5SAndroid Build Coastguard Worker GLColor(89, 67, 45, 123),
124*8975f5c5SAndroid Build Coastguard Worker };
125*8975f5c5SAndroid Build Coastguard Worker bool kPremultiply[kTestCount] = {false, false, true, true};
126*8975f5c5SAndroid Build Coastguard Worker bool kUnmultiply[kTestCount] = {false, true, false, true};
127*8975f5c5SAndroid Build Coastguard Worker
128*8975f5c5SAndroid Build Coastguard Worker for (size_t test = 0; test < kTestCount; ++test)
129*8975f5c5SAndroid Build Coastguard Worker {
130*8975f5c5SAndroid Build Coastguard Worker // Create image as sRGB.
131*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
132*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
133*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, internalformat, 1, 1, 0, format, GL_UNSIGNED_BYTE,
134*8975f5c5SAndroid Build Coastguard Worker &kSourceColor[test]);
135*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
136*8975f5c5SAndroid Build Coastguard Worker
137*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
138*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
139*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
140*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
141*8975f5c5SAndroid Build Coastguard Worker
142*8975f5c5SAndroid Build Coastguard Worker // Note: flipY is used to avoid direct transfer between textures and force a draw-based
143*8975f5c5SAndroid Build Coastguard Worker // path.
144*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, // level,
145*8975f5c5SAndroid Build Coastguard Worker 0, 0, // src x,y
146*8975f5c5SAndroid Build Coastguard Worker 0, 0, // dst x,y
147*8975f5c5SAndroid Build Coastguard Worker 1, 1, // width, height
148*8975f5c5SAndroid Build Coastguard Worker true, // flip-y
149*8975f5c5SAndroid Build Coastguard Worker kPremultiply[test], // premul
150*8975f5c5SAndroid Build Coastguard Worker kUnmultiply[test]); // unmul
151*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
152*8975f5c5SAndroid Build Coastguard Worker
153*8975f5c5SAndroid Build Coastguard Worker // Verify the copy.
154*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(),
155*8975f5c5SAndroid Build Coastguard Worker essl1_shaders::fs::Texture2D());
156*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
157*8975f5c5SAndroid Build Coastguard Worker
158*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
159*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
160*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
161*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
162*8975f5c5SAndroid Build Coastguard Worker
163*8975f5c5SAndroid Build Coastguard Worker GLint textureLocation =
164*8975f5c5SAndroid Build Coastguard Worker glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
165*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, textureLocation);
166*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLocation, 0);
167*8975f5c5SAndroid Build Coastguard Worker
168*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
169*8975f5c5SAndroid Build Coastguard Worker
170*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
171*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
172*8975f5c5SAndroid Build Coastguard Worker
173*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, kExpectedColor[test], 2);
174*8975f5c5SAndroid Build Coastguard Worker }
175*8975f5c5SAndroid Build Coastguard Worker }
176*8975f5c5SAndroid Build Coastguard Worker
177*8975f5c5SAndroid Build Coastguard Worker GLuint mTextures[2] = {
178*8975f5c5SAndroid Build Coastguard Worker 0,
179*8975f5c5SAndroid Build Coastguard Worker 0,
180*8975f5c5SAndroid Build Coastguard Worker };
181*8975f5c5SAndroid Build Coastguard Worker GLuint mFramebuffer = 0;
182*8975f5c5SAndroid Build Coastguard Worker };
183*8975f5c5SAndroid Build Coastguard Worker
184*8975f5c5SAndroid Build Coastguard Worker using CopyTextureVariationsTestParams =
185*8975f5c5SAndroid Build Coastguard Worker std::tuple<angle::PlatformParameters, GLenum, GLenum, bool, bool, bool, GLint>;
186*8975f5c5SAndroid Build Coastguard Worker
CopyTextureVariationsTestPrint(const::testing::TestParamInfo<CopyTextureVariationsTestParams> & paramsInfo)187*8975f5c5SAndroid Build Coastguard Worker std::string CopyTextureVariationsTestPrint(
188*8975f5c5SAndroid Build Coastguard Worker const ::testing::TestParamInfo<CopyTextureVariationsTestParams> ¶msInfo)
189*8975f5c5SAndroid Build Coastguard Worker {
190*8975f5c5SAndroid Build Coastguard Worker const CopyTextureVariationsTestParams ¶ms = paramsInfo.param;
191*8975f5c5SAndroid Build Coastguard Worker std::ostringstream out;
192*8975f5c5SAndroid Build Coastguard Worker
193*8975f5c5SAndroid Build Coastguard Worker out << std::get<0>(params) << "__";
194*8975f5c5SAndroid Build Coastguard Worker
195*8975f5c5SAndroid Build Coastguard Worker switch (std::get<1>(params))
196*8975f5c5SAndroid Build Coastguard Worker {
197*8975f5c5SAndroid Build Coastguard Worker case GL_ALPHA:
198*8975f5c5SAndroid Build Coastguard Worker out << "A";
199*8975f5c5SAndroid Build Coastguard Worker break;
200*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
201*8975f5c5SAndroid Build Coastguard Worker out << "RGB";
202*8975f5c5SAndroid Build Coastguard Worker break;
203*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
204*8975f5c5SAndroid Build Coastguard Worker out << "RGBA";
205*8975f5c5SAndroid Build Coastguard Worker break;
206*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE:
207*8975f5c5SAndroid Build Coastguard Worker out << "L";
208*8975f5c5SAndroid Build Coastguard Worker break;
209*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA:
210*8975f5c5SAndroid Build Coastguard Worker out << "LA";
211*8975f5c5SAndroid Build Coastguard Worker break;
212*8975f5c5SAndroid Build Coastguard Worker case GL_BGRA_EXT:
213*8975f5c5SAndroid Build Coastguard Worker out << "BGRA";
214*8975f5c5SAndroid Build Coastguard Worker break;
215*8975f5c5SAndroid Build Coastguard Worker case GL_SRGB_ALPHA_EXT:
216*8975f5c5SAndroid Build Coastguard Worker out << "SRGBA";
217*8975f5c5SAndroid Build Coastguard Worker break;
218*8975f5c5SAndroid Build Coastguard Worker default:
219*8975f5c5SAndroid Build Coastguard Worker out << "UPDATE_THIS_SWITCH";
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker
222*8975f5c5SAndroid Build Coastguard Worker out << "To";
223*8975f5c5SAndroid Build Coastguard Worker
224*8975f5c5SAndroid Build Coastguard Worker switch (std::get<2>(params))
225*8975f5c5SAndroid Build Coastguard Worker {
226*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
227*8975f5c5SAndroid Build Coastguard Worker out << "RGB";
228*8975f5c5SAndroid Build Coastguard Worker break;
229*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
230*8975f5c5SAndroid Build Coastguard Worker out << "RGBA";
231*8975f5c5SAndroid Build Coastguard Worker break;
232*8975f5c5SAndroid Build Coastguard Worker case GL_BGRA_EXT:
233*8975f5c5SAndroid Build Coastguard Worker out << "BGRA";
234*8975f5c5SAndroid Build Coastguard Worker break;
235*8975f5c5SAndroid Build Coastguard Worker case GL_SRGB_ALPHA_EXT:
236*8975f5c5SAndroid Build Coastguard Worker out << "SRGBA";
237*8975f5c5SAndroid Build Coastguard Worker break;
238*8975f5c5SAndroid Build Coastguard Worker default:
239*8975f5c5SAndroid Build Coastguard Worker out << "UPDATE_THIS_SWITCH";
240*8975f5c5SAndroid Build Coastguard Worker }
241*8975f5c5SAndroid Build Coastguard Worker
242*8975f5c5SAndroid Build Coastguard Worker if (std::get<3>(params))
243*8975f5c5SAndroid Build Coastguard Worker {
244*8975f5c5SAndroid Build Coastguard Worker out << "FlipY";
245*8975f5c5SAndroid Build Coastguard Worker }
246*8975f5c5SAndroid Build Coastguard Worker if (std::get<4>(params))
247*8975f5c5SAndroid Build Coastguard Worker {
248*8975f5c5SAndroid Build Coastguard Worker out << "PremultiplyAlpha";
249*8975f5c5SAndroid Build Coastguard Worker }
250*8975f5c5SAndroid Build Coastguard Worker if (std::get<5>(params))
251*8975f5c5SAndroid Build Coastguard Worker {
252*8975f5c5SAndroid Build Coastguard Worker out << "UnmultiplyAlpha";
253*8975f5c5SAndroid Build Coastguard Worker }
254*8975f5c5SAndroid Build Coastguard Worker if (std::get<6>(params))
255*8975f5c5SAndroid Build Coastguard Worker {
256*8975f5c5SAndroid Build Coastguard Worker out << "MesaYFlip";
257*8975f5c5SAndroid Build Coastguard Worker }
258*8975f5c5SAndroid Build Coastguard Worker
259*8975f5c5SAndroid Build Coastguard Worker return out.str();
260*8975f5c5SAndroid Build Coastguard Worker }
261*8975f5c5SAndroid Build Coastguard Worker
262*8975f5c5SAndroid Build Coastguard Worker class CopyTextureVariationsTest : public ANGLETest<CopyTextureVariationsTestParams>
263*8975f5c5SAndroid Build Coastguard Worker {
264*8975f5c5SAndroid Build Coastguard Worker protected:
CopyTextureVariationsTest()265*8975f5c5SAndroid Build Coastguard Worker CopyTextureVariationsTest()
266*8975f5c5SAndroid Build Coastguard Worker {
267*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(256);
268*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(256);
269*8975f5c5SAndroid Build Coastguard Worker setConfigRedBits(8);
270*8975f5c5SAndroid Build Coastguard Worker setConfigGreenBits(8);
271*8975f5c5SAndroid Build Coastguard Worker setConfigBlueBits(8);
272*8975f5c5SAndroid Build Coastguard Worker setConfigAlphaBits(8);
273*8975f5c5SAndroid Build Coastguard Worker }
274*8975f5c5SAndroid Build Coastguard Worker
testSetUp()275*8975f5c5SAndroid Build Coastguard Worker void testSetUp() override
276*8975f5c5SAndroid Build Coastguard Worker {
277*8975f5c5SAndroid Build Coastguard Worker glGenTextures(2, mTextures);
278*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
279*8975f5c5SAndroid Build Coastguard Worker
280*8975f5c5SAndroid Build Coastguard Worker glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
281*8975f5c5SAndroid Build Coastguard Worker glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
282*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
283*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
284*8975f5c5SAndroid Build Coastguard Worker
285*8975f5c5SAndroid Build Coastguard Worker glGenFramebuffers(1, &mFramebuffer);
286*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
287*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
288*8975f5c5SAndroid Build Coastguard Worker 0);
289*8975f5c5SAndroid Build Coastguard Worker }
290*8975f5c5SAndroid Build Coastguard Worker
testTearDown()291*8975f5c5SAndroid Build Coastguard Worker void testTearDown() override
292*8975f5c5SAndroid Build Coastguard Worker {
293*8975f5c5SAndroid Build Coastguard Worker glDeleteTextures(2, mTextures);
294*8975f5c5SAndroid Build Coastguard Worker glDeleteFramebuffers(1, &mFramebuffer);
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker
checkExtensions(GLenum sourceFormat,GLenum destFormat) const297*8975f5c5SAndroid Build Coastguard Worker bool checkExtensions(GLenum sourceFormat, GLenum destFormat) const
298*8975f5c5SAndroid Build Coastguard Worker {
299*8975f5c5SAndroid Build Coastguard Worker if (!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"))
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available."
302*8975f5c5SAndroid Build Coastguard Worker << std::endl;
303*8975f5c5SAndroid Build Coastguard Worker return false;
304*8975f5c5SAndroid Build Coastguard Worker }
305*8975f5c5SAndroid Build Coastguard Worker
306*8975f5c5SAndroid Build Coastguard Worker if ((sourceFormat == GL_BGRA_EXT || destFormat == GL_BGRA_EXT) &&
307*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
308*8975f5c5SAndroid Build Coastguard Worker {
309*8975f5c5SAndroid Build Coastguard Worker return false;
310*8975f5c5SAndroid Build Coastguard Worker }
311*8975f5c5SAndroid Build Coastguard Worker
312*8975f5c5SAndroid Build Coastguard Worker if ((sourceFormat == GL_SRGB_ALPHA_EXT || destFormat == GL_SRGB_ALPHA_EXT) &&
313*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_EXT_sRGB"))
314*8975f5c5SAndroid Build Coastguard Worker {
315*8975f5c5SAndroid Build Coastguard Worker return false;
316*8975f5c5SAndroid Build Coastguard Worker }
317*8975f5c5SAndroid Build Coastguard Worker
318*8975f5c5SAndroid Build Coastguard Worker return true;
319*8975f5c5SAndroid Build Coastguard Worker }
320*8975f5c5SAndroid Build Coastguard Worker
calculateCopyTextureResults(GLenum sourceFormat,GLenum destFormat,bool premultiplyAlpha,bool unmultiplyAlpha,const uint8_t * sourceColor,GLColor * destColor)321*8975f5c5SAndroid Build Coastguard Worker void calculateCopyTextureResults(GLenum sourceFormat,
322*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat,
323*8975f5c5SAndroid Build Coastguard Worker bool premultiplyAlpha,
324*8975f5c5SAndroid Build Coastguard Worker bool unmultiplyAlpha,
325*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceColor,
326*8975f5c5SAndroid Build Coastguard Worker GLColor *destColor)
327*8975f5c5SAndroid Build Coastguard Worker {
328*8975f5c5SAndroid Build Coastguard Worker GLColor color;
329*8975f5c5SAndroid Build Coastguard Worker
330*8975f5c5SAndroid Build Coastguard Worker switch (sourceFormat)
331*8975f5c5SAndroid Build Coastguard Worker {
332*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
333*8975f5c5SAndroid Build Coastguard Worker color = GLColor(sourceColor[0], sourceColor[1], sourceColor[2], 255);
334*8975f5c5SAndroid Build Coastguard Worker break;
335*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
336*8975f5c5SAndroid Build Coastguard Worker color = GLColor(sourceColor[0], sourceColor[1], sourceColor[2], sourceColor[3]);
337*8975f5c5SAndroid Build Coastguard Worker break;
338*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE:
339*8975f5c5SAndroid Build Coastguard Worker color = GLColor(sourceColor[0], sourceColor[0], sourceColor[0], 255);
340*8975f5c5SAndroid Build Coastguard Worker break;
341*8975f5c5SAndroid Build Coastguard Worker case GL_ALPHA:
342*8975f5c5SAndroid Build Coastguard Worker color = GLColor(0, 0, 0, sourceColor[0]);
343*8975f5c5SAndroid Build Coastguard Worker break;
344*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA:
345*8975f5c5SAndroid Build Coastguard Worker color = GLColor(sourceColor[0], sourceColor[0], sourceColor[0], sourceColor[1]);
346*8975f5c5SAndroid Build Coastguard Worker break;
347*8975f5c5SAndroid Build Coastguard Worker case GL_BGRA_EXT:
348*8975f5c5SAndroid Build Coastguard Worker color = GLColor(sourceColor[2], sourceColor[1], sourceColor[0], sourceColor[3]);
349*8975f5c5SAndroid Build Coastguard Worker break;
350*8975f5c5SAndroid Build Coastguard Worker default:
351*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(true, false);
352*8975f5c5SAndroid Build Coastguard Worker }
353*8975f5c5SAndroid Build Coastguard Worker
354*8975f5c5SAndroid Build Coastguard Worker if (premultiplyAlpha != unmultiplyAlpha)
355*8975f5c5SAndroid Build Coastguard Worker {
356*8975f5c5SAndroid Build Coastguard Worker float alpha = color.A / 255.0f;
357*8975f5c5SAndroid Build Coastguard Worker if (premultiplyAlpha)
358*8975f5c5SAndroid Build Coastguard Worker {
359*8975f5c5SAndroid Build Coastguard Worker color.R = static_cast<GLubyte>(static_cast<float>(color.R) * alpha);
360*8975f5c5SAndroid Build Coastguard Worker color.G = static_cast<GLubyte>(static_cast<float>(color.G) * alpha);
361*8975f5c5SAndroid Build Coastguard Worker color.B = static_cast<GLubyte>(static_cast<float>(color.B) * alpha);
362*8975f5c5SAndroid Build Coastguard Worker }
363*8975f5c5SAndroid Build Coastguard Worker else if (unmultiplyAlpha && color.A != 0)
364*8975f5c5SAndroid Build Coastguard Worker {
365*8975f5c5SAndroid Build Coastguard Worker color.R = static_cast<GLubyte>(static_cast<float>(color.R) / alpha);
366*8975f5c5SAndroid Build Coastguard Worker color.G = static_cast<GLubyte>(static_cast<float>(color.G) / alpha);
367*8975f5c5SAndroid Build Coastguard Worker color.B = static_cast<GLubyte>(static_cast<float>(color.B) / alpha);
368*8975f5c5SAndroid Build Coastguard Worker }
369*8975f5c5SAndroid Build Coastguard Worker }
370*8975f5c5SAndroid Build Coastguard Worker
371*8975f5c5SAndroid Build Coastguard Worker switch (destFormat)
372*8975f5c5SAndroid Build Coastguard Worker {
373*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
374*8975f5c5SAndroid Build Coastguard Worker color.A = 255;
375*8975f5c5SAndroid Build Coastguard Worker break;
376*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
377*8975f5c5SAndroid Build Coastguard Worker case GL_BGRA_EXT:
378*8975f5c5SAndroid Build Coastguard Worker case GL_SRGB_ALPHA_EXT:
379*8975f5c5SAndroid Build Coastguard Worker break;
380*8975f5c5SAndroid Build Coastguard Worker default:
381*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(true, false);
382*8975f5c5SAndroid Build Coastguard Worker }
383*8975f5c5SAndroid Build Coastguard Worker
384*8975f5c5SAndroid Build Coastguard Worker *destColor = color;
385*8975f5c5SAndroid Build Coastguard Worker }
386*8975f5c5SAndroid Build Coastguard Worker
getSourceColors(GLenum sourceFormat,size_t * colorCount,uint8_t * componentCount)387*8975f5c5SAndroid Build Coastguard Worker const uint8_t *getSourceColors(GLenum sourceFormat, size_t *colorCount, uint8_t *componentCount)
388*8975f5c5SAndroid Build Coastguard Worker {
389*8975f5c5SAndroid Build Coastguard Worker // Note: in all the following values, alpha is larger than RGB so unmultiply alpha doesn't
390*8975f5c5SAndroid Build Coastguard Worker // overflow
391*8975f5c5SAndroid Build Coastguard Worker constexpr static uint8_t kRgbaColors[7 * 4] = {
392*8975f5c5SAndroid Build Coastguard Worker 255u, 127u, 63u, 255u, // 0
393*8975f5c5SAndroid Build Coastguard Worker 31u, 127u, 63u, 127u, // 1
394*8975f5c5SAndroid Build Coastguard Worker 31u, 63u, 127u, 255u, // 2
395*8975f5c5SAndroid Build Coastguard Worker 15u, 127u, 31u, 127u, // 3
396*8975f5c5SAndroid Build Coastguard Worker 127u, 255u, 63u, 0u, // 4
397*8975f5c5SAndroid Build Coastguard Worker 31u, 63u, 127u, 0u, // 5
398*8975f5c5SAndroid Build Coastguard Worker 15u, 31u, 63u, 63u, // 6
399*8975f5c5SAndroid Build Coastguard Worker };
400*8975f5c5SAndroid Build Coastguard Worker
401*8975f5c5SAndroid Build Coastguard Worker constexpr static uint8_t kRgbColors[7 * 3] = {
402*8975f5c5SAndroid Build Coastguard Worker 255u, 127u, 63u, // 0
403*8975f5c5SAndroid Build Coastguard Worker 31u, 127u, 63u, // 1
404*8975f5c5SAndroid Build Coastguard Worker 31u, 63u, 127u, // 2
405*8975f5c5SAndroid Build Coastguard Worker 15u, 127u, 31u, // 3
406*8975f5c5SAndroid Build Coastguard Worker 127u, 255u, 63u, // 4
407*8975f5c5SAndroid Build Coastguard Worker 31u, 63u, 127u, // 5
408*8975f5c5SAndroid Build Coastguard Worker 15u, 31u, 63u, // 6
409*8975f5c5SAndroid Build Coastguard Worker };
410*8975f5c5SAndroid Build Coastguard Worker
411*8975f5c5SAndroid Build Coastguard Worker constexpr static uint8_t kLumColors[7 * 1] = {
412*8975f5c5SAndroid Build Coastguard Worker 255u, // 0
413*8975f5c5SAndroid Build Coastguard Worker 163u, // 1
414*8975f5c5SAndroid Build Coastguard Worker 78u, // 2
415*8975f5c5SAndroid Build Coastguard Worker 114u, // 3
416*8975f5c5SAndroid Build Coastguard Worker 51u, // 4
417*8975f5c5SAndroid Build Coastguard Worker 0u, // 5
418*8975f5c5SAndroid Build Coastguard Worker 217u, // 6
419*8975f5c5SAndroid Build Coastguard Worker };
420*8975f5c5SAndroid Build Coastguard Worker
421*8975f5c5SAndroid Build Coastguard Worker constexpr static uint8_t kLumaColors[7 * 2] = {
422*8975f5c5SAndroid Build Coastguard Worker 255u, 255u, // 0
423*8975f5c5SAndroid Build Coastguard Worker 67u, 163u, // 1
424*8975f5c5SAndroid Build Coastguard Worker 78u, 231u, // 2
425*8975f5c5SAndroid Build Coastguard Worker 8u, 114u, // 3
426*8975f5c5SAndroid Build Coastguard Worker 51u, 199u, // 4
427*8975f5c5SAndroid Build Coastguard Worker 0u, 173u, // 5
428*8975f5c5SAndroid Build Coastguard Worker 34u, 217u, // 6
429*8975f5c5SAndroid Build Coastguard Worker };
430*8975f5c5SAndroid Build Coastguard Worker
431*8975f5c5SAndroid Build Coastguard Worker constexpr static uint8_t kAlphaColors[7 * 1] = {
432*8975f5c5SAndroid Build Coastguard Worker 255u, // 0
433*8975f5c5SAndroid Build Coastguard Worker 67u, // 1
434*8975f5c5SAndroid Build Coastguard Worker 231u, // 2
435*8975f5c5SAndroid Build Coastguard Worker 8u, // 3
436*8975f5c5SAndroid Build Coastguard Worker 199u, // 4
437*8975f5c5SAndroid Build Coastguard Worker 173u, // 5
438*8975f5c5SAndroid Build Coastguard Worker 34u, // 6
439*8975f5c5SAndroid Build Coastguard Worker };
440*8975f5c5SAndroid Build Coastguard Worker
441*8975f5c5SAndroid Build Coastguard Worker *colorCount = 7;
442*8975f5c5SAndroid Build Coastguard Worker
443*8975f5c5SAndroid Build Coastguard Worker switch (sourceFormat)
444*8975f5c5SAndroid Build Coastguard Worker {
445*8975f5c5SAndroid Build Coastguard Worker case GL_RGB:
446*8975f5c5SAndroid Build Coastguard Worker *componentCount = 3;
447*8975f5c5SAndroid Build Coastguard Worker return kRgbColors;
448*8975f5c5SAndroid Build Coastguard Worker case GL_RGBA:
449*8975f5c5SAndroid Build Coastguard Worker case GL_BGRA_EXT:
450*8975f5c5SAndroid Build Coastguard Worker *componentCount = 4;
451*8975f5c5SAndroid Build Coastguard Worker return kRgbaColors;
452*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE:
453*8975f5c5SAndroid Build Coastguard Worker *componentCount = 1;
454*8975f5c5SAndroid Build Coastguard Worker return kLumColors;
455*8975f5c5SAndroid Build Coastguard Worker case GL_ALPHA:
456*8975f5c5SAndroid Build Coastguard Worker *componentCount = 1;
457*8975f5c5SAndroid Build Coastguard Worker return kAlphaColors;
458*8975f5c5SAndroid Build Coastguard Worker case GL_LUMINANCE_ALPHA:
459*8975f5c5SAndroid Build Coastguard Worker *componentCount = 2;
460*8975f5c5SAndroid Build Coastguard Worker return kLumaColors;
461*8975f5c5SAndroid Build Coastguard Worker default:
462*8975f5c5SAndroid Build Coastguard Worker EXPECT_EQ(true, false);
463*8975f5c5SAndroid Build Coastguard Worker return nullptr;
464*8975f5c5SAndroid Build Coastguard Worker }
465*8975f5c5SAndroid Build Coastguard Worker }
466*8975f5c5SAndroid Build Coastguard Worker
initializeSourceTexture(GLenum target,GLenum sourceFormat,const uint8_t * srcColors,uint8_t componentCount)467*8975f5c5SAndroid Build Coastguard Worker void initializeSourceTexture(GLenum target,
468*8975f5c5SAndroid Build Coastguard Worker GLenum sourceFormat,
469*8975f5c5SAndroid Build Coastguard Worker const uint8_t *srcColors,
470*8975f5c5SAndroid Build Coastguard Worker uint8_t componentCount)
471*8975f5c5SAndroid Build Coastguard Worker {
472*8975f5c5SAndroid Build Coastguard Worker // The texture is initialized as 2x2. If the componentCount is 1 or 3, then the input data
473*8975f5c5SAndroid Build Coastguard Worker // will have a row pitch of 2 or 6, which needs to be padded to 4 or 8 respectively.
474*8975f5c5SAndroid Build Coastguard Worker uint8_t srcColorsPadded[4 * 4];
475*8975f5c5SAndroid Build Coastguard Worker size_t srcRowPitch =
476*8975f5c5SAndroid Build Coastguard Worker 2 * componentCount + (componentCount == 1 || componentCount == 3 ? 2 : 0);
477*8975f5c5SAndroid Build Coastguard Worker size_t inputRowPitch = 2 * componentCount;
478*8975f5c5SAndroid Build Coastguard Worker for (size_t row = 0; row < 2; ++row)
479*8975f5c5SAndroid Build Coastguard Worker {
480*8975f5c5SAndroid Build Coastguard Worker memcpy(&srcColorsPadded[row * srcRowPitch], &srcColors[row * inputRowPitch],
481*8975f5c5SAndroid Build Coastguard Worker inputRowPitch);
482*8975f5c5SAndroid Build Coastguard Worker memset(&srcColorsPadded[row * srcRowPitch + inputRowPitch], 0,
483*8975f5c5SAndroid Build Coastguard Worker srcRowPitch - inputRowPitch);
484*8975f5c5SAndroid Build Coastguard Worker }
485*8975f5c5SAndroid Build Coastguard Worker
486*8975f5c5SAndroid Build Coastguard Worker glBindTexture(target, mTextures[0]);
487*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(target, 0, sourceFormat, 2, 2, 0, sourceFormat, GL_UNSIGNED_BYTE,
488*8975f5c5SAndroid Build Coastguard Worker srcColorsPadded);
489*8975f5c5SAndroid Build Coastguard Worker }
490*8975f5c5SAndroid Build Coastguard Worker
testCopyTexture(GLenum sourceTarget,GLenum sourceFormat,GLenum destFormat,bool flipY,bool premultiplyAlpha,bool unmultiplyAlpha,GLint mesaYFlipParam)491*8975f5c5SAndroid Build Coastguard Worker void testCopyTexture(GLenum sourceTarget,
492*8975f5c5SAndroid Build Coastguard Worker GLenum sourceFormat,
493*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat,
494*8975f5c5SAndroid Build Coastguard Worker bool flipY,
495*8975f5c5SAndroid Build Coastguard Worker bool premultiplyAlpha,
496*8975f5c5SAndroid Build Coastguard Worker bool unmultiplyAlpha,
497*8975f5c5SAndroid Build Coastguard Worker GLint mesaYFlipParam)
498*8975f5c5SAndroid Build Coastguard Worker {
499*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions(sourceFormat, destFormat))
500*8975f5c5SAndroid Build Coastguard Worker {
501*8975f5c5SAndroid Build Coastguard Worker return;
502*8975f5c5SAndroid Build Coastguard Worker }
503*8975f5c5SAndroid Build Coastguard Worker
504*8975f5c5SAndroid Build Coastguard Worker const bool hasMesaFbFlipYExt = IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y");
505*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlipParam && !hasMesaFbFlipYExt)
506*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(hasMesaFbFlipYExt);
507*8975f5c5SAndroid Build Coastguard Worker
508*8975f5c5SAndroid Build Coastguard Worker if (sourceFormat == GL_LUMINANCE || sourceFormat == GL_LUMINANCE_ALPHA ||
509*8975f5c5SAndroid Build Coastguard Worker sourceFormat == GL_ALPHA || destFormat == GL_LUMINANCE ||
510*8975f5c5SAndroid Build Coastguard Worker destFormat == GL_LUMINANCE_ALPHA || destFormat == GL_ALPHA)
511*8975f5c5SAndroid Build Coastguard Worker {
512*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263512
513*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && destFormat == GL_SRGB_ALPHA_EXT);
514*8975f5c5SAndroid Build Coastguard Worker }
515*8975f5c5SAndroid Build Coastguard Worker
516*8975f5c5SAndroid Build Coastguard Worker size_t colorCount;
517*8975f5c5SAndroid Build Coastguard Worker uint8_t componentCount;
518*8975f5c5SAndroid Build Coastguard Worker const uint8_t *srcColors = getSourceColors(sourceFormat, &colorCount, &componentCount);
519*8975f5c5SAndroid Build Coastguard Worker
520*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> destColors(colorCount);
521*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < colorCount; ++i)
522*8975f5c5SAndroid Build Coastguard Worker {
523*8975f5c5SAndroid Build Coastguard Worker calculateCopyTextureResults(sourceFormat, destFormat, premultiplyAlpha, unmultiplyAlpha,
524*8975f5c5SAndroid Build Coastguard Worker &srcColors[i * componentCount], &destColors[i]);
525*8975f5c5SAndroid Build Coastguard Worker }
526*8975f5c5SAndroid Build Coastguard Worker
527*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < colorCount - 3; ++i)
528*8975f5c5SAndroid Build Coastguard Worker {
529*8975f5c5SAndroid Build Coastguard Worker initializeSourceTexture(sourceTarget, sourceFormat, &srcColors[i * componentCount],
530*8975f5c5SAndroid Build Coastguard Worker componentCount);
531*8975f5c5SAndroid Build Coastguard Worker
532*8975f5c5SAndroid Build Coastguard Worker if (hasMesaFbFlipYExt)
533*8975f5c5SAndroid Build Coastguard Worker {
534*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA,
535*8975f5c5SAndroid Build Coastguard Worker mesaYFlipParam);
536*8975f5c5SAndroid Build Coastguard Worker }
537*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,
538*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, flipY, premultiplyAlpha, unmultiplyAlpha);
539*8975f5c5SAndroid Build Coastguard Worker
540*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
541*8975f5c5SAndroid Build Coastguard Worker
542*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
543*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
544*8975f5c5SAndroid Build Coastguard Worker
545*8975f5c5SAndroid Build Coastguard Worker if (flipY)
546*8975f5c5SAndroid Build Coastguard Worker {
547*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlipParam)
548*8975f5c5SAndroid Build Coastguard Worker {
549*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);
550*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);
551*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);
552*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);
553*8975f5c5SAndroid Build Coastguard Worker }
554*8975f5c5SAndroid Build Coastguard Worker else
555*8975f5c5SAndroid Build Coastguard Worker {
556*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);
557*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);
558*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);
559*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);
560*8975f5c5SAndroid Build Coastguard Worker }
561*8975f5c5SAndroid Build Coastguard Worker }
562*8975f5c5SAndroid Build Coastguard Worker else
563*8975f5c5SAndroid Build Coastguard Worker {
564*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlipParam)
565*8975f5c5SAndroid Build Coastguard Worker {
566*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);
567*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);
568*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);
569*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);
570*8975f5c5SAndroid Build Coastguard Worker }
571*8975f5c5SAndroid Build Coastguard Worker else
572*8975f5c5SAndroid Build Coastguard Worker {
573*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);
574*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);
575*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);
576*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);
577*8975f5c5SAndroid Build Coastguard Worker }
578*8975f5c5SAndroid Build Coastguard Worker }
579*8975f5c5SAndroid Build Coastguard Worker
580*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
581*8975f5c5SAndroid Build Coastguard Worker }
582*8975f5c5SAndroid Build Coastguard Worker }
583*8975f5c5SAndroid Build Coastguard Worker
testCopySubTexture(GLenum sourceTarget,GLenum sourceFormat,GLenum destFormat,bool flipY,bool premultiplyAlpha,bool unmultiplyAlpha,GLint mesaYFlipParam)584*8975f5c5SAndroid Build Coastguard Worker void testCopySubTexture(GLenum sourceTarget,
585*8975f5c5SAndroid Build Coastguard Worker GLenum sourceFormat,
586*8975f5c5SAndroid Build Coastguard Worker GLenum destFormat,
587*8975f5c5SAndroid Build Coastguard Worker bool flipY,
588*8975f5c5SAndroid Build Coastguard Worker bool premultiplyAlpha,
589*8975f5c5SAndroid Build Coastguard Worker bool unmultiplyAlpha,
590*8975f5c5SAndroid Build Coastguard Worker GLint mesaYFlipParam)
591*8975f5c5SAndroid Build Coastguard Worker {
592*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions(sourceFormat, destFormat))
593*8975f5c5SAndroid Build Coastguard Worker {
594*8975f5c5SAndroid Build Coastguard Worker return;
595*8975f5c5SAndroid Build Coastguard Worker }
596*8975f5c5SAndroid Build Coastguard Worker
597*8975f5c5SAndroid Build Coastguard Worker const bool hasMesaFbFlipYExt = IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y");
598*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlipParam && !hasMesaFbFlipYExt)
599*8975f5c5SAndroid Build Coastguard Worker ASSERT_TRUE(hasMesaFbFlipYExt);
600*8975f5c5SAndroid Build Coastguard Worker
601*8975f5c5SAndroid Build Coastguard Worker if (sourceFormat == GL_LUMINANCE || sourceFormat == GL_LUMINANCE_ALPHA ||
602*8975f5c5SAndroid Build Coastguard Worker sourceFormat == GL_ALPHA || destFormat == GL_LUMINANCE ||
603*8975f5c5SAndroid Build Coastguard Worker destFormat == GL_LUMINANCE_ALPHA || destFormat == GL_ALPHA)
604*8975f5c5SAndroid Build Coastguard Worker {
605*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263512
606*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOpenGL() && destFormat == GL_SRGB_ALPHA_EXT);
607*8975f5c5SAndroid Build Coastguard Worker }
608*8975f5c5SAndroid Build Coastguard Worker
609*8975f5c5SAndroid Build Coastguard Worker size_t colorCount;
610*8975f5c5SAndroid Build Coastguard Worker uint8_t componentCount;
611*8975f5c5SAndroid Build Coastguard Worker const uint8_t *srcColors = getSourceColors(sourceFormat, &colorCount, &componentCount);
612*8975f5c5SAndroid Build Coastguard Worker
613*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> destColors(colorCount);
614*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < colorCount; ++i)
615*8975f5c5SAndroid Build Coastguard Worker {
616*8975f5c5SAndroid Build Coastguard Worker calculateCopyTextureResults(sourceFormat, destFormat, premultiplyAlpha, unmultiplyAlpha,
617*8975f5c5SAndroid Build Coastguard Worker &srcColors[i * componentCount], &destColors[i]);
618*8975f5c5SAndroid Build Coastguard Worker }
619*8975f5c5SAndroid Build Coastguard Worker
620*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < colorCount - 3; ++i)
621*8975f5c5SAndroid Build Coastguard Worker {
622*8975f5c5SAndroid Build Coastguard Worker initializeSourceTexture(sourceTarget, sourceFormat, &srcColors[i * componentCount],
623*8975f5c5SAndroid Build Coastguard Worker componentCount);
624*8975f5c5SAndroid Build Coastguard Worker
625*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
626*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 2, 2, 0, destFormat, GL_UNSIGNED_BYTE,
627*8975f5c5SAndroid Build Coastguard Worker nullptr);
628*8975f5c5SAndroid Build Coastguard Worker
629*8975f5c5SAndroid Build Coastguard Worker if (hasMesaFbFlipYExt)
630*8975f5c5SAndroid Build Coastguard Worker {
631*8975f5c5SAndroid Build Coastguard Worker glFramebufferParameteriMESA(GL_FRAMEBUFFER, GL_FRAMEBUFFER_FLIP_Y_MESA,
632*8975f5c5SAndroid Build Coastguard Worker mesaYFlipParam);
633*8975f5c5SAndroid Build Coastguard Worker }
634*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 2,
635*8975f5c5SAndroid Build Coastguard Worker 2, flipY, premultiplyAlpha, unmultiplyAlpha);
636*8975f5c5SAndroid Build Coastguard Worker
637*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
638*8975f5c5SAndroid Build Coastguard Worker
639*8975f5c5SAndroid Build Coastguard Worker if (sourceFormat != GL_LUMINANCE && sourceFormat != GL_LUMINANCE_ALPHA &&
640*8975f5c5SAndroid Build Coastguard Worker sourceFormat != GL_ALPHA)
641*8975f5c5SAndroid Build Coastguard Worker {
642*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
643*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
644*8975f5c5SAndroid Build Coastguard Worker }
645*8975f5c5SAndroid Build Coastguard Worker
646*8975f5c5SAndroid Build Coastguard Worker if (flipY)
647*8975f5c5SAndroid Build Coastguard Worker {
648*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlipParam)
649*8975f5c5SAndroid Build Coastguard Worker {
650*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);
651*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);
652*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);
653*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);
654*8975f5c5SAndroid Build Coastguard Worker }
655*8975f5c5SAndroid Build Coastguard Worker else
656*8975f5c5SAndroid Build Coastguard Worker {
657*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);
658*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);
659*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);
660*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);
661*8975f5c5SAndroid Build Coastguard Worker }
662*8975f5c5SAndroid Build Coastguard Worker }
663*8975f5c5SAndroid Build Coastguard Worker else
664*8975f5c5SAndroid Build Coastguard Worker {
665*8975f5c5SAndroid Build Coastguard Worker if (mesaYFlipParam)
666*8975f5c5SAndroid Build Coastguard Worker {
667*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);
668*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);
669*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);
670*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);
671*8975f5c5SAndroid Build Coastguard Worker }
672*8975f5c5SAndroid Build Coastguard Worker else
673*8975f5c5SAndroid Build Coastguard Worker {
674*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);
675*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);
676*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);
677*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);
678*8975f5c5SAndroid Build Coastguard Worker }
679*8975f5c5SAndroid Build Coastguard Worker }
680*8975f5c5SAndroid Build Coastguard Worker
681*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
682*8975f5c5SAndroid Build Coastguard Worker }
683*8975f5c5SAndroid Build Coastguard Worker }
684*8975f5c5SAndroid Build Coastguard Worker
685*8975f5c5SAndroid Build Coastguard Worker GLuint mTextures[2] = {
686*8975f5c5SAndroid Build Coastguard Worker 0,
687*8975f5c5SAndroid Build Coastguard Worker 0,
688*8975f5c5SAndroid Build Coastguard Worker };
689*8975f5c5SAndroid Build Coastguard Worker GLuint mFramebuffer = 0;
690*8975f5c5SAndroid Build Coastguard Worker };
691*8975f5c5SAndroid Build Coastguard Worker
692*8975f5c5SAndroid Build Coastguard Worker class CopyTextureTestDest : public CopyTextureTest
693*8975f5c5SAndroid Build Coastguard Worker {};
694*8975f5c5SAndroid Build Coastguard Worker
695*8975f5c5SAndroid Build Coastguard Worker class CopyTextureTestWebGL : public CopyTextureTest
696*8975f5c5SAndroid Build Coastguard Worker {
697*8975f5c5SAndroid Build Coastguard Worker protected:
CopyTextureTestWebGL()698*8975f5c5SAndroid Build Coastguard Worker CopyTextureTestWebGL() : CopyTextureTest() { setWebGLCompatibilityEnabled(true); }
699*8975f5c5SAndroid Build Coastguard Worker };
700*8975f5c5SAndroid Build Coastguard Worker
701*8975f5c5SAndroid Build Coastguard Worker class CopyTextureTestES3 : public CopyTextureTest
702*8975f5c5SAndroid Build Coastguard Worker {
703*8975f5c5SAndroid Build Coastguard Worker protected:
704*8975f5c5SAndroid Build Coastguard Worker void invalidateBlitThenBlendCommon(GLsizei layerCount);
705*8975f5c5SAndroid Build Coastguard Worker };
706*8975f5c5SAndroid Build Coastguard Worker
707*8975f5c5SAndroid Build Coastguard Worker // Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to
708*8975f5c5SAndroid Build Coastguard Worker // immutable textures
TEST_P(CopyTextureTest,ImmutableTexture)709*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, ImmutableTexture)
710*8975f5c5SAndroid Build Coastguard Worker {
711*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
712*8975f5c5SAndroid Build Coastguard Worker {
713*8975f5c5SAndroid Build Coastguard Worker return;
714*8975f5c5SAndroid Build Coastguard Worker }
715*8975f5c5SAndroid Build Coastguard Worker
716*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
717*8975f5c5SAndroid Build Coastguard Worker (!IsGLExtensionEnabled("GL_EXT_texture_storage") ||
718*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_OES_rgb8_rgba8")));
719*8975f5c5SAndroid Build Coastguard Worker
720*8975f5c5SAndroid Build Coastguard Worker GLColor pixels = GLColor::red;
721*8975f5c5SAndroid Build Coastguard Worker
722*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
723*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
724*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
725*8975f5c5SAndroid Build Coastguard Worker
726*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
727*8975f5c5SAndroid Build Coastguard Worker glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
728*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
729*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
730*8975f5c5SAndroid Build Coastguard Worker
731*8975f5c5SAndroid Build Coastguard Worker // Should generate an error when the texture is redefined
732*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
733*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
734*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
735*8975f5c5SAndroid Build Coastguard Worker
736*8975f5c5SAndroid Build Coastguard Worker // Should succeed when using CopySubTexture
737*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
738*8975f5c5SAndroid Build Coastguard Worker false, false, false);
739*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
740*8975f5c5SAndroid Build Coastguard Worker
741*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
742*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
743*8975f5c5SAndroid Build Coastguard Worker
744*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
745*8975f5c5SAndroid Build Coastguard Worker
746*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
747*8975f5c5SAndroid Build Coastguard Worker }
748*8975f5c5SAndroid Build Coastguard Worker
749*8975f5c5SAndroid Build Coastguard Worker struct FormatPair
750*8975f5c5SAndroid Build Coastguard Worker {
FormatPairangle::FormatPair751*8975f5c5SAndroid Build Coastguard Worker explicit FormatPair(GLenum format) : format(format), internalFormat(format) {}
FormatPairangle::FormatPair752*8975f5c5SAndroid Build Coastguard Worker FormatPair(GLenum format, GLint internalFormat) : format(format), internalFormat(internalFormat)
753*8975f5c5SAndroid Build Coastguard Worker {}
754*8975f5c5SAndroid Build Coastguard Worker
755*8975f5c5SAndroid Build Coastguard Worker GLenum format;
756*8975f5c5SAndroid Build Coastguard Worker GLint internalFormat;
757*8975f5c5SAndroid Build Coastguard Worker };
758*8975f5c5SAndroid Build Coastguard Worker
759*8975f5c5SAndroid Build Coastguard Worker // Test validation of internal formats in CopyTexture and CopySubTexture
TEST_P(CopyTextureTest,InternalFormat)760*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, InternalFormat)
761*8975f5c5SAndroid Build Coastguard Worker {
762*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
763*8975f5c5SAndroid Build Coastguard Worker {
764*8975f5c5SAndroid Build Coastguard Worker return;
765*8975f5c5SAndroid Build Coastguard Worker }
766*8975f5c5SAndroid Build Coastguard Worker
767*8975f5c5SAndroid Build Coastguard Worker std::vector<FormatPair> sourceFormats;
768*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_ALPHA));
769*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_RGB));
770*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_RGBA));
771*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_LUMINANCE));
772*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_LUMINANCE_ALPHA));
773*8975f5c5SAndroid Build Coastguard Worker
774*8975f5c5SAndroid Build Coastguard Worker std::vector<FormatPair> destFormats;
775*8975f5c5SAndroid Build Coastguard Worker destFormats.push_back(FormatPair(GL_RGB));
776*8975f5c5SAndroid Build Coastguard Worker destFormats.push_back(FormatPair(GL_RGBA));
777*8975f5c5SAndroid Build Coastguard Worker
778*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
779*8975f5c5SAndroid Build Coastguard Worker {
780*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_BGRA_EXT));
781*8975f5c5SAndroid Build Coastguard Worker destFormats.push_back(FormatPair(GL_BGRA_EXT));
782*8975f5c5SAndroid Build Coastguard Worker }
783*8975f5c5SAndroid Build Coastguard Worker
784*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_ANGLE_rgbx_internal_format"))
785*8975f5c5SAndroid Build Coastguard Worker {
786*8975f5c5SAndroid Build Coastguard Worker sourceFormats.push_back(FormatPair(GL_RGB, GL_RGBX8_ANGLE));
787*8975f5c5SAndroid Build Coastguard Worker destFormats.push_back(FormatPair(GL_RGB, GL_RGBX8_ANGLE));
788*8975f5c5SAndroid Build Coastguard Worker }
789*8975f5c5SAndroid Build Coastguard Worker
790*8975f5c5SAndroid Build Coastguard Worker // Test with glCopyTexture
791*8975f5c5SAndroid Build Coastguard Worker for (FormatPair &sourceFormat : sourceFormats)
792*8975f5c5SAndroid Build Coastguard Worker {
793*8975f5c5SAndroid Build Coastguard Worker for (FormatPair &destFormat : destFormats)
794*8975f5c5SAndroid Build Coastguard Worker {
795*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
796*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat.internalFormat, 1, 1, 0,
797*8975f5c5SAndroid Build Coastguard Worker sourceFormat.format, GL_UNSIGNED_BYTE, nullptr);
798*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
799*8975f5c5SAndroid Build Coastguard Worker
800*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0,
801*8975f5c5SAndroid Build Coastguard Worker destFormat.internalFormat, GL_UNSIGNED_BYTE, false, false, false);
802*8975f5c5SAndroid Build Coastguard Worker
803*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
804*8975f5c5SAndroid Build Coastguard Worker }
805*8975f5c5SAndroid Build Coastguard Worker }
806*8975f5c5SAndroid Build Coastguard Worker
807*8975f5c5SAndroid Build Coastguard Worker // Test with glCopySubTexture
808*8975f5c5SAndroid Build Coastguard Worker for (FormatPair &sourceFormat : sourceFormats)
809*8975f5c5SAndroid Build Coastguard Worker {
810*8975f5c5SAndroid Build Coastguard Worker for (FormatPair &destFormat : destFormats)
811*8975f5c5SAndroid Build Coastguard Worker {
812*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
813*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat.internalFormat, 1, 1, 0,
814*8975f5c5SAndroid Build Coastguard Worker sourceFormat.format, GL_UNSIGNED_BYTE, nullptr);
815*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
816*8975f5c5SAndroid Build Coastguard Worker
817*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
818*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, destFormat.internalFormat, 1, 1, 0, destFormat.format,
819*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
820*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
821*8975f5c5SAndroid Build Coastguard Worker
822*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1,
823*8975f5c5SAndroid Build Coastguard Worker 1, false, false, false);
824*8975f5c5SAndroid Build Coastguard Worker
825*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
826*8975f5c5SAndroid Build Coastguard Worker }
827*8975f5c5SAndroid Build Coastguard Worker }
828*8975f5c5SAndroid Build Coastguard Worker }
829*8975f5c5SAndroid Build Coastguard Worker
830*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that the destination texture is redefined if the properties are different.
TEST_P(CopyTextureTest,RedefineDestinationTexture)831*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, RedefineDestinationTexture)
832*8975f5c5SAndroid Build Coastguard Worker {
833*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!checkExtensions());
834*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"));
835*8975f5c5SAndroid Build Coastguard Worker
836*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
837*8975f5c5SAndroid Build Coastguard Worker
838*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
839*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
840*8975f5c5SAndroid Build Coastguard Worker
841*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
842*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
843*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
844*8975f5c5SAndroid Build Coastguard Worker
845*8975f5c5SAndroid Build Coastguard Worker // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
846*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
847*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
848*8975f5c5SAndroid Build Coastguard Worker // GL_INVALID_VALUE due to bad dimensions.
849*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
850*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
851*8975f5c5SAndroid Build Coastguard Worker
852*8975f5c5SAndroid Build Coastguard Worker // If the dest texture has different properties, glCopyTextureCHROMIUM()
853*8975f5c5SAndroid Build Coastguard Worker // redefines them.
854*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
855*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
856*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
857*8975f5c5SAndroid Build Coastguard Worker
858*8975f5c5SAndroid Build Coastguard Worker // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2
859*8975f5c5SAndroid Build Coastguard Worker // dimension and GL_RGBA format.
860*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
861*8975f5c5SAndroid Build Coastguard Worker glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
862*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
863*8975f5c5SAndroid Build Coastguard Worker
864*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
865*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
866*8975f5c5SAndroid Build Coastguard Worker
867*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);
868*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
869*8975f5c5SAndroid Build Coastguard Worker }
870*8975f5c5SAndroid Build Coastguard Worker
871*8975f5c5SAndroid Build Coastguard Worker // Test that invalid dimensions in CopySubTexture are validated
TEST_P(CopyTextureTest,CopySubTextureDimension)872*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopySubTextureDimension)
873*8975f5c5SAndroid Build Coastguard Worker {
874*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
875*8975f5c5SAndroid Build Coastguard Worker {
876*8975f5c5SAndroid Build Coastguard Worker return;
877*8975f5c5SAndroid Build Coastguard Worker }
878*8975f5c5SAndroid Build Coastguard Worker
879*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
880*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
881*8975f5c5SAndroid Build Coastguard Worker
882*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
883*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
884*8975f5c5SAndroid Build Coastguard Worker
885*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
886*8975f5c5SAndroid Build Coastguard Worker false, false, false);
887*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
888*8975f5c5SAndroid Build Coastguard Worker
889*8975f5c5SAndroid Build Coastguard Worker // xoffset < 0
890*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, -1, 1, 0, 0, 1, 1,
891*8975f5c5SAndroid Build Coastguard Worker false, false, false);
892*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
893*8975f5c5SAndroid Build Coastguard Worker
894*8975f5c5SAndroid Build Coastguard Worker // x < 0
895*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, -1, 0, 1, 1,
896*8975f5c5SAndroid Build Coastguard Worker false, false, false);
897*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
898*8975f5c5SAndroid Build Coastguard Worker
899*8975f5c5SAndroid Build Coastguard Worker // xoffset + width > dest_width
900*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 2, 2, 0, 0, 2, 2,
901*8975f5c5SAndroid Build Coastguard Worker false, false, false);
902*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
903*8975f5c5SAndroid Build Coastguard Worker
904*8975f5c5SAndroid Build Coastguard Worker // x + width > source_width
905*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 1, 1, 2, 2,
906*8975f5c5SAndroid Build Coastguard Worker false, false, false);
907*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
908*8975f5c5SAndroid Build Coastguard Worker }
909*8975f5c5SAndroid Build Coastguard Worker
910*8975f5c5SAndroid Build Coastguard Worker // Test that invalid IDs in CopyTexture are validated
TEST_P(CopyTextureTest,CopyTextureInvalidTextureIds)911*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)
912*8975f5c5SAndroid Build Coastguard Worker {
913*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
914*8975f5c5SAndroid Build Coastguard Worker {
915*8975f5c5SAndroid Build Coastguard Worker return;
916*8975f5c5SAndroid Build Coastguard Worker }
917*8975f5c5SAndroid Build Coastguard Worker
918*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
919*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
920*8975f5c5SAndroid Build Coastguard Worker
921*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
922*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
923*8975f5c5SAndroid Build Coastguard Worker
924*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, GL_RGBA, GL_UNSIGNED_BYTE,
925*8975f5c5SAndroid Build Coastguard Worker false, false, false);
926*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
927*8975f5c5SAndroid Build Coastguard Worker
928*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA, GL_UNSIGNED_BYTE,
929*8975f5c5SAndroid Build Coastguard Worker false, false, false);
930*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
931*8975f5c5SAndroid Build Coastguard Worker
932*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, GL_RGBA, GL_UNSIGNED_BYTE, false,
933*8975f5c5SAndroid Build Coastguard Worker false, false);
934*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
935*8975f5c5SAndroid Build Coastguard Worker
936*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
937*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
938*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
939*8975f5c5SAndroid Build Coastguard Worker }
940*8975f5c5SAndroid Build Coastguard Worker
941*8975f5c5SAndroid Build Coastguard Worker // Test that the right error type is triggered when
942*8975f5c5SAndroid Build Coastguard Worker // OES_EGL_image_external_essl3 is required but not supported
TEST_P(CopyTextureTest,CopyTextureMissingRequiredExtension)943*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopyTextureMissingRequiredExtension)
944*8975f5c5SAndroid Build Coastguard Worker {
945*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
946*8975f5c5SAndroid Build Coastguard Worker {
947*8975f5c5SAndroid Build Coastguard Worker return;
948*8975f5c5SAndroid Build Coastguard Worker }
949*8975f5c5SAndroid Build Coastguard Worker
950*8975f5c5SAndroid Build Coastguard Worker // decide if the test is relevant
951*8975f5c5SAndroid Build Coastguard Worker // If GL_OES_EGL_image_external_essl3 is supported, then no need to test
952*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_OES_EGL_image_external_essl3"));
953*8975f5c5SAndroid Build Coastguard Worker // GL_OES_EGL_image_external extension is required to use TEXTURE_EXTERNAL_OES
954*8975f5c5SAndroid Build Coastguard Worker // as the texture target. So if GL_OES_EGL_image_external is not supported,
955*8975f5c5SAndroid Build Coastguard Worker // the error case cannot happen.
956*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_EGL_image_external"));
957*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
958*8975f5c5SAndroid Build Coastguard Worker EGLDisplay dpy = window->getDisplay();
959*8975f5c5SAndroid Build Coastguard Worker // If EGL_KHR_image_base is not supported, then eglImageKHR cannot be used,
960*8975f5c5SAndroid Build Coastguard Worker // and therefore the error case cannot happen
961*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(dpy, "EGL_KHR_image_base"));
962*8975f5c5SAndroid Build Coastguard Worker
963*8975f5c5SAndroid Build Coastguard Worker // prepare test data
964*8975f5c5SAndroid Build Coastguard Worker // create the texture data
965*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
966*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
967*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
968*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kSourceColor(2 * 2, GLColor::green);
969*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
970*8975f5c5SAndroid Build Coastguard Worker kSourceColor.data());
971*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
972*8975f5c5SAndroid Build Coastguard Worker
973*8975f5c5SAndroid Build Coastguard Worker // create the image and load the texture data
974*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint attribs[] = {
975*8975f5c5SAndroid Build Coastguard Worker EGL_IMAGE_PRESERVED,
976*8975f5c5SAndroid Build Coastguard Worker EGL_TRUE,
977*8975f5c5SAndroid Build Coastguard Worker EGL_NONE,
978*8975f5c5SAndroid Build Coastguard Worker };
979*8975f5c5SAndroid Build Coastguard Worker EGLImageKHR image = eglCreateImageKHR(
980*8975f5c5SAndroid Build Coastguard Worker window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
981*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(texture)), attribs);
982*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
983*8975f5c5SAndroid Build Coastguard Worker // source is from the image
984*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextures[0]);
985*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
986*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);
987*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
988*8975f5c5SAndroid Build Coastguard Worker
989*8975f5c5SAndroid Build Coastguard Worker // dest
990*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
991*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
992*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
993*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
994*8975f5c5SAndroid Build Coastguard Worker
995*8975f5c5SAndroid Build Coastguard Worker // This copying needs EGLImageExternalEssl3OES extension
996*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGB32UI,
997*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
998*8975f5c5SAndroid Build Coastguard Worker
999*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_OPERATION);
1000*8975f5c5SAndroid Build Coastguard Worker
1001*8975f5c5SAndroid Build Coastguard Worker // Non-integer dest internal format doesn't need the extension
1002*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1003*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1004*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1005*8975f5c5SAndroid Build Coastguard Worker }
1006*8975f5c5SAndroid Build Coastguard Worker
1007*8975f5c5SAndroid Build Coastguard Worker // Test that invalid IDs in CopySubTexture are validated
TEST_P(CopyTextureTest,CopySubTextureInvalidTextureIds)1008*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
1009*8975f5c5SAndroid Build Coastguard Worker {
1010*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1011*8975f5c5SAndroid Build Coastguard Worker {
1012*8975f5c5SAndroid Build Coastguard Worker return;
1013*8975f5c5SAndroid Build Coastguard Worker }
1014*8975f5c5SAndroid Build Coastguard Worker
1015*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1016*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1017*8975f5c5SAndroid Build Coastguard Worker
1018*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1019*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1020*8975f5c5SAndroid Build Coastguard Worker
1021*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, 1, 1, 0, 0, 1, 1, false,
1022*8975f5c5SAndroid Build Coastguard Worker false, false);
1023*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
1024*8975f5c5SAndroid Build Coastguard Worker
1025*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1, false,
1026*8975f5c5SAndroid Build Coastguard Worker false, false);
1027*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
1028*8975f5c5SAndroid Build Coastguard Worker
1029*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, 1, 1, 0, 0, 1, 1, false, false,
1030*8975f5c5SAndroid Build Coastguard Worker false);
1031*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
1032*8975f5c5SAndroid Build Coastguard Worker
1033*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
1034*8975f5c5SAndroid Build Coastguard Worker false, false, false);
1035*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1036*8975f5c5SAndroid Build Coastguard Worker }
1037*8975f5c5SAndroid Build Coastguard Worker
TEST_P(CopyTextureTest,InvalidTarget)1038*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, InvalidTarget)
1039*8975f5c5SAndroid Build Coastguard Worker {
1040*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!checkExtensions());
1041*8975f5c5SAndroid Build Coastguard Worker
1042*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1043*8975f5c5SAndroid Build Coastguard Worker
1044*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1045*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1046*8975f5c5SAndroid Build Coastguard Worker
1047*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
1048*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1049*8975f5c5SAndroid Build Coastguard Worker
1050*8975f5c5SAndroid Build Coastguard Worker // Invalid enum for a completely invalid target
1051*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(textures[0], 0, GL_INVALID_VALUE, textures[1], 0, 1, 1, 0, 0, 1, 1,
1052*8975f5c5SAndroid Build Coastguard Worker false, false, false);
1053*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_ENUM);
1054*8975f5c5SAndroid Build Coastguard Worker
1055*8975f5c5SAndroid Build Coastguard Worker // Invalid value for a valid target enum but is not valid for the destination texture
1056*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(textures[0], 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textures[1], 0, 1, 1,
1057*8975f5c5SAndroid Build Coastguard Worker 0, 0, 1, 1, false, false, false);
1058*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
1059*8975f5c5SAndroid Build Coastguard Worker }
1060*8975f5c5SAndroid Build Coastguard Worker
1061*8975f5c5SAndroid Build Coastguard Worker // Test that using an offset in CopySubTexture works correctly
TEST_P(CopyTextureTest,CopySubTextureOffset)1062*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopySubTextureOffset)
1063*8975f5c5SAndroid Build Coastguard Worker {
1064*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1065*8975f5c5SAndroid Build Coastguard Worker {
1066*8975f5c5SAndroid Build Coastguard Worker return;
1067*8975f5c5SAndroid Build Coastguard Worker }
1068*8975f5c5SAndroid Build Coastguard Worker
1069*8975f5c5SAndroid Build Coastguard Worker GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
1070*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1071*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
1072*8975f5c5SAndroid Build Coastguard Worker
1073*8975f5c5SAndroid Build Coastguard Worker GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,
1074*8975f5c5SAndroid Build Coastguard Worker GLColor::transparentBlack, GLColor::transparentBlack};
1075*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1076*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);
1077*8975f5c5SAndroid Build Coastguard Worker
1078*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
1079*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1080*8975f5c5SAndroid Build Coastguard Worker
1081*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
1082*8975f5c5SAndroid Build Coastguard Worker false, false, false);
1083*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1084*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
1085*8975f5c5SAndroid Build Coastguard Worker
1086*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 0, 1, 0, 1, 1,
1087*8975f5c5SAndroid Build Coastguard Worker false, false, false);
1088*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1089*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
1090*8975f5c5SAndroid Build Coastguard Worker
1091*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 1, 0, 1, 1, 1,
1092*8975f5c5SAndroid Build Coastguard Worker false, false, false);
1093*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1094*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
1095*8975f5c5SAndroid Build Coastguard Worker
1096*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
1097*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1098*8975f5c5SAndroid Build Coastguard Worker }
1099*8975f5c5SAndroid Build Coastguard Worker
1100*8975f5c5SAndroid Build Coastguard Worker // Test that copying a texture attached to a framebuffer into a L texture does not break a
1101*8975f5c5SAndroid Build Coastguard Worker // subsequent clear
TEST_P(CopyTextureTest,ClearAfterCopySubTextureLuminance)1102*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, ClearAfterCopySubTextureLuminance)
1103*8975f5c5SAndroid Build Coastguard Worker {
1104*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1105*8975f5c5SAndroid Build Coastguard Worker {
1106*8975f5c5SAndroid Build Coastguard Worker return;
1107*8975f5c5SAndroid Build Coastguard Worker }
1108*8975f5c5SAndroid Build Coastguard Worker
1109*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1110*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 4, 4, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
1111*8975f5c5SAndroid Build Coastguard Worker
1112*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1113*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1114*8975f5c5SAndroid Build Coastguard Worker
1115*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 0.0, 0.0, 1.0);
1116*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1117*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1118*8975f5c5SAndroid Build Coastguard Worker
1119*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, 0, 0, 0, 0, 4, 4,
1120*8975f5c5SAndroid Build Coastguard Worker GL_TRUE, GL_FALSE, GL_TRUE);
1121*8975f5c5SAndroid Build Coastguard Worker
1122*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 1.0, 0.0, 1.0);
1123*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1124*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1125*8975f5c5SAndroid Build Coastguard Worker }
1126*8975f5c5SAndroid Build Coastguard Worker
1127*8975f5c5SAndroid Build Coastguard Worker // Test that copying a texture attached to a framebuffer into a LA texture does not break a
1128*8975f5c5SAndroid Build Coastguard Worker // subsequent clear
TEST_P(CopyTextureTest,ClearAfterCopySubTextureLuminanceAlpha)1129*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, ClearAfterCopySubTextureLuminanceAlpha)
1130*8975f5c5SAndroid Build Coastguard Worker {
1131*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1132*8975f5c5SAndroid Build Coastguard Worker {
1133*8975f5c5SAndroid Build Coastguard Worker return;
1134*8975f5c5SAndroid Build Coastguard Worker }
1135*8975f5c5SAndroid Build Coastguard Worker
1136*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1137*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 4, 4, 0, GL_LUMINANCE_ALPHA,
1138*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1139*8975f5c5SAndroid Build Coastguard Worker
1140*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1141*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1142*8975f5c5SAndroid Build Coastguard Worker
1143*8975f5c5SAndroid Build Coastguard Worker glClearColor(1.0, 0.0, 0.0, 1.0);
1144*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1145*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1146*8975f5c5SAndroid Build Coastguard Worker
1147*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, 0, 0, 0, 0, 4, 4,
1148*8975f5c5SAndroid Build Coastguard Worker GL_TRUE, GL_FALSE, GL_TRUE);
1149*8975f5c5SAndroid Build Coastguard Worker
1150*8975f5c5SAndroid Build Coastguard Worker glClearColor(0.0, 1.0, 0.0, 1.0);
1151*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
1152*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1153*8975f5c5SAndroid Build Coastguard Worker }
1154*8975f5c5SAndroid Build Coastguard Worker
1155*8975f5c5SAndroid Build Coastguard Worker // Test every combination of copy [sub]texture parameters:
1156*8975f5c5SAndroid Build Coastguard Worker // source: ALPHA, RGB, RGBA, LUMINANCE, LUMINANCE_ALPHA, BGRA_EXT
1157*8975f5c5SAndroid Build Coastguard Worker // destination: RGB, RGBA, BGRA_EXT
1158*8975f5c5SAndroid Build Coastguard Worker // flipY: false, true
1159*8975f5c5SAndroid Build Coastguard Worker // premultiplyAlpha: false, true
1160*8975f5c5SAndroid Build Coastguard Worker // unmultiplyAlpha: false, true
1161*8975f5c5SAndroid Build Coastguard Worker namespace
1162*8975f5c5SAndroid Build Coastguard Worker {
1163*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kCopyTextureVariationsSrcFormats[] = {
1164*8975f5c5SAndroid Build Coastguard Worker GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_BGRA_EXT};
1165*8975f5c5SAndroid Build Coastguard Worker constexpr GLenum kCopyTextureVariationsDstFormats[] = {GL_RGB, GL_RGBA, GL_BGRA_EXT,
1166*8975f5c5SAndroid Build Coastguard Worker GL_SRGB_ALPHA_EXT};
1167*8975f5c5SAndroid Build Coastguard Worker constexpr GLint kMesaYFlips[] = {0, 1};
1168*8975f5c5SAndroid Build Coastguard Worker } // anonymous namespace
1169*8975f5c5SAndroid Build Coastguard Worker
TEST_P(CopyTextureVariationsTest,CopyTexture)1170*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureVariationsTest, CopyTexture)
1171*8975f5c5SAndroid Build Coastguard Worker {
1172*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264260
1173*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOzone());
1174*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263799
1175*8975f5c5SAndroid Build Coastguard Worker if (std::get<1>(GetParam()) == GL_ALPHA && std::get<2>(GetParam()) == GL_RGB &&
1176*8975f5c5SAndroid Build Coastguard Worker std::get<3>(GetParam()) && std::get<5>(GetParam()))
1177*8975f5c5SAndroid Build Coastguard Worker {
1178*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows7() && IsNVIDIA() && IsOpenGLES());
1179*8975f5c5SAndroid Build Coastguard Worker }
1180*8975f5c5SAndroid Build Coastguard Worker
1181*8975f5c5SAndroid Build Coastguard Worker if (std::get<6>(GetParam()))
1182*8975f5c5SAndroid Build Coastguard Worker {
1183*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
1184*8975f5c5SAndroid Build Coastguard Worker }
1185*8975f5c5SAndroid Build Coastguard Worker
1186*8975f5c5SAndroid Build Coastguard Worker testCopyTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()),
1187*8975f5c5SAndroid Build Coastguard Worker std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()),
1188*8975f5c5SAndroid Build Coastguard Worker std::get<6>(GetParam()));
1189*8975f5c5SAndroid Build Coastguard Worker }
1190*8975f5c5SAndroid Build Coastguard Worker
TEST_P(CopyTextureVariationsTest,CopySubTexture)1191*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureVariationsTest, CopySubTexture)
1192*8975f5c5SAndroid Build Coastguard Worker {
1193*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42264260
1194*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsOzone());
1195*8975f5c5SAndroid Build Coastguard Worker
1196*8975f5c5SAndroid Build Coastguard Worker if (std::get<6>(GetParam()))
1197*8975f5c5SAndroid Build Coastguard Worker {
1198*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
1199*8975f5c5SAndroid Build Coastguard Worker }
1200*8975f5c5SAndroid Build Coastguard Worker
1201*8975f5c5SAndroid Build Coastguard Worker testCopySubTexture(GL_TEXTURE_2D, std::get<1>(GetParam()), std::get<2>(GetParam()),
1202*8975f5c5SAndroid Build Coastguard Worker std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()),
1203*8975f5c5SAndroid Build Coastguard Worker std::get<6>(GetParam()));
1204*8975f5c5SAndroid Build Coastguard Worker }
1205*8975f5c5SAndroid Build Coastguard Worker
TEST_P(CopyTextureVariationsTest,CopyTextureRectangle)1206*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureVariationsTest, CopyTextureRectangle)
1207*8975f5c5SAndroid Build Coastguard Worker {
1208*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_rectangle"));
1209*8975f5c5SAndroid Build Coastguard Worker
1210*8975f5c5SAndroid Build Coastguard Worker if (std::get<6>(GetParam()))
1211*8975f5c5SAndroid Build Coastguard Worker {
1212*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
1213*8975f5c5SAndroid Build Coastguard Worker }
1214*8975f5c5SAndroid Build Coastguard Worker
1215*8975f5c5SAndroid Build Coastguard Worker testCopyTexture(GL_TEXTURE_RECTANGLE_ANGLE, std::get<1>(GetParam()), std::get<2>(GetParam()),
1216*8975f5c5SAndroid Build Coastguard Worker std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()),
1217*8975f5c5SAndroid Build Coastguard Worker std::get<6>(GetParam()));
1218*8975f5c5SAndroid Build Coastguard Worker }
1219*8975f5c5SAndroid Build Coastguard Worker
TEST_P(CopyTextureVariationsTest,CopySubTextureRectangle)1220*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureVariationsTest, CopySubTextureRectangle)
1221*8975f5c5SAndroid Build Coastguard Worker {
1222*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!EnsureGLExtensionEnabled("GL_ANGLE_texture_rectangle"));
1223*8975f5c5SAndroid Build Coastguard Worker
1224*8975f5c5SAndroid Build Coastguard Worker if (std::get<6>(GetParam()))
1225*8975f5c5SAndroid Build Coastguard Worker {
1226*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_MESA_framebuffer_flip_y"));
1227*8975f5c5SAndroid Build Coastguard Worker }
1228*8975f5c5SAndroid Build Coastguard Worker
1229*8975f5c5SAndroid Build Coastguard Worker testCopySubTexture(GL_TEXTURE_RECTANGLE_ANGLE, std::get<1>(GetParam()), std::get<2>(GetParam()),
1230*8975f5c5SAndroid Build Coastguard Worker std::get<3>(GetParam()), std::get<4>(GetParam()), std::get<5>(GetParam()),
1231*8975f5c5SAndroid Build Coastguard Worker std::get<6>(GetParam()));
1232*8975f5c5SAndroid Build Coastguard Worker }
1233*8975f5c5SAndroid Build Coastguard Worker
1234*8975f5c5SAndroid Build Coastguard Worker // Test that copying to cube maps works
TEST_P(CopyTextureTest,CubeMapTarget)1235*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CubeMapTarget)
1236*8975f5c5SAndroid Build Coastguard Worker {
1237*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1238*8975f5c5SAndroid Build Coastguard Worker {
1239*8975f5c5SAndroid Build Coastguard Worker return;
1240*8975f5c5SAndroid Build Coastguard Worker }
1241*8975f5c5SAndroid Build Coastguard Worker
1242*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42260718
1243*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsIntel() && IsDesktopOpenGL());
1244*8975f5c5SAndroid Build Coastguard Worker
1245*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42261821
1246*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
1247*8975f5c5SAndroid Build Coastguard Worker
1248*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[7] = {
1249*8975f5c5SAndroid Build Coastguard Worker GLColor(10u, 13u, 16u, 19u), GLColor(20u, 23u, 26u, 29u), GLColor(30u, 33u, 36u, 39u),
1250*8975f5c5SAndroid Build Coastguard Worker GLColor(40u, 43u, 46u, 49u), GLColor(50u, 53u, 56u, 59u), GLColor(60u, 63u, 66u, 69u),
1251*8975f5c5SAndroid Build Coastguard Worker GLColor(70u, 73u, 76u, 79u),
1252*8975f5c5SAndroid Build Coastguard Worker };
1253*8975f5c5SAndroid Build Coastguard Worker
1254*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1255*8975f5c5SAndroid Build Coastguard Worker
1256*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
1257*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1258*8975f5c5SAndroid Build Coastguard Worker face++)
1259*8975f5c5SAndroid Build Coastguard Worker {
1260*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1261*8975f5c5SAndroid Build Coastguard Worker }
1262*8975f5c5SAndroid Build Coastguard Worker
1263*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i)
1264*8975f5c5SAndroid Build Coastguard Worker {
1265*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1266*8975f5c5SAndroid Build Coastguard Worker face++)
1267*8975f5c5SAndroid Build Coastguard Worker {
1268*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1269*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1270*8975f5c5SAndroid Build Coastguard Worker &pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);
1271*8975f5c5SAndroid Build Coastguard Worker
1272*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 1, 1, false,
1273*8975f5c5SAndroid Build Coastguard Worker false, false);
1274*8975f5c5SAndroid Build Coastguard Worker }
1275*8975f5c5SAndroid Build Coastguard Worker
1276*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1277*8975f5c5SAndroid Build Coastguard Worker
1278*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1279*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1280*8975f5c5SAndroid Build Coastguard Worker
1281*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1282*8975f5c5SAndroid Build Coastguard Worker face++)
1283*8975f5c5SAndroid Build Coastguard Worker {
1284*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);
1285*8975f5c5SAndroid Build Coastguard Worker
1286*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
1287*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1288*8975f5c5SAndroid Build Coastguard Worker
1289*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);
1290*8975f5c5SAndroid Build Coastguard Worker
1291*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1292*8975f5c5SAndroid Build Coastguard Worker }
1293*8975f5c5SAndroid Build Coastguard Worker }
1294*8975f5c5SAndroid Build Coastguard Worker }
1295*8975f5c5SAndroid Build Coastguard Worker
1296*8975f5c5SAndroid Build Coastguard Worker // Test that we can successfully copy into incomplete cube maps. Regression test for
1297*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42262051
TEST_P(CopyTextureTest,IncompleteCubeMap)1298*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, IncompleteCubeMap)
1299*8975f5c5SAndroid Build Coastguard Worker {
1300*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1301*8975f5c5SAndroid Build Coastguard Worker {
1302*8975f5c5SAndroid Build Coastguard Worker return;
1303*8975f5c5SAndroid Build Coastguard Worker }
1304*8975f5c5SAndroid Build Coastguard Worker
1305*8975f5c5SAndroid Build Coastguard Worker GLTexture texture2D;
1306*8975f5c5SAndroid Build Coastguard Worker GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
1307*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture2D);
1308*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
1309*8975f5c5SAndroid Build Coastguard Worker
1310*8975f5c5SAndroid Build Coastguard Worker GLTexture textureCube;
1311*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, textureCube);
1312*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1313*8975f5c5SAndroid Build Coastguard Worker face++)
1314*8975f5c5SAndroid Build Coastguard Worker {
1315*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1316*8975f5c5SAndroid Build Coastguard Worker }
1317*8975f5c5SAndroid Build Coastguard Worker
1318*8975f5c5SAndroid Build Coastguard Worker // Set one face to 2x2
1319*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1320*8975f5c5SAndroid Build Coastguard Worker rgbaPixels);
1321*8975f5c5SAndroid Build Coastguard Worker
1322*8975f5c5SAndroid Build Coastguard Worker // Copy into the incomplete face
1323*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(texture2D, 0, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, textureCube, 0, 0, 0, 0,
1324*8975f5c5SAndroid Build Coastguard Worker 0, 2, 2, false, false, false);
1325*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1326*8975f5c5SAndroid Build Coastguard Worker }
1327*8975f5c5SAndroid Build Coastguard Worker
1328*8975f5c5SAndroid Build Coastguard Worker // Test BGRA to RGBA cube map copy
TEST_P(CopyTextureTest,CubeMapTargetBGRA)1329*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CubeMapTargetBGRA)
1330*8975f5c5SAndroid Build Coastguard Worker {
1331*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1332*8975f5c5SAndroid Build Coastguard Worker {
1333*8975f5c5SAndroid Build Coastguard Worker return;
1334*8975f5c5SAndroid Build Coastguard Worker }
1335*8975f5c5SAndroid Build Coastguard Worker
1336*8975f5c5SAndroid Build Coastguard Worker if (!IsGLExtensionEnabled("GL_EXT_texture_format_BGRA8888"))
1337*8975f5c5SAndroid Build Coastguard Worker {
1338*8975f5c5SAndroid Build Coastguard Worker return;
1339*8975f5c5SAndroid Build Coastguard Worker }
1340*8975f5c5SAndroid Build Coastguard Worker
1341*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42261821
1342*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
1343*8975f5c5SAndroid Build Coastguard Worker
1344*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[7] = {
1345*8975f5c5SAndroid Build Coastguard Worker GLColor(10u, 13u, 16u, 19u), GLColor(20u, 23u, 26u, 29u), GLColor(30u, 33u, 36u, 39u),
1346*8975f5c5SAndroid Build Coastguard Worker GLColor(40u, 43u, 46u, 49u), GLColor(50u, 53u, 56u, 59u), GLColor(60u, 63u, 66u, 69u),
1347*8975f5c5SAndroid Build Coastguard Worker GLColor(70u, 73u, 76u, 79u),
1348*8975f5c5SAndroid Build Coastguard Worker };
1349*8975f5c5SAndroid Build Coastguard Worker
1350*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1351*8975f5c5SAndroid Build Coastguard Worker
1352*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
1353*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1354*8975f5c5SAndroid Build Coastguard Worker face++)
1355*8975f5c5SAndroid Build Coastguard Worker {
1356*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1357*8975f5c5SAndroid Build Coastguard Worker }
1358*8975f5c5SAndroid Build Coastguard Worker
1359*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i)
1360*8975f5c5SAndroid Build Coastguard Worker {
1361*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1362*8975f5c5SAndroid Build Coastguard Worker face++)
1363*8975f5c5SAndroid Build Coastguard Worker {
1364*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1365*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
1366*8975f5c5SAndroid Build Coastguard Worker &pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);
1367*8975f5c5SAndroid Build Coastguard Worker
1368*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 1, 1, false,
1369*8975f5c5SAndroid Build Coastguard Worker false, false);
1370*8975f5c5SAndroid Build Coastguard Worker }
1371*8975f5c5SAndroid Build Coastguard Worker
1372*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1373*8975f5c5SAndroid Build Coastguard Worker
1374*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1375*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1376*8975f5c5SAndroid Build Coastguard Worker
1377*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1378*8975f5c5SAndroid Build Coastguard Worker face++)
1379*8975f5c5SAndroid Build Coastguard Worker {
1380*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);
1381*8975f5c5SAndroid Build Coastguard Worker
1382*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
1383*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1384*8975f5c5SAndroid Build Coastguard Worker
1385*8975f5c5SAndroid Build Coastguard Worker GLColor converted = pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i];
1386*8975f5c5SAndroid Build Coastguard Worker std::swap(converted.R, converted.B);
1387*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, converted);
1388*8975f5c5SAndroid Build Coastguard Worker
1389*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1390*8975f5c5SAndroid Build Coastguard Worker }
1391*8975f5c5SAndroid Build Coastguard Worker }
1392*8975f5c5SAndroid Build Coastguard Worker }
1393*8975f5c5SAndroid Build Coastguard Worker
1394*8975f5c5SAndroid Build Coastguard Worker // Test cube map copies with RGB format
TEST_P(CopyTextureTest,CubeMapTargetRGB)1395*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CubeMapTargetRGB)
1396*8975f5c5SAndroid Build Coastguard Worker {
1397*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1398*8975f5c5SAndroid Build Coastguard Worker {
1399*8975f5c5SAndroid Build Coastguard Worker return;
1400*8975f5c5SAndroid Build Coastguard Worker }
1401*8975f5c5SAndroid Build Coastguard Worker
1402*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42260718
1403*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsIntel() && IsDesktopOpenGL());
1404*8975f5c5SAndroid Build Coastguard Worker
1405*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42261821
1406*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsFuchsia() && IsIntel() && IsVulkan());
1407*8975f5c5SAndroid Build Coastguard Worker
1408*8975f5c5SAndroid Build Coastguard Worker constexpr uint8_t pixels[16 * 7] = {
1409*8975f5c5SAndroid Build Coastguard Worker 0u, 3u, 6u, 10u, 13u, 16u, 0, 0, 20u, 23u, 26u, 30u, 33u, 36u, 0, 0, // 2x2
1410*8975f5c5SAndroid Build Coastguard Worker 40u, 43u, 46u, 50u, 53u, 56u, 0, 0, 60u, 63u, 66u, 70u, 73u, 76u, 0, 0, // 2x2
1411*8975f5c5SAndroid Build Coastguard Worker 80u, 83u, 86u, 90u, 93u, 96u, 0, 0, 100u, 103u, 106u, 110u, 113u, 116u, 0, 0, // 2x2
1412*8975f5c5SAndroid Build Coastguard Worker 120u, 123u, 126u, 130u, 133u, 136u, 0, 0, 140u, 143u, 146u, 160u, 163u, 166u, 0, 0, // 2x2
1413*8975f5c5SAndroid Build Coastguard Worker 170u, 173u, 176u, 180u, 183u, 186u, 0, 0, 190u, 193u, 196u, 200u, 203u, 206u, 0, 0, // 2x2
1414*8975f5c5SAndroid Build Coastguard Worker 210u, 213u, 216u, 220u, 223u, 226u, 0, 0, 230u, 233u, 236u, 240u, 243u, 246u, 0, 0, // 2x2
1415*8975f5c5SAndroid Build Coastguard Worker 10u, 50u, 100u, 30u, 80u, 130u, 0, 0, 60u, 110u, 160u, 90u, 140u, 200u, 0, 0, // 2x2
1416*8975f5c5SAndroid Build Coastguard Worker };
1417*8975f5c5SAndroid Build Coastguard Worker
1418*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1419*8975f5c5SAndroid Build Coastguard Worker
1420*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
1421*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1422*8975f5c5SAndroid Build Coastguard Worker face++)
1423*8975f5c5SAndroid Build Coastguard Worker {
1424*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(face, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
1425*8975f5c5SAndroid Build Coastguard Worker }
1426*8975f5c5SAndroid Build Coastguard Worker
1427*8975f5c5SAndroid Build Coastguard Worker for (size_t i = 0; i < 2; ++i)
1428*8975f5c5SAndroid Build Coastguard Worker {
1429*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1430*8975f5c5SAndroid Build Coastguard Worker face++)
1431*8975f5c5SAndroid Build Coastguard Worker {
1432*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1433*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
1434*8975f5c5SAndroid Build Coastguard Worker &pixels[(face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) * 16]);
1435*8975f5c5SAndroid Build Coastguard Worker
1436*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 2, 2, false,
1437*8975f5c5SAndroid Build Coastguard Worker false, false);
1438*8975f5c5SAndroid Build Coastguard Worker }
1439*8975f5c5SAndroid Build Coastguard Worker
1440*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1441*8975f5c5SAndroid Build Coastguard Worker
1442*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1443*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1444*8975f5c5SAndroid Build Coastguard Worker
1445*8975f5c5SAndroid Build Coastguard Worker for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
1446*8975f5c5SAndroid Build Coastguard Worker face++)
1447*8975f5c5SAndroid Build Coastguard Worker {
1448*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);
1449*8975f5c5SAndroid Build Coastguard Worker
1450*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
1451*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1452*8975f5c5SAndroid Build Coastguard Worker
1453*8975f5c5SAndroid Build Coastguard Worker const uint8_t *faceData = &pixels[(face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) * 16];
1454*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(faceData[0], faceData[1], faceData[2], 255));
1455*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor(faceData[3], faceData[4], faceData[5], 255));
1456*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor(faceData[8], faceData[9], faceData[10], 255));
1457*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor(faceData[11], faceData[12], faceData[13], 255));
1458*8975f5c5SAndroid Build Coastguard Worker
1459*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1460*8975f5c5SAndroid Build Coastguard Worker }
1461*8975f5c5SAndroid Build Coastguard Worker }
1462*8975f5c5SAndroid Build Coastguard Worker }
1463*8975f5c5SAndroid Build Coastguard Worker
1464*8975f5c5SAndroid Build Coastguard Worker // Test that copying to non-zero mipmaps works
TEST_P(CopyTextureTest,CopyToMipmap)1465*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopyToMipmap)
1466*8975f5c5SAndroid Build Coastguard Worker {
1467*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1468*8975f5c5SAndroid Build Coastguard Worker {
1469*8975f5c5SAndroid Build Coastguard Worker return;
1470*8975f5c5SAndroid Build Coastguard Worker }
1471*8975f5c5SAndroid Build Coastguard Worker
1472*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
1473*8975f5c5SAndroid Build Coastguard Worker !IsGLExtensionEnabled("GL_OES_fbo_render_mipmap"));
1474*8975f5c5SAndroid Build Coastguard Worker
1475*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
1476*8975f5c5SAndroid Build Coastguard Worker
1477*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1478*8975f5c5SAndroid Build Coastguard Worker
1479*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1480*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1481*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1482*8975f5c5SAndroid Build Coastguard Worker
1483*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
1484*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1485*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1486*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1487*8975f5c5SAndroid Build Coastguard Worker
1488*8975f5c5SAndroid Build Coastguard Worker std::vector<std::pair<GLint, GLint>> soureDestPairs;
1489*8975f5c5SAndroid Build Coastguard Worker soureDestPairs.push_back(std::make_pair(0, 1));
1490*8975f5c5SAndroid Build Coastguard Worker
1491*8975f5c5SAndroid Build Coastguard Worker // ES3 allows copying from non-zero mips
1492*8975f5c5SAndroid Build Coastguard Worker if (getClientMajorVersion() >= 3)
1493*8975f5c5SAndroid Build Coastguard Worker {
1494*8975f5c5SAndroid Build Coastguard Worker soureDestPairs.push_back(std::make_pair(1, 2));
1495*8975f5c5SAndroid Build Coastguard Worker }
1496*8975f5c5SAndroid Build Coastguard Worker
1497*8975f5c5SAndroid Build Coastguard Worker for (const auto &sourceDestPair : soureDestPairs)
1498*8975f5c5SAndroid Build Coastguard Worker {
1499*8975f5c5SAndroid Build Coastguard Worker const GLint sourceLevel = sourceDestPair.first;
1500*8975f5c5SAndroid Build Coastguard Worker const GLint destLevel = sourceDestPair.second;
1501*8975f5c5SAndroid Build Coastguard Worker
1502*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(textures[0], sourceLevel, GL_TEXTURE_2D, textures[1], destLevel,
1503*8975f5c5SAndroid Build Coastguard Worker GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
1504*8975f5c5SAndroid Build Coastguard Worker
1505*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1506*8975f5c5SAndroid Build Coastguard Worker
1507*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1508*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1509*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
1510*8975f5c5SAndroid Build Coastguard Worker destLevel);
1511*8975f5c5SAndroid Build Coastguard Worker
1512*8975f5c5SAndroid Build Coastguard Worker // Check that FB is complete.
1513*8975f5c5SAndroid Build Coastguard Worker EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
1514*8975f5c5SAndroid Build Coastguard Worker
1515*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[0]);
1516*8975f5c5SAndroid Build Coastguard Worker
1517*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1518*8975f5c5SAndroid Build Coastguard Worker }
1519*8975f5c5SAndroid Build Coastguard Worker }
1520*8975f5c5SAndroid Build Coastguard Worker
1521*8975f5c5SAndroid Build Coastguard Worker // Test that copying outside the mipmap range works
TEST_P(CopyTextureTest,CopyOutsideMipmap)1522*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, CopyOutsideMipmap)
1523*8975f5c5SAndroid Build Coastguard Worker {
1524*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1525*8975f5c5SAndroid Build Coastguard Worker {
1526*8975f5c5SAndroid Build Coastguard Worker return;
1527*8975f5c5SAndroid Build Coastguard Worker }
1528*8975f5c5SAndroid Build Coastguard Worker
1529*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263316
1530*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsD3D());
1531*8975f5c5SAndroid Build Coastguard Worker
1532*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263799
1533*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsNVIDIA() && IsOpenGL());
1534*8975f5c5SAndroid Build Coastguard Worker
1535*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
1536*8975f5c5SAndroid Build Coastguard Worker
1537*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
1538*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
1539*8975f5c5SAndroid Build Coastguard Worker GLint textureLoc = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
1540*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, textureLoc);
1541*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLoc, 0);
1542*8975f5c5SAndroid Build Coastguard Worker
1543*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1544*8975f5c5SAndroid Build Coastguard Worker
1545*8975f5c5SAndroid Build Coastguard Worker // Create two single-mip textures.
1546*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
1547*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1548*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::red);
1549*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1550*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1551*8975f5c5SAndroid Build Coastguard Worker
1552*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
1553*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &GLColor::green);
1554*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
1555*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1556*8975f5c5SAndroid Build Coastguard Worker
1557*8975f5c5SAndroid Build Coastguard Worker // Commit texture 0
1558*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1559*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
1560*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1561*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1562*8975f5c5SAndroid Build Coastguard Worker
1563*8975f5c5SAndroid Build Coastguard Worker // Copy texture 1 into mip 1 of texture 0. This mip is outside the range of the image allocated
1564*8975f5c5SAndroid Build Coastguard Worker // for texture 0.
1565*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(textures[1], 0, GL_TEXTURE_2D, textures[0], 1, GL_RGBA, GL_UNSIGNED_BYTE,
1566*8975f5c5SAndroid Build Coastguard Worker false, false, false);
1567*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1568*8975f5c5SAndroid Build Coastguard Worker
1569*8975f5c5SAndroid Build Coastguard Worker // Draw with texture 0 again
1570*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, std::string(essl1_shaders::PositionAttrib()), 0.5f);
1571*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
1572*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1573*8975f5c5SAndroid Build Coastguard Worker }
1574*8975f5c5SAndroid Build Coastguard Worker
1575*8975f5c5SAndroid Build Coastguard Worker // Test that copying from an RGBA8 texture to RGBA4 results in exactly 4-bit precision in the result
TEST_P(CopyTextureTest,DownsampleRGBA4444)1576*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, DownsampleRGBA4444)
1577*8975f5c5SAndroid Build Coastguard Worker {
1578*8975f5c5SAndroid Build Coastguard Worker // Downsampling on copy is only guarenteed on D3D11
1579*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsD3D11());
1580*8975f5c5SAndroid Build Coastguard Worker
1581*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1582*8975f5c5SAndroid Build Coastguard Worker
1583*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[] = {GLColor(0, 5, 6, 7), GLColor(17, 22, 25, 24), GLColor(34, 35, 36, 36),
1584*8975f5c5SAndroid Build Coastguard Worker GLColor(51, 53, 55, 55)};
1585*8975f5c5SAndroid Build Coastguard Worker
1586*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1587*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1588*8975f5c5SAndroid Build Coastguard Worker
1589*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
1590*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGBA,
1591*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_SHORT_4_4_4_4, GL_FALSE, GL_FALSE, GL_FALSE);
1592*8975f5c5SAndroid Build Coastguard Worker
1593*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1594*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1595*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
1596*8975f5c5SAndroid Build Coastguard Worker
1597*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 0), 1.0);
1598*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(17, 17, 17, 17), 1.0);
1599*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(34, 34, 34, 34), 1.0);
1600*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(51, 51, 51, 51), 1.0);
1601*8975f5c5SAndroid Build Coastguard Worker
1602*8975f5c5SAndroid Build Coastguard Worker testGradientDownsampleUniqueValues(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, {16, 16, 16, 16});
1603*8975f5c5SAndroid Build Coastguard Worker }
1604*8975f5c5SAndroid Build Coastguard Worker
1605*8975f5c5SAndroid Build Coastguard Worker // Test that copying from an RGBA8 texture to RGB565 results in exactly 4-bit precision in the
1606*8975f5c5SAndroid Build Coastguard Worker // result
TEST_P(CopyTextureTest,DownsampleRGB565)1607*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, DownsampleRGB565)
1608*8975f5c5SAndroid Build Coastguard Worker {
1609*8975f5c5SAndroid Build Coastguard Worker // Downsampling on copy is only guarenteed on D3D11
1610*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsD3D11());
1611*8975f5c5SAndroid Build Coastguard Worker
1612*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1613*8975f5c5SAndroid Build Coastguard Worker
1614*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[] = {GLColor(0, 5, 2, 14), GLColor(17, 22, 25, 30), GLColor(34, 33, 36, 46),
1615*8975f5c5SAndroid Build Coastguard Worker GLColor(50, 54, 49, 60)};
1616*8975f5c5SAndroid Build Coastguard Worker
1617*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1618*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1619*8975f5c5SAndroid Build Coastguard Worker
1620*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
1621*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGB,
1622*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_SHORT_5_6_5, GL_FALSE, GL_FALSE, GL_FALSE);
1623*8975f5c5SAndroid Build Coastguard Worker
1624*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1625*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1626*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
1627*8975f5c5SAndroid Build Coastguard Worker
1628*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 4, 0, 255), 1.0);
1629*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(16, 20, 25, 255), 1.0);
1630*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(33, 32, 33, 255), 1.0);
1631*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(49, 53, 49, 255), 1.0);
1632*8975f5c5SAndroid Build Coastguard Worker
1633*8975f5c5SAndroid Build Coastguard Worker testGradientDownsampleUniqueValues(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, {32, 64, 32, 1});
1634*8975f5c5SAndroid Build Coastguard Worker }
1635*8975f5c5SAndroid Build Coastguard Worker
1636*8975f5c5SAndroid Build Coastguard Worker // Test that copying from an RGBA8 texture to RGBA5551 results in exactly 4-bit precision in the
1637*8975f5c5SAndroid Build Coastguard Worker // result
TEST_P(CopyTextureTest,DownsampleRGBA5551)1638*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, DownsampleRGBA5551)
1639*8975f5c5SAndroid Build Coastguard Worker {
1640*8975f5c5SAndroid Build Coastguard Worker // Downsampling on copy is only guarenteed on D3D11
1641*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsD3D11());
1642*8975f5c5SAndroid Build Coastguard Worker
1643*8975f5c5SAndroid Build Coastguard Worker GLTexture textures[2];
1644*8975f5c5SAndroid Build Coastguard Worker
1645*8975f5c5SAndroid Build Coastguard Worker GLColor pixels[] = {GLColor(0, 1, 2, 3), GLColor(14, 16, 17, 18), GLColor(33, 34, 36, 46),
1646*8975f5c5SAndroid Build Coastguard Worker GLColor(50, 51, 52, 255)};
1647*8975f5c5SAndroid Build Coastguard Worker
1648*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[0]);
1649*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
1650*8975f5c5SAndroid Build Coastguard Worker
1651*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, textures[1]);
1652*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGBA,
1653*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_SHORT_5_5_5_1, GL_FALSE, GL_FALSE, GL_FALSE);
1654*8975f5c5SAndroid Build Coastguard Worker
1655*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
1656*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1657*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
1658*8975f5c5SAndroid Build Coastguard Worker
1659*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 0), 1.0);
1660*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(16, 16, 16, 0), 1.0);
1661*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(33, 33, 33, 0), 1.0);
1662*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(49, 49, 49, 255), 1.0);
1663*8975f5c5SAndroid Build Coastguard Worker
1664*8975f5c5SAndroid Build Coastguard Worker testGradientDownsampleUniqueValues(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, {32, 32, 32, 2});
1665*8975f5c5SAndroid Build Coastguard Worker }
1666*8975f5c5SAndroid Build Coastguard Worker
1667*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with LUMINANCE texture as a destination
TEST_P(CopyTextureTestDest,Luminance)1668*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, Luminance)
1669*8975f5c5SAndroid Build Coastguard Worker {
1670*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1671*8975f5c5SAndroid Build Coastguard Worker {
1672*8975f5c5SAndroid Build Coastguard Worker return;
1673*8975f5c5SAndroid Build Coastguard Worker }
1674*8975f5c5SAndroid Build Coastguard Worker
1675*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 200u);
1676*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(50u, 50u, 50u, 255u);
1677*8975f5c5SAndroid Build Coastguard Worker
1678*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
1679*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1680*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1681*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1682*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1683*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
1684*8975f5c5SAndroid Build Coastguard Worker
1685*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
1686*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1687*8975f5c5SAndroid Build Coastguard Worker
1688*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1689*8975f5c5SAndroid Build Coastguard Worker
1690*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1691*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1692*8975f5c5SAndroid Build Coastguard Worker
1693*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1694*8975f5c5SAndroid Build Coastguard Worker
1695*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1696*8975f5c5SAndroid Build Coastguard Worker }
1697*8975f5c5SAndroid Build Coastguard Worker
1698*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with LUMINANCE texture as a destination with
1699*8975f5c5SAndroid Build Coastguard Worker // UnpackPremultiply parameter
TEST_P(CopyTextureTestDest,LuminanceMultiply)1700*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, LuminanceMultiply)
1701*8975f5c5SAndroid Build Coastguard Worker {
1702*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1703*8975f5c5SAndroid Build Coastguard Worker {
1704*8975f5c5SAndroid Build Coastguard Worker return;
1705*8975f5c5SAndroid Build Coastguard Worker }
1706*8975f5c5SAndroid Build Coastguard Worker
1707*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 200u);
1708*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(39u, 39u, 39u, 255u);
1709*8975f5c5SAndroid Build Coastguard Worker
1710*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
1711*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1712*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1713*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1714*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1715*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
1716*8975f5c5SAndroid Build Coastguard Worker
1717*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
1718*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false);
1719*8975f5c5SAndroid Build Coastguard Worker
1720*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1721*8975f5c5SAndroid Build Coastguard Worker
1722*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1723*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1724*8975f5c5SAndroid Build Coastguard Worker
1725*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1726*8975f5c5SAndroid Build Coastguard Worker
1727*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1728*8975f5c5SAndroid Build Coastguard Worker }
1729*8975f5c5SAndroid Build Coastguard Worker
1730*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with LUMINANCE texture as a destination with
1731*8975f5c5SAndroid Build Coastguard Worker // UnpackUnmultiply parameter
TEST_P(CopyTextureTestDest,LuminanceUnmultiply)1732*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, LuminanceUnmultiply)
1733*8975f5c5SAndroid Build Coastguard Worker {
1734*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1735*8975f5c5SAndroid Build Coastguard Worker {
1736*8975f5c5SAndroid Build Coastguard Worker return;
1737*8975f5c5SAndroid Build Coastguard Worker }
1738*8975f5c5SAndroid Build Coastguard Worker
1739*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 200u);
1740*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(64u, 64u, 64u, 255u);
1741*8975f5c5SAndroid Build Coastguard Worker
1742*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
1743*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1744*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1745*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1746*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1747*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
1748*8975f5c5SAndroid Build Coastguard Worker
1749*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
1750*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true);
1751*8975f5c5SAndroid Build Coastguard Worker
1752*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1753*8975f5c5SAndroid Build Coastguard Worker
1754*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1755*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1756*8975f5c5SAndroid Build Coastguard Worker
1757*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1758*8975f5c5SAndroid Build Coastguard Worker
1759*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1760*8975f5c5SAndroid Build Coastguard Worker }
1761*8975f5c5SAndroid Build Coastguard Worker
1762*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination
TEST_P(CopyTextureTestDest,LuminanceAlpha)1763*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, LuminanceAlpha)
1764*8975f5c5SAndroid Build Coastguard Worker {
1765*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1766*8975f5c5SAndroid Build Coastguard Worker {
1767*8975f5c5SAndroid Build Coastguard Worker return;
1768*8975f5c5SAndroid Build Coastguard Worker }
1769*8975f5c5SAndroid Build Coastguard Worker
1770*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 200u);
1771*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(50u, 50u, 50u, 200u);
1772*8975f5c5SAndroid Build Coastguard Worker
1773*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
1774*8975f5c5SAndroid Build Coastguard Worker // RGBA texture to verify contents.
1775*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1776*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1777*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1778*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
1779*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1780*8975f5c5SAndroid Build Coastguard Worker
1781*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
1782*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1783*8975f5c5SAndroid Build Coastguard Worker
1784*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1785*8975f5c5SAndroid Build Coastguard Worker
1786*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1787*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1788*8975f5c5SAndroid Build Coastguard Worker
1789*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1790*8975f5c5SAndroid Build Coastguard Worker }
1791*8975f5c5SAndroid Build Coastguard Worker
1792*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with
1793*8975f5c5SAndroid Build Coastguard Worker // UnpackPremultiply parameter
TEST_P(CopyTextureTestDest,LuminanceAlphaMultiply)1794*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, LuminanceAlphaMultiply)
1795*8975f5c5SAndroid Build Coastguard Worker {
1796*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1797*8975f5c5SAndroid Build Coastguard Worker {
1798*8975f5c5SAndroid Build Coastguard Worker return;
1799*8975f5c5SAndroid Build Coastguard Worker }
1800*8975f5c5SAndroid Build Coastguard Worker
1801*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 200u);
1802*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(39u, 39u, 39u, 200u);
1803*8975f5c5SAndroid Build Coastguard Worker
1804*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
1805*8975f5c5SAndroid Build Coastguard Worker // RGBA texture to verify contents.
1806*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1807*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1808*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1809*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
1810*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1811*8975f5c5SAndroid Build Coastguard Worker
1812*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
1813*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false);
1814*8975f5c5SAndroid Build Coastguard Worker
1815*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1816*8975f5c5SAndroid Build Coastguard Worker
1817*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1818*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1819*8975f5c5SAndroid Build Coastguard Worker
1820*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1821*8975f5c5SAndroid Build Coastguard Worker }
1822*8975f5c5SAndroid Build Coastguard Worker
1823*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with
1824*8975f5c5SAndroid Build Coastguard Worker // UnpackUnmultiplyAlpha parameter
TEST_P(CopyTextureTestDest,LuminanceAlphaUnmultiply)1825*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, LuminanceAlphaUnmultiply)
1826*8975f5c5SAndroid Build Coastguard Worker {
1827*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1828*8975f5c5SAndroid Build Coastguard Worker {
1829*8975f5c5SAndroid Build Coastguard Worker return;
1830*8975f5c5SAndroid Build Coastguard Worker }
1831*8975f5c5SAndroid Build Coastguard Worker
1832*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 200u);
1833*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(64u, 64u, 64u, 200u);
1834*8975f5c5SAndroid Build Coastguard Worker
1835*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
1836*8975f5c5SAndroid Build Coastguard Worker // RGBA texture to verify contents.
1837*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1838*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1839*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1840*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
1841*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
1842*8975f5c5SAndroid Build Coastguard Worker
1843*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
1844*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true);
1845*8975f5c5SAndroid Build Coastguard Worker
1846*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1847*8975f5c5SAndroid Build Coastguard Worker
1848*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1849*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1850*8975f5c5SAndroid Build Coastguard Worker
1851*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1852*8975f5c5SAndroid Build Coastguard Worker
1853*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1854*8975f5c5SAndroid Build Coastguard Worker }
1855*8975f5c5SAndroid Build Coastguard Worker
1856*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with ALPHA texture as a destination
TEST_P(CopyTextureTestDest,Alpha)1857*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, Alpha)
1858*8975f5c5SAndroid Build Coastguard Worker {
1859*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1860*8975f5c5SAndroid Build Coastguard Worker {
1861*8975f5c5SAndroid Build Coastguard Worker return;
1862*8975f5c5SAndroid Build Coastguard Worker }
1863*8975f5c5SAndroid Build Coastguard Worker
1864*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 155u);
1865*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(0u, 0u, 0u, 155u);
1866*8975f5c5SAndroid Build Coastguard Worker
1867*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
1868*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1869*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1870*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1871*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1872*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
1873*8975f5c5SAndroid Build Coastguard Worker
1874*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
1875*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1876*8975f5c5SAndroid Build Coastguard Worker
1877*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1878*8975f5c5SAndroid Build Coastguard Worker
1879*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1880*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1881*8975f5c5SAndroid Build Coastguard Worker
1882*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1883*8975f5c5SAndroid Build Coastguard Worker
1884*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1885*8975f5c5SAndroid Build Coastguard Worker }
1886*8975f5c5SAndroid Build Coastguard Worker
1887*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with ALPHA texture as a destination with
1888*8975f5c5SAndroid Build Coastguard Worker // UnpackPremultiplyAlpha parameter
TEST_P(CopyTextureTestDest,AlphaMultiply)1889*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, AlphaMultiply)
1890*8975f5c5SAndroid Build Coastguard Worker {
1891*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1892*8975f5c5SAndroid Build Coastguard Worker {
1893*8975f5c5SAndroid Build Coastguard Worker return;
1894*8975f5c5SAndroid Build Coastguard Worker }
1895*8975f5c5SAndroid Build Coastguard Worker
1896*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 155u);
1897*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(0u, 0u, 0u, 155u);
1898*8975f5c5SAndroid Build Coastguard Worker
1899*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
1900*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1901*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1902*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1903*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1904*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
1905*8975f5c5SAndroid Build Coastguard Worker
1906*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
1907*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false);
1908*8975f5c5SAndroid Build Coastguard Worker
1909*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1910*8975f5c5SAndroid Build Coastguard Worker
1911*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1912*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1913*8975f5c5SAndroid Build Coastguard Worker
1914*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1915*8975f5c5SAndroid Build Coastguard Worker
1916*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1917*8975f5c5SAndroid Build Coastguard Worker }
1918*8975f5c5SAndroid Build Coastguard Worker
1919*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture works with ALPHA texture as a destination with
1920*8975f5c5SAndroid Build Coastguard Worker // UnpackUnmultiplyAlpha parameter
TEST_P(CopyTextureTestDest,AlphaUnmultiply)1921*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, AlphaUnmultiply)
1922*8975f5c5SAndroid Build Coastguard Worker {
1923*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
1924*8975f5c5SAndroid Build Coastguard Worker {
1925*8975f5c5SAndroid Build Coastguard Worker return;
1926*8975f5c5SAndroid Build Coastguard Worker }
1927*8975f5c5SAndroid Build Coastguard Worker
1928*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 155u);
1929*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(0u, 0u, 0u, 155u);
1930*8975f5c5SAndroid Build Coastguard Worker
1931*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
1932*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1933*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1934*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1935*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1936*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
1937*8975f5c5SAndroid Build Coastguard Worker
1938*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
1939*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true);
1940*8975f5c5SAndroid Build Coastguard Worker
1941*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1942*8975f5c5SAndroid Build Coastguard Worker
1943*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1944*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1945*8975f5c5SAndroid Build Coastguard Worker
1946*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1947*8975f5c5SAndroid Build Coastguard Worker
1948*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1949*8975f5c5SAndroid Build Coastguard Worker }
1950*8975f5c5SAndroid Build Coastguard Worker
1951*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture uses the correct ALPHA passthrough shader to ensure RGB channels
1952*8975f5c5SAndroid Build Coastguard Worker // are set to 0.
TEST_P(CopyTextureTestDest,AlphaCopyWithRGB)1953*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestDest, AlphaCopyWithRGB)
1954*8975f5c5SAndroid Build Coastguard Worker {
1955*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40644706
1956*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsIntel() && IsLinux() && IsOpenGLES());
1957*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!checkExtensions());
1958*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_texture_half_float"));
1959*8975f5c5SAndroid Build Coastguard Worker
1960*8975f5c5SAndroid Build Coastguard Worker GLColor originalPixels(50u, 100u, 150u, 155u);
1961*8975f5c5SAndroid Build Coastguard Worker GLColor expectedPixels(0u, 0u, 0u, 155u);
1962*8975f5c5SAndroid Build Coastguard Worker
1963*8975f5c5SAndroid Build Coastguard Worker // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
1964*8975f5c5SAndroid Build Coastguard Worker // texture to verify contents.
1965*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
1966*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
1967*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
1968*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_HALF_FLOAT_OES, nullptr);
1969*8975f5c5SAndroid Build Coastguard Worker
1970*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
1971*8975f5c5SAndroid Build Coastguard Worker GL_HALF_FLOAT_OES, false, false, false);
1972*8975f5c5SAndroid Build Coastguard Worker
1973*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1974*8975f5c5SAndroid Build Coastguard Worker
1975*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
1976*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
1977*8975f5c5SAndroid Build Coastguard Worker
1978*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
1979*8975f5c5SAndroid Build Coastguard Worker
1980*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1981*8975f5c5SAndroid Build Coastguard Worker }
1982*8975f5c5SAndroid Build Coastguard Worker
1983*8975f5c5SAndroid Build Coastguard Worker // Bug where TEXTURE_SWIZZLE_RGBA was not reset after the Luminance workaround. (crbug.com/1022080)
TEST_P(CopyTextureTestES3,LuminanceWorkaroundTextureSwizzleBug)1984*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, LuminanceWorkaroundTextureSwizzleBug)
1985*8975f5c5SAndroid Build Coastguard Worker {
1986*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_texture_sRGB"));
1987*8975f5c5SAndroid Build Coastguard Worker
1988*8975f5c5SAndroid Build Coastguard Worker {
1989*8975f5c5SAndroid Build Coastguard Worker GLColor pixels(50u, 20u, 100u, 150u);
1990*8975f5c5SAndroid Build Coastguard Worker
1991*8975f5c5SAndroid Build Coastguard Worker // Hit BlitGL::copySubImageToLUMAWorkaroundTexture by copying an ALPHA texture
1992*8975f5c5SAndroid Build Coastguard Worker GLTexture srcTexture;
1993*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, srcTexture);
1994*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
1995*8975f5c5SAndroid Build Coastguard Worker
1996*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFBO;
1997*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFBO);
1998*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture, 0);
1999*8975f5c5SAndroid Build Coastguard Worker
2000*8975f5c5SAndroid Build Coastguard Worker GLTexture dstTexture;
2001*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, dstTexture);
2002*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
2003*8975f5c5SAndroid Build Coastguard Worker
2004*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, 1, 1);
2005*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2006*8975f5c5SAndroid Build Coastguard Worker }
2007*8975f5c5SAndroid Build Coastguard Worker
2008*8975f5c5SAndroid Build Coastguard Worker {
2009*8975f5c5SAndroid Build Coastguard Worker // This time hit BlitGL::blitColorBufferWithShader by copying an SRGB texture
2010*8975f5c5SAndroid Build Coastguard Worker GLColor pixels(100u, 200u, 50u, 210u);
2011*8975f5c5SAndroid Build Coastguard Worker
2012*8975f5c5SAndroid Build Coastguard Worker GLTexture srcTexture;
2013*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, srcTexture);
2014*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT,
2015*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, &pixels);
2016*8975f5c5SAndroid Build Coastguard Worker
2017*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFBO;
2018*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
2019*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, srcTexture,
2020*8975f5c5SAndroid Build Coastguard Worker 0);
2021*8975f5c5SAndroid Build Coastguard Worker
2022*8975f5c5SAndroid Build Coastguard Worker GLTexture dstTexture;
2023*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, dstTexture);
2024*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, 1, 1, 0, GL_SRGB_ALPHA_EXT,
2025*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
2026*8975f5c5SAndroid Build Coastguard Worker
2027*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer dstFBO;
2028*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, dstFBO);
2029*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, dstTexture,
2030*8975f5c5SAndroid Build Coastguard Worker 0);
2031*8975f5c5SAndroid Build Coastguard Worker
2032*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, 1, 1, 0, 0, 1, 1, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2033*8975f5c5SAndroid Build Coastguard Worker
2034*8975f5c5SAndroid Build Coastguard Worker // The previous workaround should not affect this copy
2035*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, dstFBO);
2036*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
2037*8975f5c5SAndroid Build Coastguard Worker }
2038*8975f5c5SAndroid Build Coastguard Worker }
2039*8975f5c5SAndroid Build Coastguard Worker
2040*8975f5c5SAndroid Build Coastguard Worker // Test to ensure that CopyTexture will fail with a non-zero level and NPOT texture in WebGL
TEST_P(CopyTextureTestWebGL,NPOT)2041*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestWebGL, NPOT)
2042*8975f5c5SAndroid Build Coastguard Worker {
2043*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionRequestable("GL_CHROMIUM_copy_texture"))
2044*8975f5c5SAndroid Build Coastguard Worker {
2045*8975f5c5SAndroid Build Coastguard Worker glRequestExtensionANGLE("GL_CHROMIUM_copy_texture");
2046*8975f5c5SAndroid Build Coastguard Worker }
2047*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_CHROMIUM_copy_texture"));
2048*8975f5c5SAndroid Build Coastguard Worker
2049*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor> pixelData(10 * 10, GLColor::red);
2050*8975f5c5SAndroid Build Coastguard Worker
2051*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
2052*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
2053*8975f5c5SAndroid Build Coastguard Worker
2054*8975f5c5SAndroid Build Coastguard Worker // Do a basic copy to make sure things work
2055*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
2056*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
2057*8975f5c5SAndroid Build Coastguard Worker
2058*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2059*8975f5c5SAndroid Build Coastguard Worker
2060*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
2061*8975f5c5SAndroid Build Coastguard Worker
2062*8975f5c5SAndroid Build Coastguard Worker // Do the same operation with destLevel 1, which should fail
2063*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 1, GL_RGBA,
2064*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false);
2065*8975f5c5SAndroid Build Coastguard Worker
2066*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_ERROR(GL_INVALID_VALUE);
2067*8975f5c5SAndroid Build Coastguard Worker }
2068*8975f5c5SAndroid Build Coastguard Worker
2069*8975f5c5SAndroid Build Coastguard Worker // Test the newly added ES3 unorm formats
TEST_P(CopyTextureTestES3,ES3UnormFormats)2070*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, ES3UnormFormats)
2071*8975f5c5SAndroid Build Coastguard Worker {
2072*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
2073*8975f5c5SAndroid Build Coastguard Worker {
2074*8975f5c5SAndroid Build Coastguard Worker return;
2075*8975f5c5SAndroid Build Coastguard Worker }
2076*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096654
2077*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid());
2078*8975f5c5SAndroid Build Coastguard Worker
2079*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263690
2080*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsOpenGL() && IsIntel());
2081*8975f5c5SAndroid Build Coastguard Worker
2082*8975f5c5SAndroid Build Coastguard Worker auto testOutput = [this](GLuint texture, const GLColor &expectedColor) {
2083*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
2084*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2085*8975f5c5SAndroid Build Coastguard Worker "in vec4 position;\n"
2086*8975f5c5SAndroid Build Coastguard Worker "out vec2 texcoord;\n"
2087*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2088*8975f5c5SAndroid Build Coastguard Worker "{\n"
2089*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
2090*8975f5c5SAndroid Build Coastguard Worker " texcoord = (position.xy * 0.5) + 0.5;\n"
2091*8975f5c5SAndroid Build Coastguard Worker "}\n";
2092*8975f5c5SAndroid Build Coastguard Worker
2093*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
2094*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2095*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
2096*8975f5c5SAndroid Build Coastguard Worker "uniform sampler2D tex;\n"
2097*8975f5c5SAndroid Build Coastguard Worker "in vec2 texcoord;\n"
2098*8975f5c5SAndroid Build Coastguard Worker "out vec4 color;\n"
2099*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2100*8975f5c5SAndroid Build Coastguard Worker "{\n"
2101*8975f5c5SAndroid Build Coastguard Worker " color = texture(tex, texcoord);\n"
2102*8975f5c5SAndroid Build Coastguard Worker "}\n";
2103*8975f5c5SAndroid Build Coastguard Worker
2104*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
2105*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2106*8975f5c5SAndroid Build Coastguard Worker
2107*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
2108*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
2109*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
2110*8975f5c5SAndroid Build Coastguard Worker
2111*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2112*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2113*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
2114*8975f5c5SAndroid Build Coastguard Worker
2115*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
2116*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2117*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2118*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2119*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program, "tex"), 0);
2120*8975f5c5SAndroid Build Coastguard Worker
2121*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
2122*8975f5c5SAndroid Build Coastguard Worker
2123*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, 1.0);
2124*8975f5c5SAndroid Build Coastguard Worker };
2125*8975f5c5SAndroid Build Coastguard Worker
2126*8975f5c5SAndroid Build Coastguard Worker auto testCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
2127*8975f5c5SAndroid Build Coastguard Worker GLenum sourceType, const GLColor &sourceColor,
2128*8975f5c5SAndroid Build Coastguard Worker GLenum destInternalFormat, GLenum destType, bool flipY,
2129*8975f5c5SAndroid Build Coastguard Worker bool premultiplyAlpha, bool unmultiplyAlpha,
2130*8975f5c5SAndroid Build Coastguard Worker const GLColor &expectedColor) {
2131*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2132*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2133*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
2134*8975f5c5SAndroid Build Coastguard Worker &sourceColor);
2135*8975f5c5SAndroid Build Coastguard Worker
2136*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
2137*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2138*8975f5c5SAndroid Build Coastguard Worker
2139*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
2140*8975f5c5SAndroid Build Coastguard Worker destType, flipY, premultiplyAlpha, unmultiplyAlpha);
2141*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2142*8975f5c5SAndroid Build Coastguard Worker
2143*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, expectedColor);
2144*8975f5c5SAndroid Build Coastguard Worker };
2145*8975f5c5SAndroid Build Coastguard Worker
2146*8975f5c5SAndroid Build Coastguard Worker auto testSubCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
2147*8975f5c5SAndroid Build Coastguard Worker GLenum sourceType, const GLColor &sourceColor,
2148*8975f5c5SAndroid Build Coastguard Worker GLenum destInternalFormat, GLenum destFormat,
2149*8975f5c5SAndroid Build Coastguard Worker GLenum destType, bool flipY, bool premultiplyAlpha,
2150*8975f5c5SAndroid Build Coastguard Worker bool unmultiplyAlpha, const GLColor &expectedColor) {
2151*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2152*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2153*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
2154*8975f5c5SAndroid Build Coastguard Worker &sourceColor);
2155*8975f5c5SAndroid Build Coastguard Worker
2156*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
2157*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2158*8975f5c5SAndroid Build Coastguard Worker
2159*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, destInternalFormat, 1, 1, 0, destFormat, destType, nullptr);
2160*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 0, 1, 1,
2161*8975f5c5SAndroid Build Coastguard Worker flipY, premultiplyAlpha, unmultiplyAlpha);
2162*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2163*8975f5c5SAndroid Build Coastguard Worker
2164*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, expectedColor);
2165*8975f5c5SAndroid Build Coastguard Worker };
2166*8975f5c5SAndroid Build Coastguard Worker
2167*8975f5c5SAndroid Build Coastguard Worker // New LUMA source formats
2168*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGB,
2169*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor(128, 128, 128, 255));
2170*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
2171*8975f5c5SAndroid Build Coastguard Worker GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, false,
2172*8975f5c5SAndroid Build Coastguard Worker GLColor(128, 128, 128, 255));
2173*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
2174*8975f5c5SAndroid Build Coastguard Worker GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, true, false,
2175*8975f5c5SAndroid Build Coastguard Worker GLColor(32, 32, 32, 255));
2176*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
2177*8975f5c5SAndroid Build Coastguard Worker GLColor(128, 128, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, true,
2178*8975f5c5SAndroid Build Coastguard Worker GLColor(255, 255, 255, 255));
2179*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
2180*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor(0, 0, 0, 128));
2181*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
2182*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true, GLColor(0, 0, 0, 128));
2183*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
2184*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false, GLColor(0, 0, 0, 128));
2185*8975f5c5SAndroid Build Coastguard Worker
2186*8975f5c5SAndroid Build Coastguard Worker // New sRGB dest formats
2187*8975f5c5SAndroid Build Coastguard Worker if (IsGLExtensionEnabled("GL_EXT_sRGB"))
2188*8975f5c5SAndroid Build Coastguard Worker {
2189*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
2190*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor(55, 13, 4, 255));
2191*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
2192*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false, GLColor(13, 4, 1, 255));
2193*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2194*8975f5c5SAndroid Build Coastguard Worker GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false, false,
2195*8975f5c5SAndroid Build Coastguard Worker GLColor(55, 13, 4, 128));
2196*8975f5c5SAndroid Build Coastguard Worker
2197*8975f5c5SAndroid Build Coastguard Worker testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2198*8975f5c5SAndroid Build Coastguard Worker GL_SRGB, GL_SRGB, GL_UNSIGNED_BYTE, false, false, false,
2199*8975f5c5SAndroid Build Coastguard Worker GLColor(55, 13, 4, 255));
2200*8975f5c5SAndroid Build Coastguard Worker testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2201*8975f5c5SAndroid Build Coastguard Worker GL_SRGB, GL_SRGB, GL_UNSIGNED_BYTE, false, true, false,
2202*8975f5c5SAndroid Build Coastguard Worker GLColor(13, 4, 1, 255));
2203*8975f5c5SAndroid Build Coastguard Worker testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2204*8975f5c5SAndroid Build Coastguard Worker GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false,
2205*8975f5c5SAndroid Build Coastguard Worker false, GLColor(55, 13, 4, 128));
2206*8975f5c5SAndroid Build Coastguard Worker }
2207*8975f5c5SAndroid Build Coastguard Worker }
2208*8975f5c5SAndroid Build Coastguard Worker
2209*8975f5c5SAndroid Build Coastguard Worker // Test the newly added ES3 float formats
TEST_P(CopyTextureTestES3,ES3FloatFormats)2210*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, ES3FloatFormats)
2211*8975f5c5SAndroid Build Coastguard Worker {
2212*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
2213*8975f5c5SAndroid Build Coastguard Worker {
2214*8975f5c5SAndroid Build Coastguard Worker return;
2215*8975f5c5SAndroid Build Coastguard Worker }
2216*8975f5c5SAndroid Build Coastguard Worker
2217*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
2218*8975f5c5SAndroid Build Coastguard Worker
2219*8975f5c5SAndroid Build Coastguard Worker auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {
2220*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
2221*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2222*8975f5c5SAndroid Build Coastguard Worker "in vec4 position;\n"
2223*8975f5c5SAndroid Build Coastguard Worker "out vec2 texcoord;\n"
2224*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2225*8975f5c5SAndroid Build Coastguard Worker "{\n"
2226*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
2227*8975f5c5SAndroid Build Coastguard Worker " texcoord = (position.xy * 0.5) + 0.5;\n"
2228*8975f5c5SAndroid Build Coastguard Worker "}\n";
2229*8975f5c5SAndroid Build Coastguard Worker
2230*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
2231*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2232*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
2233*8975f5c5SAndroid Build Coastguard Worker "uniform sampler2D tex;\n"
2234*8975f5c5SAndroid Build Coastguard Worker "in vec2 texcoord;\n"
2235*8975f5c5SAndroid Build Coastguard Worker "out vec4 color;\n"
2236*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2237*8975f5c5SAndroid Build Coastguard Worker "{\n"
2238*8975f5c5SAndroid Build Coastguard Worker " color = texture(tex, texcoord);\n"
2239*8975f5c5SAndroid Build Coastguard Worker "}\n";
2240*8975f5c5SAndroid Build Coastguard Worker
2241*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
2242*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2243*8975f5c5SAndroid Build Coastguard Worker
2244*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
2245*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
2246*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);
2247*8975f5c5SAndroid Build Coastguard Worker
2248*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2249*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2250*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
2251*8975f5c5SAndroid Build Coastguard Worker
2252*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
2253*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2254*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2255*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2256*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program, "tex"), 0);
2257*8975f5c5SAndroid Build Coastguard Worker
2258*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
2259*8975f5c5SAndroid Build Coastguard Worker
2260*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);
2261*8975f5c5SAndroid Build Coastguard Worker };
2262*8975f5c5SAndroid Build Coastguard Worker
2263*8975f5c5SAndroid Build Coastguard Worker auto testCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
2264*8975f5c5SAndroid Build Coastguard Worker GLenum sourceType, const GLColor &sourceColor,
2265*8975f5c5SAndroid Build Coastguard Worker GLenum destInternalFormat, GLenum destType, bool flipY,
2266*8975f5c5SAndroid Build Coastguard Worker bool premultiplyAlpha, bool unmultiplyAlpha,
2267*8975f5c5SAndroid Build Coastguard Worker const GLColor32F &expectedColor) {
2268*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2269*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2270*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
2271*8975f5c5SAndroid Build Coastguard Worker &sourceColor);
2272*8975f5c5SAndroid Build Coastguard Worker
2273*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
2274*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2275*8975f5c5SAndroid Build Coastguard Worker
2276*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
2277*8975f5c5SAndroid Build Coastguard Worker destType, flipY, premultiplyAlpha, unmultiplyAlpha);
2278*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2279*8975f5c5SAndroid Build Coastguard Worker
2280*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, expectedColor);
2281*8975f5c5SAndroid Build Coastguard Worker };
2282*8975f5c5SAndroid Build Coastguard Worker
2283*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
2284*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 0.5f));
2285*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
2286*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 0.5f));
2287*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
2288*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 0.5f));
2289*8975f5c5SAndroid Build Coastguard Worker
2290*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
2291*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.0f, 0.0f, 1.0f));
2292*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
2293*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.0f, 0.0f, 1.0f));
2294*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
2295*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.0f, 0.0f, 1.0f));
2296*8975f5c5SAndroid Build Coastguard Worker
2297*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
2298*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.0f, 1.0f));
2299*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
2300*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0f, 1.0f));
2301*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
2302*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.0f, 1.0f));
2303*8975f5c5SAndroid Build Coastguard Worker
2304*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
2305*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
2306*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
2307*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
2308*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
2309*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
2310*8975f5c5SAndroid Build Coastguard Worker
2311*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2312*8975f5c5SAndroid Build Coastguard Worker GL_R11F_G11F_B10F, GL_FLOAT, false, false, false,
2313*8975f5c5SAndroid Build Coastguard Worker GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
2314*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2315*8975f5c5SAndroid Build Coastguard Worker GL_R11F_G11F_B10F, GL_FLOAT, false, true, false,
2316*8975f5c5SAndroid Build Coastguard Worker GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
2317*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
2318*8975f5c5SAndroid Build Coastguard Worker GL_R11F_G11F_B10F, GL_FLOAT, false, false, true,
2319*8975f5c5SAndroid Build Coastguard Worker GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
2320*8975f5c5SAndroid Build Coastguard Worker
2321*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
2322*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
2323*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
2324*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
2325*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
2326*8975f5c5SAndroid Build Coastguard Worker GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
2327*8975f5c5SAndroid Build Coastguard Worker }
2328*8975f5c5SAndroid Build Coastguard Worker
2329*8975f5c5SAndroid Build Coastguard Worker // Test the newly added ES3 unsigned integer formats
TEST_P(CopyTextureTestES3,ES3UintFormats)2330*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, ES3UintFormats)
2331*8975f5c5SAndroid Build Coastguard Worker {
2332*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsLinux() && IsOpenGL() && IsIntel());
2333*8975f5c5SAndroid Build Coastguard Worker
2334*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
2335*8975f5c5SAndroid Build Coastguard Worker {
2336*8975f5c5SAndroid Build Coastguard Worker return;
2337*8975f5c5SAndroid Build Coastguard Worker }
2338*8975f5c5SAndroid Build Coastguard Worker
2339*8975f5c5SAndroid Build Coastguard Worker using GLColor32U = std::tuple<GLuint, GLuint, GLuint, GLuint>;
2340*8975f5c5SAndroid Build Coastguard Worker
2341*8975f5c5SAndroid Build Coastguard Worker auto testOutput = [this](GLuint texture, const GLColor32U &expectedColor) {
2342*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
2343*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2344*8975f5c5SAndroid Build Coastguard Worker "in vec4 position;\n"
2345*8975f5c5SAndroid Build Coastguard Worker "out vec2 texcoord;\n"
2346*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2347*8975f5c5SAndroid Build Coastguard Worker "{\n"
2348*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
2349*8975f5c5SAndroid Build Coastguard Worker " texcoord = (position.xy * 0.5) + 0.5;\n"
2350*8975f5c5SAndroid Build Coastguard Worker "}\n";
2351*8975f5c5SAndroid Build Coastguard Worker
2352*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
2353*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2354*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
2355*8975f5c5SAndroid Build Coastguard Worker "precision mediump usampler2D;\n"
2356*8975f5c5SAndroid Build Coastguard Worker "in vec2 texcoord;\n"
2357*8975f5c5SAndroid Build Coastguard Worker "uniform usampler2D tex;\n"
2358*8975f5c5SAndroid Build Coastguard Worker "out uvec4 color;\n"
2359*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2360*8975f5c5SAndroid Build Coastguard Worker "{\n"
2361*8975f5c5SAndroid Build Coastguard Worker " color = texture(tex, texcoord);\n"
2362*8975f5c5SAndroid Build Coastguard Worker "}\n";
2363*8975f5c5SAndroid Build Coastguard Worker
2364*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
2365*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2366*8975f5c5SAndroid Build Coastguard Worker
2367*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
2368*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
2369*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8UI, 1, 1);
2370*8975f5c5SAndroid Build Coastguard Worker
2371*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2372*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2373*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
2374*8975f5c5SAndroid Build Coastguard Worker
2375*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
2376*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2377*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2378*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2379*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program, "tex"), 0);
2380*8975f5c5SAndroid Build Coastguard Worker
2381*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
2382*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2383*8975f5c5SAndroid Build Coastguard Worker
2384*8975f5c5SAndroid Build Coastguard Worker GLuint pixel[4] = {0};
2385*8975f5c5SAndroid Build Coastguard Worker glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);
2386*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2387*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(std::get<0>(expectedColor), pixel[0], 1);
2388*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(std::get<1>(expectedColor), pixel[1], 1);
2389*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(std::get<2>(expectedColor), pixel[2], 1);
2390*8975f5c5SAndroid Build Coastguard Worker EXPECT_NEAR(std::get<3>(expectedColor), pixel[3], 1);
2391*8975f5c5SAndroid Build Coastguard Worker };
2392*8975f5c5SAndroid Build Coastguard Worker
2393*8975f5c5SAndroid Build Coastguard Worker auto testCopyCombination = [testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
2394*8975f5c5SAndroid Build Coastguard Worker GLenum sourceType, const GLColor &sourceColor,
2395*8975f5c5SAndroid Build Coastguard Worker GLenum destInternalFormat, GLenum destType, bool flipY,
2396*8975f5c5SAndroid Build Coastguard Worker bool premultiplyAlpha, bool unmultiplyAlpha,
2397*8975f5c5SAndroid Build Coastguard Worker const GLColor32U &expectedColor) {
2398*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2399*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2400*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
2401*8975f5c5SAndroid Build Coastguard Worker &sourceColor);
2402*8975f5c5SAndroid Build Coastguard Worker
2403*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
2404*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2405*8975f5c5SAndroid Build Coastguard Worker
2406*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
2407*8975f5c5SAndroid Build Coastguard Worker destType, flipY, premultiplyAlpha, unmultiplyAlpha);
2408*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2409*8975f5c5SAndroid Build Coastguard Worker
2410*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, expectedColor);
2411*8975f5c5SAndroid Build Coastguard Worker };
2412*8975f5c5SAndroid Build Coastguard Worker
2413*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
2414*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 128));
2415*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
2416*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 128));
2417*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
2418*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 128));
2419*8975f5c5SAndroid Build Coastguard Worker
2420*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
2421*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 1));
2422*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
2423*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 1));
2424*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
2425*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 1));
2426*8975f5c5SAndroid Build Coastguard Worker
2427*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
2428*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 0, 1));
2429*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
2430*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 0, 1));
2431*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
2432*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 0, 1));
2433*8975f5c5SAndroid Build Coastguard Worker
2434*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
2435*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 0, 0, 1));
2436*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
2437*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 0, 0, 1));
2438*8975f5c5SAndroid Build Coastguard Worker testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(120, 64, 32, 128), GL_R8UI,
2439*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, false, false, true, GLColor32U(240, 0, 0, 1));
2440*8975f5c5SAndroid Build Coastguard Worker }
2441*8975f5c5SAndroid Build Coastguard Worker
2442*8975f5c5SAndroid Build Coastguard Worker // Test that using an offset in CopySubTexture works correctly for non-renderable float targets
TEST_P(CopyTextureTestES3,CopySubTextureOffsetNonRenderableFloat)2443*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, CopySubTextureOffsetNonRenderableFloat)
2444*8975f5c5SAndroid Build Coastguard Worker {
2445*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
2446*8975f5c5SAndroid Build Coastguard Worker {
2447*8975f5c5SAndroid Build Coastguard Worker return;
2448*8975f5c5SAndroid Build Coastguard Worker }
2449*8975f5c5SAndroid Build Coastguard Worker
2450*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_color_buffer_float"));
2451*8975f5c5SAndroid Build Coastguard Worker
2452*8975f5c5SAndroid Build Coastguard Worker auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {
2453*8975f5c5SAndroid Build Coastguard Worker constexpr char kVS[] =
2454*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2455*8975f5c5SAndroid Build Coastguard Worker "in vec4 position;\n"
2456*8975f5c5SAndroid Build Coastguard Worker "out vec2 texcoord;\n"
2457*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2458*8975f5c5SAndroid Build Coastguard Worker "{\n"
2459*8975f5c5SAndroid Build Coastguard Worker " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
2460*8975f5c5SAndroid Build Coastguard Worker " texcoord = (position.xy * 0.5) + 0.5;\n"
2461*8975f5c5SAndroid Build Coastguard Worker "}\n";
2462*8975f5c5SAndroid Build Coastguard Worker
2463*8975f5c5SAndroid Build Coastguard Worker constexpr char kFS[] =
2464*8975f5c5SAndroid Build Coastguard Worker "#version 300 es\n"
2465*8975f5c5SAndroid Build Coastguard Worker "precision mediump float;\n"
2466*8975f5c5SAndroid Build Coastguard Worker "uniform sampler2D tex;\n"
2467*8975f5c5SAndroid Build Coastguard Worker "in vec2 texcoord;\n"
2468*8975f5c5SAndroid Build Coastguard Worker "out vec4 color;\n"
2469*8975f5c5SAndroid Build Coastguard Worker "void main()\n"
2470*8975f5c5SAndroid Build Coastguard Worker "{\n"
2471*8975f5c5SAndroid Build Coastguard Worker " color = texture(tex, texcoord);\n"
2472*8975f5c5SAndroid Build Coastguard Worker "}\n";
2473*8975f5c5SAndroid Build Coastguard Worker
2474*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, kVS, kFS);
2475*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2476*8975f5c5SAndroid Build Coastguard Worker
2477*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
2478*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
2479*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);
2480*8975f5c5SAndroid Build Coastguard Worker
2481*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer fbo;
2482*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2483*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
2484*8975f5c5SAndroid Build Coastguard Worker
2485*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
2486*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2487*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2488*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2489*8975f5c5SAndroid Build Coastguard Worker glUniform1i(glGetUniformLocation(program, "tex"), 0);
2490*8975f5c5SAndroid Build Coastguard Worker
2491*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, "position", 0.5f, 1.0f, true);
2492*8975f5c5SAndroid Build Coastguard Worker
2493*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);
2494*8975f5c5SAndroid Build Coastguard Worker };
2495*8975f5c5SAndroid Build Coastguard Worker
2496*8975f5c5SAndroid Build Coastguard Worker auto testCopy = [this, testOutput](GLenum destInternalFormat, GLenum destFormat,
2497*8975f5c5SAndroid Build Coastguard Worker GLenum destType) {
2498*8975f5c5SAndroid Build Coastguard Worker GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
2499*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
2500*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
2501*8975f5c5SAndroid Build Coastguard Worker
2502*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
2503*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2504*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, destInternalFormat, 1, 1, 0, destFormat, destType, nullptr);
2505*8975f5c5SAndroid Build Coastguard Worker
2506*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 0, 1, 1,
2507*8975f5c5SAndroid Build Coastguard Worker false, false, false);
2508*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2509*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, kFloatRed);
2510*8975f5c5SAndroid Build Coastguard Worker
2511*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 1, 0, 1, 1,
2512*8975f5c5SAndroid Build Coastguard Worker false, false, false);
2513*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2514*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, kFloatGreen);
2515*8975f5c5SAndroid Build Coastguard Worker
2516*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 1, 1, 1,
2517*8975f5c5SAndroid Build Coastguard Worker false, false, false);
2518*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2519*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, kFloatBlue);
2520*8975f5c5SAndroid Build Coastguard Worker
2521*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 1, 1, 1, 1,
2522*8975f5c5SAndroid Build Coastguard Worker false, false, false);
2523*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2524*8975f5c5SAndroid Build Coastguard Worker testOutput(destTexture, kFloatBlack);
2525*8975f5c5SAndroid Build Coastguard Worker };
2526*8975f5c5SAndroid Build Coastguard Worker
2527*8975f5c5SAndroid Build Coastguard Worker testCopy(GL_RGB9_E5, GL_RGB, GL_FLOAT);
2528*8975f5c5SAndroid Build Coastguard Worker }
2529*8975f5c5SAndroid Build Coastguard Worker
2530*8975f5c5SAndroid Build Coastguard Worker // Test that copying from one mip to another works
TEST_P(CopyTextureTestES3,CopyBetweenMips)2531*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, CopyBetweenMips)
2532*8975f5c5SAndroid Build Coastguard Worker {
2533*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
2534*8975f5c5SAndroid Build Coastguard Worker {
2535*8975f5c5SAndroid Build Coastguard Worker return;
2536*8975f5c5SAndroid Build Coastguard Worker }
2537*8975f5c5SAndroid Build Coastguard Worker
2538*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
2539*8975f5c5SAndroid Build Coastguard Worker
2540*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl3_shaders::vs::Texture2DLod(), essl3_shaders::fs::Texture2DLod());
2541*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2542*8975f5c5SAndroid Build Coastguard Worker GLint textureLoc = glGetUniformLocation(program, essl3_shaders::Texture2DUniform());
2543*8975f5c5SAndroid Build Coastguard Worker GLint lodLoc = glGetUniformLocation(program, essl3_shaders::LodUniform());
2544*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, textureLoc);
2545*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, lodLoc);
2546*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLoc, 0);
2547*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 0);
2548*8975f5c5SAndroid Build Coastguard Worker
2549*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2550*8975f5c5SAndroid Build Coastguard Worker
2551*8975f5c5SAndroid Build Coastguard Worker // Create a texture with 3 mips. Mip0 will contain an image as follows:
2552*8975f5c5SAndroid Build Coastguard Worker //
2553*8975f5c5SAndroid Build Coastguard Worker // G G B G
2554*8975f5c5SAndroid Build Coastguard Worker // G R R G
2555*8975f5c5SAndroid Build Coastguard Worker // G R R G
2556*8975f5c5SAndroid Build Coastguard Worker // G G G G
2557*8975f5c5SAndroid Build Coastguard Worker //
2558*8975f5c5SAndroid Build Coastguard Worker // The 2x2 red square and 1x1 blue square will be copied to the other mips.
2559*8975f5c5SAndroid Build Coastguard Worker const GLColor kMip0InitColor[4 * 4] = {
2560*8975f5c5SAndroid Build Coastguard Worker GLColor::green, GLColor::green, GLColor::blue, GLColor::green,
2561*8975f5c5SAndroid Build Coastguard Worker GLColor::green, GLColor::red, GLColor::red, GLColor::green,
2562*8975f5c5SAndroid Build Coastguard Worker GLColor::green, GLColor::red, GLColor::red, GLColor::green,
2563*8975f5c5SAndroid Build Coastguard Worker GLColor::green, GLColor::green, GLColor::green, GLColor::green,
2564*8975f5c5SAndroid Build Coastguard Worker };
2565*8975f5c5SAndroid Build Coastguard Worker const GLColor kMipOtherInitColor[4] = {
2566*8975f5c5SAndroid Build Coastguard Worker GLColor::black,
2567*8975f5c5SAndroid Build Coastguard Worker GLColor::black,
2568*8975f5c5SAndroid Build Coastguard Worker GLColor::black,
2569*8975f5c5SAndroid Build Coastguard Worker GLColor::black,
2570*8975f5c5SAndroid Build Coastguard Worker };
2571*8975f5c5SAndroid Build Coastguard Worker
2572*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
2573*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2574*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMip0InitColor);
2575*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMipOtherInitColor);
2576*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, kMipOtherInitColor);
2577*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
2578*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2579*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2580*8975f5c5SAndroid Build Coastguard Worker
2581*8975f5c5SAndroid Build Coastguard Worker // Commit texture
2582*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 0);
2583*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2584*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMip0InitColor[0]);
2585*8975f5c5SAndroid Build Coastguard Worker
2586*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 1);
2587*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2588*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMipOtherInitColor[0]);
2589*8975f5c5SAndroid Build Coastguard Worker
2590*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 2);
2591*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2592*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMipOtherInitColor[0]);
2593*8975f5c5SAndroid Build Coastguard Worker
2594*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2595*8975f5c5SAndroid Build Coastguard Worker
2596*8975f5c5SAndroid Build Coastguard Worker // Copy from mip 0 to mip 1. The level is not redefined, so a direct copy can potentially be
2597*8975f5c5SAndroid Build Coastguard Worker // done.
2598*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(texture, 0, GL_TEXTURE_2D, texture, 1, 0, 0, 1, 1, 2, 2, false, false,
2599*8975f5c5SAndroid Build Coastguard Worker false);
2600*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2601*8975f5c5SAndroid Build Coastguard Worker
2602*8975f5c5SAndroid Build Coastguard Worker // Copy from mip 0 to mip 2. Again, the level is not redefined.
2603*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(texture, 0, GL_TEXTURE_2D, texture, 2, 0, 0, 2, 0, 1, 1, false, false,
2604*8975f5c5SAndroid Build Coastguard Worker false);
2605*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2606*8975f5c5SAndroid Build Coastguard Worker
2607*8975f5c5SAndroid Build Coastguard Worker // Verify mips 1 and 2.
2608*8975f5c5SAndroid Build Coastguard Worker int w = getWindowWidth() - 1;
2609*8975f5c5SAndroid Build Coastguard Worker int h = getWindowHeight() - 1;
2610*8975f5c5SAndroid Build Coastguard Worker
2611*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 1);
2612*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2613*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMip0InitColor[4 * 1 + 1]);
2614*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, 0, kMip0InitColor[4 * 1 + 2]);
2615*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h, kMip0InitColor[4 * 2 + 1]);
2616*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, h, kMip0InitColor[4 * 2 + 2]);
2617*8975f5c5SAndroid Build Coastguard Worker
2618*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 2);
2619*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl3_shaders::PositionAttrib(), 0.5f);
2620*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kMip0InitColor[4 * 0 + 2]);
2621*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, 0, kMip0InitColor[4 * 0 + 2]);
2622*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, h, kMip0InitColor[4 * 0 + 2]);
2623*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(w, h, kMip0InitColor[4 * 0 + 2]);
2624*8975f5c5SAndroid Build Coastguard Worker }
2625*8975f5c5SAndroid Build Coastguard Worker
2626*8975f5c5SAndroid Build Coastguard Worker // Test that swizzle on source texture does not affect the copy.
TEST_P(CopyTextureTestES3,SwizzleOnSource)2627*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, SwizzleOnSource)
2628*8975f5c5SAndroid Build Coastguard Worker {
2629*8975f5c5SAndroid Build Coastguard Worker const GLColor kSourceColor = GLColor(31, 73, 146, 228);
2630*8975f5c5SAndroid Build Coastguard Worker
2631*8975f5c5SAndroid Build Coastguard Worker // Create image with swizzle. If swizzle is mistakenly applied, resulting color would be
2632*8975f5c5SAndroid Build Coastguard Worker // kSourceColor.gbar
2633*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2634*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2635*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &kSourceColor);
2636*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_GREEN);
2637*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_BLUE);
2638*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_ALPHA);
2639*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_RED);
2640*8975f5c5SAndroid Build Coastguard Worker
2641*8975f5c5SAndroid Build Coastguard Worker GLTexture destTexture;
2642*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2643*8975f5c5SAndroid Build Coastguard Worker
2644*8975f5c5SAndroid Build Coastguard Worker // Note: flipY is used to avoid direct transfer between textures and force a draw-based path.
2645*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, GL_RGBA8,
2646*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, true, false, false);
2647*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2648*8975f5c5SAndroid Build Coastguard Worker
2649*8975f5c5SAndroid Build Coastguard Worker // Verify the copy.
2650*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Texture2D(), essl1_shaders::fs::Texture2D());
2651*8975f5c5SAndroid Build Coastguard Worker glUseProgram(program);
2652*8975f5c5SAndroid Build Coastguard Worker
2653*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
2654*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, destTexture);
2655*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
2656*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
2657*8975f5c5SAndroid Build Coastguard Worker
2658*8975f5c5SAndroid Build Coastguard Worker GLint textureLocation = glGetUniformLocation(program, essl1_shaders::Texture2DUniform());
2659*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, textureLocation);
2660*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLocation, 0);
2661*8975f5c5SAndroid Build Coastguard Worker
2662*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, 0);
2663*8975f5c5SAndroid Build Coastguard Worker
2664*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.5f);
2665*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2666*8975f5c5SAndroid Build Coastguard Worker
2667*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, kSourceColor);
2668*8975f5c5SAndroid Build Coastguard Worker }
2669*8975f5c5SAndroid Build Coastguard Worker
2670*8975f5c5SAndroid Build Coastguard Worker // Test that the right error type is triggered when
2671*8975f5c5SAndroid Build Coastguard Worker // OES_EGL_image_external_essl3 is required but not supported
TEST_P(CopyTextureTestES3,CopySubTextureMissingRequiredExtension)2672*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, CopySubTextureMissingRequiredExtension)
2673*8975f5c5SAndroid Build Coastguard Worker {
2674*8975f5c5SAndroid Build Coastguard Worker if (!checkExtensions())
2675*8975f5c5SAndroid Build Coastguard Worker {
2676*8975f5c5SAndroid Build Coastguard Worker return;
2677*8975f5c5SAndroid Build Coastguard Worker }
2678*8975f5c5SAndroid Build Coastguard Worker
2679*8975f5c5SAndroid Build Coastguard Worker // decide if the test is relevant
2680*8975f5c5SAndroid Build Coastguard Worker // If GL_OES_EGL_image_external_essl3 is supported, then no need to test
2681*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsGLExtensionEnabled("GL_OES_EGL_image_external_essl3"));
2682*8975f5c5SAndroid Build Coastguard Worker // GL_OES_EGL_image_external extension is required to use TEXTURE_EXTERNAL_OES
2683*8975f5c5SAndroid Build Coastguard Worker // as the texture target. So if GL_OES_EGL_image_external is not supported,
2684*8975f5c5SAndroid Build Coastguard Worker // the error case cannot happen.
2685*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_EGL_image_external"));
2686*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
2687*8975f5c5SAndroid Build Coastguard Worker EGLDisplay dpy = window->getDisplay();
2688*8975f5c5SAndroid Build Coastguard Worker // If EGL_KHR_image_base is not supported, then eglImageKHR cannot be used,
2689*8975f5c5SAndroid Build Coastguard Worker // and therefore the error case cannot happen
2690*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(dpy, "EGL_KHR_image_base"));
2691*8975f5c5SAndroid Build Coastguard Worker
2692*8975f5c5SAndroid Build Coastguard Worker // prepare test data
2693*8975f5c5SAndroid Build Coastguard Worker // create the texture data
2694*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2695*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2696*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2697*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kSourceColor(2 * 2, GLColor::green);
2698*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2699*8975f5c5SAndroid Build Coastguard Worker kSourceColor.data());
2700*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2701*8975f5c5SAndroid Build Coastguard Worker
2702*8975f5c5SAndroid Build Coastguard Worker // create the image and load the texture data
2703*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint attribs[] = {
2704*8975f5c5SAndroid Build Coastguard Worker EGL_IMAGE_PRESERVED,
2705*8975f5c5SAndroid Build Coastguard Worker EGL_TRUE,
2706*8975f5c5SAndroid Build Coastguard Worker EGL_NONE,
2707*8975f5c5SAndroid Build Coastguard Worker };
2708*8975f5c5SAndroid Build Coastguard Worker EGLImageKHR image = eglCreateImageKHR(
2709*8975f5c5SAndroid Build Coastguard Worker window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
2710*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(texture)), attribs);
2711*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2712*8975f5c5SAndroid Build Coastguard Worker // source is from the image
2713*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextures[0]);
2714*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2715*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);
2716*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2717*8975f5c5SAndroid Build Coastguard Worker
2718*8975f5c5SAndroid Build Coastguard Worker // dest
2719*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
2720*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2721*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8UI, 3, 3, 0, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, nullptr);
2722*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2723*8975f5c5SAndroid Build Coastguard Worker
2724*8975f5c5SAndroid Build Coastguard Worker // This copying needs EGLImageExternalEssl3OES extension
2725*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
2726*8975f5c5SAndroid Build Coastguard Worker false, false, false);
2727*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_ERROR(GL_INVALID_OPERATION);
2728*8975f5c5SAndroid Build Coastguard Worker
2729*8975f5c5SAndroid Build Coastguard Worker // Non-integer dest internal format doesn't need the extension
2730*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
2731*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2732*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2733*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2734*8975f5c5SAndroid Build Coastguard Worker
2735*8975f5c5SAndroid Build Coastguard Worker glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
2736*8975f5c5SAndroid Build Coastguard Worker false, false, false);
2737*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2738*8975f5c5SAndroid Build Coastguard Worker }
2739*8975f5c5SAndroid Build Coastguard Worker
2740*8975f5c5SAndroid Build Coastguard Worker // Test copying from gles texture to EGLImage
TEST_P(CopyTextureTestES3,CopyImageSubDataToEGLImage)2741*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, CopyImageSubDataToEGLImage)
2742*8975f5c5SAndroid Build Coastguard Worker {
2743*8975f5c5SAndroid Build Coastguard Worker // GL_OES_EGL_image_external extension is required to use TEXTURE_EXTERNAL_OES
2744*8975f5c5SAndroid Build Coastguard Worker // as the texture target. So if GL_OES_EGL_image_external is not supported,
2745*8975f5c5SAndroid Build Coastguard Worker // the error case cannot happen.
2746*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_EGL_image_external"));
2747*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_copy_image extension is required to use glCopyImageSubDataEXT to
2748*8975f5c5SAndroid Build Coastguard Worker // copy from/to GL_TEXTURE_EXTERNAL_OES texture target. If GL_EXT_copy_image
2749*8975f5c5SAndroid Build Coastguard Worker // is not supported, then no need to test.
2750*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
2751*8975f5c5SAndroid Build Coastguard Worker
2752*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
2753*8975f5c5SAndroid Build Coastguard Worker EGLDisplay dpy = window->getDisplay();
2754*8975f5c5SAndroid Build Coastguard Worker // If EGL_KHR_image_base is not supported, then eglImageKHR cannot be used,
2755*8975f5c5SAndroid Build Coastguard Worker // and therefore the error case cannot happen
2756*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(dpy, "EGL_KHR_image_base"));
2757*8975f5c5SAndroid Build Coastguard Worker
2758*8975f5c5SAndroid Build Coastguard Worker // Prepare test data
2759*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2760*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2761*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2762*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kDstColor(4 * 4, GLColor::red);
2763*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, kDstColor.data());
2764*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2765*8975f5c5SAndroid Build Coastguard Worker
2766*8975f5c5SAndroid Build Coastguard Worker // Create the egl image and bind it to target GL_TEXTURE_EXTERNAL_OES
2767*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint attribs[] = {
2768*8975f5c5SAndroid Build Coastguard Worker EGL_IMAGE_PRESERVED,
2769*8975f5c5SAndroid Build Coastguard Worker EGL_TRUE,
2770*8975f5c5SAndroid Build Coastguard Worker EGL_NONE,
2771*8975f5c5SAndroid Build Coastguard Worker };
2772*8975f5c5SAndroid Build Coastguard Worker EGLImageKHR image = eglCreateImageKHR(
2773*8975f5c5SAndroid Build Coastguard Worker window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
2774*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(texture)), attribs);
2775*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2776*8975f5c5SAndroid Build Coastguard Worker
2777*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextures[0]);
2778*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2779*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);
2780*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2781*8975f5c5SAndroid Build Coastguard Worker
2782*8975f5c5SAndroid Build Coastguard Worker // Prepare the source texture data
2783*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
2784*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2785*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kSourceColor(4 * 4, GLColor::green);
2786*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2787*8975f5c5SAndroid Build Coastguard Worker kSourceColor.data());
2788*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2789*8975f5c5SAndroid Build Coastguard Worker
2790*8975f5c5SAndroid Build Coastguard Worker // Copy from gles texture to EGLImage.
2791*8975f5c5SAndroid Build Coastguard Worker // This copying needs EGLImageExternalEssl3OES and GL_EXT_copy_image extension
2792*8975f5c5SAndroid Build Coastguard Worker glCopyImageSubDataEXT(mTextures[1], GL_TEXTURE_2D, 0, 0, 0, 0, mTextures[0],
2793*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_EXTERNAL_OES, 0, 0, 0, 0, 4, 4, 1);
2794*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2795*8975f5c5SAndroid Build Coastguard Worker
2796*8975f5c5SAndroid Build Coastguard Worker // Check the results
2797*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2798*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
2799*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2800*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
2801*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2802*8975f5c5SAndroid Build Coastguard Worker
2803*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 4, 4, GLColor::green);
2804*8975f5c5SAndroid Build Coastguard Worker }
2805*8975f5c5SAndroid Build Coastguard Worker
2806*8975f5c5SAndroid Build Coastguard Worker // Test copying from EGLImage to gles texture
TEST_P(CopyTextureTestES3,CopyImageSubDataFromEGLImage)2807*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, CopyImageSubDataFromEGLImage)
2808*8975f5c5SAndroid Build Coastguard Worker {
2809*8975f5c5SAndroid Build Coastguard Worker // GL_OES_EGL_image_external extension is required to use TEXTURE_EXTERNAL_OES
2810*8975f5c5SAndroid Build Coastguard Worker // as the texture target. So if GL_OES_EGL_image_external is not supported,
2811*8975f5c5SAndroid Build Coastguard Worker // the error case cannot happen.
2812*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_OES_EGL_image_external"));
2813*8975f5c5SAndroid Build Coastguard Worker // GL_EXT_copy_image extension is required to use glCopyImageSubDataEXT to
2814*8975f5c5SAndroid Build Coastguard Worker // copy from/to GL_TEXTURE_EXTERNAL_OES texture target. If GL_EXT_copy_image
2815*8975f5c5SAndroid Build Coastguard Worker // is not supported, then no need to test.
2816*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
2817*8975f5c5SAndroid Build Coastguard Worker
2818*8975f5c5SAndroid Build Coastguard Worker // Prepare test data
2819*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2820*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2821*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2822*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kSourceColor(4 * 4, GLColor::green);
2823*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2824*8975f5c5SAndroid Build Coastguard Worker kSourceColor.data());
2825*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2826*8975f5c5SAndroid Build Coastguard Worker
2827*8975f5c5SAndroid Build Coastguard Worker EGLWindow *window = getEGLWindow();
2828*8975f5c5SAndroid Build Coastguard Worker EGLDisplay dpy = window->getDisplay();
2829*8975f5c5SAndroid Build Coastguard Worker // If EGL_KHR_image_base is not supported, then eglImageKHR cannot be used,
2830*8975f5c5SAndroid Build Coastguard Worker // and therefore the error case cannot happen
2831*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsEGLDisplayExtensionEnabled(dpy, "EGL_KHR_image_base"));
2832*8975f5c5SAndroid Build Coastguard Worker
2833*8975f5c5SAndroid Build Coastguard Worker // Create the egl image and bind it to target GL_TEXTURE_EXTERNAL_OES
2834*8975f5c5SAndroid Build Coastguard Worker constexpr EGLint attribs[] = {
2835*8975f5c5SAndroid Build Coastguard Worker EGL_IMAGE_PRESERVED,
2836*8975f5c5SAndroid Build Coastguard Worker EGL_TRUE,
2837*8975f5c5SAndroid Build Coastguard Worker EGL_NONE,
2838*8975f5c5SAndroid Build Coastguard Worker };
2839*8975f5c5SAndroid Build Coastguard Worker EGLImageKHR image = eglCreateImageKHR(
2840*8975f5c5SAndroid Build Coastguard Worker window->getDisplay(), window->getContext(), EGL_GL_TEXTURE_2D_KHR,
2841*8975f5c5SAndroid Build Coastguard Worker reinterpret_cast<EGLClientBuffer>(static_cast<uintptr_t>(texture)), attribs);
2842*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2843*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextures[0]);
2844*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2845*8975f5c5SAndroid Build Coastguard Worker glEGLImageTargetTexture2DOES(GL_TEXTURE_EXTERNAL_OES, image);
2846*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2847*8975f5c5SAndroid Build Coastguard Worker
2848*8975f5c5SAndroid Build Coastguard Worker // Prepare the destination texture
2849*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
2850*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2851*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kDstColor(4 * 4, GLColor::red);
2852*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, kDstColor.data());
2853*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2854*8975f5c5SAndroid Build Coastguard Worker
2855*8975f5c5SAndroid Build Coastguard Worker // Copy from egl texture to gles texture.
2856*8975f5c5SAndroid Build Coastguard Worker glCopyImageSubDataEXT(mTextures[0], GL_TEXTURE_EXTERNAL_OES, 0, 0, 0, 0, mTextures[1],
2857*8975f5c5SAndroid Build Coastguard Worker GL_TEXTURE_2D, 0, 0, 0, 0, 4, 4, 1);
2858*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_NO_ERROR();
2859*8975f5c5SAndroid Build Coastguard Worker
2860*8975f5c5SAndroid Build Coastguard Worker // Check the results.
2861*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(0, 0, 4, 4, GLColor::green);
2862*8975f5c5SAndroid Build Coastguard Worker }
2863*8975f5c5SAndroid Build Coastguard Worker
2864*8975f5c5SAndroid Build Coastguard Worker // Test that copy after invalidate works
TEST_P(CopyTextureTestES3,InvalidateCopyThenBlend)2865*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, InvalidateCopyThenBlend)
2866*8975f5c5SAndroid Build Coastguard Worker {
2867*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2868*8975f5c5SAndroid Build Coastguard Worker
2869*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263716
2870*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsIntel() && IsOpenGL());
2871*8975f5c5SAndroid Build Coastguard Worker
2872*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263717
2873*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsOpenGL());
2874*8975f5c5SAndroid Build Coastguard Worker
2875*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 4;
2876*8975f5c5SAndroid Build Coastguard Worker
2877*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2878*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, texture);
2879*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, kSize * 2, kSize * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2880*8975f5c5SAndroid Build Coastguard Worker nullptr);
2881*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize * 2, kSize * 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2882*8975f5c5SAndroid Build Coastguard Worker nullptr);
2883*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA8, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2884*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 3, GL_RGBA8, kSize / 2, kSize / 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2885*8975f5c5SAndroid Build Coastguard Worker nullptr);
2886*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 4, GL_RGBA8, kSize / 4, kSize / 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2887*8975f5c5SAndroid Build Coastguard Worker nullptr);
2888*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 1);
2889*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 4);
2890*8975f5c5SAndroid Build Coastguard Worker
2891*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
2892*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2893*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 2);
2894*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2895*8975f5c5SAndroid Build Coastguard Worker
2896*8975f5c5SAndroid Build Coastguard Worker // Invalidate the framebuffer.
2897*8975f5c5SAndroid Build Coastguard Worker const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
2898*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
2899*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2900*8975f5c5SAndroid Build Coastguard Worker
2901*8975f5c5SAndroid Build Coastguard Worker // Copy into the framebuffer attachment.
2902*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kSourceColor(kSize * kSize, GLColor::green);
2903*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2904*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2905*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2906*8975f5c5SAndroid Build Coastguard Worker kSourceColor.data());
2907*8975f5c5SAndroid Build Coastguard Worker // Note: flipY is used to avoid direct transfer between textures and force a draw-based path.
2908*8975f5c5SAndroid Build Coastguard Worker glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, texture, 2, GL_RGBA8, GL_UNSIGNED_BYTE,
2909*8975f5c5SAndroid Build Coastguard Worker true, false, false);
2910*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2911*8975f5c5SAndroid Build Coastguard Worker
2912*8975f5c5SAndroid Build Coastguard Worker // Draw and blend, making sure both the copy and draw happen correctly.
2913*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2914*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
2915*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
2916*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2917*8975f5c5SAndroid Build Coastguard Worker
2918*8975f5c5SAndroid Build Coastguard Worker // Make sure the blend was correctly done.
2919*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
2920*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::yellow);
2921*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::yellow);
2922*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::yellow);
2923*8975f5c5SAndroid Build Coastguard Worker }
2924*8975f5c5SAndroid Build Coastguard Worker
2925*8975f5c5SAndroid Build Coastguard Worker // Test that sRGB-to-RGB copy does not change pixel values.
2926*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096868
TEST_P(CopyTextureTest,NoConvertSRGBToRGB)2927*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTest, NoConvertSRGBToRGB)
2928*8975f5c5SAndroid Build Coastguard Worker {
2929*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_sRGB"));
2930*8975f5c5SAndroid Build Coastguard Worker testSrgbToRgb(GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT);
2931*8975f5c5SAndroid Build Coastguard Worker }
2932*8975f5c5SAndroid Build Coastguard Worker
2933*8975f5c5SAndroid Build Coastguard Worker // Test that sRGB-to-RGB copy does not change pixel values.
2934*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/40096868
TEST_P(CopyTextureTestES3,NoConvertSRGBToRGB)2935*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, NoConvertSRGBToRGB)
2936*8975f5c5SAndroid Build Coastguard Worker {
2937*8975f5c5SAndroid Build Coastguard Worker testSrgbToRgb(GL_SRGB8_ALPHA8, GL_RGBA);
2938*8975f5c5SAndroid Build Coastguard Worker }
2939*8975f5c5SAndroid Build Coastguard Worker
invalidateBlitThenBlendCommon(GLsizei layerCount)2940*8975f5c5SAndroid Build Coastguard Worker void CopyTextureTestES3::invalidateBlitThenBlendCommon(GLsizei layerCount)
2941*8975f5c5SAndroid Build Coastguard Worker {
2942*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263713
2943*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsAndroid() && IsOpenGL());
2944*8975f5c5SAndroid Build Coastguard Worker
2945*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263716
2946*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsMac() && IsIntel() && IsOpenGL());
2947*8975f5c5SAndroid Build Coastguard Worker
2948*8975f5c5SAndroid Build Coastguard Worker // http://anglebug.com/42263717
2949*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(IsWindows() && IsIntel() && IsOpenGL());
2950*8975f5c5SAndroid Build Coastguard Worker
2951*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(program, essl1_shaders::vs::Simple(), essl1_shaders::fs::Red());
2952*8975f5c5SAndroid Build Coastguard Worker
2953*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 4;
2954*8975f5c5SAndroid Build Coastguard Worker
2955*8975f5c5SAndroid Build Coastguard Worker GLTexture texture;
2956*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, texture);
2957*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA8, kSize * 2, kSize * 2, layerCount, 0, GL_RGBA,
2958*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
2959*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA8, kSize * 2, kSize * 2, layerCount, 0, GL_RGBA,
2960*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
2961*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 2, GL_RGBA8, kSize, kSize, layerCount, 0, GL_RGBA,
2962*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
2963*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 3, GL_RGBA8, kSize / 2, kSize / 2, layerCount, 0, GL_RGBA,
2964*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
2965*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 4, GL_RGBA8, kSize / 4, kSize / 4, layerCount, 0, GL_RGBA,
2966*8975f5c5SAndroid Build Coastguard Worker GL_UNSIGNED_BYTE, nullptr);
2967*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
2968*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 4);
2969*8975f5c5SAndroid Build Coastguard Worker
2970*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer framebuffer;
2971*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
2972*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, texture, 2, layerCount / 2);
2973*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
2974*8975f5c5SAndroid Build Coastguard Worker
2975*8975f5c5SAndroid Build Coastguard Worker // Invalidate the framebuffer.
2976*8975f5c5SAndroid Build Coastguard Worker const GLenum discards[] = {GL_COLOR_ATTACHMENT0};
2977*8975f5c5SAndroid Build Coastguard Worker glInvalidateFramebuffer(GL_FRAMEBUFFER, 1, discards);
2978*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2979*8975f5c5SAndroid Build Coastguard Worker
2980*8975f5c5SAndroid Build Coastguard Worker // Blit into the framebuffer attachment.
2981*8975f5c5SAndroid Build Coastguard Worker const std::vector<GLColor> kSourceColor(kSize * kSize, GLColor::green);
2982*8975f5c5SAndroid Build Coastguard Worker GLTexture sourceTexture;
2983*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, sourceTexture);
2984*8975f5c5SAndroid Build Coastguard Worker glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, kSize, kSize, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2985*8975f5c5SAndroid Build Coastguard Worker kSourceColor.data());
2986*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer sourceFramebuffer;
2987*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, sourceFramebuffer);
2988*8975f5c5SAndroid Build Coastguard Worker glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, sourceTexture,
2989*8975f5c5SAndroid Build Coastguard Worker 0);
2990*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_READ_FRAMEBUFFER);
2991*8975f5c5SAndroid Build Coastguard Worker
2992*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
2993*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
2994*8975f5c5SAndroid Build Coastguard Worker
2995*8975f5c5SAndroid Build Coastguard Worker // Draw and blend, making sure both the blit and draw happen correctly.
2996*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
2997*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE);
2998*8975f5c5SAndroid Build Coastguard Worker drawQuad(program, essl1_shaders::PositionAttrib(), 0.0f);
2999*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3000*8975f5c5SAndroid Build Coastguard Worker
3001*8975f5c5SAndroid Build Coastguard Worker // Make sure the blend was correctly done.
3002*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffer);
3003*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::yellow);
3004*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, 0, GLColor::yellow);
3005*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(0, kSize - 1, GLColor::yellow);
3006*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_COLOR_EQ(kSize - 1, kSize - 1, GLColor::yellow);
3007*8975f5c5SAndroid Build Coastguard Worker }
3008*8975f5c5SAndroid Build Coastguard Worker
3009*8975f5c5SAndroid Build Coastguard Worker // Test that blit after invalidate works with non-zero layer
TEST_P(CopyTextureTestES3,InvalidateBlitThenBlend3Layers)3010*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, InvalidateBlitThenBlend3Layers)
3011*8975f5c5SAndroid Build Coastguard Worker {
3012*8975f5c5SAndroid Build Coastguard Worker invalidateBlitThenBlendCommon(3);
3013*8975f5c5SAndroid Build Coastguard Worker }
3014*8975f5c5SAndroid Build Coastguard Worker
3015*8975f5c5SAndroid Build Coastguard Worker // Test that blit after invalidate works with non-zero layer that is very large
TEST_P(CopyTextureTestES3,InvalidateBlitThenBlend1000Layers)3016*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, InvalidateBlitThenBlend1000Layers)
3017*8975f5c5SAndroid Build Coastguard Worker {
3018*8975f5c5SAndroid Build Coastguard Worker invalidateBlitThenBlendCommon(1000);
3019*8975f5c5SAndroid Build Coastguard Worker }
3020*8975f5c5SAndroid Build Coastguard Worker
TEST_P(CopyTextureTestES3,DrawThenCopyThenBlend)3021*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, DrawThenCopyThenBlend)
3022*8975f5c5SAndroid Build Coastguard Worker {
3023*8975f5c5SAndroid Build Coastguard Worker // Regression test for anglebug.com/42265446.
3024*8975f5c5SAndroid Build Coastguard Worker //
3025*8975f5c5SAndroid Build Coastguard Worker // Reproduces two behaviors:
3026*8975f5c5SAndroid Build Coastguard Worker //
3027*8975f5c5SAndroid Build Coastguard Worker // 1) The initial draw disappearing entirely from the default back
3028*8975f5c5SAndroid Build Coastguard Worker // buffer. The current test case does not show this behavior
3029*8975f5c5SAndroid Build Coastguard Worker // independently from the other, but a previous iteration, with the
3030*8975f5c5SAndroid Build Coastguard Worker // textured quad scaled to half size and translated (-0.5, -0.5), did.
3031*8975f5c5SAndroid Build Coastguard Worker //
3032*8975f5c5SAndroid Build Coastguard Worker // 2) With Metal debug layers and load/store validation turned on on
3033*8975f5c5SAndroid Build Coastguard Worker // Intel Macs, the transparent area of the texture prior to the bug
3034*8975f5c5SAndroid Build Coastguard Worker // fix was magenta = undefined. Similar behavior would presumably
3035*8975f5c5SAndroid Build Coastguard Worker // reproduce on M1 hardware without debug layers or validation.
3036*8975f5c5SAndroid Build Coastguard Worker
3037*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kSize = 64;
3038*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kHalfSize = kSize / 2;
3039*8975f5c5SAndroid Build Coastguard Worker
3040*8975f5c5SAndroid Build Coastguard Worker setWindowWidth(kSize);
3041*8975f5c5SAndroid Build Coastguard Worker setWindowHeight(kSize);
3042*8975f5c5SAndroid Build Coastguard Worker
3043*8975f5c5SAndroid Build Coastguard Worker // Define destination texture for the CopyTexSubImage2D operation.
3044*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3045*8975f5c5SAndroid Build Coastguard Worker glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3046*8975f5c5SAndroid Build Coastguard Worker glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3047*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3048*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3049*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kHalfSize, kHalfSize);
3050*8975f5c5SAndroid Build Coastguard Worker
3051*8975f5c5SAndroid Build Coastguard Worker // Redefine framebuffer's texture already allocated in testSetUp.
3052*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3053*8975f5c5SAndroid Build Coastguard Worker glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, kSize, kSize);
3054*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
3055*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3056*8975f5c5SAndroid Build Coastguard Worker
3057*8975f5c5SAndroid Build Coastguard Worker GLRenderbuffer rbo;
3058*8975f5c5SAndroid Build Coastguard Worker glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3059*8975f5c5SAndroid Build Coastguard Worker glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, kSize, kSize);
3060*8975f5c5SAndroid Build Coastguard Worker
3061*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer srcFBO;
3062*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, srcFBO);
3063*8975f5c5SAndroid Build Coastguard Worker glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3064*8975f5c5SAndroid Build Coastguard Worker EXPECT_GL_FRAMEBUFFER_COMPLETE(GL_FRAMEBUFFER);
3065*8975f5c5SAndroid Build Coastguard Worker
3066*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawGreen, essl3_shaders::vs::Simple(), essl3_shaders::fs::Green());
3067*8975f5c5SAndroid Build Coastguard Worker ANGLE_GL_PROGRAM(drawTexture, essl3_shaders::vs::Texture2DLod(),
3068*8975f5c5SAndroid Build Coastguard Worker essl3_shaders::fs::Texture2DLod());
3069*8975f5c5SAndroid Build Coastguard Worker
3070*8975f5c5SAndroid Build Coastguard Worker glDisable(GL_BLEND);
3071*8975f5c5SAndroid Build Coastguard Worker
3072*8975f5c5SAndroid Build Coastguard Worker // Draw a square half the size of the viewport, centered in the viewport.
3073*8975f5c5SAndroid Build Coastguard Worker glViewport(0, 0, kSize, kSize);
3074*8975f5c5SAndroid Build Coastguard Worker glClearColor(0, 0, 0, 0);
3075*8975f5c5SAndroid Build Coastguard Worker glClear(GL_COLOR_BUFFER_BIT);
3076*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawGreen);
3077*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawGreen, essl3_shaders::PositionAttrib(), 0.5f, 0.5f, true);
3078*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3079*8975f5c5SAndroid Build Coastguard Worker
3080*8975f5c5SAndroid Build Coastguard Worker // Resolve the multisampled framebuffer.
3081*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
3082*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
3083*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3084*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3085*8975f5c5SAndroid Build Coastguard Worker
3086*8975f5c5SAndroid Build Coastguard Worker // Copy the upper right quarter of the framebuffer to mTextures[0].
3087*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
3088*8975f5c5SAndroid Build Coastguard Worker glActiveTexture(GL_TEXTURE0);
3089*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3090*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3091*8975f5c5SAndroid Build Coastguard Worker glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, kHalfSize, kHalfSize, kHalfSize, kHalfSize);
3092*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3093*8975f5c5SAndroid Build Coastguard Worker
3094*8975f5c5SAndroid Build Coastguard Worker glUseProgram(drawTexture);
3095*8975f5c5SAndroid Build Coastguard Worker GLint textureLoc = glGetUniformLocation(drawTexture, essl3_shaders::Texture2DUniform());
3096*8975f5c5SAndroid Build Coastguard Worker GLint lodLoc = glGetUniformLocation(drawTexture, essl3_shaders::LodUniform());
3097*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, textureLoc);
3098*8975f5c5SAndroid Build Coastguard Worker ASSERT_NE(-1, lodLoc);
3099*8975f5c5SAndroid Build Coastguard Worker glUniform1i(textureLoc, 0); // to match GL_TEXTURE0
3100*8975f5c5SAndroid Build Coastguard Worker glUniform1f(lodLoc, 0);
3101*8975f5c5SAndroid Build Coastguard Worker
3102*8975f5c5SAndroid Build Coastguard Worker // Magnify and blend this texture over the current framebuffer.
3103*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, srcFBO);
3104*8975f5c5SAndroid Build Coastguard Worker glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
3105*8975f5c5SAndroid Build Coastguard Worker glEnable(GL_BLEND);
3106*8975f5c5SAndroid Build Coastguard Worker drawQuad(drawTexture, essl3_shaders::PositionAttrib(), 0.5f, 1.0f, true);
3107*8975f5c5SAndroid Build Coastguard Worker
3108*8975f5c5SAndroid Build Coastguard Worker // Resolve the multisampled framebuffer again.
3109*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, srcFBO);
3110*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mFramebuffer);
3111*8975f5c5SAndroid Build Coastguard Worker glBlitFramebuffer(0, 0, kSize, kSize, 0, 0, kSize, kSize, GL_COLOR_BUFFER_BIT, GL_NEAREST);
3112*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3113*8975f5c5SAndroid Build Coastguard Worker
3114*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_READ_FRAMEBUFFER, mFramebuffer);
3115*8975f5c5SAndroid Build Coastguard Worker
3116*8975f5c5SAndroid Build Coastguard Worker // Center quad should be rendered correctly.
3117*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kHalfSize / 2 + 1, kHalfSize / 2 + 1, kHalfSize - 2, kHalfSize - 2,
3118*8975f5c5SAndroid Build Coastguard Worker GLColor::green);
3119*8975f5c5SAndroid Build Coastguard Worker
3120*8975f5c5SAndroid Build Coastguard Worker // Overlapping lower-left quad should be green as well.
3121*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, 1, kHalfSize - 2, kHalfSize - 2, GLColor::green);
3122*8975f5c5SAndroid Build Coastguard Worker
3123*8975f5c5SAndroid Build Coastguard Worker // Leftmost area above the lower-left quad should be transparent.
3124*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(1, kHalfSize + 1, kHalfSize / 2 - 2, kHalfSize / 2 - 2,
3125*8975f5c5SAndroid Build Coastguard Worker GLColor::transparentBlack);
3126*8975f5c5SAndroid Build Coastguard Worker
3127*8975f5c5SAndroid Build Coastguard Worker // Bottommost area to the right of the lower-left quad should be transparent.
3128*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT_EQ(kHalfSize + 1, 1, kHalfSize / 2 - 2, kHalfSize / 2 - 2,
3129*8975f5c5SAndroid Build Coastguard Worker GLColor::transparentBlack);
3130*8975f5c5SAndroid Build Coastguard Worker }
3131*8975f5c5SAndroid Build Coastguard Worker
3132*8975f5c5SAndroid Build Coastguard Worker // Test that copy multiple slices between 2D_ARRAY and 3D textures work when their texture formats
3133*8975f5c5SAndroid Build Coastguard Worker // are different.
3134*8975f5c5SAndroid Build Coastguard Worker // Simplified from
3135*8975f5c5SAndroid Build Coastguard Worker // dEQP-GLES31.functional.copy_image.non_compressed.viewclass_128_bits.rgba32f_rgba32i.texture2d_array_to_texture3d
TEST_P(CopyTextureTestES3,TextureCopyMultipleSlicesBetween2DArrayAnd3D)3136*8975f5c5SAndroid Build Coastguard Worker TEST_P(CopyTextureTestES3, TextureCopyMultipleSlicesBetween2DArrayAnd3D)
3137*8975f5c5SAndroid Build Coastguard Worker {
3138*8975f5c5SAndroid Build Coastguard Worker ANGLE_SKIP_TEST_IF(!IsGLExtensionEnabled("GL_EXT_copy_image"));
3139*8975f5c5SAndroid Build Coastguard Worker
3140*8975f5c5SAndroid Build Coastguard Worker constexpr GLColor32F kFloatYellow = {1.0f, 1.0f, 0.0f, 1.0f};
3141*8975f5c5SAndroid Build Coastguard Worker constexpr GLColor32I kIntBlue = {0, 0, 255, 255};
3142*8975f5c5SAndroid Build Coastguard Worker constexpr GLColor32I kIntGreen = {0, 255, 0, 255};
3143*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kTexWidth = 16;
3144*8975f5c5SAndroid Build Coastguard Worker constexpr GLsizei kTexHeight = 16;
3145*8975f5c5SAndroid Build Coastguard Worker constexpr int32_t kIntEquivalentOfFloatOne = 1065353216;
3146*8975f5c5SAndroid Build Coastguard Worker
3147*8975f5c5SAndroid Build Coastguard Worker GLTexture tex2DArray;
3148*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
3149*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3150*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, tex2DArray);
3151*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32F> tex2DArraySlice0(kTexWidth * kTexHeight, kFloatRed);
3152*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32F> tex2DArraySlice1(kTexWidth * kTexHeight, kFloatYellow);
3153*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32F> tex2DArrayPixels(kTexWidth * kTexHeight * 2);
3154*8975f5c5SAndroid Build Coastguard Worker auto pos = tex2DArrayPixels.begin();
3155*8975f5c5SAndroid Build Coastguard Worker tex2DArrayPixels.insert(pos, tex2DArraySlice1.begin(), tex2DArraySlice1.end());
3156*8975f5c5SAndroid Build Coastguard Worker pos = tex2DArrayPixels.begin();
3157*8975f5c5SAndroid Build Coastguard Worker tex2DArrayPixels.insert(pos, tex2DArraySlice0.begin(), tex2DArraySlice0.end());
3158*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA32F, kTexWidth, kTexHeight, 2, 0, GL_RGBA, GL_FLOAT,
3159*8975f5c5SAndroid Build Coastguard Worker tex2DArrayPixels.data());
3160*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3161*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3162*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3163*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3164*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3165*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3166*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_2D_ARRAY, 0);
3167*8975f5c5SAndroid Build Coastguard Worker
3168*8975f5c5SAndroid Build Coastguard Worker GLTexture tex3D;
3169*8975f5c5SAndroid Build Coastguard Worker glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
3170*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3171*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, tex3D);
3172*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32I> tex3DSlice0(kTexWidth * kTexHeight, kIntBlue);
3173*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32I> tex3DSlice1(kTexWidth * kTexHeight, kIntGreen);
3174*8975f5c5SAndroid Build Coastguard Worker std::vector<GLColor32I> tex3DPixels(kTexWidth * kTexHeight * 2);
3175*8975f5c5SAndroid Build Coastguard Worker auto pos2 = tex3DPixels.begin();
3176*8975f5c5SAndroid Build Coastguard Worker tex3DPixels.insert(pos2, tex3DSlice1.begin(), tex3DSlice1.end());
3177*8975f5c5SAndroid Build Coastguard Worker pos2 = tex3DPixels.begin();
3178*8975f5c5SAndroid Build Coastguard Worker tex3DPixels.insert(pos2, tex3DSlice0.begin(), tex3DSlice0.end());
3179*8975f5c5SAndroid Build Coastguard Worker glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA32I, kTexWidth, kTexHeight, 2, 0, GL_RGBA_INTEGER, GL_INT,
3180*8975f5c5SAndroid Build Coastguard Worker tex3DPixels.data());
3181*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3182*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
3183*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
3184*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3185*8975f5c5SAndroid Build Coastguard Worker glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3186*8975f5c5SAndroid Build Coastguard Worker ASSERT_GL_NO_ERROR();
3187*8975f5c5SAndroid Build Coastguard Worker glBindTexture(GL_TEXTURE_3D, 0);
3188*8975f5c5SAndroid Build Coastguard Worker
3189*8975f5c5SAndroid Build Coastguard Worker // Verify color before copy
3190*8975f5c5SAndroid Build Coastguard Worker GLFramebuffer FBO;
3191*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
3192*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 0);
3193*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32F_EQ(0, 0, kTexWidth, kTexHeight, kFloatRed);
3194*8975f5c5SAndroid Build Coastguard Worker
3195*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 1);
3196*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32F_EQ(0, 0, kTexWidth, kTexHeight, kFloatYellow);
3197*8975f5c5SAndroid Build Coastguard Worker
3198*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 0);
3199*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, 0, kTexWidth, kTexHeight, kIntBlue);
3200*8975f5c5SAndroid Build Coastguard Worker
3201*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
3202*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, 0, kTexWidth, kTexHeight, kIntGreen);
3203*8975f5c5SAndroid Build Coastguard Worker
3204*8975f5c5SAndroid Build Coastguard Worker // Copy GL_TEXTURE_2D_ARRAY to GL_TEXTURE_3D with copy size = (texWidth, texHeight/2, 2)
3205*8975f5c5SAndroid Build Coastguard Worker glCopyImageSubDataEXT(tex2DArray, GL_TEXTURE_2D_ARRAY, 0, 0, 0, 0, tex3D, GL_TEXTURE_3D, 0, 0,
3206*8975f5c5SAndroid Build Coastguard Worker 0, 0, kTexWidth, kTexHeight / 2, 2);
3207*8975f5c5SAndroid Build Coastguard Worker
3208*8975f5c5SAndroid Build Coastguard Worker // Verify colors after copy
3209*8975f5c5SAndroid Build Coastguard Worker glBindFramebuffer(GL_FRAMEBUFFER, FBO);
3210*8975f5c5SAndroid Build Coastguard Worker // verify tex2DArray
3211*8975f5c5SAndroid Build Coastguard Worker // layer 0 should remain unchanged
3212*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 0);
3213*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32F_EQ(0, 0, kTexWidth, kTexHeight, kFloatRed);
3214*8975f5c5SAndroid Build Coastguard Worker // layer 1 should remain unchanged
3215*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex2DArray, 0, 1);
3216*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32F_EQ(0, 0, kTexWidth, kTexHeight, kFloatYellow);
3217*8975f5c5SAndroid Build Coastguard Worker
3218*8975f5c5SAndroid Build Coastguard Worker // verify tex3D content
3219*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 0);
3220*8975f5c5SAndroid Build Coastguard Worker // part of tex3D slice 0 should contain the copied content from tex2DArray layer 0
3221*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, 0, kTexWidth, kTexHeight / 2,
3222*8975f5c5SAndroid Build Coastguard Worker GLColor32I(kIntEquivalentOfFloatOne, 0, 0, kIntEquivalentOfFloatOne));
3223*8975f5c5SAndroid Build Coastguard Worker // part of tex3D slice 0 should remain unchanged
3224*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, kTexHeight / 2, kTexWidth, kTexHeight / 2, kIntBlue);
3225*8975f5c5SAndroid Build Coastguard Worker // verify slice 1
3226*8975f5c5SAndroid Build Coastguard Worker glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, tex3D, 0, 1);
3227*8975f5c5SAndroid Build Coastguard Worker // part of tex3D slice 1 should contain the copied content from tex2DArray layer 1
3228*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, 0, kTexWidth, kTexHeight / 2,
3229*8975f5c5SAndroid Build Coastguard Worker GLColor32I(kIntEquivalentOfFloatOne, kIntEquivalentOfFloatOne, 0,
3230*8975f5c5SAndroid Build Coastguard Worker kIntEquivalentOfFloatOne));
3231*8975f5c5SAndroid Build Coastguard Worker // part of tex3D slice 1 should remain unchanged
3232*8975f5c5SAndroid Build Coastguard Worker EXPECT_PIXEL_RECT32I_EQ(0, kTexHeight / 2, kTexWidth, kTexHeight / 2, kIntGreen);
3233*8975f5c5SAndroid Build Coastguard Worker }
3234*8975f5c5SAndroid Build Coastguard Worker
3235*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTest);
3236*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_COMBINE_6(CopyTextureVariationsTest,
3237*8975f5c5SAndroid Build Coastguard Worker CopyTextureVariationsTestPrint,
3238*8975f5c5SAndroid Build Coastguard Worker testing::ValuesIn(kCopyTextureVariationsSrcFormats),
3239*8975f5c5SAndroid Build Coastguard Worker testing::ValuesIn(kCopyTextureVariationsDstFormats),
3240*8975f5c5SAndroid Build Coastguard Worker testing::Bool(), // flipY
3241*8975f5c5SAndroid Build Coastguard Worker testing::Bool(), // premultiplyAlpha
3242*8975f5c5SAndroid Build Coastguard Worker testing::Bool(), // unmultiplyAlpha
3243*8975f5c5SAndroid Build Coastguard Worker testing::ValuesIn(kMesaYFlips),
3244*8975f5c5SAndroid Build Coastguard Worker ES2_D3D9(),
3245*8975f5c5SAndroid Build Coastguard Worker ES2_D3D11(),
3246*8975f5c5SAndroid Build Coastguard Worker ES2_OPENGL(),
3247*8975f5c5SAndroid Build Coastguard Worker ES2_OPENGLES(),
3248*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN(),
3249*8975f5c5SAndroid Build Coastguard Worker ES2_METAL());
3250*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES2(CopyTextureTestWebGL);
3251*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST(CopyTextureTestDest,
3252*8975f5c5SAndroid Build Coastguard Worker ES2_D3D11(),
3253*8975f5c5SAndroid Build Coastguard Worker ES2_OPENGL(),
3254*8975f5c5SAndroid Build Coastguard Worker ES2_OPENGLES(),
3255*8975f5c5SAndroid Build Coastguard Worker ES2_VULKAN(),
3256*8975f5c5SAndroid Build Coastguard Worker ES2_METAL());
3257*8975f5c5SAndroid Build Coastguard Worker
3258*8975f5c5SAndroid Build Coastguard Worker GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(CopyTextureTestES3);
3259*8975f5c5SAndroid Build Coastguard Worker ANGLE_INSTANTIATE_TEST_ES3(CopyTextureTestES3);
3260*8975f5c5SAndroid Build Coastguard Worker
3261*8975f5c5SAndroid Build Coastguard Worker } // namespace angle
3262