• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2018 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // CopyTexture3DTest.cpp: Tests of the GL_ANGLE_copy_texture_3d extension
8 
9 #include "test_utils/ANGLETest.h"
10 
11 #include "test_utils/gl_raii.h"
12 
13 namespace angle
14 {
15 
16 class CopyTexture3DTest : public ANGLETest
17 {
18   protected:
CopyTexture3DTest()19     CopyTexture3DTest()
20     {
21         setWindowWidth(256);
22         setWindowHeight(256);
23         setConfigRedBits(8);
24         setConfigGreenBits(8);
25         setConfigBlueBits(8);
26         setConfigAlphaBits(8);
27     }
28 
testSetUp()29     void testSetUp() override
30     {
31         const char *vertexShaderSource   = getVertexShaderSource();
32         const char *fragmentShaderSource = getFragmentShaderSource();
33 
34         mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
35         ASSERT_NE(0u, mProgram);
36 
37         glUseProgram(mProgram);
38 
39         ASSERT_GL_NO_ERROR();
40     }
41 
getVertexShaderSource()42     const char *getVertexShaderSource()
43     {
44         return "#version 300 es\n"
45                "out vec3 texcoord;\n"
46                "in vec4 position;\n"
47                "void main()\n"
48                "{\n"
49                "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
50                "    texcoord = (position.xyz * 0.5) + 0.5;\n"
51                "}\n";
52     }
53 
checkExtensions() const54     bool checkExtensions() const
55     {
56         if (!IsGLExtensionEnabled("GL_ANGLE_copy_texture_3d"))
57         {
58             std::cout << "Test skipped because GL_ANGLE_copy_texture_3d is not available."
59                       << std::endl;
60             return false;
61         }
62 
63         EXPECT_NE(nullptr, glCopyTexture3DANGLE);
64         EXPECT_NE(nullptr, glCopySubTexture3DANGLE);
65         return true;
66     }
67 
testCopy(const GLenum testTarget,const GLColor & sourceColor,GLenum destInternalFormat,GLenum destType,bool flipY,bool premultiplyAlpha,bool unmultiplyAlpha,const GLColor & expectedColor)68     void testCopy(const GLenum testTarget,
69                   const GLColor &sourceColor,
70                   GLenum destInternalFormat,
71                   GLenum destType,
72                   bool flipY,
73                   bool premultiplyAlpha,
74                   bool unmultiplyAlpha,
75                   const GLColor &expectedColor)
76     {
77         std::vector<GLColor> texDataColor(2u * 2u * 2u, sourceColor);
78 
79         glBindTexture(testTarget, sourceTexture.get());
80         glTexImage3D(testTarget, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
81                      texDataColor.data());
82         glTexParameteri(testTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
83         glTexParameteri(testTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
84         glTexParameteri(testTarget, GL_TEXTURE_BASE_LEVEL, 0);
85         glTexParameteri(testTarget, GL_TEXTURE_MAX_LEVEL, 0);
86         EXPECT_GL_NO_ERROR();
87 
88         glActiveTexture(GL_TEXTURE0);
89         glBindTexture(testTarget, destTexture.get());
90         glCopyTexture3DANGLE(sourceTexture.get(), 0, testTarget, destTexture.get(), 0,
91                              destInternalFormat, destType, flipY, premultiplyAlpha,
92                              unmultiplyAlpha);
93         EXPECT_GL_NO_ERROR();
94 
95         GLRenderbuffer rbo;
96         glBindRenderbuffer(GL_RENDERBUFFER, rbo);
97 
98         GLenum renderType = 0;
99 
100         switch (destInternalFormat)
101         {
102             case GL_RGB:
103             case GL_RGBA:
104             case GL_LUMINANCE:
105             case GL_LUMINANCE_ALPHA:
106             case GL_ALPHA:
107             case GL_R8:
108             case GL_RG:
109             case GL_RG8:
110             case GL_RGB8:
111             case GL_RGBA8:
112             case GL_SRGB8:
113             case GL_RGB565:
114             case GL_SRGB8_ALPHA8:
115             case GL_RGB5_A1:
116             case GL_RGBA4:
117             case GL_R8_SNORM:
118             case GL_RG8_SNORM:
119             case GL_RGB8_SNORM:
120             case GL_RGBA8_SNORM:
121             case GL_RGB10_A2:
122                 renderType = GL_RGBA8;
123                 break;
124             case GL_R8I:
125             case GL_R16I:
126             case GL_R32I:
127             case GL_RG8I:
128             case GL_RG16I:
129             case GL_RG32I:
130             case GL_RGB8I:
131             case GL_RGB16I:
132             case GL_RGB32I:
133             case GL_RGBA8I:
134             case GL_RGBA16I:
135             case GL_RGBA32I:
136                 renderType = GL_RGBA8I;
137                 break;
138             case GL_R8UI:
139             case GL_R16UI:
140             case GL_R32UI:
141             case GL_RG8UI:
142             case GL_RG16UI:
143             case GL_RG32UI:
144             case GL_RGB8UI:
145             case GL_RGB16UI:
146             case GL_RGB32UI:
147             case GL_RGBA8UI:
148             case GL_RGBA16UI:
149             case GL_RGBA32UI:
150             case GL_RGB10_A2UI:
151                 renderType = GL_RGBA8UI;
152                 break;
153             case GL_R16F:
154             case GL_RGB16F:
155             case GL_RGB32F:
156             case GL_R32F:
157             case GL_RG16F:
158             case GL_RG32F:
159             case GL_RGBA16F:
160             case GL_RGBA32F:
161             case GL_R11F_G11F_B10F:
162             case GL_RGB9_E5:
163                 renderType = GL_RGBA32F;
164                 break;
165             default:
166                 ASSERT_TRUE(false);
167         }
168 
169         glRenderbufferStorage(GL_RENDERBUFFER, renderType, 1, 1);
170 
171         GLFramebuffer fbo;
172         glBindFramebuffer(GL_FRAMEBUFFER, fbo);
173         glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
174 
175         glTexParameteri(testTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
176         glTexParameteri(testTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
177         glTexParameteri(testTarget, GL_TEXTURE_BASE_LEVEL, 0);
178         glTexParameteri(testTarget, GL_TEXTURE_MAX_LEVEL, 0);
179 
180         drawQuad(mProgram, "position", 0.5f);
181         EXPECT_GL_NO_ERROR();
182 
183         if (renderType == GL_RGBA8)
184         {
185             GLColor actual;
186             glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R);
187             EXPECT_GL_NO_ERROR();
188             EXPECT_COLOR_NEAR(expectedColor, actual, 1);
189             return;
190         }
191         else if (renderType == GL_RGBA32F)
192         {
193             float expectedColorFloat[4] = {static_cast<float>(expectedColor.R) / 255,
194                                            static_cast<float>(expectedColor.G) / 255,
195                                            static_cast<float>(expectedColor.B) / 255,
196                                            static_cast<float>(expectedColor.A) / 255};
197             EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
198                                        GLColor32F(expectedColorFloat[0], expectedColorFloat[1],
199                                                   expectedColorFloat[2], expectedColorFloat[3]),
200                                        0.01);
201             return;
202         }
203         else if (renderType == GL_RGBA8UI)
204         {
205             GLuint pixel[4] = {0};
206             glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);
207             EXPECT_COLOR_NEAR(
208                 expectedColor,
209                 GLColor(static_cast<GLubyte>(pixel[0]), static_cast<GLubyte>(pixel[1]),
210                         static_cast<GLubyte>(pixel[2]), static_cast<GLubyte>(pixel[3])),
211                 0.2);
212         }
213         else if (renderType == GL_RGBA8I)
214         {
215             GLint pixel[4] = {0};
216             glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, pixel);
217             EXPECT_COLOR_NEAR(
218                 expectedColor,
219                 GLColor(static_cast<GLubyte>(pixel[0]), static_cast<GLubyte>(pixel[1]),
220                         static_cast<GLubyte>(pixel[2]), static_cast<GLubyte>(pixel[3])),
221                 0.2);
222         }
223         else
224         {
225             ASSERT_TRUE(false);
226         }
227     }
228 
229     virtual const char *getFragmentShaderSource() = 0;
230 
231     GLuint mProgram = 0;
232     GLTexture sourceTexture;
233     GLTexture destTexture;
234 };
235 
236 class Texture3DCopy : public CopyTexture3DTest
237 {
238   protected:
Texture3DCopy()239     Texture3DCopy() {}
240 
getFragmentShaderSource()241     const char *getFragmentShaderSource() override
242     {
243         return "#version 300 es\n"
244                "precision highp float;\n"
245                "uniform highp sampler3D tex3D;\n"
246                "in vec3 texcoord;\n"
247                "out vec4 fragColor;\n"
248                "void main()\n"
249                "{\n"
250                "    fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
251                "}\n";
252     }
253 };
254 
255 class Texture2DArrayCopy : public CopyTexture3DTest
256 {
257   protected:
Texture2DArrayCopy()258     Texture2DArrayCopy() {}
259 
getFragmentShaderSource()260     const char *getFragmentShaderSource() override
261     {
262         return "#version 300 es\n"
263                "precision highp float;\n"
264                "uniform highp sampler2DArray tex2DArray;\n"
265                "in vec3 texcoord;\n"
266                "out vec4 fragColor;\n"
267                "void main()\n"
268                "{\n"
269                "    fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
270                "}\n";
271     }
272 };
273 
274 // Test that glCopySubTexture3DANGLE correctly copies to and from a GL_TEXTURE_3D texture.
TEST_P(Texture3DCopy,CopySubTexture)275 TEST_P(Texture3DCopy, CopySubTexture)
276 {
277     ANGLE_SKIP_TEST_IF(!checkExtensions());
278 
279     sourceTexture.get();
280     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
281     std::vector<GLColor> texDataRed(2u * 2u * 2u, GLColor::red);
282 
283     glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
284     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
285                  texDataGreen.data());
286     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
287     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
288     EXPECT_GL_NO_ERROR();
289 
290     glActiveTexture(GL_TEXTURE0);
291     glBindTexture(GL_TEXTURE_3D, destTexture.get());
292     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
293                  texDataRed.data());
294     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
295     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
296     EXPECT_GL_NO_ERROR();
297     glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 0, 0, 0, 0,
298                             0, 0, 2, 2, 2, false, false, false);
299     glBindTexture(GL_TEXTURE_3D, destTexture.get());
300     EXPECT_GL_NO_ERROR();
301     drawQuad(mProgram, "position", 0.5f);
302 
303     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
304 }
305 
306 // Test that glCopyTexture3DANGLE correctly copies from a non-zero mipmap on a GL_TEXTURE_3D
307 // texture.
TEST_P(Texture3DCopy,CopyFromMipmap)308 TEST_P(Texture3DCopy, CopyFromMipmap)
309 {
310     ANGLE_SKIP_TEST_IF(!checkExtensions());
311 
312     std::vector<GLColor> texDataGreen(4u * 4u * 4u, GLColor::green);
313 
314     glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
315     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
316                  texDataGreen.data());
317     glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
318                  texDataGreen.data());
319     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
320     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
321     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
322     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
323 
324     EXPECT_GL_NO_ERROR();
325 
326     glActiveTexture(GL_TEXTURE0);
327     glBindTexture(GL_TEXTURE_3D, destTexture.get());
328     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
329     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
330     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
331     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
332     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
333     EXPECT_GL_NO_ERROR();
334 
335     glCopyTexture3DANGLE(sourceTexture.get(), 1, GL_TEXTURE_3D, destTexture.get(), 0, GL_RGBA,
336                          GL_UNSIGNED_BYTE, false, false, false);
337     glBindTexture(GL_TEXTURE_3D, destTexture.get());
338     EXPECT_GL_NO_ERROR();
339     drawQuad(mProgram, "position", 0.5f);
340 
341     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
342 }
343 
344 // Test that glCopySubTexture3DANGLE's offset and dimension parameters work correctly with a
345 // GL_TEXTURE_3D texture.
TEST_P(Texture3DCopy,OffsetSubCopy)346 TEST_P(Texture3DCopy, OffsetSubCopy)
347 {
348     ANGLE_SKIP_TEST_IF(!checkExtensions());
349 
350     GLColor rgbaPixels[27];
351 
352     // Create pixel data for a 3x3x3 red cube
353     for (int i = 0; i < 27; i++)
354     {
355         rgbaPixels[i] = GLColor(255u, 0u, 0u, 255u);
356     }
357 
358     // Change a pixel to create a 1x1x1 blue cube at (0, 0, 0)
359     rgbaPixels[0] = GLColor(0u, 0u, 255u, 255u);
360 
361     // Change some pixels to green to create a 2x2x2 cube starting at (1, 1, 1)
362     rgbaPixels[13] = GLColor(0u, 255u, 0u, 255u);
363     rgbaPixels[14] = GLColor(0u, 255u, 0u, 255u);
364     rgbaPixels[16] = GLColor(0u, 255u, 0u, 255u);
365     rgbaPixels[17] = GLColor(0u, 255u, 0u, 255u);
366     rgbaPixels[22] = GLColor(0u, 255u, 0u, 255u);
367     rgbaPixels[23] = GLColor(0u, 255u, 0u, 255u);
368     rgbaPixels[25] = GLColor(0u, 255u, 0u, 255u);
369     rgbaPixels[26] = GLColor(0u, 255u, 0u, 255u);
370 
371     glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
372     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 3, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
373     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
374     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
375     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
376     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
377     EXPECT_GL_NO_ERROR();
378 
379     glActiveTexture(GL_TEXTURE0);
380     glBindTexture(GL_TEXTURE_3D, destTexture.get());
381     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
382     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
383     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
384     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
385     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
386     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
387     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
388     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
389 
390     EXPECT_GL_NO_ERROR();
391     // Copy the 2x2x2 green cube into a new texture
392     glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 0, 0, 0, 1,
393                             1, 1, 2, 2, 2, false, false, false);
394     glBindTexture(GL_TEXTURE_3D, destTexture.get());
395     EXPECT_GL_NO_ERROR();
396     drawQuad(mProgram, "position", 1.0f);
397     int width  = getWindowWidth() - 1;
398     int height = getWindowHeight() - 1;
399 
400     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
401     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
402     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
403     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
404 
405     // Copy the 1x1x1 blue cube into the the 2x2x2 green cube at location (1, 1, 1)
406     glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 1, 1, 1, 0,
407                             0, 0, 1, 1, 1, false, false, false);
408     EXPECT_GL_NO_ERROR();
409     drawQuad(mProgram, "position", 1.0f);
410     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
411     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
412     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
413     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::blue);
414 }
415 
416 // Test that the flipY parameter works with a GL_TEXTURE_3D texture.
TEST_P(Texture3DCopy,FlipY)417 TEST_P(Texture3DCopy, FlipY)
418 {
419     ANGLE_SKIP_TEST_IF(!checkExtensions());
420 
421     // Create a 2x2x2 cube. The top half is red. The bottom half is green.
422     GLColor rgbaPixels[8] = {GLColor::green, GLColor::green, GLColor::red, GLColor::red,
423                              GLColor::green, GLColor::green, GLColor::red, GLColor::red};
424 
425     glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
426     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
427     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
428     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
429     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
430     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
431     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
432     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
433     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
434 
435     // mProgram creates a quad with the colors from the top (y-direction) layer of the 3D texture.
436     // 3D pixel (<x>, <y>, <z>) is drawn to 2D pixel (<x>, <z>) for <y> = 1.
437     drawQuad(mProgram, "position", 1.0f);
438 
439     int width  = getWindowWidth() - 1;
440     int height = getWindowHeight() - 1;
441 
442     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
443     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::red);
444     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::red);
445     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::red);
446 
447     EXPECT_GL_NO_ERROR();
448 
449     glActiveTexture(GL_TEXTURE0);
450     glBindTexture(GL_TEXTURE_3D, destTexture.get());
451     glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
452     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
453     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
454     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
455     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
456     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
457     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
458     glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
459     EXPECT_GL_NO_ERROR();
460 
461     // Flip the y coordinate. This will put the greem half on top, and the red half on the bottom.
462     glCopyTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, GL_RGBA,
463                          GL_UNSIGNED_BYTE, true, false, false);
464 
465     glBindTexture(GL_TEXTURE_3D, destTexture.get());
466     EXPECT_GL_NO_ERROR();
467     drawQuad(mProgram, "position", 1.0f);
468 
469     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
470     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
471     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
472     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
473 }
474 
475 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsized
476 // formats.
TEST_P(Texture3DCopy,UnsizedFormats)477 TEST_P(Texture3DCopy, UnsizedFormats)
478 {
479     ANGLE_SKIP_TEST_IF(!checkExtensions());
480 
481     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_BYTE, false, false,
482              false, GLColor(250, 200, 150, 255));
483     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_BYTE, false, true,
484              false, GLColor(98, 78, 59, 255));
485     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_RGB, GL_UNSIGNED_BYTE, false, false,
486              true, GLColor(128, 191, 255, 255));
487 
488     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false,
489              false, false, GLColor(247, 199, 148, 255));
490     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false,
491              true, false, GLColor(99, 77, 57, 255));
492     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false,
493              false, true, GLColor(132, 190, 255, 255));
494 
495     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_BYTE, false, false,
496              false, GLColor(250, 200, 150, 100));
497     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_BYTE, false, true,
498              false, GLColor(98, 78, 59, 100));
499     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_RGBA, GL_UNSIGNED_BYTE, false, false,
500              true, GLColor(128, 191, 255, 200));
501 
502     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false,
503              false, false, GLColor(255, 204, 153, 102));
504     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false,
505              true, false, GLColor(102, 85, 51, 102));
506     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false,
507              false, true, GLColor(136, 187, 255, 204));
508 
509     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false,
510              false, false, GLColor(247, 198, 148, 0));
511     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false,
512              true, false, GLColor(99, 82, 57, 0));
513     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false,
514              false, true, GLColor(132, 189, 255, 255));
515 
516     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_LUMINANCE, GL_UNSIGNED_BYTE, false,
517              false, false, GLColor(250, 250, 250, 255));
518     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_LUMINANCE, GL_UNSIGNED_BYTE, false,
519              true, false, GLColor(98, 98, 98, 255));
520     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_LUMINANCE, GL_UNSIGNED_BYTE, false,
521              false, true, GLColor(128, 128, 128, 255));
522 
523     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
524              false, false, false, GLColor(250, 250, 250, 100));
525     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
526              false, true, false, GLColor(98, 98, 98, 100));
527     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 200), GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
528              false, false, true, GLColor(128, 128, 128, 200));
529 
530     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_ALPHA, GL_UNSIGNED_BYTE, false, false,
531              false, GLColor(0, 0, 0, 100));
532     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_ALPHA, GL_UNSIGNED_BYTE, false, false,
533              false, GLColor(0, 0, 0, 100));
534     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_ALPHA, GL_UNSIGNED_BYTE, false, false,
535              false, GLColor(0, 0, 0, 100));
536 }
537 
538 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with snorm
539 // formats.
TEST_P(Texture3DCopy,SnormFormats)540 TEST_P(Texture3DCopy, SnormFormats)
541 {
542     ANGLE_SKIP_TEST_IF(!checkExtensions());
543 
544     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_R8_SNORM, GL_BYTE, false, false, false,
545              GLColor(251, 0, 0, 255));
546     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_R8_SNORM, GL_BYTE, false, true, false,
547              GLColor(187, 0, 0, 255));
548     testCopy(GL_TEXTURE_3D, GLColor(200, 150, 100, 230), GL_R8_SNORM, GL_BYTE, false, false, true,
549              GLColor(221, 0, 0, 255));
550 
551     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_RG8_SNORM, GL_BYTE, false, false, false,
552              GLColor(251, 201, 0, 255));
553     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_RG8_SNORM, GL_BYTE, false, true, false,
554              GLColor(187, 149, 0, 255));
555     testCopy(GL_TEXTURE_3D, GLColor(200, 150, 100, 230), GL_RG8_SNORM, GL_BYTE, false, false, true,
556              GLColor(221, 167, 0, 255));
557 
558     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_RGB8_SNORM, GL_BYTE, false, false,
559              false, GLColor(251, 201, 151, 255));
560     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_RGB8_SNORM, GL_BYTE, false, true, false,
561              GLColor(187, 149, 112, 255));
562     testCopy(GL_TEXTURE_3D, GLColor(200, 150, 100, 230), GL_RGB8_SNORM, GL_BYTE, false, false, true,
563              GLColor(221, 167, 110, 255));
564 
565     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_RGBA8_SNORM, GL_BYTE, false, false,
566              false, GLColor(251, 201, 151, 191));
567     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 190), GL_RGBA8_SNORM, GL_BYTE, false, true,
568              false, GLColor(187, 149, 112, 191));
569     testCopy(GL_TEXTURE_3D, GLColor(200, 150, 100, 230), GL_RGBA8_SNORM, GL_BYTE, false, false,
570              true, GLColor(221, 167, 110, 231));
571 
572     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB10_A2,
573              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false, GLColor(250, 200, 150, 85));
574     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB10_A2,
575              GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false, GLColor(196, 157, 118, 170));
576     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 250, 200), GL_RGB10_A2,
577              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true, GLColor(128, 191, 255, 170));
578 }
579 
580 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsigned
581 // byte formats.
TEST_P(Texture3DCopy,UnsignedByteFormats)582 TEST_P(Texture3DCopy, UnsignedByteFormats)
583 {
584     ANGLE_SKIP_TEST_IF(!checkExtensions());
585 
586     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_R8, GL_UNSIGNED_BYTE, false, false,
587              false, GLColor(250, 0, 0, 255));
588     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_R8, GL_UNSIGNED_BYTE, false, true,
589              false, GLColor(98, 0, 0, 255));
590     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_R8, GL_UNSIGNED_BYTE, false, false,
591              true, GLColor(255, 0, 0, 255));
592 
593     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RG8, GL_UNSIGNED_BYTE, false, false,
594              false, GLColor(250, 200, 0, 255));
595     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RG8, GL_UNSIGNED_BYTE, false, true,
596              false, GLColor(98, 78, 0, 255));
597     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RG8, GL_UNSIGNED_BYTE, false, false,
598              true, GLColor(255, 255, 0, 255));
599 
600     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB8, GL_UNSIGNED_BYTE, false, false,
601              false, GLColor(250, 200, 150, 255));
602     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB8, GL_UNSIGNED_BYTE, false, true,
603              false, GLColor(98, 78, 59, 255));
604     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB8, GL_UNSIGNED_BYTE, false, false,
605              true, GLColor(255, 255, 255, 255));
606 
607     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA8, GL_UNSIGNED_BYTE, false, false,
608              false, GLColor(250, 200, 150, 100));
609     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA8, GL_UNSIGNED_BYTE, false, true,
610              false, GLColor(98, 78, 59, 100));
611     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA8, GL_UNSIGNED_BYTE, false, false,
612              true, GLColor(255, 255, 255, 100));
613 
614     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_BYTE, false, false,
615              false, GLColor(255, 204, 153, 102));
616     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_BYTE, false, true,
617              false, GLColor(102, 85, 51, 102));
618     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_BYTE, false, false,
619              true, GLColor(119, 187, 238, 204));
620 
621     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false,
622              false, false, GLColor(255, 204, 153, 102));
623     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false,
624              true, false, GLColor(102, 85, 51, 102));
625     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false,
626              false, true, GLColor(119, 187, 238, 204));
627 
628     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_SRGB8, GL_UNSIGNED_BYTE, false, false,
629              false, GLColor(244, 148, 78, 255));
630     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_SRGB8, GL_UNSIGNED_BYTE, false, true,
631              false, GLColor(31, 19, 11, 255));
632     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_SRGB8, GL_UNSIGNED_BYTE, false, false,
633              true, GLColor(52, 253, 53, 255));
634 
635     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,
636              false, false, GLColor(244, 148, 78, 100));
637     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,
638              true, false, GLColor(31, 19, 11, 100));
639     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,
640              false, true, GLColor(52, 253, 53, 100));
641 
642     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false, false,
643              false, GLColor(247, 198, 148, 255));
644     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB5_A1, GL_UNSIGNED_BYTE, false, true,
645              false, GLColor(99, 82, 57, 0));
646     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 100), GL_RGB5_A1, GL_UNSIGNED_BYTE, false, false,
647              true, GLColor(255, 255, 255, 0));
648 
649     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV,
650              false, false, false, GLColor(247, 198, 148, 255));
651     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV,
652              false, true, false, GLColor(198, 156, 115, 255));
653     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 250, 200), GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV,
654              false, false, true, GLColor(132, 189, 255, 255));
655 
656     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1,
657              false, false, false, GLColor(247, 198, 148, 255));
658     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1,
659              false, true, false, GLColor(198, 156, 115, 255));
660     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 250, 200), GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1,
661              false, false, true, GLColor(132, 189, 255, 255));
662 
663     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_BYTE, false, false,
664              false, GLColor(247, 199, 148, 255));
665     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_BYTE, false, true,
666              false, GLColor(198, 158, 115, 255));
667     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 250, 200), GL_RGB565, GL_UNSIGNED_BYTE, false, false,
668              true, GLColor(132, 190, 255, 255));
669 
670     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false,
671              false, false, GLColor(247, 199, 148, 255));
672     testCopy(GL_TEXTURE_3D, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false,
673              true, false, GLColor(198, 158, 115, 255));
674     testCopy(GL_TEXTURE_3D, GLColor(100, 150, 250, 200), GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false,
675              false, true, GLColor(132, 190, 255, 255));
676 }
677 
678 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with float
679 // formats.
TEST_P(Texture3DCopy,FloatFormats)680 TEST_P(Texture3DCopy, FloatFormats)
681 {
682     ANGLE_SKIP_TEST_IF(!checkExtensions());
683 
684     std::vector<GLenum> floatTypes = {GL_FLOAT, GL_HALF_FLOAT, GL_UNSIGNED_INT_10F_11F_11F_REV,
685                                       GL_UNSIGNED_INT_5_9_9_9_REV};
686 
687     for (GLenum floatType : floatTypes)
688     {
689         if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV &&
690             floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
691         {
692             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R16F, floatType, false, false,
693                      false, GLColor(210, 0, 0, 255));
694             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R16F, floatType, false, true,
695                      false, GLColor(191, 0, 0, 255));
696             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R16F, floatType, false, false,
697                      true, GLColor(227, 0, 0, 255));
698 
699             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RG16F, floatType, false, false,
700                      false, GLColor(210, 200, 0, 255));
701             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RG16F, floatType, false, true,
702                      false, GLColor(191, 184, 0, 255));
703             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RG16F, floatType, false, false,
704                      true, GLColor(227, 217, 0, 255));
705 
706             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB16F, floatType, false, false,
707                      false, GLColor(210, 200, 150, 255));
708             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB16F, floatType, false, true,
709                      false, GLColor(191, 184, 138, 255));
710             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB16F, floatType, false, false,
711                      true, GLColor(227, 217, 161, 255));
712 
713             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGBA16F, floatType, false,
714                      false, false, GLColor(210, 200, 150, 235));
715             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGBA16F, floatType, false, true,
716                      false, GLColor(191, 184, 138, 235));
717             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGBA16F, floatType, false,
718                      false, true, GLColor(227, 217, 161, 235));
719         }
720 
721         if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV)
722         {
723             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R11F_G11F_B10F, floatType,
724                      false, false, false, GLColor(210, 200, 148, 255));
725             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R11F_G11F_B10F, floatType,
726                      false, true, false, GLColor(191, 184, 138, 255));
727             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R11F_G11F_B10F, floatType,
728                      false, false, true, GLColor(227, 217, 161, 255));
729         }
730 
731         if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
732         {
733             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB9_E5, floatType, false,
734                      false, false, GLColor(210, 200, 148, 255));
735             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB9_E5, floatType, false, true,
736                      false, GLColor(192, 184, 138, 255));
737             testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB9_E5, floatType, false,
738                      false, true, GLColor(227, 217, 161, 255));
739         }
740     }
741 
742     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R32F, GL_FLOAT, false, false, false,
743              GLColor(210, 0, 0, 255));
744     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R32F, GL_FLOAT, false, true, false,
745              GLColor(191, 0, 0, 255));
746     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_R32F, GL_FLOAT, false, false, true,
747              GLColor(227, 0, 0, 255));
748 
749     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RG32F, GL_FLOAT, false, false, false,
750              GLColor(210, 200, 0, 255));
751     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RG32F, GL_FLOAT, false, true, false,
752              GLColor(191, 184, 0, 255));
753     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RG32F, GL_FLOAT, false, false, true,
754              GLColor(227, 217, 0, 255));
755 
756     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB32F, GL_FLOAT, false, false, false,
757              GLColor(210, 200, 150, 255));
758     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB32F, GL_FLOAT, false, true, false,
759              GLColor(191, 184, 138, 255));
760     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGB32F, GL_FLOAT, false, false, true,
761              GLColor(227, 217, 161, 255));
762 
763     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGBA32F, GL_FLOAT, false, false, false,
764              GLColor(210, 200, 150, 235));
765     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGBA32F, GL_FLOAT, false, true, false,
766              GLColor(191, 184, 138, 235));
767     testCopy(GL_TEXTURE_3D, GLColor(210, 200, 150, 235), GL_RGBA32F, GL_FLOAT, false, false, true,
768              GLColor(227, 217, 161, 235));
769 }
770 
771 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with integer
772 // formats.
TEST_P(Texture3DCopy,IntFormats)773 TEST_P(Texture3DCopy, IntFormats)
774 {
775     ANGLE_SKIP_TEST_IF(!checkExtensions());
776 
777     constexpr char kFS[] =
778         "#version 300 es\n"
779         "precision highp float;\n"
780         "uniform highp isampler3D tex3D;\n"
781         "in vec3 texcoord;\n"
782         "out ivec4 fragColor;\n"
783         "void main()\n"
784         "{\n"
785         "    fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
786         "}\n";
787 
788     mProgram = CompileProgram(getVertexShaderSource(), kFS);
789     ASSERT_NE(0u, mProgram);
790     ASSERT_GL_NO_ERROR();
791 
792     glUseProgram(mProgram);
793 
794     // Pixels will be read as if the most significant bit is data, not the sign. The expected colors
795     // reflect this.
796     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R8I, GL_BYTE, false, false, false,
797              GLColor(127, 0, 0, 1));
798     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R8I, GL_BYTE, false, true, false,
799              GLColor(115, 0, 0, 1));
800     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R8I, GL_BYTE, false, false, true,
801              GLColor(127, 0, 0, 1));
802 
803     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R16I, GL_SHORT, false, false, false,
804              GLColor(127, 0, 0, 1));
805     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R16I, GL_SHORT, false, true, false,
806              GLColor(115, 0, 0, 1));
807     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R16I, GL_SHORT, false, false, true,
808              GLColor(127, 0, 0, 1));
809 
810     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R32I, GL_INT, false, false, false,
811              GLColor(127, 0, 0, 1));
812     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R32I, GL_INT, false, true, false,
813              GLColor(115, 0, 0, 1));
814     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_R32I, GL_INT, false, false, true,
815              GLColor(127, 0, 0, 1));
816 
817     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG8I, GL_BYTE, false, false, false,
818              GLColor(127, 70, 0, 1));
819     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG8I, GL_BYTE, false, true, false,
820              GLColor(115, 63, 0, 1));
821     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG8I, GL_BYTE, false, false, true,
822              GLColor(127, 77, 0, 1));
823 
824     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG16I, GL_SHORT, false, false, false,
825              GLColor(127, 70, 0, 1));
826     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG16I, GL_SHORT, false, true, false,
827              GLColor(115, 63, 0, 1));
828     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG16I, GL_SHORT, false, false, true,
829              GLColor(127, 77, 0, 1));
830 
831     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG32I, GL_INT, false, false, false,
832              GLColor(127, 70, 0, 1));
833     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG32I, GL_INT, false, true, false,
834              GLColor(115, 63, 0, 1));
835     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RG32I, GL_INT, false, false, true,
836              GLColor(127, 77, 0, 1));
837 
838     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB8I, GL_BYTE, false, false, false,
839              GLColor(127, 70, 75, 1));
840     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB8I, GL_BYTE, false, true, false,
841              GLColor(115, 63, 67, 1));
842     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB8I, GL_BYTE, false, false, true,
843              GLColor(127, 77, 83, 1));
844 
845     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB16I, GL_SHORT, false, false, false,
846              GLColor(127, 70, 75, 1));
847     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB16I, GL_SHORT, false, true, false,
848              GLColor(115, 63, 67, 1));
849     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB16I, GL_SHORT, false, false, true,
850              GLColor(127, 77, 83, 1));
851 
852     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB32I, GL_INT, false, false, false,
853              GLColor(127, 70, 75, 1));
854     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB32I, GL_INT, false, true, false,
855              GLColor(115, 63, 67, 1));
856     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGB32I, GL_INT, false, false, true,
857              GLColor(127, 77, 83, 1));
858 
859     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA8I, GL_BYTE, false, false, false,
860              GLColor(127, 70, 75, 115));
861     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA8I, GL_BYTE, false, true, false,
862              GLColor(115, 63, 67, 115));
863     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA8I, GL_BYTE, false, false, true,
864              GLColor(127, 77, 83, 115));
865 
866     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA16I, GL_SHORT, false, false, false,
867              GLColor(127, 70, 75, 115));
868     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA16I, GL_SHORT, false, true, false,
869              GLColor(115, 63, 67, 115));
870     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA16I, GL_SHORT, false, false, true,
871              GLColor(127, 77, 83, 115));
872 
873     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA32I, GL_INT, false, false, false,
874              GLColor(127, 70, 75, 115));
875     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA32I, GL_INT, false, true, false,
876              GLColor(115, 63, 67, 115));
877     testCopy(GL_TEXTURE_3D, GLColor(255, 140, 150, 230), GL_RGBA32I, GL_INT, false, false, true,
878              GLColor(127, 77, 83, 115));
879 }
880 
881 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsigned
882 // integer formats.
TEST_P(Texture3DCopy,UintFormats)883 TEST_P(Texture3DCopy, UintFormats)
884 {
885     ANGLE_SKIP_TEST_IF(!checkExtensions());
886 
887     constexpr char kFS[] =
888         "#version 300 es\n"
889         "precision highp float;\n"
890         "uniform highp usampler3D tex3D;\n"
891         "in vec3 texcoord;\n"
892         "out uvec4 fragColor;\n"
893         "void main()\n"
894         "{\n"
895         "    fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
896         "}\n";
897 
898     mProgram = CompileProgram(getVertexShaderSource(), kFS);
899     ASSERT_NE(0u, mProgram);
900     ASSERT_GL_NO_ERROR();
901 
902     glUseProgram(mProgram);
903 
904     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R8UI, GL_UNSIGNED_BYTE, false, false,
905              false, GLColor(128, 0, 0, 1));
906     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R8UI, GL_UNSIGNED_BYTE, false, true,
907              false, GLColor(50, 0, 0, 1));
908     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R8UI, GL_UNSIGNED_BYTE, false, false,
909              true, GLColor(255, 0, 0, 1));
910 
911     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R16UI, GL_UNSIGNED_SHORT, false, false,
912              false, GLColor(128, 0, 0, 1));
913     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R16UI, GL_UNSIGNED_SHORT, false, true,
914              false, GLColor(50, 0, 0, 1));
915     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R16UI, GL_UNSIGNED_SHORT, false, false,
916              true, GLColor(255, 0, 0, 1));
917 
918     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R32UI, GL_UNSIGNED_INT, false, false,
919              false, GLColor(128, 0, 0, 1));
920     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R32UI, GL_UNSIGNED_INT, false, true,
921              false, GLColor(50, 0, 0, 1));
922     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_R32UI, GL_UNSIGNED_INT, false, false,
923              true, GLColor(255, 0, 0, 1));
924 
925     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG8UI, GL_UNSIGNED_BYTE, false, false,
926              false, GLColor(128, 84, 0, 1));
927     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG8UI, GL_UNSIGNED_BYTE, false, true,
928              false, GLColor(50, 32, 0, 1));
929     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG8UI, GL_UNSIGNED_BYTE, false, false,
930              true, GLColor(255, 214, 0, 1));
931 
932     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG16UI, GL_UNSIGNED_SHORT, false, false,
933              false, GLColor(128, 84, 0, 1));
934     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG16UI, GL_UNSIGNED_SHORT, false, true,
935              false, GLColor(50, 32, 0, 1));
936     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG16UI, GL_UNSIGNED_SHORT, false, false,
937              true, GLColor(255, 214, 0, 1));
938 
939     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG32UI, GL_UNSIGNED_INT, false, false,
940              false, GLColor(128, 84, 0, 1));
941     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG32UI, GL_UNSIGNED_INT, false, true,
942              false, GLColor(50, 32, 0, 1));
943     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RG32UI, GL_UNSIGNED_INT, false, false,
944              true, GLColor(255, 214, 0, 1));
945 
946     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB8UI, GL_UNSIGNED_BYTE, false, false,
947              false, GLColor(128, 84, 32, 1));
948     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB8UI, GL_UNSIGNED_BYTE, false, true,
949              false, GLColor(50, 32, 12, 1));
950     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB8UI, GL_UNSIGNED_BYTE, false, false,
951              true, GLColor(255, 214, 81, 1));
952 
953     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB16UI, GL_UNSIGNED_SHORT, false, false,
954              false, GLColor(128, 84, 32, 1));
955     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB16UI, GL_UNSIGNED_SHORT, false, true,
956              false, GLColor(50, 32, 12, 1));
957     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB16UI, GL_UNSIGNED_SHORT, false, false,
958              true, GLColor(255, 214, 81, 1));
959 
960     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB32UI, GL_UNSIGNED_INT, false, false,
961              false, GLColor(128, 84, 32, 1));
962     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB32UI, GL_UNSIGNED_INT, false, true,
963              false, GLColor(50, 32, 12, 1));
964     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB32UI, GL_UNSIGNED_INT, false, false,
965              true, GLColor(255, 214, 81, 1));
966 
967     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA8UI, GL_UNSIGNED_BYTE, false, false,
968              false, GLColor(128, 84, 32, 100));
969     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA8UI, GL_UNSIGNED_BYTE, false, true,
970              false, GLColor(50, 32, 12, 100));
971     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA8UI, GL_UNSIGNED_BYTE, false, false,
972              true, GLColor(255, 214, 81, 100));
973 
974     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA16UI, GL_UNSIGNED_SHORT, false, false,
975              false, GLColor(128, 84, 32, 100));
976     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA16UI, GL_UNSIGNED_SHORT, false, true,
977              false, GLColor(50, 32, 12, 100));
978     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA16UI, GL_UNSIGNED_SHORT, false, false,
979              true, GLColor(255, 214, 81, 100));
980 
981     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA32UI, GL_UNSIGNED_INT, false, false,
982              false, GLColor(128, 84, 32, 100));
983     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA32UI, GL_UNSIGNED_INT, false, true,
984              false, GLColor(50, 32, 12, 100));
985     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGBA32UI, GL_UNSIGNED_INT, false, false,
986              true, GLColor(255, 214, 81, 100));
987 
988     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB10_A2UI,
989              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false, GLColor(128, 84, 32, 3));
990     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB10_A2UI,
991              GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false, GLColor(50, 32, 12, 3));
992     testCopy(GL_TEXTURE_3D, GLColor(128, 84, 32, 100), GL_RGB10_A2UI,
993              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true, GLColor(255, 214, 81, 3));
994 }
995 
996 // Test that glCopySubTexture3DANGLE correctly copies to and from a GL_TEXTURE_2D_ARRAY texture.
TEST_P(Texture2DArrayCopy,CopySubTexture)997 TEST_P(Texture2DArrayCopy, CopySubTexture)
998 {
999     ANGLE_SKIP_TEST_IF(!checkExtensions());
1000 
1001     std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
1002     std::vector<GLColor> texDataRed(2u * 2u * 2u, GLColor::red);
1003 
1004     glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1005     EXPECT_GL_NO_ERROR();
1006     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1007                  texDataGreen.data());
1008     EXPECT_GL_NO_ERROR();
1009     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1010     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
1011     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1012     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1013     EXPECT_GL_NO_ERROR();
1014 
1015     glActiveTexture(GL_TEXTURE0);
1016     glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1017     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1018                  texDataRed.data());
1019     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1020     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
1021     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1022     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1023     EXPECT_GL_NO_ERROR();
1024     glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 0, 0,
1025                             0, 0, 0, 0, 2, 2, 2, false, false, false);
1026     EXPECT_GL_NO_ERROR();
1027     drawQuad(mProgram, "position", 0.5f);
1028 
1029     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1030 }
1031 
1032 // Test that glCopyTexture3DANGLE correctly copies from a non-zero mipmap on a GL_TEXTURE_2D_ARRAY
1033 // texture.
TEST_P(Texture2DArrayCopy,CopyFromMipmap)1034 TEST_P(Texture2DArrayCopy, CopyFromMipmap)
1035 {
1036     ANGLE_SKIP_TEST_IF(!checkExtensions());
1037 
1038     std::vector<GLColor> texDataGreen4(4u * 4u * 4u, GLColor::green);
1039     std::vector<GLColor> texDataGreen2(2u * 2u * 2u, GLColor::green);
1040     std::vector<GLColor> texDataRed2(2u * 2u * 2u, GLColor::red);
1041 
1042     glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1043     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1044                  texDataGreen4.data());
1045     glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1046                  texDataGreen2.data());
1047     EXPECT_GL_NO_ERROR();
1048     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1049     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1050     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
1051     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
1052     EXPECT_GL_NO_ERROR();
1053 
1054     glActiveTexture(GL_TEXTURE0);
1055     glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1056     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1057     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1058     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1059     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1060     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1061 
1062     EXPECT_GL_NO_ERROR();
1063     glCopyTexture3DANGLE(sourceTexture.get(), 1, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, GL_RGBA,
1064                          GL_UNSIGNED_BYTE, false, false, false);
1065 
1066     EXPECT_GL_NO_ERROR();
1067     drawQuad(mProgram, "position", 1.0f);
1068 
1069     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1070 }
1071 
1072 // Test that glCopySubTexture3DANGLE's offset and dimension parameters work correctly with a
1073 // GL_TEXTURE_2D_ARRAY texture.
TEST_P(Texture2DArrayCopy,OffsetSubCopy)1074 TEST_P(Texture2DArrayCopy, OffsetSubCopy)
1075 {
1076     ANGLE_SKIP_TEST_IF(!checkExtensions());
1077 
1078     GLColor rgbaPixels[27];
1079 
1080     // Create pixel data for a 3x3x3 red cube
1081     for (int i = 0; i < 27; i++)
1082     {
1083         rgbaPixels[i] = GLColor(255u, 0u, 0u, 255u);
1084     }
1085 
1086     // Change a pixel to create a 1x1x1 blue cube at (0, 0, 0)
1087     rgbaPixels[0] = GLColor(0u, 0u, 255u, 255u);
1088 
1089     // Change some pixels to green to create a 2x2x2 cube starting at (1, 1, 1)
1090     rgbaPixels[13] = GLColor(0u, 255u, 0u, 255u);
1091     rgbaPixels[14] = GLColor(0u, 255u, 0u, 255u);
1092     rgbaPixels[16] = GLColor(0u, 255u, 0u, 255u);
1093     rgbaPixels[17] = GLColor(0u, 255u, 0u, 255u);
1094     rgbaPixels[22] = GLColor(0u, 255u, 0u, 255u);
1095     rgbaPixels[23] = GLColor(0u, 255u, 0u, 255u);
1096     rgbaPixels[25] = GLColor(0u, 255u, 0u, 255u);
1097     rgbaPixels[26] = GLColor(0u, 255u, 0u, 255u);
1098 
1099     glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1100     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 3, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1101                  rgbaPixels);
1102     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1103     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1104     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1105     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1106     EXPECT_GL_NO_ERROR();
1107 
1108     glActiveTexture(GL_TEXTURE0);
1109     glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1110     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1111     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1112     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1113     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1114     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1115     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1116     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1117     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1118 
1119     EXPECT_GL_NO_ERROR();
1120     // Copy the 2x2x2 green cube into a new texture
1121     glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 0, 0,
1122                             0, 1, 1, 1, 2, 2, 2, false, false, false);
1123     glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1124     EXPECT_GL_NO_ERROR();
1125     drawQuad(mProgram, "position", 1.0f);
1126     int width  = getWindowWidth() - 1;
1127     int height = getWindowHeight() - 1;
1128 
1129     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1130     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
1131     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
1132     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
1133 
1134     // Copy the 1x1x1 blue cube into the the 2x2x2 green cube at location (1, 1, 1)
1135     glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 1, 1,
1136                             1, 0, 0, 0, 1, 1, 1, false, false, false);
1137     EXPECT_GL_NO_ERROR();
1138     drawQuad(mProgram, "position", 1.0f);
1139     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1140     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
1141     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
1142     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::blue);
1143 }
1144 
1145 // Test that the flipY parameter works with a GL_TEXTURE_2D_ARRAY texture.
TEST_P(Texture2DArrayCopy,FlipY)1146 TEST_P(Texture2DArrayCopy, FlipY)
1147 {
1148     ANGLE_SKIP_TEST_IF(!checkExtensions());
1149 
1150     // Create a 2x2x2 cube. The top half is red. The bottom half is green.
1151     GLColor rgbaPixels[8] = {GLColor::green, GLColor::green, GLColor::red, GLColor::red,
1152                              GLColor::green, GLColor::green, GLColor::red, GLColor::red};
1153 
1154     glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1155     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1156                  rgbaPixels);
1157     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1158     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1159     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1160     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1161     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1162     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1163     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1164 
1165     drawQuad(mProgram, "position", 1.0f);
1166 
1167     int width  = getWindowWidth() - 1;
1168     int height = getWindowHeight() - 1;
1169 
1170     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1171     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::red);
1172     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::red);
1173     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::red);
1174 
1175     EXPECT_GL_NO_ERROR();
1176 
1177     glActiveTexture(GL_TEXTURE0);
1178     glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1179     glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1180     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1181     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1182     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1183     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1184     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1185     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1186     glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1187     EXPECT_GL_NO_ERROR();
1188 
1189     // Flip the y coordinate. This will put the greem half on top, and the red half on the bottom.
1190     glCopyTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, GL_RGBA,
1191                          GL_UNSIGNED_BYTE, true, false, false);
1192 
1193     glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1194     EXPECT_GL_NO_ERROR();
1195     drawQuad(mProgram, "position", 1.0f);
1196 
1197     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1198     EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
1199     EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
1200     EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
1201 }
1202 
1203 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1204 // unsized formats.
TEST_P(Texture2DArrayCopy,UnsizedFormats)1205 TEST_P(Texture2DArrayCopy, UnsizedFormats)
1206 {
1207     ANGLE_SKIP_TEST_IF(!checkExtensions());
1208 
1209     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_BYTE, false,
1210              false, false, GLColor(250, 200, 150, 255));
1211     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_BYTE, false,
1212              true, false, GLColor(98, 78, 59, 255));
1213     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_RGB, GL_UNSIGNED_BYTE, false,
1214              false, true, GLColor(128, 191, 255, 255));
1215 
1216     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
1217              false, false, false, GLColor(247, 199, 148, 255));
1218     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
1219              false, true, false, GLColor(99, 77, 57, 255));
1220     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_RGB, GL_UNSIGNED_SHORT_5_6_5,
1221              false, false, true, GLColor(132, 190, 255, 255));
1222 
1223     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_BYTE, false,
1224              false, false, GLColor(250, 200, 150, 100));
1225     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_BYTE, false,
1226              true, false, GLColor(98, 78, 59, 100));
1227     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_RGBA, GL_UNSIGNED_BYTE, false,
1228              false, true, GLColor(128, 191, 255, 200));
1229 
1230     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
1231              false, false, false, GLColor(255, 204, 153, 102));
1232     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
1233              false, true, false, GLColor(102, 85, 51, 102));
1234     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4,
1235              false, false, true, GLColor(136, 187, 255, 204));
1236 
1237     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1,
1238              false, false, false, GLColor(247, 198, 148, 0));
1239     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1,
1240              false, true, false, GLColor(99, 82, 57, 0));
1241     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1,
1242              false, false, true, GLColor(132, 189, 255, 255));
1243 
1244     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_LUMINANCE, GL_UNSIGNED_BYTE,
1245              false, false, false, GLColor(250, 250, 250, 255));
1246     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_LUMINANCE, GL_UNSIGNED_BYTE,
1247              false, true, false, GLColor(98, 98, 98, 255));
1248     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_LUMINANCE, GL_UNSIGNED_BYTE,
1249              false, false, true, GLColor(128, 128, 128, 255));
1250 
1251     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
1252              false, false, false, GLColor(250, 250, 250, 100));
1253     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
1254              false, true, false, GLColor(98, 98, 98, 100));
1255     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 200), GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
1256              false, false, true, GLColor(128, 128, 128, 200));
1257 
1258     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_ALPHA, GL_UNSIGNED_BYTE, false,
1259              false, false, GLColor(0, 0, 0, 100));
1260     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_ALPHA, GL_UNSIGNED_BYTE, false,
1261              false, false, GLColor(0, 0, 0, 100));
1262     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_ALPHA, GL_UNSIGNED_BYTE, false,
1263              false, false, GLColor(0, 0, 0, 100));
1264 }
1265 
1266 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1267 // snorm formats.
TEST_P(Texture2DArrayCopy,SnormFormats)1268 TEST_P(Texture2DArrayCopy, SnormFormats)
1269 {
1270     ANGLE_SKIP_TEST_IF(!checkExtensions());
1271 
1272     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_R8_SNORM, GL_BYTE, false, false,
1273              false, GLColor(251, 0, 0, 255));
1274     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_R8_SNORM, GL_BYTE, false, true,
1275              false, GLColor(187, 0, 0, 255));
1276     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(200, 150, 100, 230), GL_R8_SNORM, GL_BYTE, false, false,
1277              true, GLColor(221, 0, 0, 255));
1278 
1279     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_RG8_SNORM, GL_BYTE, false, false,
1280              false, GLColor(251, 201, 0, 255));
1281     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_RG8_SNORM, GL_BYTE, false, true,
1282              false, GLColor(187, 149, 0, 255));
1283     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(200, 150, 100, 230), GL_RG8_SNORM, GL_BYTE, false, false,
1284              true, GLColor(221, 167, 0, 255));
1285 
1286     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_RGB8_SNORM, GL_BYTE, false, false,
1287              false, GLColor(251, 201, 151, 255));
1288     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_RGB8_SNORM, GL_BYTE, false, true,
1289              false, GLColor(187, 149, 112, 255));
1290     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(200, 150, 100, 230), GL_RGB8_SNORM, GL_BYTE, false, false,
1291              true, GLColor(221, 167, 110, 255));
1292 
1293     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_RGBA8_SNORM, GL_BYTE, false,
1294              false, false, GLColor(251, 201, 151, 191));
1295     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 190), GL_RGBA8_SNORM, GL_BYTE, false, true,
1296              false, GLColor(187, 149, 112, 191));
1297     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(200, 150, 100, 230), GL_RGBA8_SNORM, GL_BYTE, false,
1298              false, true, GLColor(221, 167, 110, 231));
1299 
1300     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB10_A2,
1301              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false, GLColor(250, 200, 150, 85));
1302     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB10_A2,
1303              GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false, GLColor(196, 157, 118, 170));
1304     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 250, 200), GL_RGB10_A2,
1305              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true, GLColor(128, 191, 255, 170));
1306 }
1307 
1308 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1309 // unsigned byte formats.
TEST_P(Texture2DArrayCopy,UnsignedByteFormats)1310 TEST_P(Texture2DArrayCopy, UnsignedByteFormats)
1311 {
1312     ANGLE_SKIP_TEST_IF(!checkExtensions());
1313 
1314     // Flay on Windows D3D11. http://anglebug.com/2896
1315     ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());
1316 
1317     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_R8, GL_UNSIGNED_BYTE, false,
1318              false, false, GLColor(250, 0, 0, 255));
1319     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_R8, GL_UNSIGNED_BYTE, false, true,
1320              false, GLColor(98, 0, 0, 255));
1321     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_R8, GL_UNSIGNED_BYTE, false,
1322              false, true, GLColor(255, 0, 0, 255));
1323 
1324     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RG8, GL_UNSIGNED_BYTE, false,
1325              false, false, GLColor(250, 200, 0, 255));
1326     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RG8, GL_UNSIGNED_BYTE, false,
1327              true, false, GLColor(98, 78, 0, 255));
1328     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RG8, GL_UNSIGNED_BYTE, false,
1329              false, true, GLColor(255, 255, 0, 255));
1330 
1331     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB8, GL_UNSIGNED_BYTE, false,
1332              false, false, GLColor(250, 200, 150, 255));
1333     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB8, GL_UNSIGNED_BYTE, false,
1334              true, false, GLColor(98, 78, 59, 255));
1335     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB8, GL_UNSIGNED_BYTE, false,
1336              false, true, GLColor(255, 255, 255, 255));
1337 
1338     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA8, GL_UNSIGNED_BYTE, false,
1339              false, false, GLColor(250, 200, 150, 100));
1340     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA8, GL_UNSIGNED_BYTE, false,
1341              true, false, GLColor(98, 78, 59, 100));
1342     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA8, GL_UNSIGNED_BYTE, false,
1343              false, true, GLColor(255, 255, 255, 100));
1344 
1345     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_BYTE, false,
1346              false, false, GLColor(255, 204, 153, 102));
1347     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_BYTE, false,
1348              true, false, GLColor(102, 85, 51, 102));
1349     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_BYTE, false,
1350              false, true, GLColor(119, 187, 238, 204));
1351 
1352     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4,
1353              false, false, false, GLColor(255, 204, 153, 102));
1354     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4,
1355              false, true, false, GLColor(102, 85, 51, 102));
1356     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4,
1357              false, false, true, GLColor(119, 187, 238, 204));
1358 
1359     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,
1360              false, false, GLColor(247, 198, 148, 255));
1361     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,
1362              true, false, GLColor(99, 82, 57, 0));
1363     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,
1364              false, true, GLColor(255, 255, 255, 0));
1365 
1366     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB5_A1,
1367              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false, GLColor(247, 198, 148, 255));
1368     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB5_A1,
1369              GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false, GLColor(198, 156, 115, 255));
1370     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 250, 200), GL_RGB5_A1,
1371              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true, GLColor(132, 189, 255, 255));
1372 
1373     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB5_A1,
1374              GL_UNSIGNED_SHORT_5_5_5_1, false, false, false, GLColor(247, 198, 148, 255));
1375     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB5_A1,
1376              GL_UNSIGNED_SHORT_5_5_5_1, false, true, false, GLColor(198, 156, 115, 255));
1377     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 250, 200), GL_RGB5_A1,
1378              GL_UNSIGNED_SHORT_5_5_5_1, false, false, true, GLColor(132, 189, 255, 255));
1379 
1380     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_BYTE, false,
1381              false, false, GLColor(247, 199, 148, 255));
1382     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_BYTE, false,
1383              true, false, GLColor(198, 158, 115, 255));
1384     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 250, 200), GL_RGB565, GL_UNSIGNED_BYTE, false,
1385              false, true, GLColor(132, 190, 255, 255));
1386 
1387     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_SHORT_5_6_5,
1388              false, false, false, GLColor(247, 199, 148, 255));
1389     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 200), GL_RGB565, GL_UNSIGNED_SHORT_5_6_5,
1390              false, true, false, GLColor(198, 158, 115, 255));
1391     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(100, 150, 250, 200), GL_RGB565, GL_UNSIGNED_SHORT_5_6_5,
1392              false, false, true, GLColor(132, 190, 255, 255));
1393 
1394     ANGLE_SKIP_TEST_IF(IsAMD() && IsWindows() && IsD3D11());
1395 
1396     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_SRGB8, GL_UNSIGNED_BYTE, false,
1397              false, false, GLColor(244, 148, 78, 255));
1398     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_SRGB8, GL_UNSIGNED_BYTE, false,
1399              true, false, GLColor(31, 19, 11, 255));
1400     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_SRGB8, GL_UNSIGNED_BYTE, false,
1401              false, true, GLColor(52, 253, 53, 255));
1402 
1403     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE,
1404              false, false, false, GLColor(244, 148, 78, 100));
1405     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE,
1406              false, true, false, GLColor(31, 19, 11, 100));
1407     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(250, 200, 150, 100), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE,
1408              false, false, true, GLColor(52, 253, 53, 100));
1409 }
1410 
1411 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1412 // float formats.
TEST_P(Texture2DArrayCopy,FloatFormats)1413 TEST_P(Texture2DArrayCopy, FloatFormats)
1414 {
1415     ANGLE_SKIP_TEST_IF(!checkExtensions());
1416 
1417     std::vector<GLenum> floatTypes = {GL_FLOAT, GL_HALF_FLOAT, GL_UNSIGNED_INT_10F_11F_11F_REV,
1418                                       GL_UNSIGNED_INT_5_9_9_9_REV};
1419 
1420     for (GLenum floatType : floatTypes)
1421     {
1422         if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV &&
1423             floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
1424         {
1425             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R16F, floatType, false,
1426                      false, false, GLColor(210, 0, 0, 255));
1427             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R16F, floatType, false,
1428                      true, false, GLColor(191, 0, 0, 255));
1429             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R16F, floatType, false,
1430                      false, true, GLColor(227, 0, 0, 255));
1431 
1432             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RG16F, floatType, false,
1433                      false, false, GLColor(210, 200, 0, 255));
1434             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RG16F, floatType, false,
1435                      true, false, GLColor(191, 184, 0, 255));
1436             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RG16F, floatType, false,
1437                      false, true, GLColor(227, 217, 0, 255));
1438 
1439             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB16F, floatType, false,
1440                      false, false, GLColor(210, 200, 150, 255));
1441             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB16F, floatType, false,
1442                      true, false, GLColor(191, 184, 138, 255));
1443             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB16F, floatType, false,
1444                      false, true, GLColor(227, 217, 161, 255));
1445 
1446             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGBA16F, floatType, false,
1447                      false, false, GLColor(210, 200, 150, 235));
1448             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGBA16F, floatType, false,
1449                      true, false, GLColor(191, 184, 138, 235));
1450             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGBA16F, floatType, false,
1451                      false, true, GLColor(227, 217, 161, 235));
1452         }
1453 
1454         if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV)
1455         {
1456             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R11F_G11F_B10F, floatType,
1457                      false, false, false, GLColor(210, 200, 148, 255));
1458             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R11F_G11F_B10F, floatType,
1459                      false, true, false, GLColor(191, 184, 138, 255));
1460             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R11F_G11F_B10F, floatType,
1461                      false, false, true, GLColor(227, 217, 161, 255));
1462         }
1463 
1464         if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
1465         {
1466             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB9_E5, floatType, false,
1467                      false, false, GLColor(210, 200, 148, 255));
1468             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB9_E5, floatType, false,
1469                      true, false, GLColor(192, 184, 138, 255));
1470             testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB9_E5, floatType, false,
1471                      false, true, GLColor(227, 217, 161, 255));
1472         }
1473     }
1474 
1475     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R32F, GL_FLOAT, false, false,
1476              false, GLColor(210, 0, 0, 255));
1477     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R32F, GL_FLOAT, false, true,
1478              false, GLColor(191, 0, 0, 255));
1479     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_R32F, GL_FLOAT, false, false,
1480              true, GLColor(227, 0, 0, 255));
1481 
1482     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RG32F, GL_FLOAT, false, false,
1483              false, GLColor(210, 200, 0, 255));
1484     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RG32F, GL_FLOAT, false, true,
1485              false, GLColor(191, 184, 0, 255));
1486     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RG32F, GL_FLOAT, false, false,
1487              true, GLColor(227, 217, 0, 255));
1488 
1489     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB32F, GL_FLOAT, false, false,
1490              false, GLColor(210, 200, 150, 255));
1491     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB32F, GL_FLOAT, false, true,
1492              false, GLColor(191, 184, 138, 255));
1493     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGB32F, GL_FLOAT, false, false,
1494              true, GLColor(227, 217, 161, 255));
1495 
1496     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGBA32F, GL_FLOAT, false, false,
1497              false, GLColor(210, 200, 150, 235));
1498     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGBA32F, GL_FLOAT, false, true,
1499              false, GLColor(191, 184, 138, 235));
1500     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(210, 200, 150, 235), GL_RGBA32F, GL_FLOAT, false, false,
1501              true, GLColor(227, 217, 161, 235));
1502 }
1503 
1504 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1505 // integer formats.
TEST_P(Texture2DArrayCopy,IntFormats)1506 TEST_P(Texture2DArrayCopy, IntFormats)
1507 {
1508     ANGLE_SKIP_TEST_IF(!checkExtensions());
1509 
1510     constexpr char kFS[] =
1511         "#version 300 es\n"
1512         "precision highp float;\n"
1513         "uniform highp isampler2DArray tex2DArray;\n"
1514         "in vec3 texcoord;\n"
1515         "out ivec4 fragColor;\n"
1516         "void main()\n"
1517         "{\n"
1518         "    fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
1519         "}\n";
1520 
1521     mProgram = CompileProgram(getVertexShaderSource(), kFS);
1522     ASSERT_NE(0u, mProgram);
1523     ASSERT_GL_NO_ERROR();
1524 
1525     glUseProgram(mProgram);
1526 
1527     // Pixels will be read as if the most significant bit is data, not the sign. The expected colors
1528     // reflect this.
1529     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R8I, GL_BYTE, false, false, false,
1530              GLColor(127, 0, 0, 1));
1531     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R8I, GL_BYTE, false, true, false,
1532              GLColor(115, 0, 0, 1));
1533     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R8I, GL_BYTE, false, false, true,
1534              GLColor(127, 0, 0, 1));
1535 
1536     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R16I, GL_SHORT, false, false,
1537              false, GLColor(127, 0, 0, 1));
1538     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R16I, GL_SHORT, false, true,
1539              false, GLColor(115, 0, 0, 1));
1540     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R16I, GL_SHORT, false, false,
1541              true, GLColor(127, 0, 0, 1));
1542 
1543     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R32I, GL_INT, false, false, false,
1544              GLColor(127, 0, 0, 1));
1545     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R32I, GL_INT, false, true, false,
1546              GLColor(115, 0, 0, 1));
1547     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_R32I, GL_INT, false, false, true,
1548              GLColor(127, 0, 0, 1));
1549 
1550     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG8I, GL_BYTE, false, false,
1551              false, GLColor(127, 70, 0, 1));
1552     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG8I, GL_BYTE, false, true, false,
1553              GLColor(115, 63, 0, 1));
1554     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG8I, GL_BYTE, false, false, true,
1555              GLColor(127, 77, 0, 1));
1556 
1557     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG16I, GL_SHORT, false, false,
1558              false, GLColor(127, 70, 0, 1));
1559     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG16I, GL_SHORT, false, true,
1560              false, GLColor(115, 63, 0, 1));
1561     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG16I, GL_SHORT, false, false,
1562              true, GLColor(127, 77, 0, 1));
1563 
1564     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG32I, GL_INT, false, false,
1565              false, GLColor(127, 70, 0, 1));
1566     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG32I, GL_INT, false, true, false,
1567              GLColor(115, 63, 0, 1));
1568     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RG32I, GL_INT, false, false, true,
1569              GLColor(127, 77, 0, 1));
1570 
1571     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB8I, GL_BYTE, false, false,
1572              false, GLColor(127, 70, 75, 1));
1573     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB8I, GL_BYTE, false, true,
1574              false, GLColor(115, 63, 67, 1));
1575     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB8I, GL_BYTE, false, false,
1576              true, GLColor(127, 77, 83, 1));
1577 
1578     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB16I, GL_SHORT, false, false,
1579              false, GLColor(127, 70, 75, 1));
1580     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB16I, GL_SHORT, false, true,
1581              false, GLColor(115, 63, 67, 1));
1582     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB16I, GL_SHORT, false, false,
1583              true, GLColor(127, 77, 83, 1));
1584 
1585     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB32I, GL_INT, false, false,
1586              false, GLColor(127, 70, 75, 1));
1587     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB32I, GL_INT, false, true,
1588              false, GLColor(115, 63, 67, 1));
1589     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGB32I, GL_INT, false, false,
1590              true, GLColor(127, 77, 83, 1));
1591 
1592     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA8I, GL_BYTE, false, false,
1593              false, GLColor(127, 70, 75, 115));
1594     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA8I, GL_BYTE, false, true,
1595              false, GLColor(115, 63, 67, 115));
1596     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA8I, GL_BYTE, false, false,
1597              true, GLColor(127, 77, 83, 115));
1598 
1599     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA16I, GL_SHORT, false, false,
1600              false, GLColor(127, 70, 75, 115));
1601     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA16I, GL_SHORT, false, true,
1602              false, GLColor(115, 63, 67, 115));
1603     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA16I, GL_SHORT, false, false,
1604              true, GLColor(127, 77, 83, 115));
1605 
1606     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA32I, GL_INT, false, false,
1607              false, GLColor(127, 70, 75, 115));
1608     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA32I, GL_INT, false, true,
1609              false, GLColor(115, 63, 67, 115));
1610     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(255, 140, 150, 230), GL_RGBA32I, GL_INT, false, false,
1611              true, GLColor(127, 77, 83, 115));
1612 }
1613 
1614 // Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1615 // unsigned integer formats.
TEST_P(Texture2DArrayCopy,UintFormats)1616 TEST_P(Texture2DArrayCopy, UintFormats)
1617 {
1618     ANGLE_SKIP_TEST_IF(!checkExtensions());
1619 
1620     constexpr char kFS[] =
1621         "#version 300 es\n"
1622         "precision highp float;\n"
1623         "uniform highp usampler2DArray tex2DArray;\n"
1624         "in vec3 texcoord;\n"
1625         "out uvec4 fragColor;\n"
1626         "void main()\n"
1627         "{\n"
1628         "    fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
1629         "}\n";
1630 
1631     mProgram = CompileProgram(getVertexShaderSource(), kFS);
1632     ASSERT_NE(0u, mProgram);
1633     ASSERT_GL_NO_ERROR();
1634 
1635     glUseProgram(mProgram);
1636 
1637     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R8UI, GL_UNSIGNED_BYTE, false,
1638              false, false, GLColor(128, 0, 0, 1));
1639     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R8UI, GL_UNSIGNED_BYTE, false, true,
1640              false, GLColor(50, 0, 0, 1));
1641     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R8UI, GL_UNSIGNED_BYTE, false,
1642              false, true, GLColor(255, 0, 0, 1));
1643 
1644     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R16UI, GL_UNSIGNED_SHORT, false,
1645              false, false, GLColor(128, 0, 0, 1));
1646     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R16UI, GL_UNSIGNED_SHORT, false,
1647              true, false, GLColor(50, 0, 0, 1));
1648     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R16UI, GL_UNSIGNED_SHORT, false,
1649              false, true, GLColor(255, 0, 0, 1));
1650 
1651     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R32UI, GL_UNSIGNED_INT, false,
1652              false, false, GLColor(128, 0, 0, 1));
1653     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R32UI, GL_UNSIGNED_INT, false, true,
1654              false, GLColor(50, 0, 0, 1));
1655     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_R32UI, GL_UNSIGNED_INT, false,
1656              false, true, GLColor(255, 0, 0, 1));
1657 
1658     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG8UI, GL_UNSIGNED_BYTE, false,
1659              false, false, GLColor(128, 84, 0, 1));
1660     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG8UI, GL_UNSIGNED_BYTE, false,
1661              true, false, GLColor(50, 32, 0, 1));
1662     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG8UI, GL_UNSIGNED_BYTE, false,
1663              false, true, GLColor(255, 214, 0, 1));
1664 
1665     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG16UI, GL_UNSIGNED_SHORT, false,
1666              false, false, GLColor(128, 84, 0, 1));
1667     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG16UI, GL_UNSIGNED_SHORT, false,
1668              true, false, GLColor(50, 32, 0, 1));
1669     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG16UI, GL_UNSIGNED_SHORT, false,
1670              false, true, GLColor(255, 214, 0, 1));
1671 
1672     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG32UI, GL_UNSIGNED_INT, false,
1673              false, false, GLColor(128, 84, 0, 1));
1674     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG32UI, GL_UNSIGNED_INT, false,
1675              true, false, GLColor(50, 32, 0, 1));
1676     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RG32UI, GL_UNSIGNED_INT, false,
1677              false, true, GLColor(255, 214, 0, 1));
1678 
1679     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB8UI, GL_UNSIGNED_BYTE, false,
1680              false, false, GLColor(128, 84, 32, 1));
1681     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB8UI, GL_UNSIGNED_BYTE, false,
1682              true, false, GLColor(50, 32, 12, 1));
1683     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB8UI, GL_UNSIGNED_BYTE, false,
1684              false, true, GLColor(255, 214, 81, 1));
1685 
1686     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB16UI, GL_UNSIGNED_SHORT, false,
1687              false, false, GLColor(128, 84, 32, 1));
1688     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB16UI, GL_UNSIGNED_SHORT, false,
1689              true, false, GLColor(50, 32, 12, 1));
1690     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB16UI, GL_UNSIGNED_SHORT, false,
1691              false, true, GLColor(255, 214, 81, 1));
1692 
1693     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB32UI, GL_UNSIGNED_INT, false,
1694              false, false, GLColor(128, 84, 32, 1));
1695     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB32UI, GL_UNSIGNED_INT, false,
1696              true, false, GLColor(50, 32, 12, 1));
1697     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB32UI, GL_UNSIGNED_INT, false,
1698              false, true, GLColor(255, 214, 81, 1));
1699 
1700     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA8UI, GL_UNSIGNED_BYTE, false,
1701              false, false, GLColor(128, 84, 32, 100));
1702     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA8UI, GL_UNSIGNED_BYTE, false,
1703              true, false, GLColor(50, 32, 12, 100));
1704     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA8UI, GL_UNSIGNED_BYTE, false,
1705              false, true, GLColor(255, 214, 81, 100));
1706 
1707     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA16UI, GL_UNSIGNED_SHORT, false,
1708              false, false, GLColor(128, 84, 32, 100));
1709     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA16UI, GL_UNSIGNED_SHORT, false,
1710              true, false, GLColor(50, 32, 12, 100));
1711     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA16UI, GL_UNSIGNED_SHORT, false,
1712              false, true, GLColor(255, 214, 81, 100));
1713 
1714     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA32UI, GL_UNSIGNED_INT, false,
1715              false, false, GLColor(128, 84, 32, 100));
1716     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA32UI, GL_UNSIGNED_INT, false,
1717              true, false, GLColor(50, 32, 12, 100));
1718     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGBA32UI, GL_UNSIGNED_INT, false,
1719              false, true, GLColor(255, 214, 81, 100));
1720 
1721     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB10_A2UI,
1722              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false, GLColor(128, 84, 32, 3));
1723     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB10_A2UI,
1724              GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false, GLColor(50, 32, 12, 3));
1725     testCopy(GL_TEXTURE_2D_ARRAY, GLColor(128, 84, 32, 100), GL_RGB10_A2UI,
1726              GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true, GLColor(255, 214, 81, 3));
1727 }
1728 
1729 ANGLE_INSTANTIATE_TEST_ES3(Texture3DCopy);
1730 ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayCopy);
1731 
1732 }  // namespace angle
1733