blob: 529dad1ceae6d40e3426e833d0a05896a25bdafa [file] [log] [blame]
Geoff Lang97073d12016-04-20 10:42:34 -07001//
2// Copyright 2016 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// CopyTextureTest.cpp: Tests of the GL_CHROMIUM_copy_texture extension
8
9#include "test_utils/ANGLETest.h"
10
Geoff Lang4f0e0032017-05-01 16:04:35 -040011#include "test_utils/gl_raii.h"
12
Geoff Lang97073d12016-04-20 10:42:34 -070013namespace angle
14{
15
16class CopyTextureTest : public ANGLETest
17{
18 protected:
19 CopyTextureTest()
20 {
21 setWindowWidth(256);
22 setWindowHeight(256);
23 setConfigRedBits(8);
24 setConfigGreenBits(8);
25 setConfigBlueBits(8);
26 setConfigAlphaBits(8);
27 }
28
29 void SetUp() override
30 {
31 ANGLETest::SetUp();
32
33 glGenTextures(2, mTextures);
34 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
35
36 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
37 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
38 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
39 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
40
41 glGenFramebuffers(1, &mFramebuffer);
42 glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
43 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
44 0);
45
46 if (extensionEnabled("GL_CHROMIUM_copy_texture"))
47 {
48 glCopyTextureCHROMIUM = reinterpret_cast<PFNGLCOPYTEXTURECHROMIUMPROC>(
49 eglGetProcAddress("glCopyTextureCHROMIUM"));
50 glCopySubTextureCHROMIUM = reinterpret_cast<PFNGLCOPYSUBTEXTURECHROMIUMPROC>(
51 eglGetProcAddress("glCopySubTextureCHROMIUM"));
52 }
53 }
54
55 void TearDown() override
56 {
57 glDeleteTextures(2, mTextures);
58 glDeleteFramebuffers(1, &mFramebuffer);
59
60 ANGLETest::TearDown();
61 }
62
63 bool checkExtensions() const
64 {
65 if (!extensionEnabled("GL_CHROMIUM_copy_texture"))
66 {
67 std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available."
68 << std::endl;
69 return false;
70 }
71
72 EXPECT_NE(nullptr, glCopyTextureCHROMIUM);
73 EXPECT_NE(nullptr, glCopySubTextureCHROMIUM);
74 return true;
75 }
76
Shahbaz Youssefi29b49412019-01-07 14:03:06 -050077 void calculateCopyTextureResults(GLenum sourceFormat,
78 GLenum destFormat,
79 bool premultiplyAlpha,
80 bool unmultiplyAlpha,
81 const uint8_t *sourceColor,
82 GLColor *destColor)
83 {
84 GLColor color;
85
86 switch (sourceFormat)
87 {
88 case GL_RGB:
89 color = GLColor(sourceColor[0], sourceColor[1], sourceColor[2], 255);
90 break;
91 case GL_RGBA:
92 color = GLColor(sourceColor[0], sourceColor[1], sourceColor[2], sourceColor[3]);
93 break;
94 case GL_LUMINANCE:
95 color = GLColor(sourceColor[0], sourceColor[0], sourceColor[0], 255);
96 break;
97 case GL_ALPHA:
98 color = GLColor(0, 0, 0, sourceColor[0]);
99 break;
100 case GL_LUMINANCE_ALPHA:
101 color = GLColor(sourceColor[0], sourceColor[0], sourceColor[0], sourceColor[1]);
102 break;
103 case GL_BGRA_EXT:
104 color = GLColor(sourceColor[2], sourceColor[1], sourceColor[0], sourceColor[3]);
105 break;
106 default:
107 EXPECT_EQ(true, false);
108 }
109
110 if (premultiplyAlpha != unmultiplyAlpha)
111 {
112 float alpha = color.A / 255.0f;
113 if (premultiplyAlpha)
114 {
Jamie Madill7098cff2019-01-15 18:33:42 -0500115 color.R = static_cast<GLubyte>(static_cast<float>(color.R) * alpha);
116 color.G = static_cast<GLubyte>(static_cast<float>(color.G) * alpha);
117 color.B = static_cast<GLubyte>(static_cast<float>(color.B) * alpha);
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500118 }
119 else if (unmultiplyAlpha && color.A != 0)
120 {
Jamie Madill7098cff2019-01-15 18:33:42 -0500121 color.R = static_cast<GLubyte>(static_cast<float>(color.R) / alpha);
122 color.G = static_cast<GLubyte>(static_cast<float>(color.G) / alpha);
123 color.B = static_cast<GLubyte>(static_cast<float>(color.B) / alpha);
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500124 }
125 }
126
127 switch (destFormat)
128 {
129 case GL_RGB:
130 color.A = 255;
131 break;
132 case GL_RGBA:
133 case GL_BGRA_EXT:
134 break;
135 default:
136 EXPECT_EQ(true, false);
137 }
138
139 *destColor = color;
140 }
141
142 const uint8_t *getSourceColors(GLenum sourceFormat, size_t *colorCount, uint8_t *componentCount)
143 {
144 // Note: in all the following values, alpha is larger than RGB so unmultiply alpha doesn't
145 // overflow
146 constexpr static uint8_t kRgbaColors[7 * 4] = {
147 255u, 127u, 63u, 255u, // 0
148 31u, 127u, 63u, 127u, // 1
149 31u, 63u, 127u, 255u, // 2
150 15u, 127u, 31u, 127u, // 3
151 127u, 255u, 63u, 0u, // 4
152 31u, 63u, 127u, 0u, // 5
153 15u, 31u, 63u, 63u, // 6
154 };
155
156 constexpr static uint8_t kRgbColors[7 * 3] = {
157 255u, 127u, 63u, // 0
158 31u, 127u, 63u, // 1
159 31u, 63u, 127u, // 2
160 15u, 127u, 31u, // 3
161 127u, 255u, 63u, // 4
162 31u, 63u, 127u, // 5
163 15u, 31u, 63u, // 6
164 };
165
166 constexpr static uint8_t kLumColors[7 * 1] = {
167 255u, // 0
168 163u, // 1
169 78u, // 2
170 114u, // 3
171 51u, // 4
172 0u, // 5
173 217u, // 6
174 };
175
176 constexpr static uint8_t kLumaColors[7 * 2] = {
177 255u, 255u, // 0
178 67u, 163u, // 1
179 78u, 231u, // 2
180 8u, 114u, // 3
181 51u, 199u, // 4
182 0u, 173u, // 5
183 34u, 217u, // 6
184 };
185
186 constexpr static uint8_t kAlphaColors[7 * 1] = {
187 255u, // 0
188 67u, // 1
189 231u, // 2
190 8u, // 3
191 199u, // 4
192 173u, // 5
193 34u, // 6
194 };
195
196 *colorCount = 7;
197
198 switch (sourceFormat)
199 {
200 case GL_RGB:
201 *componentCount = 3;
202 return kRgbColors;
203 case GL_RGBA:
204 case GL_BGRA_EXT:
205 *componentCount = 4;
206 return kRgbaColors;
207 case GL_LUMINANCE:
208 *componentCount = 1;
209 return kLumColors;
210 case GL_ALPHA:
211 *componentCount = 1;
212 return kAlphaColors;
213 case GL_LUMINANCE_ALPHA:
214 *componentCount = 2;
215 return kLumaColors;
216 default:
217 EXPECT_EQ(true, false);
218 return nullptr;
219 }
220 }
221
222 void initializeSourceTexture(GLenum sourceFormat,
223 const uint8_t *srcColors,
224 uint8_t componentCount)
225 {
226 // The texture is initialized as 2x2. If the componentCount is 1 or 3, then the input data
227 // will have a row pitch of 2 or 6, which needs to be padded to 4 or 8 respectively.
228 uint8_t srcColorsPadded[4 * 4];
229 size_t srcRowPitch =
230 2 * componentCount + (componentCount == 1 || componentCount == 3 ? 2 : 0);
231 size_t inputRowPitch = 2 * componentCount;
232 for (size_t row = 0; row < 2; ++row)
233 {
234 memcpy(&srcColorsPadded[row * srcRowPitch], &srcColors[row * inputRowPitch],
235 inputRowPitch);
236 memset(&srcColorsPadded[row * srcRowPitch + inputRowPitch], 0,
237 srcRowPitch - inputRowPitch);
238 }
239
240 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
241 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 2, 2, 0, sourceFormat, GL_UNSIGNED_BYTE,
242 srcColorsPadded);
243 }
244
245 void testCopyTexture(GLenum sourceFormat,
246 GLenum destFormat,
247 bool flipY,
248 bool premultiplyAlpha,
249 bool unmultiplyAlpha)
250 {
251 if (!checkExtensions())
252 {
253 return;
254 }
255
256 size_t colorCount;
257 uint8_t componentCount;
258 const uint8_t *srcColors = getSourceColors(sourceFormat, &colorCount, &componentCount);
259
260 std::vector<GLColor> destColors(colorCount);
261 for (size_t i = 0; i < colorCount; ++i)
262 {
263 calculateCopyTextureResults(sourceFormat, destFormat, premultiplyAlpha, unmultiplyAlpha,
264 &srcColors[i * componentCount], &destColors[i]);
265 }
266
267 for (size_t i = 0; i < colorCount - 3; ++i)
268 {
269 initializeSourceTexture(sourceFormat, &srcColors[i * componentCount], componentCount);
270
271 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,
272 GL_UNSIGNED_BYTE, flipY, premultiplyAlpha, unmultiplyAlpha);
273
274 EXPECT_GL_NO_ERROR();
275
276 // Check that FB is complete.
277 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
278
279 if (flipY)
280 {
281 EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);
282 EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);
283 EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);
284 EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);
285 }
286 else
287 {
288 EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);
289 EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);
290 EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);
291 EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);
292 }
293
294 EXPECT_GL_NO_ERROR();
295 }
296 }
297
298 void testCopySubTexture(GLenum sourceFormat,
299 GLenum destFormat,
300 bool flipY,
301 bool premultiplyAlpha,
302 bool unmultiplyAlpha)
303 {
304 if (!checkExtensions())
305 {
306 return;
307 }
308
309 size_t colorCount;
310 uint8_t componentCount;
311 const uint8_t *srcColors = getSourceColors(sourceFormat, &colorCount, &componentCount);
312
313 std::vector<GLColor> destColors(colorCount);
314 for (size_t i = 0; i < colorCount; ++i)
315 {
316 calculateCopyTextureResults(sourceFormat, destFormat, premultiplyAlpha, unmultiplyAlpha,
317 &srcColors[i * componentCount], &destColors[i]);
318 }
319
320 for (size_t i = 0; i < colorCount - 3; ++i)
321 {
322 initializeSourceTexture(sourceFormat, &srcColors[i * componentCount], componentCount);
323
324 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
325 glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 2, 2, 0, destFormat, GL_UNSIGNED_BYTE,
326 nullptr);
327
328 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 2,
329 2, flipY, premultiplyAlpha, unmultiplyAlpha);
330
331 EXPECT_GL_NO_ERROR();
332
333 if (sourceFormat != GL_LUMINANCE && sourceFormat != GL_LUMINANCE_ALPHA &&
334 sourceFormat != GL_ALPHA)
335 {
336 // Check that FB is complete.
337 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
338 }
339
340 if (flipY)
341 {
342 EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 2], 1.0);
343 EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 3], 1.0);
344 EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 0], 1.0);
345 EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 1], 1.0);
346 }
347 else
348 {
349 EXPECT_PIXEL_COLOR_NEAR(0, 0, destColors[i + 0], 1.0);
350 EXPECT_PIXEL_COLOR_NEAR(1, 0, destColors[i + 1], 1.0);
351 EXPECT_PIXEL_COLOR_NEAR(0, 1, destColors[i + 2], 1.0);
352 EXPECT_PIXEL_COLOR_NEAR(1, 1, destColors[i + 3], 1.0);
353 }
354
355 EXPECT_GL_NO_ERROR();
356 }
357 }
358
Geoff Langf81d17c2018-02-02 15:10:37 -0500359 void testGradientDownsampleUniqueValues(GLenum destFormat,
360 GLenum destType,
361 const std::array<size_t, 4> &expectedUniqueValues)
362 {
363 std::array<GLColor, 256> sourceGradient;
364 for (size_t i = 0; i < sourceGradient.size(); i++)
365 {
366 GLubyte value = static_cast<GLubyte>(i);
367 sourceGradient[i] = GLColor(value, value, value, value);
368 }
369 GLTexture sourceTexture;
370 glBindTexture(GL_TEXTURE_2D, sourceTexture);
371 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
372 sourceGradient.data());
373
374 GLTexture destTexture;
375 glBindTexture(GL_TEXTURE_2D, destTexture);
376 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destFormat, destType,
377 GL_FALSE, GL_FALSE, GL_FALSE);
378 EXPECT_GL_NO_ERROR();
379
380 GLFramebuffer fbo;
381 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
382 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, destTexture, 0);
383
384 std::array<GLColor, 256> destData;
385 glReadPixels(0, 0, 256, 1, GL_RGBA, GL_UNSIGNED_BYTE, destData.data());
386 EXPECT_GL_NO_ERROR();
387
388 std::set<GLubyte> uniqueValues[4];
389 for (size_t i = 0; i < destData.size(); i++)
390 {
391 GLColor color = destData[i];
392 uniqueValues[0].insert(color.R);
393 uniqueValues[1].insert(color.G);
394 uniqueValues[2].insert(color.B);
395 uniqueValues[3].insert(color.A);
396 }
397
398 EXPECT_EQ(expectedUniqueValues[0], uniqueValues[0].size());
399 EXPECT_EQ(expectedUniqueValues[1], uniqueValues[1].size());
400 EXPECT_EQ(expectedUniqueValues[2], uniqueValues[2].size());
401 EXPECT_EQ(expectedUniqueValues[3], uniqueValues[3].size());
402 }
403
Geoff Lang97073d12016-04-20 10:42:34 -0700404 GLuint mTextures[2] = {
Jamie Madillb980c562018-11-27 11:34:27 -0500405 0,
406 0,
Geoff Lang97073d12016-04-20 10:42:34 -0700407 };
408 GLuint mFramebuffer = 0;
409
410 PFNGLCOPYTEXTURECHROMIUMPROC glCopyTextureCHROMIUM = nullptr;
411 PFNGLCOPYSUBTEXTURECHROMIUMPROC glCopySubTextureCHROMIUM = nullptr;
412};
413
Brandon Jones340b7b82017-06-26 13:02:31 -0700414class CopyTextureTestDest : public CopyTextureTest
Jamie Madillb980c562018-11-27 11:34:27 -0500415{};
Brandon Jones340b7b82017-06-26 13:02:31 -0700416
Brandon Jones28783792018-03-05 09:37:32 -0800417class CopyTextureTestWebGL : public CopyTextureTest
418{
419 protected:
420 CopyTextureTestWebGL() : CopyTextureTest() { setWebGLCompatibilityEnabled(true); }
421};
422
Geoff Lang4f0e0032017-05-01 16:04:35 -0400423class CopyTextureTestES3 : public CopyTextureTest
Jamie Madillb980c562018-11-27 11:34:27 -0500424{};
Geoff Lang4f0e0032017-05-01 16:04:35 -0400425
Geoff Lang97073d12016-04-20 10:42:34 -0700426// Test to ensure that the basic functionality of the extension works.
427TEST_P(CopyTextureTest, BasicCopyTexture)
428{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500429 testCopyTexture(GL_RGBA, GL_RGBA, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700430}
431
432// Test to ensure that the basic functionality of the extension works.
433TEST_P(CopyTextureTest, BasicCopySubTexture)
434{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500435 testCopySubTexture(GL_RGBA, GL_RGBA, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700436}
437
438// Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to
439// immutable textures
440TEST_P(CopyTextureTest, ImmutableTexture)
441{
442 if (!checkExtensions())
443 {
444 return;
445 }
446
Yunchao He9550c602018-02-13 14:47:05 +0800447 ANGLE_SKIP_TEST_IF(
448 getClientMajorVersion() < 3 &&
449 (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")));
Geoff Lang97073d12016-04-20 10:42:34 -0700450
451 GLColor pixels = GLColor::red;
452
453 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
454 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
455 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
456
457 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
458 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
459 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
460 EXPECT_GL_NO_ERROR();
461
462 // Should generate an error when the texture is redefined
Geoff Langfc72a072017-03-24 14:52:39 -0400463 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
464 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700465 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
466
467 // Should succeed when using CopySubTexture
Geoff Langfc72a072017-03-24 14:52:39 -0400468 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
469 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700470 EXPECT_GL_NO_ERROR();
471
472 // Check that FB is complete.
473 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
474
475 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
476
477 EXPECT_GL_NO_ERROR();
478}
479
480// Test validation of internal formats in CopyTexture and CopySubTexture
481TEST_P(CopyTextureTest, InternalFormat)
482{
483 if (!checkExtensions())
484 {
485 return;
486 }
487
488 std::vector<GLint> sourceFormats;
489 sourceFormats.push_back(GL_ALPHA);
490 sourceFormats.push_back(GL_RGB);
491 sourceFormats.push_back(GL_RGBA);
492 sourceFormats.push_back(GL_LUMINANCE);
493 sourceFormats.push_back(GL_LUMINANCE_ALPHA);
494
495 std::vector<GLint> destFormats;
496 destFormats.push_back(GL_RGB);
497 destFormats.push_back(GL_RGBA);
498
499 if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
500 {
501 sourceFormats.push_back(GL_BGRA_EXT);
502 destFormats.push_back(GL_BGRA_EXT);
503 }
504
505 // Test with glCopyTexture
506 for (GLint sourceFormat : sourceFormats)
507 {
508 for (GLint destFormat : destFormats)
509 {
510 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
511 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
512 nullptr);
513 EXPECT_GL_NO_ERROR();
514
Geoff Langfc72a072017-03-24 14:52:39 -0400515 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,
516 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700517
518 EXPECT_GL_NO_ERROR();
519 }
520 }
521
522 // Test with glCopySubTexture
523 for (GLint sourceFormat : sourceFormats)
524 {
525 for (GLint destFormat : destFormats)
526 {
527 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
528 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
529 nullptr);
530 EXPECT_GL_NO_ERROR();
531
532 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
533 glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE,
534 nullptr);
535 EXPECT_GL_NO_ERROR();
536
Geoff Langfc72a072017-03-24 14:52:39 -0400537 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1,
538 1, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700539
540 EXPECT_GL_NO_ERROR();
541 }
542 }
543}
544
Geoff Lang97073d12016-04-20 10:42:34 -0700545// Test to ensure that the destination texture is redefined if the properties are different.
546TEST_P(CopyTextureTest, RedefineDestinationTexture)
547{
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -0700548 ANGLE_SKIP_TEST_IF(!checkExtensions());
549 ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_texture_format_BGRA8888"));
Geoff Lang97073d12016-04-20 10:42:34 -0700550
551 GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
552
553 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
554 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
555
556 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
557 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
558 EXPECT_GL_NO_ERROR();
559
560 // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
561 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
562 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
563 // GL_INVALID_VALUE due to bad dimensions.
564 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
565 EXPECT_GL_ERROR(GL_INVALID_VALUE);
566
567 // If the dest texture has different properties, glCopyTextureCHROMIUM()
568 // redefines them.
Geoff Langfc72a072017-03-24 14:52:39 -0400569 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
570 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700571 EXPECT_GL_NO_ERROR();
572
573 // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2
574 // dimension and GL_RGBA format.
575 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
576 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
577 EXPECT_GL_NO_ERROR();
578
579 // Check that FB is complete.
580 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
581
582 EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);
583 EXPECT_GL_NO_ERROR();
584}
585
586// Test that invalid dimensions in CopySubTexture are validated
587TEST_P(CopyTextureTest, CopySubTextureDimension)
588{
589 if (!checkExtensions())
590 {
591 return;
592 }
593
594 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
595 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
596
597 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
598 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
599
Geoff Langfc72a072017-03-24 14:52:39 -0400600 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
601 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700602 EXPECT_GL_NO_ERROR();
603
604 // xoffset < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400605 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, -1, 1, 0, 0, 1, 1,
606 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700607 EXPECT_GL_ERROR(GL_INVALID_VALUE);
608
609 // x < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400610 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, -1, 0, 1, 1,
611 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700612 EXPECT_GL_ERROR(GL_INVALID_VALUE);
613
614 // xoffset + width > dest_width
Geoff Langfc72a072017-03-24 14:52:39 -0400615 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 2, 2, 0, 0, 2, 2,
616 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700617 EXPECT_GL_ERROR(GL_INVALID_VALUE);
618
619 // x + width > source_width
Geoff Langfc72a072017-03-24 14:52:39 -0400620 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 1, 1, 2, 2,
621 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700622 EXPECT_GL_ERROR(GL_INVALID_VALUE);
623}
624
625// Test that invalid IDs in CopyTexture are validated
626TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)
627{
628 if (!checkExtensions())
629 {
630 return;
631 }
632
633 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
634 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
635
636 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
637 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
638
Geoff Langfc72a072017-03-24 14:52:39 -0400639 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, GL_RGBA, GL_UNSIGNED_BYTE,
640 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700641 EXPECT_GL_ERROR(GL_INVALID_VALUE);
642
Geoff Langfc72a072017-03-24 14:52:39 -0400643 glCopyTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA, GL_UNSIGNED_BYTE,
644 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700645 EXPECT_GL_ERROR(GL_INVALID_VALUE);
646
Geoff Langfc72a072017-03-24 14:52:39 -0400647 glCopyTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, GL_RGBA, GL_UNSIGNED_BYTE, false,
648 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700649 EXPECT_GL_ERROR(GL_INVALID_VALUE);
650
Geoff Langfc72a072017-03-24 14:52:39 -0400651 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
652 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700653 EXPECT_GL_NO_ERROR();
654}
655
656// Test that invalid IDs in CopySubTexture are validated
657TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
658{
659 if (!checkExtensions())
660 {
661 return;
662 }
663
664 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
665 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
666
667 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
668 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
669
Geoff Langfc72a072017-03-24 14:52:39 -0400670 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, 1, 1, 0, 0, 1, 1, false,
671 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700672 EXPECT_GL_ERROR(GL_INVALID_VALUE);
673
Geoff Langfc72a072017-03-24 14:52:39 -0400674 glCopySubTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1, false,
675 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700676 EXPECT_GL_ERROR(GL_INVALID_VALUE);
677
Geoff Langfc72a072017-03-24 14:52:39 -0400678 glCopySubTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, 1, 1, 0, 0, 1, 1, false, false,
679 false);
Geoff Lang97073d12016-04-20 10:42:34 -0700680 EXPECT_GL_ERROR(GL_INVALID_VALUE);
681
Geoff Langfc72a072017-03-24 14:52:39 -0400682 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
683 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700684 EXPECT_GL_NO_ERROR();
685}
686
Geoff Lang63458a32017-10-30 15:16:53 -0400687TEST_P(CopyTextureTest, InvalidTarget)
688{
689 ANGLE_SKIP_TEST_IF(!checkExtensions());
690
691 GLTexture textures[2];
692
693 glBindTexture(GL_TEXTURE_2D, textures[0]);
694 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
695
696 glBindTexture(GL_TEXTURE_2D, textures[1]);
697 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
698
699 // Invalid enum for a completely invalid target
700 glCopySubTextureCHROMIUM(textures[0], 0, GL_INVALID_VALUE, textures[1], 0, 1, 1, 0, 0, 1, 1,
701 false, false, false);
702 EXPECT_GL_ERROR(GL_INVALID_ENUM);
703
704 // Invalid value for a valid target enum but is not valid for the destination texture
705 glCopySubTextureCHROMIUM(textures[0], 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textures[1], 0, 1, 1,
706 0, 0, 1, 1, false, false, false);
707 EXPECT_GL_ERROR(GL_INVALID_VALUE);
708}
709
Geoff Lang97073d12016-04-20 10:42:34 -0700710// Test that using an offset in CopySubTexture works correctly
711TEST_P(CopyTextureTest, CopySubTextureOffset)
712{
713 if (!checkExtensions())
714 {
715 return;
716 }
717
718 GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
719 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
720 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
721
722 GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,
723 GLColor::transparentBlack, GLColor::transparentBlack};
724 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
725 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);
726
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500727 // Check that FB is complete.
728 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
729
Geoff Langfc72a072017-03-24 14:52:39 -0400730 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
731 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700732 EXPECT_GL_NO_ERROR();
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500733 EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
734
Geoff Langfc72a072017-03-24 14:52:39 -0400735 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 0, 1, 0, 1, 1,
736 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700737 EXPECT_GL_NO_ERROR();
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500738 EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
739
Geoff Langfc72a072017-03-24 14:52:39 -0400740 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 1, 0, 1, 1, 1,
741 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700742 EXPECT_GL_NO_ERROR();
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500743 EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
Geoff Lang97073d12016-04-20 10:42:34 -0700744
745 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
Geoff Lang97073d12016-04-20 10:42:34 -0700746 EXPECT_GL_NO_ERROR();
747}
748
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500749// Test every combination of copy [sub]texture parameters:
750// source: ALPHA, RGB, RGBA, LUMINANCE, LUMINANCE_ALPHA, BGRA_EXT
751// destination: RGB, RGBA, BGRA_EXT
752// flipY: false, true
753// premultiplyAlpha: false, true
754// unmultiplyAlpha: false, true
755TEST_P(CopyTextureTest, CopyTextureAToRGB)
Geoff Lang97073d12016-04-20 10:42:34 -0700756{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500757 testCopyTexture(GL_ALPHA, GL_RGB, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700758}
759
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500760TEST_P(CopyTextureTest, CopySubTextureAToRGB)
Geoff Lang97073d12016-04-20 10:42:34 -0700761{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500762 testCopySubTexture(GL_ALPHA, GL_RGB, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700763}
764
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500765TEST_P(CopyTextureTest, CopyTextureAToRGBUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -0700766{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500767 testCopyTexture(GL_ALPHA, GL_RGB, false, false, true);
Geoff Lang97073d12016-04-20 10:42:34 -0700768}
769
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500770TEST_P(CopyTextureTest, CopySubTextureAToRGBUnmultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -0700771{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500772 testCopySubTexture(GL_ALPHA, GL_RGB, false, false, true);
Geoff Lang97073d12016-04-20 10:42:34 -0700773}
774
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500775TEST_P(CopyTextureTest, CopyTextureAToRGBPremultiplyAlpha)
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500776{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500777 testCopyTexture(GL_ALPHA, GL_RGB, false, true, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500778}
779
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500780TEST_P(CopyTextureTest, CopySubTextureAToRGBPremultiplyAlpha)
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500781{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500782 testCopySubTexture(GL_ALPHA, GL_RGB, false, true, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500783}
784
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500785TEST_P(CopyTextureTest, CopyTextureAToRGBPremultiplyAlphaUnmultiplyAlpha)
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500786{
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500787 testCopyTexture(GL_ALPHA, GL_RGB, false, true, true);
788}
789
790TEST_P(CopyTextureTest, CopySubTextureAToRGBPremultiplyAlphaUnmultiplyAlpha)
791{
792 testCopySubTexture(GL_ALPHA, GL_RGB, false, true, true);
793}
794
795TEST_P(CopyTextureTest, CopyTextureAToRGBFlipY)
796{
797 testCopyTexture(GL_ALPHA, GL_RGB, true, false, false);
798}
799
800TEST_P(CopyTextureTest, CopySubTextureAToRGBFlipY)
801{
802 testCopySubTexture(GL_ALPHA, GL_RGB, true, false, false);
803}
804
805TEST_P(CopyTextureTest, CopyTextureAToRGBFlipYUnmultiplyAlpha)
806{
807 testCopyTexture(GL_ALPHA, GL_RGB, true, false, true);
808}
809
810TEST_P(CopyTextureTest, CopySubTextureAToRGBFlipYUnmultiplyAlpha)
811{
812 testCopySubTexture(GL_ALPHA, GL_RGB, true, false, true);
813}
814
815TEST_P(CopyTextureTest, CopyTextureAToRGBFlipYPremultiplyAlpha)
816{
817 testCopyTexture(GL_ALPHA, GL_RGB, true, true, false);
818}
819
820TEST_P(CopyTextureTest, CopySubTextureAToRGBFlipYPremultiplyAlpha)
821{
822 testCopySubTexture(GL_ALPHA, GL_RGB, true, true, false);
823}
824
825TEST_P(CopyTextureTest, CopyTextureAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
826{
827 testCopyTexture(GL_ALPHA, GL_RGB, true, true, true);
828}
829
830TEST_P(CopyTextureTest, CopySubTextureAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
831{
832 testCopySubTexture(GL_ALPHA, GL_RGB, true, true, true);
833}
834
835TEST_P(CopyTextureTest, CopyTextureAToRGBA)
836{
837 testCopyTexture(GL_ALPHA, GL_RGBA, false, false, false);
838}
839
840TEST_P(CopyTextureTest, CopySubTextureAToRGBA)
841{
842 testCopySubTexture(GL_ALPHA, GL_RGBA, false, false, false);
843}
844
845TEST_P(CopyTextureTest, CopyTextureAToRGBAUnmultiplyAlpha)
846{
847 testCopyTexture(GL_ALPHA, GL_RGBA, false, false, true);
848}
849
850TEST_P(CopyTextureTest, CopySubTextureAToRGBAUnmultiplyAlpha)
851{
852 testCopySubTexture(GL_ALPHA, GL_RGBA, false, false, true);
853}
854
855TEST_P(CopyTextureTest, CopyTextureAToRGBAPremultiplyAlpha)
856{
857 testCopyTexture(GL_ALPHA, GL_RGBA, false, true, false);
858}
859
860TEST_P(CopyTextureTest, CopySubTextureAToRGBAPremultiplyAlpha)
861{
862 testCopySubTexture(GL_ALPHA, GL_RGBA, false, true, false);
863}
864
865TEST_P(CopyTextureTest, CopyTextureAToRGBAPremultiplyAlphaUnmultiplyAlpha)
866{
867 testCopyTexture(GL_ALPHA, GL_RGBA, false, true, true);
868}
869
870TEST_P(CopyTextureTest, CopySubTextureAToRGBAPremultiplyAlphaUnmultiplyAlpha)
871{
872 testCopySubTexture(GL_ALPHA, GL_RGBA, false, true, true);
873}
874
875TEST_P(CopyTextureTest, CopyTextureAToRGBAFlipY)
876{
877 testCopyTexture(GL_ALPHA, GL_RGBA, true, false, false);
878}
879
880TEST_P(CopyTextureTest, CopySubTextureAToRGBAFlipY)
881{
882 testCopySubTexture(GL_ALPHA, GL_RGBA, true, false, false);
883}
884
885TEST_P(CopyTextureTest, CopyTextureAToRGBAFlipYUnmultiplyAlpha)
886{
887 testCopyTexture(GL_ALPHA, GL_RGBA, true, false, true);
888}
889
890TEST_P(CopyTextureTest, CopySubTextureAToRGBAFlipYUnmultiplyAlpha)
891{
892 testCopySubTexture(GL_ALPHA, GL_RGBA, true, false, true);
893}
894
895TEST_P(CopyTextureTest, CopyTextureAToRGBAFlipYPremultiplyAlpha)
896{
897 testCopyTexture(GL_ALPHA, GL_RGBA, true, true, false);
898}
899
900TEST_P(CopyTextureTest, CopySubTextureAToRGBAFlipYPremultiplyAlpha)
901{
902 testCopySubTexture(GL_ALPHA, GL_RGBA, true, true, false);
903}
904
905TEST_P(CopyTextureTest, CopyTextureAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
906{
907 testCopyTexture(GL_ALPHA, GL_RGBA, true, true, true);
908}
909
910TEST_P(CopyTextureTest, CopySubTextureAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
911{
912 testCopySubTexture(GL_ALPHA, GL_RGBA, true, true, true);
913}
914
915TEST_P(CopyTextureTest, CopyTextureAToBGRA)
916{
917 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500918 {
919 return;
920 }
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500921 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, false, false, false);
922}
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500923
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500924TEST_P(CopyTextureTest, CopySubTextureAToBGRA)
925{
926 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
927 {
928 return;
929 }
930 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, false, false, false);
931}
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500932
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500933TEST_P(CopyTextureTest, CopyTextureAToBGRAUnmultiplyAlpha)
934{
935 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
936 {
937 return;
938 }
939 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, false, false, true);
940}
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500941
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500942TEST_P(CopyTextureTest, CopySubTextureAToBGRAUnmultiplyAlpha)
943{
944 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
945 {
946 return;
947 }
948 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, false, false, true);
949}
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500950
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500951TEST_P(CopyTextureTest, CopyTextureAToBGRAPremultiplyAlpha)
952{
953 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
954 {
955 return;
956 }
957 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, false, true, false);
958}
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500959
Shahbaz Youssefi29b49412019-01-07 14:03:06 -0500960TEST_P(CopyTextureTest, CopySubTextureAToBGRAPremultiplyAlpha)
961{
962 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
963 {
964 return;
965 }
966 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, false, true, false);
967}
968
969TEST_P(CopyTextureTest, CopyTextureAToBGRAPremultiplyAlphaUnmultiplyAlpha)
970{
971 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
972 {
973 return;
974 }
975 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, false, true, true);
976}
977
978TEST_P(CopyTextureTest, CopySubTextureAToBGRAPremultiplyAlphaUnmultiplyAlpha)
979{
980 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
981 {
982 return;
983 }
984 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, false, true, true);
985}
986
987TEST_P(CopyTextureTest, CopyTextureAToBGRAFlipY)
988{
989 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
990 {
991 return;
992 }
993 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, true, false, false);
994}
995
996TEST_P(CopyTextureTest, CopySubTextureAToBGRAFlipY)
997{
998 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
999 {
1000 return;
1001 }
1002 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, true, false, false);
1003}
1004
1005TEST_P(CopyTextureTest, CopyTextureAToBGRAFlipYUnmultiplyAlpha)
1006{
1007 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1008 {
1009 return;
1010 }
1011 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, true, false, true);
1012}
1013
1014TEST_P(CopyTextureTest, CopySubTextureAToBGRAFlipYUnmultiplyAlpha)
1015{
1016 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1017 {
1018 return;
1019 }
1020 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, true, false, true);
1021}
1022
1023TEST_P(CopyTextureTest, CopyTextureAToBGRAFlipYPremultiplyAlpha)
1024{
1025 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1026 {
1027 return;
1028 }
1029 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, true, true, false);
1030}
1031
1032TEST_P(CopyTextureTest, CopySubTextureAToBGRAFlipYPremultiplyAlpha)
1033{
1034 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1035 {
1036 return;
1037 }
1038 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, true, true, false);
1039}
1040
1041TEST_P(CopyTextureTest, CopyTextureAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1042{
1043 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1044 {
1045 return;
1046 }
1047 testCopyTexture(GL_ALPHA, GL_BGRA_EXT, true, true, true);
1048}
1049
1050TEST_P(CopyTextureTest, CopySubTextureAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1051{
1052 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1053 {
1054 return;
1055 }
1056 testCopySubTexture(GL_ALPHA, GL_BGRA_EXT, true, true, true);
1057}
1058
1059TEST_P(CopyTextureTest, CopyTextureRGBToRGB)
1060{
1061 testCopyTexture(GL_RGB, GL_RGB, false, false, false);
1062}
1063
1064TEST_P(CopyTextureTest, CopySubTextureRGBToRGB)
1065{
1066 testCopySubTexture(GL_RGB, GL_RGB, false, false, false);
1067}
1068
1069TEST_P(CopyTextureTest, CopyTextureRGBToRGBUnmultiplyAlpha)
1070{
1071 testCopyTexture(GL_RGB, GL_RGB, false, false, true);
1072}
1073
1074TEST_P(CopyTextureTest, CopySubTextureRGBToRGBUnmultiplyAlpha)
1075{
1076 testCopySubTexture(GL_RGB, GL_RGB, false, false, true);
1077}
1078
1079TEST_P(CopyTextureTest, CopyTextureRGBToRGBPremultiplyAlpha)
1080{
1081 testCopyTexture(GL_RGB, GL_RGB, false, true, false);
1082}
1083
1084TEST_P(CopyTextureTest, CopySubTextureRGBToRGBPremultiplyAlpha)
1085{
1086 testCopySubTexture(GL_RGB, GL_RGB, false, true, false);
1087}
1088
1089TEST_P(CopyTextureTest, CopyTextureRGBToRGBPremultiplyAlphaUnmultiplyAlpha)
1090{
1091 testCopyTexture(GL_RGB, GL_RGB, false, true, true);
1092}
1093
1094TEST_P(CopyTextureTest, CopySubTextureRGBToRGBPremultiplyAlphaUnmultiplyAlpha)
1095{
1096 testCopySubTexture(GL_RGB, GL_RGB, false, true, true);
1097}
1098
1099TEST_P(CopyTextureTest, CopyTextureRGBToRGBFlipY)
1100{
1101 testCopyTexture(GL_RGB, GL_RGB, true, false, false);
1102}
1103
1104TEST_P(CopyTextureTest, CopySubTextureRGBToRGBFlipY)
1105{
1106 testCopySubTexture(GL_RGB, GL_RGB, true, false, false);
1107}
1108
1109TEST_P(CopyTextureTest, CopyTextureRGBToRGBFlipYUnmultiplyAlpha)
1110{
1111 testCopyTexture(GL_RGB, GL_RGB, true, false, true);
1112}
1113
1114TEST_P(CopyTextureTest, CopySubTextureRGBToRGBFlipYUnmultiplyAlpha)
1115{
1116 testCopySubTexture(GL_RGB, GL_RGB, true, false, true);
1117}
1118
1119TEST_P(CopyTextureTest, CopyTextureRGBToRGBFlipYPremultiplyAlpha)
1120{
1121 testCopyTexture(GL_RGB, GL_RGB, true, true, false);
1122}
1123
1124TEST_P(CopyTextureTest, CopySubTextureRGBToRGBFlipYPremultiplyAlpha)
1125{
1126 testCopySubTexture(GL_RGB, GL_RGB, true, true, false);
1127}
1128
1129TEST_P(CopyTextureTest, CopyTextureRGBToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
1130{
1131 testCopyTexture(GL_RGB, GL_RGB, true, true, true);
1132}
1133
1134TEST_P(CopyTextureTest, CopySubTextureRGBToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
1135{
1136 testCopySubTexture(GL_RGB, GL_RGB, true, true, true);
1137}
1138
1139TEST_P(CopyTextureTest, CopyTextureRGBToRGBA)
1140{
1141 testCopyTexture(GL_RGB, GL_RGBA, false, false, false);
1142}
1143
1144TEST_P(CopyTextureTest, CopySubTextureRGBToRGBA)
1145{
1146 testCopySubTexture(GL_RGB, GL_RGBA, false, false, false);
1147}
1148
1149TEST_P(CopyTextureTest, CopyTextureRGBToRGBAUnmultiplyAlpha)
1150{
1151 testCopyTexture(GL_RGB, GL_RGBA, false, false, true);
1152}
1153
1154TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAUnmultiplyAlpha)
1155{
1156 testCopySubTexture(GL_RGB, GL_RGBA, false, false, true);
1157}
1158
1159TEST_P(CopyTextureTest, CopyTextureRGBToRGBAPremultiplyAlpha)
1160{
1161 testCopyTexture(GL_RGB, GL_RGBA, false, true, false);
1162}
1163
1164TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAPremultiplyAlpha)
1165{
1166 testCopySubTexture(GL_RGB, GL_RGBA, false, true, false);
1167}
1168
1169TEST_P(CopyTextureTest, CopyTextureRGBToRGBAPremultiplyAlphaUnmultiplyAlpha)
1170{
1171 testCopyTexture(GL_RGB, GL_RGBA, false, true, true);
1172}
1173
1174TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAPremultiplyAlphaUnmultiplyAlpha)
1175{
1176 testCopySubTexture(GL_RGB, GL_RGBA, false, true, true);
1177}
1178
1179TEST_P(CopyTextureTest, CopyTextureRGBToRGBAFlipY)
1180{
1181 testCopyTexture(GL_RGB, GL_RGBA, true, false, false);
1182}
1183
1184TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAFlipY)
1185{
1186 testCopySubTexture(GL_RGB, GL_RGBA, true, false, false);
1187}
1188
1189TEST_P(CopyTextureTest, CopyTextureRGBToRGBAFlipYUnmultiplyAlpha)
1190{
1191 testCopyTexture(GL_RGB, GL_RGBA, true, false, true);
1192}
1193
1194TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAFlipYUnmultiplyAlpha)
1195{
1196 testCopySubTexture(GL_RGB, GL_RGBA, true, false, true);
1197}
1198
1199TEST_P(CopyTextureTest, CopyTextureRGBToRGBAFlipYPremultiplyAlpha)
1200{
1201 testCopyTexture(GL_RGB, GL_RGBA, true, true, false);
1202}
1203
1204TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAFlipYPremultiplyAlpha)
1205{
1206 testCopySubTexture(GL_RGB, GL_RGBA, true, true, false);
1207}
1208
1209TEST_P(CopyTextureTest, CopyTextureRGBToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
1210{
1211 testCopyTexture(GL_RGB, GL_RGBA, true, true, true);
1212}
1213
1214TEST_P(CopyTextureTest, CopySubTextureRGBToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
1215{
1216 testCopySubTexture(GL_RGB, GL_RGBA, true, true, true);
1217}
1218
1219TEST_P(CopyTextureTest, CopyTextureRGBToBGRA)
1220{
1221 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1222 {
1223 return;
1224 }
1225 testCopyTexture(GL_RGB, GL_BGRA_EXT, false, false, false);
1226}
1227
1228TEST_P(CopyTextureTest, CopySubTextureRGBToBGRA)
1229{
1230 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1231 {
1232 return;
1233 }
1234 testCopySubTexture(GL_RGB, GL_BGRA_EXT, false, false, false);
1235}
1236
1237TEST_P(CopyTextureTest, CopyTextureRGBToBGRAUnmultiplyAlpha)
1238{
1239 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1240 {
1241 return;
1242 }
1243 testCopyTexture(GL_RGB, GL_BGRA_EXT, false, false, true);
1244}
1245
1246TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAUnmultiplyAlpha)
1247{
1248 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1249 {
1250 return;
1251 }
1252 testCopySubTexture(GL_RGB, GL_BGRA_EXT, false, false, true);
1253}
1254
1255TEST_P(CopyTextureTest, CopyTextureRGBToBGRAPremultiplyAlpha)
1256{
1257 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1258 {
1259 return;
1260 }
1261 testCopyTexture(GL_RGB, GL_BGRA_EXT, false, true, false);
1262}
1263
1264TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAPremultiplyAlpha)
1265{
1266 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1267 {
1268 return;
1269 }
1270 testCopySubTexture(GL_RGB, GL_BGRA_EXT, false, true, false);
1271}
1272
1273TEST_P(CopyTextureTest, CopyTextureRGBToBGRAPremultiplyAlphaUnmultiplyAlpha)
1274{
1275 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1276 {
1277 return;
1278 }
1279 testCopyTexture(GL_RGB, GL_BGRA_EXT, false, true, true);
1280}
1281
1282TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAPremultiplyAlphaUnmultiplyAlpha)
1283{
1284 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1285 {
1286 return;
1287 }
1288 testCopySubTexture(GL_RGB, GL_BGRA_EXT, false, true, true);
1289}
1290
1291TEST_P(CopyTextureTest, CopyTextureRGBToBGRAFlipY)
1292{
1293 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1294 {
1295 return;
1296 }
1297 testCopyTexture(GL_RGB, GL_BGRA_EXT, true, false, false);
1298}
1299
1300TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAFlipY)
1301{
1302 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1303 {
1304 return;
1305 }
1306 testCopySubTexture(GL_RGB, GL_BGRA_EXT, true, false, false);
1307}
1308
1309TEST_P(CopyTextureTest, CopyTextureRGBToBGRAFlipYUnmultiplyAlpha)
1310{
1311 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1312 {
1313 return;
1314 }
1315 testCopyTexture(GL_RGB, GL_BGRA_EXT, true, false, true);
1316}
1317
1318TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAFlipYUnmultiplyAlpha)
1319{
1320 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1321 {
1322 return;
1323 }
1324 testCopySubTexture(GL_RGB, GL_BGRA_EXT, true, false, true);
1325}
1326
1327TEST_P(CopyTextureTest, CopyTextureRGBToBGRAFlipYPremultiplyAlpha)
1328{
1329 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1330 {
1331 return;
1332 }
1333 testCopyTexture(GL_RGB, GL_BGRA_EXT, true, true, false);
1334}
1335
1336TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAFlipYPremultiplyAlpha)
1337{
1338 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1339 {
1340 return;
1341 }
1342 testCopySubTexture(GL_RGB, GL_BGRA_EXT, true, true, false);
1343}
1344
1345TEST_P(CopyTextureTest, CopyTextureRGBToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1346{
1347 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1348 {
1349 return;
1350 }
1351 testCopyTexture(GL_RGB, GL_BGRA_EXT, true, true, true);
1352}
1353
1354TEST_P(CopyTextureTest, CopySubTextureRGBToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1355{
1356 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1357 {
1358 return;
1359 }
1360 testCopySubTexture(GL_RGB, GL_BGRA_EXT, true, true, true);
1361}
1362
1363TEST_P(CopyTextureTest, CopyTextureRGBAToRGB)
1364{
1365 testCopyTexture(GL_RGBA, GL_RGB, false, false, false);
1366}
1367
1368TEST_P(CopyTextureTest, CopySubTextureRGBAToRGB)
1369{
1370 testCopySubTexture(GL_RGBA, GL_RGB, false, false, false);
1371}
1372
1373TEST_P(CopyTextureTest, CopyTextureRGBAToRGBUnmultiplyAlpha)
1374{
1375 testCopyTexture(GL_RGBA, GL_RGB, false, false, true);
1376}
1377
1378TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBUnmultiplyAlpha)
1379{
1380 testCopySubTexture(GL_RGBA, GL_RGB, false, false, true);
1381}
1382
1383TEST_P(CopyTextureTest, CopyTextureRGBAToRGBPremultiplyAlpha)
1384{
1385 testCopyTexture(GL_RGBA, GL_RGB, false, true, false);
1386}
1387
1388TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBPremultiplyAlpha)
1389{
1390 testCopySubTexture(GL_RGBA, GL_RGB, false, true, false);
1391}
1392
1393TEST_P(CopyTextureTest, CopyTextureRGBAToRGBPremultiplyAlphaUnmultiplyAlpha)
1394{
1395 testCopyTexture(GL_RGBA, GL_RGB, false, true, true);
1396}
1397
1398TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBPremultiplyAlphaUnmultiplyAlpha)
1399{
1400 testCopySubTexture(GL_RGBA, GL_RGB, false, true, true);
1401}
1402
1403TEST_P(CopyTextureTest, CopyTextureRGBAToRGBFlipY)
1404{
1405 testCopyTexture(GL_RGBA, GL_RGB, true, false, false);
1406}
1407
1408TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBFlipY)
1409{
1410 testCopySubTexture(GL_RGBA, GL_RGB, true, false, false);
1411}
1412
1413TEST_P(CopyTextureTest, CopyTextureRGBAToRGBFlipYUnmultiplyAlpha)
1414{
1415 testCopyTexture(GL_RGBA, GL_RGB, true, false, true);
1416}
1417
1418TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBFlipYUnmultiplyAlpha)
1419{
1420 testCopySubTexture(GL_RGBA, GL_RGB, true, false, true);
1421}
1422
1423TEST_P(CopyTextureTest, CopyTextureRGBAToRGBFlipYPremultiplyAlpha)
1424{
1425 testCopyTexture(GL_RGBA, GL_RGB, true, true, false);
1426}
1427
1428TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBFlipYPremultiplyAlpha)
1429{
1430 testCopySubTexture(GL_RGBA, GL_RGB, true, true, false);
1431}
1432
1433TEST_P(CopyTextureTest, CopyTextureRGBAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
1434{
1435 testCopyTexture(GL_RGBA, GL_RGB, true, true, true);
1436}
1437
1438TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
1439{
1440 testCopySubTexture(GL_RGBA, GL_RGB, true, true, true);
1441}
1442
1443TEST_P(CopyTextureTest, CopyTextureRGBAToRGBA)
1444{
1445 testCopyTexture(GL_RGBA, GL_RGBA, false, false, false);
1446}
1447
1448TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBA)
1449{
1450 testCopySubTexture(GL_RGBA, GL_RGBA, false, false, false);
1451}
1452
1453TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAUnmultiplyAlpha)
1454{
1455 testCopyTexture(GL_RGBA, GL_RGBA, false, false, true);
1456}
1457
1458TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAUnmultiplyAlpha)
1459{
1460 testCopySubTexture(GL_RGBA, GL_RGBA, false, false, true);
1461}
1462
1463TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAPremultiplyAlpha)
1464{
1465 testCopyTexture(GL_RGBA, GL_RGBA, false, true, false);
1466}
1467
1468TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAPremultiplyAlpha)
1469{
1470 testCopySubTexture(GL_RGBA, GL_RGBA, false, true, false);
1471}
1472
1473TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAPremultiplyAlphaUnmultiplyAlpha)
1474{
1475 testCopyTexture(GL_RGBA, GL_RGBA, false, true, true);
1476}
1477
1478TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAPremultiplyAlphaUnmultiplyAlpha)
1479{
1480 testCopySubTexture(GL_RGBA, GL_RGBA, false, true, true);
1481}
1482
1483TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAFlipY)
1484{
1485 testCopyTexture(GL_RGBA, GL_RGBA, true, false, false);
1486}
1487
1488TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAFlipY)
1489{
1490 testCopySubTexture(GL_RGBA, GL_RGBA, true, false, false);
1491}
1492
1493TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAFlipYUnmultiplyAlpha)
1494{
1495 testCopyTexture(GL_RGBA, GL_RGBA, true, false, true);
1496}
1497
1498TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAFlipYUnmultiplyAlpha)
1499{
1500 testCopySubTexture(GL_RGBA, GL_RGBA, true, false, true);
1501}
1502
1503TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAFlipYPremultiplyAlpha)
1504{
1505 testCopyTexture(GL_RGBA, GL_RGBA, true, true, false);
1506}
1507
1508TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAFlipYPremultiplyAlpha)
1509{
1510 testCopySubTexture(GL_RGBA, GL_RGBA, true, true, false);
1511}
1512
1513TEST_P(CopyTextureTest, CopyTextureRGBAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
1514{
1515 testCopyTexture(GL_RGBA, GL_RGBA, true, true, true);
1516}
1517
1518TEST_P(CopyTextureTest, CopySubTextureRGBAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
1519{
1520 testCopySubTexture(GL_RGBA, GL_RGBA, true, true, true);
1521}
1522
1523TEST_P(CopyTextureTest, CopyTextureRGBAToBGRA)
1524{
1525 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1526 {
1527 return;
1528 }
1529 testCopyTexture(GL_RGBA, GL_BGRA_EXT, false, false, false);
1530}
1531
1532TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRA)
1533{
1534 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1535 {
1536 return;
1537 }
1538 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, false, false, false);
1539}
1540
1541TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAUnmultiplyAlpha)
1542{
1543 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1544 {
1545 return;
1546 }
1547 testCopyTexture(GL_RGBA, GL_BGRA_EXT, false, false, true);
1548}
1549
1550TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAUnmultiplyAlpha)
1551{
1552 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1553 {
1554 return;
1555 }
1556 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, false, false, true);
1557}
1558
1559TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAPremultiplyAlpha)
1560{
1561 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1562 {
1563 return;
1564 }
1565 testCopyTexture(GL_RGBA, GL_BGRA_EXT, false, true, false);
1566}
1567
1568TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAPremultiplyAlpha)
1569{
1570 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1571 {
1572 return;
1573 }
1574 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, false, true, false);
1575}
1576
1577TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAPremultiplyAlphaUnmultiplyAlpha)
1578{
1579 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1580 {
1581 return;
1582 }
1583 testCopyTexture(GL_RGBA, GL_BGRA_EXT, false, true, true);
1584}
1585
1586TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAPremultiplyAlphaUnmultiplyAlpha)
1587{
1588 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1589 {
1590 return;
1591 }
1592 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, false, true, true);
1593}
1594
1595TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAFlipY)
1596{
1597 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1598 {
1599 return;
1600 }
1601 testCopyTexture(GL_RGBA, GL_BGRA_EXT, true, false, false);
1602}
1603
1604TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAFlipY)
1605{
1606 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1607 {
1608 return;
1609 }
1610 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, true, false, false);
1611}
1612
1613TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAFlipYUnmultiplyAlpha)
1614{
1615 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1616 {
1617 return;
1618 }
1619 testCopyTexture(GL_RGBA, GL_BGRA_EXT, true, false, true);
1620}
1621
1622TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAFlipYUnmultiplyAlpha)
1623{
1624 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1625 {
1626 return;
1627 }
1628 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, true, false, true);
1629}
1630
1631TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAFlipYPremultiplyAlpha)
1632{
1633 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1634 {
1635 return;
1636 }
1637 testCopyTexture(GL_RGBA, GL_BGRA_EXT, true, true, false);
1638}
1639
1640TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAFlipYPremultiplyAlpha)
1641{
1642 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1643 {
1644 return;
1645 }
1646 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, true, true, false);
1647}
1648
1649TEST_P(CopyTextureTest, CopyTextureRGBAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1650{
1651 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1652 {
1653 return;
1654 }
1655 testCopyTexture(GL_RGBA, GL_BGRA_EXT, true, true, true);
1656}
1657
1658TEST_P(CopyTextureTest, CopySubTextureRGBAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1659{
1660 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1661 {
1662 return;
1663 }
1664 testCopySubTexture(GL_RGBA, GL_BGRA_EXT, true, true, true);
1665}
1666
1667TEST_P(CopyTextureTest, CopyTextureLToRGB)
1668{
1669 testCopyTexture(GL_LUMINANCE, GL_RGB, false, false, false);
1670}
1671
1672TEST_P(CopyTextureTest, CopySubTextureLToRGB)
1673{
1674 testCopySubTexture(GL_LUMINANCE, GL_RGB, false, false, false);
1675}
1676
1677TEST_P(CopyTextureTest, CopyTextureLToRGBUnmultiplyAlpha)
1678{
1679 testCopyTexture(GL_LUMINANCE, GL_RGB, false, false, true);
1680}
1681
1682TEST_P(CopyTextureTest, CopySubTextureLToRGBUnmultiplyAlpha)
1683{
1684 testCopySubTexture(GL_LUMINANCE, GL_RGB, false, false, true);
1685}
1686
1687TEST_P(CopyTextureTest, CopyTextureLToRGBPremultiplyAlpha)
1688{
1689 testCopyTexture(GL_LUMINANCE, GL_RGB, false, true, false);
1690}
1691
1692TEST_P(CopyTextureTest, CopySubTextureLToRGBPremultiplyAlpha)
1693{
1694 testCopySubTexture(GL_LUMINANCE, GL_RGB, false, true, false);
1695}
1696
1697TEST_P(CopyTextureTest, CopyTextureLToRGBPremultiplyAlphaUnmultiplyAlpha)
1698{
1699 testCopyTexture(GL_LUMINANCE, GL_RGB, false, true, true);
1700}
1701
1702TEST_P(CopyTextureTest, CopySubTextureLToRGBPremultiplyAlphaUnmultiplyAlpha)
1703{
1704 testCopySubTexture(GL_LUMINANCE, GL_RGB, false, true, true);
1705}
1706
1707TEST_P(CopyTextureTest, CopyTextureLToRGBFlipY)
1708{
1709 testCopyTexture(GL_LUMINANCE, GL_RGB, true, false, false);
1710}
1711
1712TEST_P(CopyTextureTest, CopySubTextureLToRGBFlipY)
1713{
1714 testCopySubTexture(GL_LUMINANCE, GL_RGB, true, false, false);
1715}
1716
1717TEST_P(CopyTextureTest, CopyTextureLToRGBFlipYUnmultiplyAlpha)
1718{
1719 testCopyTexture(GL_LUMINANCE, GL_RGB, true, false, true);
1720}
1721
1722TEST_P(CopyTextureTest, CopySubTextureLToRGBFlipYUnmultiplyAlpha)
1723{
1724 testCopySubTexture(GL_LUMINANCE, GL_RGB, true, false, true);
1725}
1726
1727TEST_P(CopyTextureTest, CopyTextureLToRGBFlipYPremultiplyAlpha)
1728{
1729 testCopyTexture(GL_LUMINANCE, GL_RGB, true, true, false);
1730}
1731
1732TEST_P(CopyTextureTest, CopySubTextureLToRGBFlipYPremultiplyAlpha)
1733{
1734 testCopySubTexture(GL_LUMINANCE, GL_RGB, true, true, false);
1735}
1736
1737TEST_P(CopyTextureTest, CopyTextureLToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
1738{
1739 testCopyTexture(GL_LUMINANCE, GL_RGB, true, true, true);
1740}
1741
1742TEST_P(CopyTextureTest, CopySubTextureLToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
1743{
1744 testCopySubTexture(GL_LUMINANCE, GL_RGB, true, true, true);
1745}
1746
1747TEST_P(CopyTextureTest, CopyTextureLToRGBA)
1748{
1749 testCopyTexture(GL_LUMINANCE, GL_RGBA, false, false, false);
1750}
1751
1752TEST_P(CopyTextureTest, CopySubTextureLToRGBA)
1753{
1754 testCopySubTexture(GL_LUMINANCE, GL_RGBA, false, false, false);
1755}
1756
1757TEST_P(CopyTextureTest, CopyTextureLToRGBAUnmultiplyAlpha)
1758{
1759 testCopyTexture(GL_LUMINANCE, GL_RGBA, false, false, true);
1760}
1761
1762TEST_P(CopyTextureTest, CopySubTextureLToRGBAUnmultiplyAlpha)
1763{
1764 testCopySubTexture(GL_LUMINANCE, GL_RGBA, false, false, true);
1765}
1766
1767TEST_P(CopyTextureTest, CopyTextureLToRGBAPremultiplyAlpha)
1768{
1769 testCopyTexture(GL_LUMINANCE, GL_RGBA, false, true, false);
1770}
1771
1772TEST_P(CopyTextureTest, CopySubTextureLToRGBAPremultiplyAlpha)
1773{
1774 testCopySubTexture(GL_LUMINANCE, GL_RGBA, false, true, false);
1775}
1776
1777TEST_P(CopyTextureTest, CopyTextureLToRGBAPremultiplyAlphaUnmultiplyAlpha)
1778{
1779 testCopyTexture(GL_LUMINANCE, GL_RGBA, false, true, true);
1780}
1781
1782TEST_P(CopyTextureTest, CopySubTextureLToRGBAPremultiplyAlphaUnmultiplyAlpha)
1783{
1784 testCopySubTexture(GL_LUMINANCE, GL_RGBA, false, true, true);
1785}
1786
1787TEST_P(CopyTextureTest, CopyTextureLToRGBAFlipY)
1788{
1789 testCopyTexture(GL_LUMINANCE, GL_RGBA, true, false, false);
1790}
1791
1792TEST_P(CopyTextureTest, CopySubTextureLToRGBAFlipY)
1793{
1794 testCopySubTexture(GL_LUMINANCE, GL_RGBA, true, false, false);
1795}
1796
1797TEST_P(CopyTextureTest, CopyTextureLToRGBAFlipYUnmultiplyAlpha)
1798{
1799 testCopyTexture(GL_LUMINANCE, GL_RGBA, true, false, true);
1800}
1801
1802TEST_P(CopyTextureTest, CopySubTextureLToRGBAFlipYUnmultiplyAlpha)
1803{
1804 testCopySubTexture(GL_LUMINANCE, GL_RGBA, true, false, true);
1805}
1806
1807TEST_P(CopyTextureTest, CopyTextureLToRGBAFlipYPremultiplyAlpha)
1808{
1809 testCopyTexture(GL_LUMINANCE, GL_RGBA, true, true, false);
1810}
1811
1812TEST_P(CopyTextureTest, CopySubTextureLToRGBAFlipYPremultiplyAlpha)
1813{
1814 testCopySubTexture(GL_LUMINANCE, GL_RGBA, true, true, false);
1815}
1816
1817TEST_P(CopyTextureTest, CopyTextureLToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
1818{
1819 testCopyTexture(GL_LUMINANCE, GL_RGBA, true, true, true);
1820}
1821
1822TEST_P(CopyTextureTest, CopySubTextureLToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
1823{
1824 testCopySubTexture(GL_LUMINANCE, GL_RGBA, true, true, true);
1825}
1826
1827TEST_P(CopyTextureTest, CopyTextureLToBGRA)
1828{
1829 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1830 {
1831 return;
1832 }
1833 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, false, false, false);
1834}
1835
1836TEST_P(CopyTextureTest, CopySubTextureLToBGRA)
1837{
1838 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1839 {
1840 return;
1841 }
1842 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, false, false, false);
1843}
1844
1845TEST_P(CopyTextureTest, CopyTextureLToBGRAUnmultiplyAlpha)
1846{
1847 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1848 {
1849 return;
1850 }
1851 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, false, false, true);
1852}
1853
1854TEST_P(CopyTextureTest, CopySubTextureLToBGRAUnmultiplyAlpha)
1855{
1856 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1857 {
1858 return;
1859 }
1860 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, false, false, true);
1861}
1862
1863TEST_P(CopyTextureTest, CopyTextureLToBGRAPremultiplyAlpha)
1864{
1865 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1866 {
1867 return;
1868 }
1869 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, false, true, false);
1870}
1871
1872TEST_P(CopyTextureTest, CopySubTextureLToBGRAPremultiplyAlpha)
1873{
1874 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1875 {
1876 return;
1877 }
1878 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, false, true, false);
1879}
1880
1881TEST_P(CopyTextureTest, CopyTextureLToBGRAPremultiplyAlphaUnmultiplyAlpha)
1882{
1883 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1884 {
1885 return;
1886 }
1887 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, false, true, true);
1888}
1889
1890TEST_P(CopyTextureTest, CopySubTextureLToBGRAPremultiplyAlphaUnmultiplyAlpha)
1891{
1892 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1893 {
1894 return;
1895 }
1896 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, false, true, true);
1897}
1898
1899TEST_P(CopyTextureTest, CopyTextureLToBGRAFlipY)
1900{
1901 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1902 {
1903 return;
1904 }
1905 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, true, false, false);
1906}
1907
1908TEST_P(CopyTextureTest, CopySubTextureLToBGRAFlipY)
1909{
1910 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1911 {
1912 return;
1913 }
1914 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, true, false, false);
1915}
1916
1917TEST_P(CopyTextureTest, CopyTextureLToBGRAFlipYUnmultiplyAlpha)
1918{
1919 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1920 {
1921 return;
1922 }
1923 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, true, false, true);
1924}
1925
1926TEST_P(CopyTextureTest, CopySubTextureLToBGRAFlipYUnmultiplyAlpha)
1927{
1928 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1929 {
1930 return;
1931 }
1932 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, true, false, true);
1933}
1934
1935TEST_P(CopyTextureTest, CopyTextureLToBGRAFlipYPremultiplyAlpha)
1936{
1937 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1938 {
1939 return;
1940 }
1941 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, true, true, false);
1942}
1943
1944TEST_P(CopyTextureTest, CopySubTextureLToBGRAFlipYPremultiplyAlpha)
1945{
1946 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1947 {
1948 return;
1949 }
1950 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, true, true, false);
1951}
1952
1953TEST_P(CopyTextureTest, CopyTextureLToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1954{
1955 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1956 {
1957 return;
1958 }
1959 testCopyTexture(GL_LUMINANCE, GL_BGRA_EXT, true, true, true);
1960}
1961
1962TEST_P(CopyTextureTest, CopySubTextureLToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
1963{
1964 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
1965 {
1966 return;
1967 }
1968 testCopySubTexture(GL_LUMINANCE, GL_BGRA_EXT, true, true, true);
1969}
1970
1971TEST_P(CopyTextureTest, CopyTextureLAToRGB)
1972{
1973 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, false, false);
1974}
1975
1976TEST_P(CopyTextureTest, CopySubTextureLAToRGB)
1977{
1978 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, false, false);
1979}
1980
1981TEST_P(CopyTextureTest, CopyTextureLAToRGBUnmultiplyAlpha)
1982{
1983 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, false, true);
1984}
1985
1986TEST_P(CopyTextureTest, CopySubTextureLAToRGBUnmultiplyAlpha)
1987{
1988 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, false, true);
1989}
1990
1991TEST_P(CopyTextureTest, CopyTextureLAToRGBPremultiplyAlpha)
1992{
1993 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, true, false);
1994}
1995
1996TEST_P(CopyTextureTest, CopySubTextureLAToRGBPremultiplyAlpha)
1997{
1998 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, true, false);
1999}
2000
2001TEST_P(CopyTextureTest, CopyTextureLAToRGBPremultiplyAlphaUnmultiplyAlpha)
2002{
2003 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, true, true);
2004}
2005
2006TEST_P(CopyTextureTest, CopySubTextureLAToRGBPremultiplyAlphaUnmultiplyAlpha)
2007{
2008 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, false, true, true);
2009}
2010
2011TEST_P(CopyTextureTest, CopyTextureLAToRGBFlipY)
2012{
2013 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, false, false);
2014}
2015
2016TEST_P(CopyTextureTest, CopySubTextureLAToRGBFlipY)
2017{
2018 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, false, false);
2019}
2020
2021TEST_P(CopyTextureTest, CopyTextureLAToRGBFlipYUnmultiplyAlpha)
2022{
2023 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, false, true);
2024}
2025
2026TEST_P(CopyTextureTest, CopySubTextureLAToRGBFlipYUnmultiplyAlpha)
2027{
2028 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, false, true);
2029}
2030
2031TEST_P(CopyTextureTest, CopyTextureLAToRGBFlipYPremultiplyAlpha)
2032{
2033 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, true, false);
2034}
2035
2036TEST_P(CopyTextureTest, CopySubTextureLAToRGBFlipYPremultiplyAlpha)
2037{
2038 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, true, false);
2039}
2040
2041TEST_P(CopyTextureTest, CopyTextureLAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
2042{
2043 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, true, true);
2044}
2045
2046TEST_P(CopyTextureTest, CopySubTextureLAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
2047{
2048 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGB, true, true, true);
2049}
2050
2051TEST_P(CopyTextureTest, CopyTextureLAToRGBA)
2052{
2053 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, false, false);
2054}
2055
2056TEST_P(CopyTextureTest, CopySubTextureLAToRGBA)
2057{
2058 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, false, false);
2059}
2060
2061TEST_P(CopyTextureTest, CopyTextureLAToRGBAUnmultiplyAlpha)
2062{
2063 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, false, true);
2064}
2065
2066TEST_P(CopyTextureTest, CopySubTextureLAToRGBAUnmultiplyAlpha)
2067{
2068 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, false, true);
2069}
2070
2071TEST_P(CopyTextureTest, CopyTextureLAToRGBAPremultiplyAlpha)
2072{
2073 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, true, false);
2074}
2075
2076TEST_P(CopyTextureTest, CopySubTextureLAToRGBAPremultiplyAlpha)
2077{
2078 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, true, false);
2079}
2080
2081TEST_P(CopyTextureTest, CopyTextureLAToRGBAPremultiplyAlphaUnmultiplyAlpha)
2082{
2083 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, true, true);
2084}
2085
2086TEST_P(CopyTextureTest, CopySubTextureLAToRGBAPremultiplyAlphaUnmultiplyAlpha)
2087{
2088 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, false, true, true);
2089}
2090
2091TEST_P(CopyTextureTest, CopyTextureLAToRGBAFlipY)
2092{
2093 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, false, false);
2094}
2095
2096TEST_P(CopyTextureTest, CopySubTextureLAToRGBAFlipY)
2097{
2098 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, false, false);
2099}
2100
2101TEST_P(CopyTextureTest, CopyTextureLAToRGBAFlipYUnmultiplyAlpha)
2102{
2103 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, false, true);
2104}
2105
2106TEST_P(CopyTextureTest, CopySubTextureLAToRGBAFlipYUnmultiplyAlpha)
2107{
2108 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, false, true);
2109}
2110
2111TEST_P(CopyTextureTest, CopyTextureLAToRGBAFlipYPremultiplyAlpha)
2112{
2113 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, true, false);
2114}
2115
2116TEST_P(CopyTextureTest, CopySubTextureLAToRGBAFlipYPremultiplyAlpha)
2117{
2118 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, true, false);
2119}
2120
2121TEST_P(CopyTextureTest, CopyTextureLAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
2122{
2123 testCopyTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, true, true);
2124}
2125
2126TEST_P(CopyTextureTest, CopySubTextureLAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
2127{
2128 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_RGBA, true, true, true);
2129}
2130
2131TEST_P(CopyTextureTest, CopyTextureLAToBGRA)
2132{
2133 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2134 {
2135 return;
2136 }
2137 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, false, false);
2138}
2139
2140TEST_P(CopyTextureTest, CopySubTextureLAToBGRA)
2141{
2142 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2143 {
2144 return;
2145 }
2146 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, false, false);
2147}
2148
2149TEST_P(CopyTextureTest, CopyTextureLAToBGRAUnmultiplyAlpha)
2150{
2151 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2152 {
2153 return;
2154 }
2155 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, false, true);
2156}
2157
2158TEST_P(CopyTextureTest, CopySubTextureLAToBGRAUnmultiplyAlpha)
2159{
2160 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2161 {
2162 return;
2163 }
2164 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, false, true);
2165}
2166
2167TEST_P(CopyTextureTest, CopyTextureLAToBGRAPremultiplyAlpha)
2168{
2169 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2170 {
2171 return;
2172 }
2173 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, true, false);
2174}
2175
2176TEST_P(CopyTextureTest, CopySubTextureLAToBGRAPremultiplyAlpha)
2177{
2178 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2179 {
2180 return;
2181 }
2182 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, true, false);
2183}
2184
2185TEST_P(CopyTextureTest, CopyTextureLAToBGRAPremultiplyAlphaUnmultiplyAlpha)
2186{
2187 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2188 {
2189 return;
2190 }
2191 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, true, true);
2192}
2193
2194TEST_P(CopyTextureTest, CopySubTextureLAToBGRAPremultiplyAlphaUnmultiplyAlpha)
2195{
2196 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2197 {
2198 return;
2199 }
2200 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, false, true, true);
2201}
2202
2203TEST_P(CopyTextureTest, CopyTextureLAToBGRAFlipY)
2204{
2205 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2206 {
2207 return;
2208 }
2209 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, false, false);
2210}
2211
2212TEST_P(CopyTextureTest, CopySubTextureLAToBGRAFlipY)
2213{
2214 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2215 {
2216 return;
2217 }
2218 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, false, false);
2219}
2220
2221TEST_P(CopyTextureTest, CopyTextureLAToBGRAFlipYUnmultiplyAlpha)
2222{
2223 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2224 {
2225 return;
2226 }
2227 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, false, true);
2228}
2229
2230TEST_P(CopyTextureTest, CopySubTextureLAToBGRAFlipYUnmultiplyAlpha)
2231{
2232 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2233 {
2234 return;
2235 }
2236 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, false, true);
2237}
2238
2239TEST_P(CopyTextureTest, CopyTextureLAToBGRAFlipYPremultiplyAlpha)
2240{
2241 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2242 {
2243 return;
2244 }
2245 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, true, false);
2246}
2247
2248TEST_P(CopyTextureTest, CopySubTextureLAToBGRAFlipYPremultiplyAlpha)
2249{
2250 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2251 {
2252 return;
2253 }
2254 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, true, false);
2255}
2256
2257TEST_P(CopyTextureTest, CopyTextureLAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
2258{
2259 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2260 {
2261 return;
2262 }
2263 testCopyTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, true, true);
2264}
2265
2266TEST_P(CopyTextureTest, CopySubTextureLAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
2267{
2268 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2269 {
2270 return;
2271 }
2272 testCopySubTexture(GL_LUMINANCE_ALPHA, GL_BGRA_EXT, true, true, true);
2273}
2274
2275TEST_P(CopyTextureTest, CopyTextureBGRAToRGB)
2276{
2277 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2278 {
2279 return;
2280 }
2281 testCopyTexture(GL_BGRA_EXT, GL_RGB, false, false, false);
2282}
2283
2284TEST_P(CopyTextureTest, CopySubTextureBGRAToRGB)
2285{
2286 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2287 {
2288 return;
2289 }
2290 testCopySubTexture(GL_BGRA_EXT, GL_RGB, false, false, false);
2291}
2292
2293TEST_P(CopyTextureTest, CopyTextureBGRAToRGBUnmultiplyAlpha)
2294{
2295 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2296 {
2297 return;
2298 }
2299 testCopyTexture(GL_BGRA_EXT, GL_RGB, false, false, true);
2300}
2301
2302TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBUnmultiplyAlpha)
2303{
2304 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2305 {
2306 return;
2307 }
2308 testCopySubTexture(GL_BGRA_EXT, GL_RGB, false, false, true);
2309}
2310
2311TEST_P(CopyTextureTest, CopyTextureBGRAToRGBPremultiplyAlpha)
2312{
2313 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2314 {
2315 return;
2316 }
2317 testCopyTexture(GL_BGRA_EXT, GL_RGB, false, true, false);
2318}
2319
2320TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBPremultiplyAlpha)
2321{
2322 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2323 {
2324 return;
2325 }
2326 testCopySubTexture(GL_BGRA_EXT, GL_RGB, false, true, false);
2327}
2328
2329TEST_P(CopyTextureTest, CopyTextureBGRAToRGBPremultiplyAlphaUnmultiplyAlpha)
2330{
2331 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2332 {
2333 return;
2334 }
2335 testCopyTexture(GL_BGRA_EXT, GL_RGB, false, true, true);
2336}
2337
2338TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBPremultiplyAlphaUnmultiplyAlpha)
2339{
2340 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2341 {
2342 return;
2343 }
2344 testCopySubTexture(GL_BGRA_EXT, GL_RGB, false, true, true);
2345}
2346
2347TEST_P(CopyTextureTest, CopyTextureBGRAToRGBFlipY)
2348{
2349 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2350 {
2351 return;
2352 }
2353 testCopyTexture(GL_BGRA_EXT, GL_RGB, true, false, false);
2354}
2355
2356TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBFlipY)
2357{
2358 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2359 {
2360 return;
2361 }
2362 testCopySubTexture(GL_BGRA_EXT, GL_RGB, true, false, false);
2363}
2364
2365TEST_P(CopyTextureTest, CopyTextureBGRAToRGBFlipYUnmultiplyAlpha)
2366{
2367 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2368 {
2369 return;
2370 }
2371 testCopyTexture(GL_BGRA_EXT, GL_RGB, true, false, true);
2372}
2373
2374TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBFlipYUnmultiplyAlpha)
2375{
2376 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2377 {
2378 return;
2379 }
2380 testCopySubTexture(GL_BGRA_EXT, GL_RGB, true, false, true);
2381}
2382
2383TEST_P(CopyTextureTest, CopyTextureBGRAToRGBFlipYPremultiplyAlpha)
2384{
2385 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2386 {
2387 return;
2388 }
2389 testCopyTexture(GL_BGRA_EXT, GL_RGB, true, true, false);
2390}
2391
2392TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBFlipYPremultiplyAlpha)
2393{
2394 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2395 {
2396 return;
2397 }
2398 testCopySubTexture(GL_BGRA_EXT, GL_RGB, true, true, false);
2399}
2400
2401TEST_P(CopyTextureTest, CopyTextureBGRAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
2402{
2403 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2404 {
2405 return;
2406 }
2407 testCopyTexture(GL_BGRA_EXT, GL_RGB, true, true, true);
2408}
2409
2410TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBFlipYPremultiplyAlphaUnmultiplyAlpha)
2411{
2412 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2413 {
2414 return;
2415 }
2416 testCopySubTexture(GL_BGRA_EXT, GL_RGB, true, true, true);
2417}
2418
2419TEST_P(CopyTextureTest, CopyTextureBGRAToRGBA)
2420{
2421 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2422 {
2423 return;
2424 }
2425 testCopyTexture(GL_BGRA_EXT, GL_RGBA, false, false, false);
2426}
2427
2428TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBA)
2429{
2430 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2431 {
2432 return;
2433 }
2434 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, false, false, false);
2435}
2436
2437TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAUnmultiplyAlpha)
2438{
2439 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2440 {
2441 return;
2442 }
2443 testCopyTexture(GL_BGRA_EXT, GL_RGBA, false, false, true);
2444}
2445
2446TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAUnmultiplyAlpha)
2447{
2448 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2449 {
2450 return;
2451 }
2452 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, false, false, true);
2453}
2454
2455TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAPremultiplyAlpha)
2456{
2457 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2458 {
2459 return;
2460 }
2461 testCopyTexture(GL_BGRA_EXT, GL_RGBA, false, true, false);
2462}
2463
2464TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAPremultiplyAlpha)
2465{
2466 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2467 {
2468 return;
2469 }
2470 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, false, true, false);
2471}
2472
2473TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAPremultiplyAlphaUnmultiplyAlpha)
2474{
2475 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2476 {
2477 return;
2478 }
2479 testCopyTexture(GL_BGRA_EXT, GL_RGBA, false, true, true);
2480}
2481
2482TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAPremultiplyAlphaUnmultiplyAlpha)
2483{
2484 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2485 {
2486 return;
2487 }
2488 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, false, true, true);
2489}
2490
2491TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAFlipY)
2492{
2493 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2494 {
2495 return;
2496 }
2497 testCopyTexture(GL_BGRA_EXT, GL_RGBA, true, false, false);
2498}
2499
2500TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAFlipY)
2501{
2502 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2503 {
2504 return;
2505 }
2506 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, true, false, false);
2507}
2508
2509TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAFlipYUnmultiplyAlpha)
2510{
2511 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2512 {
2513 return;
2514 }
2515 testCopyTexture(GL_BGRA_EXT, GL_RGBA, true, false, true);
2516}
2517
2518TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAFlipYUnmultiplyAlpha)
2519{
2520 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2521 {
2522 return;
2523 }
2524 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, true, false, true);
2525}
2526
2527TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAFlipYPremultiplyAlpha)
2528{
2529 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2530 {
2531 return;
2532 }
2533 testCopyTexture(GL_BGRA_EXT, GL_RGBA, true, true, false);
2534}
2535
2536TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAFlipYPremultiplyAlpha)
2537{
2538 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2539 {
2540 return;
2541 }
2542 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, true, true, false);
2543}
2544
2545TEST_P(CopyTextureTest, CopyTextureBGRAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
2546{
2547 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2548 {
2549 return;
2550 }
2551 testCopyTexture(GL_BGRA_EXT, GL_RGBA, true, true, true);
2552}
2553
2554TEST_P(CopyTextureTest, CopySubTextureBGRAToRGBAFlipYPremultiplyAlphaUnmultiplyAlpha)
2555{
2556 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2557 {
2558 return;
2559 }
2560 testCopySubTexture(GL_BGRA_EXT, GL_RGBA, true, true, true);
2561}
2562
2563TEST_P(CopyTextureTest, CopyTextureBGRAToBGRA)
2564{
2565 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2566 {
2567 return;
2568 }
2569 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, false, false);
2570}
2571
2572TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRA)
2573{
2574 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2575 {
2576 return;
2577 }
2578 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, false, false);
2579}
2580
2581TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAUnmultiplyAlpha)
2582{
2583 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2584 {
2585 return;
2586 }
2587 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, false, true);
2588}
2589
2590TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAUnmultiplyAlpha)
2591{
2592 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2593 {
2594 return;
2595 }
2596 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, false, true);
2597}
2598
2599TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAPremultiplyAlpha)
2600{
2601 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2602 {
2603 return;
2604 }
2605 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, true, false);
2606}
2607
2608TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAPremultiplyAlpha)
2609{
2610 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2611 {
2612 return;
2613 }
2614 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, true, false);
2615}
2616
2617TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAPremultiplyAlphaUnmultiplyAlpha)
2618{
2619 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2620 {
2621 return;
2622 }
2623 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, true, true);
2624}
2625
2626TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAPremultiplyAlphaUnmultiplyAlpha)
2627{
2628 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2629 {
2630 return;
2631 }
2632 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, false, true, true);
2633}
2634
2635TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAFlipY)
2636{
2637 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2638 {
2639 return;
2640 }
2641 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, false, false);
2642}
2643
2644TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAFlipY)
2645{
2646 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2647 {
2648 return;
2649 }
2650 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, false, false);
2651}
2652
2653TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAFlipYUnmultiplyAlpha)
2654{
2655 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2656 {
2657 return;
2658 }
2659 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, false, true);
2660}
2661
2662TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAFlipYUnmultiplyAlpha)
2663{
2664 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2665 {
2666 return;
2667 }
2668 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, false, true);
2669}
2670
2671TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAFlipYPremultiplyAlpha)
2672{
2673 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2674 {
2675 return;
2676 }
2677 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, true, false);
2678}
2679
2680TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAFlipYPremultiplyAlpha)
2681{
2682 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2683 {
2684 return;
2685 }
2686 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, true, false);
2687}
2688
2689TEST_P(CopyTextureTest, CopyTextureBGRAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
2690{
2691 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2692 {
2693 return;
2694 }
2695 testCopyTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, true, true);
2696}
2697
2698TEST_P(CopyTextureTest, CopySubTextureBGRAToBGRAFlipYPremultiplyAlphaUnmultiplyAlpha)
2699{
2700 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2701 {
2702 return;
2703 }
2704 testCopySubTexture(GL_BGRA_EXT, GL_BGRA_EXT, true, true, true);
Corentin Wallez133a2ec2016-11-17 16:28:03 -05002705}
2706
Geoff Lang4f0e0032017-05-01 16:04:35 -04002707// Test that copying to cube maps works
2708TEST_P(CopyTextureTest, CubeMapTarget)
2709{
2710 if (!checkExtensions())
2711 {
2712 return;
2713 }
2714
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002715 // http://anglebug.com/1932
2716 ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel() && IsDesktopOpenGL());
2717
2718 GLColor pixels[7] = {
2719 GLColor(10u, 13u, 16u, 19u), GLColor(20u, 23u, 26u, 29u), GLColor(30u, 33u, 36u, 39u),
2720 GLColor(40u, 43u, 46u, 49u), GLColor(50u, 53u, 56u, 59u), GLColor(60u, 63u, 66u, 69u),
2721 GLColor(70u, 73u, 76u, 79u),
2722 };
Geoff Lang4f0e0032017-05-01 16:04:35 -04002723
2724 GLTexture textures[2];
2725
Geoff Lang4f0e0032017-05-01 16:04:35 -04002726 glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
2727 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2728 face++)
2729 {
2730 glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2731 }
2732
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002733 for (size_t i = 0; i < 2; ++i)
2734 {
2735 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2736 face++)
2737 {
2738 glBindTexture(GL_TEXTURE_2D, textures[0]);
2739 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE,
2740 &pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);
Geoff Lang4f0e0032017-05-01 16:04:35 -04002741
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002742 glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 1, 1, false,
2743 false, false);
2744 }
Geoff Lang4f0e0032017-05-01 16:04:35 -04002745
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002746 EXPECT_GL_NO_ERROR();
Geoff Lang4f0e0032017-05-01 16:04:35 -04002747
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002748 GLFramebuffer fbo;
2749 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
Geoff Lang4f0e0032017-05-01 16:04:35 -04002750
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002751 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2752 face++)
2753 {
2754 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);
Geoff Lang4f0e0032017-05-01 16:04:35 -04002755
Shahbaz Youssefi29b49412019-01-07 14:03:06 -05002756 // Check that FB is complete.
2757 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2758
2759 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);
2760
2761 EXPECT_GL_NO_ERROR();
2762 }
2763 }
2764}
2765
2766// Test BGRA to RGBA cube map copy
2767TEST_P(CopyTextureTest, CubeMapTargetBGRA)
2768{
2769 if (!checkExtensions())
2770 {
2771 return;
2772 }
2773
2774 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
2775 {
2776 return;
2777 }
2778
2779 GLColor pixels[7] = {
2780 GLColor(10u, 13u, 16u, 19u), GLColor(20u, 23u, 26u, 29u), GLColor(30u, 33u, 36u, 39u),
2781 GLColor(40u, 43u, 46u, 49u), GLColor(50u, 53u, 56u, 59u), GLColor(60u, 63u, 66u, 69u),
2782 GLColor(70u, 73u, 76u, 79u),
2783 };
2784
2785 GLTexture textures[2];
2786
2787 glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
2788 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2789 face++)
2790 {
2791 glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2792 }
2793
2794 for (size_t i = 0; i < 2; ++i)
2795 {
2796 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2797 face++)
2798 {
2799 glBindTexture(GL_TEXTURE_2D, textures[0]);
2800 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE,
2801 &pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i]);
2802
2803 glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 1, 1, false,
2804 false, false);
2805 }
2806
2807 EXPECT_GL_NO_ERROR();
2808
2809 GLFramebuffer fbo;
2810 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2811
2812 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2813 face++)
2814 {
2815 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);
2816
2817 // Check that FB is complete.
2818 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2819
2820 GLColor converted = pixels[face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i];
2821 std::swap(converted.R, converted.B);
2822 EXPECT_PIXEL_COLOR_EQ(0, 0, converted);
2823
2824 EXPECT_GL_NO_ERROR();
2825 }
2826 }
2827}
2828
2829// Test cube map copies with RGB format
2830TEST_P(CopyTextureTest, CubeMapTargetRGB)
2831{
2832 if (!checkExtensions())
2833 {
2834 return;
2835 }
2836
2837 // http://anglebug.com/1932
2838 ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel() && IsDesktopOpenGL());
2839
2840 constexpr uint8_t pixels[16 * 7] = {
2841 0u, 3u, 6u, 10u, 13u, 16u, 0, 0, 20u, 23u, 26u, 30u, 33u, 36u, 0, 0, // 2x2
2842 40u, 43u, 46u, 50u, 53u, 56u, 0, 0, 60u, 63u, 66u, 70u, 73u, 76u, 0, 0, // 2x2
2843 80u, 83u, 86u, 90u, 93u, 96u, 0, 0, 100u, 103u, 106u, 110u, 113u, 116u, 0, 0, // 2x2
2844 120u, 123u, 126u, 130u, 133u, 136u, 0, 0, 140u, 143u, 146u, 160u, 163u, 166u, 0, 0, // 2x2
2845 170u, 173u, 176u, 180u, 183u, 186u, 0, 0, 190u, 193u, 196u, 200u, 203u, 206u, 0, 0, // 2x2
2846 210u, 213u, 216u, 220u, 223u, 226u, 0, 0, 230u, 233u, 236u, 240u, 243u, 246u, 0, 0, // 2x2
2847 10u, 50u, 100u, 30u, 80u, 130u, 0, 0, 60u, 110u, 160u, 90u, 140u, 200u, 0, 0, // 2x2
2848 };
2849
2850 GLTexture textures[2];
2851
2852 glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
2853 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2854 face++)
2855 {
2856 glTexImage2D(face, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE, nullptr);
2857 }
2858
2859 for (size_t i = 0; i < 2; ++i)
2860 {
2861 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2862 face++)
2863 {
2864 glBindTexture(GL_TEXTURE_2D, textures[0]);
2865 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 2, 2, 0, GL_RGB, GL_UNSIGNED_BYTE,
2866 &pixels[(face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) * 16]);
2867
2868 glCopySubTextureCHROMIUM(textures[0], 0, face, textures[1], 0, 0, 0, 0, 0, 2, 2, false,
2869 false, false);
2870 }
2871
2872 EXPECT_GL_NO_ERROR();
2873
2874 GLFramebuffer fbo;
2875 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2876
2877 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
2878 face++)
2879 {
2880 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, face, textures[1], 0);
2881
2882 // Check that FB is complete.
2883 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2884
2885 const uint8_t *faceData = &pixels[(face - GL_TEXTURE_CUBE_MAP_POSITIVE_X + i) * 16];
2886 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor(faceData[0], faceData[1], faceData[2], 255));
2887 EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor(faceData[3], faceData[4], faceData[5], 255));
2888 EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor(faceData[8], faceData[9], faceData[10], 255));
2889 EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor(faceData[11], faceData[12], faceData[13], 255));
2890
2891 EXPECT_GL_NO_ERROR();
2892 }
2893 }
Geoff Lang4f0e0032017-05-01 16:04:35 -04002894}
2895
2896// Test that copying to non-zero mipmaps works
Geoff Lang165dcf12017-06-07 15:05:14 -04002897TEST_P(CopyTextureTest, CopyToMipmap)
Geoff Lang4f0e0032017-05-01 16:04:35 -04002898{
2899 if (!checkExtensions())
2900 {
2901 return;
2902 }
2903
Yunchao He9550c602018-02-13 14:47:05 +08002904 ANGLE_SKIP_TEST_IF(getClientMajorVersion() < 3 &&
2905 !extensionEnabled("GL_OES_fbo_render_mipmap"));
Geoff Lang165dcf12017-06-07 15:05:14 -04002906
Yunchao He9550c602018-02-13 14:47:05 +08002907 ANGLE_SKIP_TEST_IF(IsOSX() && IsIntel());
Geoff Lang4f0e0032017-05-01 16:04:35 -04002908
Geoff Lang165dcf12017-06-07 15:05:14 -04002909 GLColor pixels[] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
Geoff Lang4f0e0032017-05-01 16:04:35 -04002910
2911 GLTexture textures[2];
2912
Geoff Lang4f0e0032017-05-01 16:04:35 -04002913 glBindTexture(GL_TEXTURE_2D, textures[0]);
Geoff Lang165dcf12017-06-07 15:05:14 -04002914 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
2915 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
Geoff Lang4f0e0032017-05-01 16:04:35 -04002916
2917 glBindTexture(GL_TEXTURE_2D, textures[1]);
2918 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2919 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2920 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
2921
Geoff Lang165dcf12017-06-07 15:05:14 -04002922 std::vector<std::pair<GLint, GLint>> soureDestPairs;
2923 soureDestPairs.push_back(std::make_pair(0, 1));
Geoff Lang4f0e0032017-05-01 16:04:35 -04002924
Geoff Lang165dcf12017-06-07 15:05:14 -04002925 // ES3 allows copying from non-zero mips
2926 if (getClientMajorVersion() >= 3)
2927 {
2928 soureDestPairs.push_back(std::make_pair(1, 2));
2929 }
Geoff Lang4f0e0032017-05-01 16:04:35 -04002930
Geoff Lang165dcf12017-06-07 15:05:14 -04002931 for (const auto &sourceDestPair : soureDestPairs)
2932 {
2933 const GLint sourceLevel = sourceDestPair.first;
2934 const GLint destLevel = sourceDestPair.second;
Geoff Lang4f0e0032017-05-01 16:04:35 -04002935
Geoff Lang165dcf12017-06-07 15:05:14 -04002936 glCopyTextureCHROMIUM(textures[0], sourceLevel, GL_TEXTURE_2D, textures[1], destLevel,
2937 GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang4f0e0032017-05-01 16:04:35 -04002938
Geoff Lang165dcf12017-06-07 15:05:14 -04002939 EXPECT_GL_NO_ERROR();
Geoff Lang4f0e0032017-05-01 16:04:35 -04002940
Geoff Lang165dcf12017-06-07 15:05:14 -04002941 GLFramebuffer fbo;
2942 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2943 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
2944 destLevel);
2945
2946 // Check that FB is complete.
2947 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
2948
2949 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[0]);
2950
2951 EXPECT_GL_NO_ERROR();
2952 }
Geoff Lang4f0e0032017-05-01 16:04:35 -04002953}
2954
Geoff Langf81d17c2018-02-02 15:10:37 -05002955// Test that copying from an RGBA8 texture to RGBA4 results in exactly 4-bit precision in the result
2956TEST_P(CopyTextureTest, DownsampleRGBA4444)
2957{
2958 // Downsampling on copy is only guarenteed on D3D11
2959 ANGLE_SKIP_TEST_IF(!IsD3D11());
2960
2961 GLTexture textures[2];
2962
2963 GLColor pixels[] = {GLColor(0, 5, 6, 7), GLColor(17, 22, 25, 24), GLColor(34, 35, 36, 36),
2964 GLColor(51, 53, 55, 55)};
2965
2966 glBindTexture(GL_TEXTURE_2D, textures[0]);
2967 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
2968
2969 glBindTexture(GL_TEXTURE_2D, textures[1]);
2970 glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGBA,
2971 GL_UNSIGNED_SHORT_4_4_4_4, GL_FALSE, GL_FALSE, GL_FALSE);
2972
2973 GLFramebuffer fbo;
2974 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
2975 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
2976
2977 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 0), 1.0);
2978 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(17, 17, 17, 17), 1.0);
2979 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(34, 34, 34, 34), 1.0);
2980 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(51, 51, 51, 51), 1.0);
2981
2982 testGradientDownsampleUniqueValues(GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, {16, 16, 16, 16});
2983}
2984
2985// Test that copying from an RGBA8 texture to RGB565 results in exactly 4-bit precision in the
2986// result
2987TEST_P(CopyTextureTest, DownsampleRGB565)
2988{
2989 // Downsampling on copy is only guarenteed on D3D11
2990 ANGLE_SKIP_TEST_IF(!IsD3D11());
2991
2992 GLTexture textures[2];
2993
2994 GLColor pixels[] = {GLColor(0, 5, 2, 14), GLColor(17, 22, 25, 30), GLColor(34, 33, 36, 46),
2995 GLColor(50, 54, 49, 60)};
2996
2997 glBindTexture(GL_TEXTURE_2D, textures[0]);
2998 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
2999
3000 glBindTexture(GL_TEXTURE_2D, textures[1]);
3001 glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGB,
3002 GL_UNSIGNED_SHORT_5_6_5, GL_FALSE, GL_FALSE, GL_FALSE);
3003
3004 GLFramebuffer fbo;
3005 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3006 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
3007
3008 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 4, 0, 255), 1.0);
3009 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(16, 20, 25, 255), 1.0);
3010 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(33, 32, 33, 255), 1.0);
3011 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(49, 53, 49, 255), 1.0);
3012
3013 testGradientDownsampleUniqueValues(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, {32, 64, 32, 1});
3014}
3015
3016// Test that copying from an RGBA8 texture to RGBA5551 results in exactly 4-bit precision in the
3017// result
3018TEST_P(CopyTextureTest, DownsampleRGBA5551)
3019{
3020 // Downsampling on copy is only guarenteed on D3D11
3021 ANGLE_SKIP_TEST_IF(!IsD3D11());
3022
3023 GLTexture textures[2];
3024
3025 GLColor pixels[] = {GLColor(0, 1, 2, 3), GLColor(14, 16, 17, 18), GLColor(33, 34, 36, 46),
3026 GLColor(50, 51, 52, 255)};
3027
3028 glBindTexture(GL_TEXTURE_2D, textures[0]);
3029 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
3030
3031 glBindTexture(GL_TEXTURE_2D, textures[1]);
3032 glCopyTextureCHROMIUM(textures[0], 0, GL_TEXTURE_2D, textures[1], 0, GL_RGBA,
3033 GL_UNSIGNED_SHORT_5_5_5_1, GL_FALSE, GL_FALSE, GL_FALSE);
3034
3035 GLFramebuffer fbo;
3036 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3037 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1], 0);
3038
3039 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(0, 0, 0, 0), 1.0);
3040 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(16, 16, 16, 0), 1.0);
3041 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(33, 33, 33, 0), 1.0);
3042 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(49, 49, 49, 255), 1.0);
3043
3044 testGradientDownsampleUniqueValues(GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, {32, 32, 32, 2});
3045}
3046
Brandon Jones340b7b82017-06-26 13:02:31 -07003047// Test to ensure that CopyTexture works with LUMINANCE texture as a destination
3048TEST_P(CopyTextureTestDest, Luminance)
3049{
3050 if (!checkExtensions())
3051 {
3052 return;
3053 }
3054
3055 GLColor originalPixels(50u, 100u, 150u, 200u);
3056 GLColor expectedPixels(50u, 50u, 50u, 255u);
3057
3058 // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
3059 // texture to verify contents.
3060 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3061 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3062 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3063 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
3064
3065 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
3066 GL_UNSIGNED_BYTE, false, false, false);
3067
3068 EXPECT_GL_NO_ERROR();
3069
3070 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3071 GL_UNSIGNED_BYTE, false, false, false);
3072
3073 EXPECT_GL_NO_ERROR();
3074
3075 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3076}
3077
3078// Test to ensure that CopyTexture works with LUMINANCE texture as a destination with
3079// UnpackPremultiply parameter
3080TEST_P(CopyTextureTestDest, LuminanceMultiply)
3081{
3082 if (!checkExtensions())
3083 {
3084 return;
3085 }
3086
3087 GLColor originalPixels(50u, 100u, 150u, 200u);
3088 GLColor expectedPixels(39u, 39u, 39u, 255u);
3089
3090 // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
3091 // texture to verify contents.
3092 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3093 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3094 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3095 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
3096
3097 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
3098 GL_UNSIGNED_BYTE, false, true, false);
3099
3100 EXPECT_GL_NO_ERROR();
3101
3102 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3103 GL_UNSIGNED_BYTE, false, false, false);
3104
3105 EXPECT_GL_NO_ERROR();
3106
3107 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3108}
3109
3110// Test to ensure that CopyTexture works with LUMINANCE texture as a destination with
3111// UnpackUnmultiply parameter
3112TEST_P(CopyTextureTestDest, LuminanceUnmultiply)
3113{
3114 if (!checkExtensions())
3115 {
3116 return;
3117 }
3118
3119 GLColor originalPixels(50u, 100u, 150u, 200u);
3120 GLColor expectedPixels(64u, 64u, 64u, 255u);
3121
3122 // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
3123 // texture to verify contents.
3124 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3125 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3126 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3127 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
3128
3129 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
3130 GL_UNSIGNED_BYTE, false, false, true);
3131
3132 EXPECT_GL_NO_ERROR();
3133
3134 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3135 GL_UNSIGNED_BYTE, false, false, false);
3136
3137 EXPECT_GL_NO_ERROR();
3138
3139 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3140}
3141
3142// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination
3143TEST_P(CopyTextureTestDest, LuminanceAlpha)
3144{
3145 if (!checkExtensions())
3146 {
3147 return;
3148 }
3149
3150 GLColor originalPixels(50u, 100u, 150u, 200u);
3151 GLColor expectedPixels(50u, 50u, 50u, 200u);
3152
3153 // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
3154 // RGBA texture to verify contents.
3155 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3156 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3157 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3158 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
3159 GL_UNSIGNED_BYTE, nullptr);
3160
3161 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
3162 GL_UNSIGNED_BYTE, false, false, false);
3163
3164 EXPECT_GL_NO_ERROR();
3165
3166 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3167 GL_UNSIGNED_BYTE, false, false, false);
3168
3169 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3170}
3171
3172// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with
3173// UnpackPremultiply parameter
3174TEST_P(CopyTextureTestDest, LuminanceAlphaMultiply)
3175{
3176 if (!checkExtensions())
3177 {
3178 return;
3179 }
3180
3181 GLColor originalPixels(50u, 100u, 150u, 200u);
3182 GLColor expectedPixels(39u, 39u, 39u, 200u);
3183
3184 // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
3185 // RGBA texture to verify contents.
3186 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3187 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3188 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3189 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
3190 GL_UNSIGNED_BYTE, nullptr);
3191
3192 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
3193 GL_UNSIGNED_BYTE, false, true, false);
3194
3195 EXPECT_GL_NO_ERROR();
3196
3197 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3198 GL_UNSIGNED_BYTE, false, false, false);
3199
3200 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3201}
3202
3203// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with
3204// UnpackUnmultiplyAlpha parameter
3205TEST_P(CopyTextureTestDest, LuminanceAlphaUnmultiply)
3206{
3207 if (!checkExtensions())
3208 {
3209 return;
3210 }
3211
3212 GLColor originalPixels(50u, 100u, 150u, 200u);
3213 GLColor expectedPixels(64u, 64u, 64u, 200u);
3214
3215 // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
3216 // RGBA texture to verify contents.
3217 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3218 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3219 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3220 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
3221 GL_UNSIGNED_BYTE, nullptr);
3222
3223 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
3224 GL_UNSIGNED_BYTE, false, false, true);
3225
3226 EXPECT_GL_NO_ERROR();
3227
3228 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3229 GL_UNSIGNED_BYTE, false, false, false);
3230
3231 EXPECT_GL_NO_ERROR();
3232
3233 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3234}
3235
3236// Test to ensure that CopyTexture works with ALPHA texture as a destination
3237TEST_P(CopyTextureTestDest, Alpha)
3238{
3239 if (!checkExtensions())
3240 {
3241 return;
3242 }
3243
3244 GLColor originalPixels(50u, 100u, 150u, 155u);
3245 GLColor expectedPixels(0u, 0u, 0u, 155u);
3246
3247 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
3248 // texture to verify contents.
3249 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3250 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3251 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3252 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
3253
3254 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
3255 GL_UNSIGNED_BYTE, false, false, false);
3256
3257 EXPECT_GL_NO_ERROR();
3258
3259 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3260 GL_UNSIGNED_BYTE, false, false, false);
3261
3262 EXPECT_GL_NO_ERROR();
3263
3264 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3265}
3266
3267// Test to ensure that CopyTexture works with ALPHA texture as a destination with
3268// UnpackPremultiplyAlpha parameter
3269TEST_P(CopyTextureTestDest, AlphaMultiply)
3270{
3271 if (!checkExtensions())
3272 {
3273 return;
3274 }
3275
3276 GLColor originalPixels(50u, 100u, 150u, 155u);
3277 GLColor expectedPixels(0u, 0u, 0u, 155u);
3278
3279 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
3280 // texture to verify contents.
3281 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3282 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3283 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3284 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
3285
3286 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
3287 GL_UNSIGNED_BYTE, false, true, false);
3288
3289 EXPECT_GL_NO_ERROR();
3290
3291 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3292 GL_UNSIGNED_BYTE, false, false, false);
3293
3294 EXPECT_GL_NO_ERROR();
3295
3296 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3297}
3298
3299// Test to ensure that CopyTexture works with ALPHA texture as a destination with
3300// UnpackUnmultiplyAlpha parameter
3301TEST_P(CopyTextureTestDest, AlphaUnmultiply)
3302{
3303 if (!checkExtensions())
3304 {
3305 return;
3306 }
3307
3308 GLColor originalPixels(50u, 100u, 150u, 155u);
3309 GLColor expectedPixels(0u, 0u, 0u, 155u);
3310
3311 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
3312 // texture to verify contents.
3313 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3314 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3315 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3316 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
3317
3318 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
3319 GL_UNSIGNED_BYTE, false, false, true);
3320
3321 EXPECT_GL_NO_ERROR();
3322
3323 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3324 GL_UNSIGNED_BYTE, false, false, false);
3325
3326 EXPECT_GL_NO_ERROR();
3327
3328 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3329}
3330
Brandon Jones92a14592017-11-16 10:01:08 -08003331// Test to ensure that CopyTexture uses the correct ALPHA passthrough shader to ensure RGB channels
3332// are set to 0.
3333TEST_P(CopyTextureTestDest, AlphaCopyWithRGB)
3334{
3335 ANGLE_SKIP_TEST_IF(!checkExtensions());
3336
3337 GLColor originalPixels(50u, 100u, 150u, 155u);
3338 GLColor expectedPixels(0u, 0u, 0u, 155u);
3339
3340 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
3341 // texture to verify contents.
3342 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
3343 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
3344 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3345 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_HALF_FLOAT_OES, nullptr);
3346
3347 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
3348 GL_HALF_FLOAT_OES, false, false, false);
3349
3350 EXPECT_GL_NO_ERROR();
3351
3352 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3353 GL_UNSIGNED_BYTE, false, false, false);
3354
3355 EXPECT_GL_NO_ERROR();
3356
3357 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
3358}
3359
Brandon Jones28783792018-03-05 09:37:32 -08003360// Test to ensure that CopyTexture will fail with a non-zero level and NPOT texture in WebGL
3361TEST_P(CopyTextureTestWebGL, NPOT)
3362{
3363 if (extensionRequestable("GL_CHROMIUM_copy_texture"))
3364 {
3365 glRequestExtensionANGLE("GL_CHROMIUM_copy_texture");
3366 }
3367 ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_CHROMIUM_copy_texture"));
3368
3369 std::vector<GLColor> pixelData(10 * 10, GLColor::red);
3370
3371 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
3372 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 10, 10, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixelData.data());
3373
3374 // Do a basic copy to make sure things work
3375 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
3376 GL_UNSIGNED_BYTE, false, false, false);
3377
3378 EXPECT_GL_NO_ERROR();
3379
3380 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
3381
3382 // Do the same operation with destLevel 1, which should fail
3383 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 1, GL_RGBA,
3384 GL_UNSIGNED_BYTE, false, false, false);
3385
3386 EXPECT_GL_ERROR(GL_INVALID_VALUE);
3387}
3388
Geoff Lang4f0e0032017-05-01 16:04:35 -04003389// Test the newly added ES3 unorm formats
3390TEST_P(CopyTextureTestES3, ES3UnormFormats)
3391{
3392 if (!checkExtensions())
3393 {
3394 return;
3395 }
3396
3397 auto testOutput = [this](GLuint texture, const GLColor &expectedColor) {
Jamie Madill35cd7332018-12-02 12:03:33 -05003398 constexpr char kVS[] =
Geoff Lang4f0e0032017-05-01 16:04:35 -04003399 "#version 300 es\n"
3400 "in vec4 position;\n"
3401 "out vec2 texcoord;\n"
3402 "void main()\n"
3403 "{\n"
3404 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
3405 " texcoord = (position.xy * 0.5) + 0.5;\n"
3406 "}\n";
3407
Jamie Madill35cd7332018-12-02 12:03:33 -05003408 constexpr char kFS[] =
Geoff Lang4f0e0032017-05-01 16:04:35 -04003409 "#version 300 es\n"
3410 "precision mediump float;\n"
3411 "uniform sampler2D tex;\n"
3412 "in vec2 texcoord;\n"
3413 "out vec4 color;\n"
3414 "void main()\n"
3415 "{\n"
3416 " color = texture(tex, texcoord);\n"
3417 "}\n";
3418
Jamie Madill35cd7332018-12-02 12:03:33 -05003419 ANGLE_GL_PROGRAM(program, kVS, kFS);
Geoff Lang4f0e0032017-05-01 16:04:35 -04003420 glUseProgram(program);
3421
3422 GLRenderbuffer rbo;
3423 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3424 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
3425
3426 GLFramebuffer fbo;
3427 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3428 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3429
3430 glActiveTexture(GL_TEXTURE0);
3431 glBindTexture(GL_TEXTURE_2D, texture);
3432 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3433 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3434 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
3435
3436 drawQuad(program, "position", 0.5f, 1.0f, true);
3437
3438 EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, 1.0);
3439 };
3440
3441 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
3442 GLenum sourceType, const GLColor &sourceColor,
3443 GLenum destInternalFormat, GLenum destType,
3444 bool flipY, bool premultiplyAlpha,
3445 bool unmultiplyAlpha,
3446 const GLColor &expectedColor) {
Geoff Lang4f0e0032017-05-01 16:04:35 -04003447 GLTexture sourceTexture;
3448 glBindTexture(GL_TEXTURE_2D, sourceTexture);
3449 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
3450 &sourceColor);
3451
3452 GLTexture destTexture;
3453 glBindTexture(GL_TEXTURE_2D, destTexture);
3454
3455 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
3456 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
3457 ASSERT_GL_NO_ERROR();
3458
3459 testOutput(destTexture, expectedColor);
3460 };
3461
Geoff Lang00689192018-03-27 17:34:20 -04003462 auto testSubCopyCombination = [this, testOutput](
3463 GLenum sourceInternalFormat, GLenum sourceFormat,
3464 GLenum sourceType, const GLColor &sourceColor,
3465 GLenum destInternalFormat, GLenum destFormat, GLenum destType,
3466 bool flipY, bool premultiplyAlpha, bool unmultiplyAlpha,
3467 const GLColor &expectedColor) {
Geoff Lang00689192018-03-27 17:34:20 -04003468 GLTexture sourceTexture;
3469 glBindTexture(GL_TEXTURE_2D, sourceTexture);
3470 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
3471 &sourceColor);
3472
3473 GLTexture destTexture;
3474 glBindTexture(GL_TEXTURE_2D, destTexture);
3475
3476 glTexImage2D(GL_TEXTURE_2D, 0, destInternalFormat, 1, 1, 0, destFormat, destType, nullptr);
3477 glCopySubTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, 0, 0, 0, 0, 1, 1,
3478 flipY, premultiplyAlpha, unmultiplyAlpha);
3479 ASSERT_GL_NO_ERROR();
3480
3481 testOutput(destTexture, expectedColor);
3482 };
3483
Geoff Lang4f0e0032017-05-01 16:04:35 -04003484 // New LUMA source formats
3485 testCopyCombination(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGB,
3486 GL_UNSIGNED_BYTE, false, false, false, GLColor(128, 128, 128, 255));
3487 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
3488 GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, false,
3489 GLColor(128, 128, 128, 255));
3490 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
3491 GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, true, false,
3492 GLColor(32, 32, 32, 255));
3493 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
3494 GLColor(128, 128, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, true,
3495 GLColor(255, 255, 255, 255));
3496 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
3497 GL_UNSIGNED_BYTE, false, false, false, GLColor(0, 0, 0, 128));
3498 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
3499 GL_UNSIGNED_BYTE, false, false, true, GLColor(0, 0, 0, 128));
3500 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
3501 GL_UNSIGNED_BYTE, false, true, false, GLColor(0, 0, 0, 128));
3502
3503 // New sRGB dest formats
Geoff Lang7198ebc2018-11-22 14:36:06 -05003504 if (extensionEnabled("GL_EXT_sRGB"))
3505 {
3506 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
3507 GL_UNSIGNED_BYTE, false, false, false, GLColor(55, 13, 4, 255));
3508 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
3509 GL_UNSIGNED_BYTE, false, true, false, GLColor(13, 4, 1, 255));
3510 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3511 GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false, false,
3512 GLColor(55, 13, 4, 128));
Geoff Lang00689192018-03-27 17:34:20 -04003513
Geoff Lang7198ebc2018-11-22 14:36:06 -05003514 testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3515 GL_SRGB, GL_SRGB, GL_UNSIGNED_BYTE, false, false, false,
3516 GLColor(55, 13, 4, 255));
3517 testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3518 GL_SRGB, GL_SRGB, GL_UNSIGNED_BYTE, false, true, false,
3519 GLColor(13, 4, 1, 255));
3520 testSubCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3521 GL_SRGB_ALPHA_EXT, GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false,
3522 false, GLColor(55, 13, 4, 128));
3523 }
Geoff Lang4f0e0032017-05-01 16:04:35 -04003524}
3525
3526// Test the newly added ES3 float formats
3527TEST_P(CopyTextureTestES3, ES3FloatFormats)
3528{
3529 if (!checkExtensions())
3530 {
3531 return;
3532 }
3533
Yunchao He9550c602018-02-13 14:47:05 +08003534 ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_color_buffer_float"));
Geoff Lang4f0e0032017-05-01 16:04:35 -04003535
3536 auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {
Jamie Madill35cd7332018-12-02 12:03:33 -05003537 constexpr char kVS[] =
Geoff Lang4f0e0032017-05-01 16:04:35 -04003538 "#version 300 es\n"
3539 "in vec4 position;\n"
3540 "out vec2 texcoord;\n"
3541 "void main()\n"
3542 "{\n"
3543 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
3544 " texcoord = (position.xy * 0.5) + 0.5;\n"
3545 "}\n";
3546
Jamie Madill35cd7332018-12-02 12:03:33 -05003547 constexpr char kFS[] =
Geoff Lang4f0e0032017-05-01 16:04:35 -04003548 "#version 300 es\n"
3549 "precision mediump float;\n"
3550 "uniform sampler2D tex;\n"
3551 "in vec2 texcoord;\n"
3552 "out vec4 color;\n"
3553 "void main()\n"
3554 "{\n"
3555 " color = texture(tex, texcoord);\n"
3556 "}\n";
3557
Jamie Madill35cd7332018-12-02 12:03:33 -05003558 ANGLE_GL_PROGRAM(program, kVS, kFS);
Geoff Lang4f0e0032017-05-01 16:04:35 -04003559 glUseProgram(program);
3560
3561 GLRenderbuffer rbo;
3562 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3563 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);
3564
3565 GLFramebuffer fbo;
3566 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3567 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3568
3569 glActiveTexture(GL_TEXTURE0);
3570 glBindTexture(GL_TEXTURE_2D, texture);
3571 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3572 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3573 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
3574
3575 drawQuad(program, "position", 0.5f, 1.0f, true);
3576
3577 EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);
3578 };
3579
3580 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
3581 GLenum sourceType, const GLColor &sourceColor,
3582 GLenum destInternalFormat, GLenum destType,
3583 bool flipY, bool premultiplyAlpha,
3584 bool unmultiplyAlpha,
3585 const GLColor32F &expectedColor) {
Geoff Lang4f0e0032017-05-01 16:04:35 -04003586 GLTexture sourceTexture;
3587 glBindTexture(GL_TEXTURE_2D, sourceTexture);
3588 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
3589 &sourceColor);
3590
3591 GLTexture destTexture;
3592 glBindTexture(GL_TEXTURE_2D, destTexture);
3593
3594 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
3595 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
3596 ASSERT_GL_NO_ERROR();
3597
3598 testOutput(destTexture, expectedColor);
3599 };
3600
3601 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
3602 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 0.5f));
3603 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
3604 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 0.5f));
3605 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
3606 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 0.5f));
3607
3608 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
3609 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.0f, 0.0f, 1.0f));
3610 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
3611 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.0f, 0.0f, 1.0f));
3612 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
3613 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.0f, 0.0f, 1.0f));
3614
3615 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
3616 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.0f, 1.0f));
3617 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
3618 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0f, 1.0f));
3619 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
3620 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.0f, 1.0f));
3621
3622 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
3623 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
3624 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
3625 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
3626 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
3627 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
3628
3629 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3630 GL_R11F_G11F_B10F, GL_FLOAT, false, false, false,
3631 GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
3632 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3633 GL_R11F_G11F_B10F, GL_FLOAT, false, true, false,
3634 GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
3635 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
3636 GL_R11F_G11F_B10F, GL_FLOAT, false, false, true,
3637 GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
3638
Geoff Langaadc8f32017-08-11 17:34:44 -04003639 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
3640 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
3641 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
3642 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
3643 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
3644 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
Geoff Lang4f0e0032017-05-01 16:04:35 -04003645}
3646
3647// Test the newly added ES3 unsigned integer formats
3648TEST_P(CopyTextureTestES3, ES3UintFormats)
3649{
Jamie Madill3dfaf262017-08-18 12:32:14 -04003650 ANGLE_SKIP_TEST_IF(IsLinux() && IsOpenGL() && IsIntel());
3651
Geoff Lang4f0e0032017-05-01 16:04:35 -04003652 if (!checkExtensions())
3653 {
3654 return;
3655 }
3656
Geoff Lang4f0e0032017-05-01 16:04:35 -04003657 using GLColor32U = std::tuple<GLuint, GLuint, GLuint, GLuint>;
3658
3659 auto testOutput = [this](GLuint texture, const GLColor32U &expectedColor) {
Jamie Madill35cd7332018-12-02 12:03:33 -05003660 constexpr char kVS[] =
Geoff Lang4f0e0032017-05-01 16:04:35 -04003661 "#version 300 es\n"
3662 "in vec4 position;\n"
3663 "out vec2 texcoord;\n"
3664 "void main()\n"
3665 "{\n"
3666 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
3667 " texcoord = (position.xy * 0.5) + 0.5;\n"
3668 "}\n";
3669
Jamie Madill35cd7332018-12-02 12:03:33 -05003670 constexpr char kFS[] =
Geoff Lang4f0e0032017-05-01 16:04:35 -04003671 "#version 300 es\n"
3672 "precision mediump float;\n"
3673 "precision mediump usampler2D;\n"
3674 "in vec2 texcoord;\n"
3675 "uniform usampler2D tex;\n"
3676 "out uvec4 color;\n"
3677 "void main()\n"
3678 "{\n"
3679 " color = texture(tex, texcoord);\n"
3680 "}\n";
3681
Jamie Madill35cd7332018-12-02 12:03:33 -05003682 ANGLE_GL_PROGRAM(program, kVS, kFS);
Geoff Lang4f0e0032017-05-01 16:04:35 -04003683 glUseProgram(program);
3684
3685 GLRenderbuffer rbo;
3686 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
3687 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8UI, 1, 1);
3688
3689 GLFramebuffer fbo;
3690 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
3691 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
3692
3693 glActiveTexture(GL_TEXTURE0);
3694 glBindTexture(GL_TEXTURE_2D, texture);
3695 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
3696 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
3697 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
3698
3699 drawQuad(program, "position", 0.5f, 1.0f, true);
3700 ASSERT_GL_NO_ERROR();
3701
3702 GLuint pixel[4] = {0};
3703 glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);
3704 ASSERT_GL_NO_ERROR();
3705 EXPECT_NEAR(std::get<0>(expectedColor), pixel[0], 1);
3706 EXPECT_NEAR(std::get<1>(expectedColor), pixel[1], 1);
3707 EXPECT_NEAR(std::get<2>(expectedColor), pixel[2], 1);
3708 EXPECT_NEAR(std::get<3>(expectedColor), pixel[3], 1);
3709 };
3710
3711 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
3712 GLenum sourceType, const GLColor &sourceColor,
3713 GLenum destInternalFormat, GLenum destType,
3714 bool flipY, bool premultiplyAlpha,
3715 bool unmultiplyAlpha,
3716 const GLColor32U &expectedColor) {
Geoff Lang4f0e0032017-05-01 16:04:35 -04003717 GLTexture sourceTexture;
3718 glBindTexture(GL_TEXTURE_2D, sourceTexture);
3719 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
3720 &sourceColor);
3721
3722 GLTexture destTexture;
3723 glBindTexture(GL_TEXTURE_2D, destTexture);
3724
3725 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
3726 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
3727 ASSERT_GL_NO_ERROR();
3728
3729 testOutput(destTexture, expectedColor);
3730 };
3731
3732 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
3733 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 128));
3734 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
3735 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 128));
3736 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
3737 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 128));
3738
Geoff Langaadc8f32017-08-11 17:34:44 -04003739 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
3740 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 1));
3741 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
3742 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 1));
3743 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
3744 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 1));
Geoff Lang4f0e0032017-05-01 16:04:35 -04003745
3746 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
3747 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 0, 1));
3748 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
3749 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 0, 1));
3750 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
3751 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 0, 1));
3752
3753 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
3754 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 0, 0, 1));
3755 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
3756 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 0, 0, 1));
3757 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(120, 64, 32, 128), GL_R8UI,
3758 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(240, 0, 0, 1));
3759}
3760
Geoff Lang97073d12016-04-20 10:42:34 -07003761// Use this to select which configurations (e.g. which renderer, which GLES major version) these
3762// tests should be run against.
Luc Ferronaf883622018-06-08 15:57:31 -04003763ANGLE_INSTANTIATE_TEST(CopyTextureTest,
3764 ES2_D3D9(),
3765 ES2_D3D11(),
3766 ES2_OPENGL(),
3767 ES2_OPENGLES(),
3768 ES2_VULKAN());
3769ANGLE_INSTANTIATE_TEST(CopyTextureTestWebGL,
3770 ES2_D3D9(),
3771 ES2_D3D11(),
3772 ES2_OPENGL(),
3773 ES2_OPENGLES(),
3774 ES2_VULKAN());
Brandon Jones340b7b82017-06-26 13:02:31 -07003775ANGLE_INSTANTIATE_TEST(CopyTextureTestDest, ES2_D3D11());
Geoff Lang4f0e0032017-05-01 16:04:35 -04003776ANGLE_INSTANTIATE_TEST(CopyTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Geoff Lang97073d12016-04-20 10:42:34 -07003777
3778} // namespace angle