1 //
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 
11 namespace angle
12 {
13 
14 class CopyTextureTest : public ANGLETest
15 {
16   protected:
CopyTextureTest()17     CopyTextureTest()
18     {
19         setWindowWidth(256);
20         setWindowHeight(256);
21         setConfigRedBits(8);
22         setConfigGreenBits(8);
23         setConfigBlueBits(8);
24         setConfigAlphaBits(8);
25     }
26 
SetUp()27     void SetUp() override
28     {
29         ANGLETest::SetUp();
30 
31         glGenTextures(2, mTextures);
32         glBindTexture(GL_TEXTURE_2D, mTextures[1]);
33 
34         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
35         glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
36         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
37         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
38 
39         glGenFramebuffers(1, &mFramebuffer);
40         glBindFramebuffer(GL_FRAMEBUFFER, mFramebuffer);
41         glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1],
42                                0);
43 
44         if (extensionEnabled("GL_CHROMIUM_copy_texture"))
45         {
46             glCopyTextureCHROMIUM = reinterpret_cast<PFNGLCOPYTEXTURECHROMIUMPROC>(
47                 eglGetProcAddress("glCopyTextureCHROMIUM"));
48             glCopySubTextureCHROMIUM = reinterpret_cast<PFNGLCOPYSUBTEXTURECHROMIUMPROC>(
49                 eglGetProcAddress("glCopySubTextureCHROMIUM"));
50         }
51     }
52 
TearDown()53     void TearDown() override
54     {
55         glDeleteTextures(2, mTextures);
56         glDeleteFramebuffers(1, &mFramebuffer);
57 
58         ANGLETest::TearDown();
59     }
60 
checkExtensions() const61     bool checkExtensions() const
62     {
63         if (!extensionEnabled("GL_CHROMIUM_copy_texture"))
64         {
65             std::cout << "Test skipped because GL_CHROMIUM_copy_texture is not available."
66                       << std::endl;
67             return false;
68         }
69 
70         EXPECT_NE(nullptr, glCopyTextureCHROMIUM);
71         EXPECT_NE(nullptr, glCopySubTextureCHROMIUM);
72         return true;
73     }
74 
75     GLuint mTextures[2] = {
76         0, 0,
77     };
78     GLuint mFramebuffer = 0;
79 
80     PFNGLCOPYTEXTURECHROMIUMPROC glCopyTextureCHROMIUM       = nullptr;
81     PFNGLCOPYSUBTEXTURECHROMIUMPROC glCopySubTextureCHROMIUM = nullptr;
82 };
83 
84 // Test to ensure that the basic functionality of the extension works.
TEST_P(CopyTextureTest,BasicCopyTexture)85 TEST_P(CopyTextureTest, BasicCopyTexture)
86 {
87     if (!checkExtensions())
88     {
89         return;
90     }
91 
92     GLColor pixels = GLColor::red;
93 
94     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
95     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
96 
97     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false,
98                           false);
99 
100     EXPECT_GL_NO_ERROR();
101 
102     EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
103 }
104 
105 // Test to ensure that the basic functionality of the extension works.
TEST_P(CopyTextureTest,BasicCopySubTexture)106 TEST_P(CopyTextureTest, BasicCopySubTexture)
107 {
108     if (!checkExtensions())
109     {
110         return;
111     }
112 
113     GLColor pixels = GLColor::red;
114 
115     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
116     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
117 
118     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
119     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
120 
121     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, false);
122 
123     EXPECT_GL_NO_ERROR();
124 
125     // Check that FB is complete.
126     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
127 
128     EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
129 
130     EXPECT_GL_NO_ERROR();
131 }
132 
133 // Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to
134 // immutable textures
TEST_P(CopyTextureTest,ImmutableTexture)135 TEST_P(CopyTextureTest, ImmutableTexture)
136 {
137     if (!checkExtensions())
138     {
139         return;
140     }
141 
142     if (getClientMajorVersion() < 3 &&
143         (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")))
144     {
145         std::cout
146             << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8"
147             << std::endl;
148         return;
149     }
150 
151     GLColor pixels = GLColor::red;
152 
153     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
154     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
155     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
156 
157     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
158     glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
159     glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
160     EXPECT_GL_NO_ERROR();
161 
162     // Should generate an error when the texture is redefined
163     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false,
164                           false);
165     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
166 
167     // Should succeed when using CopySubTexture
168     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, false);
169     EXPECT_GL_NO_ERROR();
170 
171     // Check that FB is complete.
172     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
173 
174     EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
175 
176     EXPECT_GL_NO_ERROR();
177 }
178 
179 // Test validation of internal formats in CopyTexture and CopySubTexture
TEST_P(CopyTextureTest,InternalFormat)180 TEST_P(CopyTextureTest, InternalFormat)
181 {
182     if (!checkExtensions())
183     {
184         return;
185     }
186 
187     std::vector<GLint> sourceFormats;
188     sourceFormats.push_back(GL_ALPHA);
189     sourceFormats.push_back(GL_RGB);
190     sourceFormats.push_back(GL_RGBA);
191     sourceFormats.push_back(GL_LUMINANCE);
192     sourceFormats.push_back(GL_LUMINANCE_ALPHA);
193 
194     std::vector<GLint> destFormats;
195     destFormats.push_back(GL_RGB);
196     destFormats.push_back(GL_RGBA);
197 
198     if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
199     {
200         sourceFormats.push_back(GL_BGRA_EXT);
201         destFormats.push_back(GL_BGRA_EXT);
202     }
203 
204     // Test with glCopyTexture
205     for (GLint sourceFormat : sourceFormats)
206     {
207         for (GLint destFormat : destFormats)
208         {
209             glBindTexture(GL_TEXTURE_2D, mTextures[0]);
210             glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
211                          nullptr);
212             EXPECT_GL_NO_ERROR();
213 
214             glCopyTextureCHROMIUM(mTextures[0], mTextures[1], destFormat, GL_UNSIGNED_BYTE, false,
215                                   false, false);
216 
217             EXPECT_GL_NO_ERROR();
218         }
219     }
220 
221     // Test with glCopySubTexture
222     for (GLint sourceFormat : sourceFormats)
223     {
224         for (GLint destFormat : destFormats)
225         {
226             glBindTexture(GL_TEXTURE_2D, mTextures[0]);
227             glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
228                          nullptr);
229             EXPECT_GL_NO_ERROR();
230 
231             glBindTexture(GL_TEXTURE_2D, mTextures[1]);
232             glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE,
233                          nullptr);
234             EXPECT_GL_NO_ERROR();
235 
236             glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false,
237                                      false);
238 
239             EXPECT_GL_NO_ERROR();
240         }
241     }
242 }
243 
244 // Check that invalid internal formats return errors.
TEST_P(CopyTextureTest,InternalFormatNotSupported)245 TEST_P(CopyTextureTest, InternalFormatNotSupported)
246 {
247     if (!checkExtensions())
248     {
249         return;
250     }
251 
252     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
253     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
254     EXPECT_GL_NO_ERROR();
255 
256     std::vector<GLint> unsupportedDestFormats;
257     unsupportedDestFormats.push_back(GL_ALPHA);
258     unsupportedDestFormats.push_back(GL_LUMINANCE);
259     unsupportedDestFormats.push_back(GL_LUMINANCE_ALPHA);
260 
261     if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
262     {
263         unsupportedDestFormats.push_back(GL_BGRA_EXT);
264     }
265 
266     // Check unsupported format reports an error.
267     for (GLint unsupportedDestFormat : unsupportedDestFormats)
268     {
269         glCopyTextureCHROMIUM(mTextures[0], mTextures[1], unsupportedDestFormat, GL_UNSIGNED_BYTE,
270                               false, false, false);
271         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
272     }
273 
274     for (GLint unsupportedDestFormat : unsupportedDestFormats)
275     {
276         glBindTexture(GL_TEXTURE_2D, mTextures[1]);
277         glTexImage2D(GL_TEXTURE_2D, 0, unsupportedDestFormat, 1, 1, 0, unsupportedDestFormat,
278                      GL_UNSIGNED_BYTE, nullptr);
279         glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 0, 0, 1, 1, false, false, false);
280         EXPECT_GL_ERROR(GL_INVALID_OPERATION);
281     }
282 }
283 
284 // Test to ensure that the destination texture is redefined if the properties are different.
TEST_P(CopyTextureTest,RedefineDestinationTexture)285 TEST_P(CopyTextureTest, RedefineDestinationTexture)
286 {
287     if (!checkExtensions())
288     {
289         return;
290     }
291 
292     GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
293 
294     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
295     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
296 
297     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
298     glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
299     EXPECT_GL_NO_ERROR();
300 
301     // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
302     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
303     EXPECT_GL_ERROR(GL_INVALID_OPERATION);
304     // GL_INVALID_VALUE due to bad dimensions.
305     glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
306     EXPECT_GL_ERROR(GL_INVALID_VALUE);
307 
308     // If the dest texture has different properties, glCopyTextureCHROMIUM()
309     // redefines them.
310     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false,
311                           false);
312     EXPECT_GL_NO_ERROR();
313 
314     // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2
315     // dimension and GL_RGBA format.
316     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
317     glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
318     EXPECT_GL_NO_ERROR();
319 
320     // Check that FB is complete.
321     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
322 
323     EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);
324     EXPECT_GL_NO_ERROR();
325 }
326 
327 // Test that invalid dimensions in CopySubTexture are validated
TEST_P(CopyTextureTest,CopySubTextureDimension)328 TEST_P(CopyTextureTest, CopySubTextureDimension)
329 {
330     if (!checkExtensions())
331     {
332         return;
333     }
334 
335     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
336     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
337 
338     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
339     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
340 
341     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false);
342     EXPECT_GL_NO_ERROR();
343 
344     // xoffset < 0
345     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], -1, 1, 0, 0, 1, 1, false, false, false);
346     EXPECT_GL_ERROR(GL_INVALID_VALUE);
347 
348     // x < 0
349     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, -1, 0, 1, 1, false, false, false);
350     EXPECT_GL_ERROR(GL_INVALID_VALUE);
351 
352     // xoffset + width > dest_width
353     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 2, 2, 0, 0, 2, 2, false, false, false);
354     EXPECT_GL_ERROR(GL_INVALID_VALUE);
355 
356     // x + width > source_width
357     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 0, 1, 1, 2, 2, false, false, false);
358     EXPECT_GL_ERROR(GL_INVALID_VALUE);
359 }
360 
361 // Test that invalid IDs in CopyTexture are validated
TEST_P(CopyTextureTest,CopyTextureInvalidTextureIds)362 TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)
363 {
364     if (!checkExtensions())
365     {
366         return;
367     }
368 
369     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
370     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
371 
372     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
373     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
374 
375     glCopyTextureCHROMIUM(mTextures[0], 99993, GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
376     EXPECT_GL_ERROR(GL_INVALID_VALUE);
377 
378     glCopyTextureCHROMIUM(99994, mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
379     EXPECT_GL_ERROR(GL_INVALID_VALUE);
380 
381     glCopyTextureCHROMIUM(99995, 99996, GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
382     EXPECT_GL_ERROR(GL_INVALID_VALUE);
383 
384     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, false, false,
385                           false);
386     EXPECT_GL_NO_ERROR();
387 }
388 
389 // Test that invalid IDs in CopySubTexture are validated
TEST_P(CopyTextureTest,CopySubTextureInvalidTextureIds)390 TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
391 {
392     if (!checkExtensions())
393     {
394         return;
395     }
396 
397     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
398     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
399 
400     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
401     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
402 
403     glCopySubTextureCHROMIUM(mTextures[0], 99993, 1, 1, 0, 0, 1, 1, false, false, false);
404     EXPECT_GL_ERROR(GL_INVALID_VALUE);
405 
406     glCopySubTextureCHROMIUM(99994, mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false);
407     EXPECT_GL_ERROR(GL_INVALID_VALUE);
408 
409     glCopySubTextureCHROMIUM(99995, 99996, 1, 1, 0, 0, 1, 1, false, false, false);
410     EXPECT_GL_ERROR(GL_INVALID_VALUE);
411 
412     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false);
413     EXPECT_GL_NO_ERROR();
414 }
415 
416 // Test that using an offset in CopySubTexture works correctly
TEST_P(CopyTextureTest,CopySubTextureOffset)417 TEST_P(CopyTextureTest, CopySubTextureOffset)
418 {
419     if (!checkExtensions())
420     {
421         return;
422     }
423 
424     GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
425     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
426     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
427 
428     GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,
429                                         GLColor::transparentBlack, GLColor::transparentBlack};
430     glBindTexture(GL_TEXTURE_2D, mTextures[1]);
431     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);
432 
433     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 1, 0, 0, 1, 1, false, false, false);
434     EXPECT_GL_NO_ERROR();
435     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 1, 0, 1, 0, 1, 1, false, false, false);
436     EXPECT_GL_NO_ERROR();
437     glCopySubTextureCHROMIUM(mTextures[0], mTextures[1], 0, 1, 0, 1, 1, 1, false, false, false);
438     EXPECT_GL_NO_ERROR();
439 
440     // Check that FB is complete.
441     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
442 
443     EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
444     EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
445     EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
446     EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
447     EXPECT_GL_NO_ERROR();
448 }
449 
450 // Test that flipping the Y component works correctly
TEST_P(CopyTextureTest,FlipY)451 TEST_P(CopyTextureTest, FlipY)
452 {
453     if (!checkExtensions())
454     {
455         return;
456     }
457 
458     GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
459                              GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
460 
461     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
462     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
463 
464     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_TRUE, GL_FALSE,
465                           GL_FALSE);
466     EXPECT_GL_NO_ERROR();
467 
468     // Check that FB is complete.
469     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
470 
471     EXPECT_PIXEL_COLOR_EQ(0, 0, rgbaPixels[2]);
472     EXPECT_PIXEL_COLOR_EQ(1, 0, rgbaPixels[3]);
473     EXPECT_PIXEL_COLOR_EQ(0, 1, rgbaPixels[0]);
474     EXPECT_PIXEL_COLOR_EQ(1, 1, rgbaPixels[1]);
475     EXPECT_GL_NO_ERROR();
476 }
477 
478 // Test that premultipying the alpha on copy works correctly
TEST_P(CopyTextureTest,PremultiplyAlpha)479 TEST_P(CopyTextureTest, PremultiplyAlpha)
480 {
481     if (!checkExtensions())
482     {
483         return;
484     }
485 
486     GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(255u, 255u, 255u, 127u),
487                              GLColor(127u, 127u, 127u, 127u), GLColor(255u, 255u, 255u, 0u)};
488 
489     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
490     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
491 
492     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE,
493                           GL_FALSE);
494     EXPECT_GL_NO_ERROR();
495 
496     // Check that FB is complete.
497     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
498 
499     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
500     EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
501     EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
502     EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(0, 0, 0, 0), 1.0);
503     EXPECT_GL_NO_ERROR();
504 }
505 
506 // Test that unmultipying the alpha on copy works correctly
TEST_P(CopyTextureTest,UnmultiplyAlpha)507 TEST_P(CopyTextureTest, UnmultiplyAlpha)
508 {
509     if (!checkExtensions())
510     {
511         return;
512     }
513 
514     GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
515                              GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
516 
517     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
518     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
519 
520     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE, GL_FALSE,
521                           GL_TRUE);
522     EXPECT_GL_NO_ERROR();
523 
524     // Check that FB is complete.
525     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
526 
527     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
528     EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(255, 255, 255, 127), 1.0);
529     EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(127, 127, 127, 127), 1.0);
530     EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
531     EXPECT_GL_NO_ERROR();
532 }
533 
534 // Test that unmultipying and premultiplying the alpha is the same as doing neither
TEST_P(CopyTextureTest,UnmultiplyAndPremultplyAlpha)535 TEST_P(CopyTextureTest, UnmultiplyAndPremultplyAlpha)
536 {
537     if (!checkExtensions())
538     {
539         return;
540     }
541 
542     GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
543                              GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
544 
545     glBindTexture(GL_TEXTURE_2D, mTextures[0]);
546     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
547 
548     glCopyTextureCHROMIUM(mTextures[0], mTextures[1], GL_RGBA, GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE,
549                           GL_TRUE);
550     EXPECT_GL_NO_ERROR();
551 
552     // Check that FB is complete.
553     EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
554 
555     EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
556     EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
557     EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
558     EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
559     EXPECT_GL_NO_ERROR();
560 }
561 
562 // Use this to select which configurations (e.g. which renderer, which GLES major version) these
563 // tests should be run against.
564 ANGLE_INSTANTIATE_TEST(CopyTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES());
565 
566 }  // namespace angle
567