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