blob: bd5e72e2d0dd76a0d4f73ae20049ded3a0886c01 [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
11namespace angle
12{
13
14class CopyTextureTest : public ANGLETest
15{
16 protected:
17 CopyTextureTest()
18 {
19 setWindowWidth(256);
20 setWindowHeight(256);
21 setConfigRedBits(8);
22 setConfigGreenBits(8);
23 setConfigBlueBits(8);
24 setConfigAlphaBits(8);
25 }
26
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
53 void TearDown() override
54 {
55 glDeleteTextures(2, mTextures);
56 glDeleteFramebuffers(1, &mFramebuffer);
57
58 ANGLETest::TearDown();
59 }
60
61 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.
85TEST_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
Geoff Langfc72a072017-03-24 14:52:39 -040097 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
98 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -070099
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.
106TEST_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
Geoff Langfc72a072017-03-24 14:52:39 -0400121 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
122 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700123
124 EXPECT_GL_NO_ERROR();
125
126 // Check that FB is complete.
127 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
128
129 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
130
131 EXPECT_GL_NO_ERROR();
132}
133
134// Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to
135// immutable textures
136TEST_P(CopyTextureTest, ImmutableTexture)
137{
138 if (!checkExtensions())
139 {
140 return;
141 }
142
143 if (getClientMajorVersion() < 3 &&
144 (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")))
145 {
146 std::cout
147 << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8"
148 << std::endl;
149 return;
150 }
151
152 GLColor pixels = GLColor::red;
153
154 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
155 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
156 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
157
158 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
159 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
160 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
161 EXPECT_GL_NO_ERROR();
162
163 // Should generate an error when the texture is redefined
Geoff Langfc72a072017-03-24 14:52:39 -0400164 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
165 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700166 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
167
168 // Should succeed when using CopySubTexture
Geoff Langfc72a072017-03-24 14:52:39 -0400169 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
170 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700171 EXPECT_GL_NO_ERROR();
172
173 // Check that FB is complete.
174 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
175
176 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
177
178 EXPECT_GL_NO_ERROR();
179}
180
181// Test validation of internal formats in CopyTexture and CopySubTexture
182TEST_P(CopyTextureTest, InternalFormat)
183{
184 if (!checkExtensions())
185 {
186 return;
187 }
188
189 std::vector<GLint> sourceFormats;
190 sourceFormats.push_back(GL_ALPHA);
191 sourceFormats.push_back(GL_RGB);
192 sourceFormats.push_back(GL_RGBA);
193 sourceFormats.push_back(GL_LUMINANCE);
194 sourceFormats.push_back(GL_LUMINANCE_ALPHA);
195
196 std::vector<GLint> destFormats;
197 destFormats.push_back(GL_RGB);
198 destFormats.push_back(GL_RGBA);
199
200 if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
201 {
202 sourceFormats.push_back(GL_BGRA_EXT);
203 destFormats.push_back(GL_BGRA_EXT);
204 }
205
206 // Test with glCopyTexture
207 for (GLint sourceFormat : sourceFormats)
208 {
209 for (GLint destFormat : destFormats)
210 {
211 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
212 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
213 nullptr);
214 EXPECT_GL_NO_ERROR();
215
Geoff Langfc72a072017-03-24 14:52:39 -0400216 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,
217 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700218
219 EXPECT_GL_NO_ERROR();
220 }
221 }
222
223 // Test with glCopySubTexture
224 for (GLint sourceFormat : sourceFormats)
225 {
226 for (GLint destFormat : destFormats)
227 {
228 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
229 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
230 nullptr);
231 EXPECT_GL_NO_ERROR();
232
233 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
234 glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE,
235 nullptr);
236 EXPECT_GL_NO_ERROR();
237
Geoff Langfc72a072017-03-24 14:52:39 -0400238 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1,
239 1, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700240
241 EXPECT_GL_NO_ERROR();
242 }
243 }
244}
245
246// Check that invalid internal formats return errors.
247TEST_P(CopyTextureTest, InternalFormatNotSupported)
248{
249 if (!checkExtensions())
250 {
251 return;
252 }
253
254 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
255 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
256 EXPECT_GL_NO_ERROR();
257
258 std::vector<GLint> unsupportedDestFormats;
259 unsupportedDestFormats.push_back(GL_ALPHA);
260 unsupportedDestFormats.push_back(GL_LUMINANCE);
261 unsupportedDestFormats.push_back(GL_LUMINANCE_ALPHA);
262
263 if (!extensionEnabled("GL_EXT_texture_format_BGRA8888"))
264 {
265 unsupportedDestFormats.push_back(GL_BGRA_EXT);
266 }
267
268 // Check unsupported format reports an error.
269 for (GLint unsupportedDestFormat : unsupportedDestFormats)
270 {
Geoff Langfc72a072017-03-24 14:52:39 -0400271 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0,
272 unsupportedDestFormat, GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700273 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
274 }
275
276 for (GLint unsupportedDestFormat : unsupportedDestFormats)
277 {
278 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
279 glTexImage2D(GL_TEXTURE_2D, 0, unsupportedDestFormat, 1, 1, 0, unsupportedDestFormat,
280 GL_UNSIGNED_BYTE, nullptr);
Geoff Langfc72a072017-03-24 14:52:39 -0400281 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
282 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700283 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
284 }
285}
286
287// Test to ensure that the destination texture is redefined if the properties are different.
288TEST_P(CopyTextureTest, RedefineDestinationTexture)
289{
290 if (!checkExtensions())
291 {
292 return;
293 }
294
295 GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
296
297 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
298 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
299
300 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
301 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
302 EXPECT_GL_NO_ERROR();
303
304 // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
305 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
306 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
307 // GL_INVALID_VALUE due to bad dimensions.
308 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
309 EXPECT_GL_ERROR(GL_INVALID_VALUE);
310
311 // If the dest texture has different properties, glCopyTextureCHROMIUM()
312 // redefines them.
Geoff Langfc72a072017-03-24 14:52:39 -0400313 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
314 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700315 EXPECT_GL_NO_ERROR();
316
317 // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2
318 // dimension and GL_RGBA format.
319 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
320 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
321 EXPECT_GL_NO_ERROR();
322
323 // Check that FB is complete.
324 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
325
326 EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);
327 EXPECT_GL_NO_ERROR();
328}
329
330// Test that invalid dimensions in CopySubTexture are validated
331TEST_P(CopyTextureTest, CopySubTextureDimension)
332{
333 if (!checkExtensions())
334 {
335 return;
336 }
337
338 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
339 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
340
341 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
342 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
343
Geoff Langfc72a072017-03-24 14:52:39 -0400344 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
345 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700346 EXPECT_GL_NO_ERROR();
347
348 // xoffset < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400349 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, -1, 1, 0, 0, 1, 1,
350 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700351 EXPECT_GL_ERROR(GL_INVALID_VALUE);
352
353 // x < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400354 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, -1, 0, 1, 1,
355 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700356 EXPECT_GL_ERROR(GL_INVALID_VALUE);
357
358 // xoffset + width > dest_width
Geoff Langfc72a072017-03-24 14:52:39 -0400359 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 2, 2, 0, 0, 2, 2,
360 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700361 EXPECT_GL_ERROR(GL_INVALID_VALUE);
362
363 // x + width > source_width
Geoff Langfc72a072017-03-24 14:52:39 -0400364 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 1, 1, 2, 2,
365 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700366 EXPECT_GL_ERROR(GL_INVALID_VALUE);
367}
368
369// Test that invalid IDs in CopyTexture are validated
370TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)
371{
372 if (!checkExtensions())
373 {
374 return;
375 }
376
377 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
378 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
379
380 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
381 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
382
Geoff Langfc72a072017-03-24 14:52:39 -0400383 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, GL_RGBA, GL_UNSIGNED_BYTE,
384 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700385 EXPECT_GL_ERROR(GL_INVALID_VALUE);
386
Geoff Langfc72a072017-03-24 14:52:39 -0400387 glCopyTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA, GL_UNSIGNED_BYTE,
388 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700389 EXPECT_GL_ERROR(GL_INVALID_VALUE);
390
Geoff Langfc72a072017-03-24 14:52:39 -0400391 glCopyTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, GL_RGBA, GL_UNSIGNED_BYTE, false,
392 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700393 EXPECT_GL_ERROR(GL_INVALID_VALUE);
394
Geoff Langfc72a072017-03-24 14:52:39 -0400395 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
396 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700397 EXPECT_GL_NO_ERROR();
398}
399
400// Test that invalid IDs in CopySubTexture are validated
401TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
402{
403 if (!checkExtensions())
404 {
405 return;
406 }
407
408 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
409 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
410
411 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
412 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
413
Geoff Langfc72a072017-03-24 14:52:39 -0400414 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, 1, 1, 0, 0, 1, 1, false,
415 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700416 EXPECT_GL_ERROR(GL_INVALID_VALUE);
417
Geoff Langfc72a072017-03-24 14:52:39 -0400418 glCopySubTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1, false,
419 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700420 EXPECT_GL_ERROR(GL_INVALID_VALUE);
421
Geoff Langfc72a072017-03-24 14:52:39 -0400422 glCopySubTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, 1, 1, 0, 0, 1, 1, false, false,
423 false);
Geoff Lang97073d12016-04-20 10:42:34 -0700424 EXPECT_GL_ERROR(GL_INVALID_VALUE);
425
Geoff Langfc72a072017-03-24 14:52:39 -0400426 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
427 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700428 EXPECT_GL_NO_ERROR();
429}
430
431// Test that using an offset in CopySubTexture works correctly
432TEST_P(CopyTextureTest, CopySubTextureOffset)
433{
434 if (!checkExtensions())
435 {
436 return;
437 }
438
439 GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
440 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
441 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
442
443 GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,
444 GLColor::transparentBlack, GLColor::transparentBlack};
445 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
446 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);
447
Geoff Langfc72a072017-03-24 14:52:39 -0400448 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
449 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700450 EXPECT_GL_NO_ERROR();
Geoff Langfc72a072017-03-24 14:52:39 -0400451 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 0, 1, 0, 1, 1,
452 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700453 EXPECT_GL_NO_ERROR();
Geoff Langfc72a072017-03-24 14:52:39 -0400454 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 1, 0, 1, 1, 1,
455 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700456 EXPECT_GL_NO_ERROR();
457
458 // Check that FB is complete.
459 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
460
461 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
462 EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
463 EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
464 EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
465 EXPECT_GL_NO_ERROR();
466}
467
468// Test that flipping the Y component works correctly
469TEST_P(CopyTextureTest, FlipY)
470{
471 if (!checkExtensions())
472 {
473 return;
474 }
475
476 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
477 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
478
479 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
480 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
481
Geoff Langfc72a072017-03-24 14:52:39 -0400482 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
483 GL_UNSIGNED_BYTE, GL_TRUE, GL_FALSE, GL_FALSE);
Geoff Lang97073d12016-04-20 10:42:34 -0700484 EXPECT_GL_NO_ERROR();
485
486 // Check that FB is complete.
487 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
488
489 EXPECT_PIXEL_COLOR_EQ(0, 0, rgbaPixels[2]);
490 EXPECT_PIXEL_COLOR_EQ(1, 0, rgbaPixels[3]);
491 EXPECT_PIXEL_COLOR_EQ(0, 1, rgbaPixels[0]);
492 EXPECT_PIXEL_COLOR_EQ(1, 1, rgbaPixels[1]);
493 EXPECT_GL_NO_ERROR();
494}
495
496// Test that premultipying the alpha on copy works correctly
497TEST_P(CopyTextureTest, PremultiplyAlpha)
498{
499 if (!checkExtensions())
500 {
501 return;
502 }
503
504 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(255u, 255u, 255u, 127u),
505 GLColor(127u, 127u, 127u, 127u), GLColor(255u, 255u, 255u, 0u)};
506
507 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
508 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
509
Geoff Langfc72a072017-03-24 14:52:39 -0400510 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
511 GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, GL_FALSE);
Geoff Lang97073d12016-04-20 10:42:34 -0700512 EXPECT_GL_NO_ERROR();
513
514 // Check that FB is complete.
515 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
516
517 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
518 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
519 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
520 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(0, 0, 0, 0), 1.0);
521 EXPECT_GL_NO_ERROR();
522}
523
524// Test that unmultipying the alpha on copy works correctly
525TEST_P(CopyTextureTest, UnmultiplyAlpha)
526{
527 if (!checkExtensions())
528 {
529 return;
530 }
531
532 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
533 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
534
535 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
536 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
537
Geoff Langfc72a072017-03-24 14:52:39 -0400538 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
539 GL_UNSIGNED_BYTE, GL_FALSE, GL_FALSE, GL_TRUE);
Geoff Lang97073d12016-04-20 10:42:34 -0700540 EXPECT_GL_NO_ERROR();
541
542 // Check that FB is complete.
543 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
544
545 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
546 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(255, 255, 255, 127), 1.0);
547 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(127, 127, 127, 127), 1.0);
548 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
549 EXPECT_GL_NO_ERROR();
550}
551
552// Test that unmultipying and premultiplying the alpha is the same as doing neither
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500553TEST_P(CopyTextureTest, UnmultiplyAndPremultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -0700554{
555 if (!checkExtensions())
556 {
557 return;
558 }
559
560 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
561 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
562
563 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
564 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
565
Geoff Langfc72a072017-03-24 14:52:39 -0400566 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
567 GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, GL_TRUE);
Geoff Lang97073d12016-04-20 10:42:34 -0700568 EXPECT_GL_NO_ERROR();
569
570 // Check that FB is complete.
571 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
572
573 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
574 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
575 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
576 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
577 EXPECT_GL_NO_ERROR();
578}
579
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500580// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture
581TEST_P(CopyTextureTest, LuminanceAlpha)
582{
583 if (!checkExtensions())
584 {
585 return;
586 }
587
588 uint8_t originalPixels[] = {163u, 67u};
589 GLColor expectedPixels(163u, 163u, 163u, 67u);
590
591 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
592 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
593 GL_UNSIGNED_BYTE, &originalPixels);
594
Geoff Langfc72a072017-03-24 14:52:39 -0400595 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
596 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500597
598 EXPECT_GL_NO_ERROR();
599
600 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
601}
602
603// Test to ensure that CopyTexture works with LUMINANCE texture
604TEST_P(CopyTextureTest, Luminance)
605{
606 if (!checkExtensions())
607 {
608 return;
609 }
610
611 uint8_t originalPixels[] = {57u};
612 GLColor expectedPixels(57u, 57u, 57u, 255u);
613
614 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
615 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
616 &originalPixels);
617
Geoff Langfc72a072017-03-24 14:52:39 -0400618 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
619 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500620
621 EXPECT_GL_NO_ERROR();
622
623 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
624}
625
626// Test to ensure that CopyTexture works with ALPHA texture
627TEST_P(CopyTextureTest, Alpha)
628{
629 if (!checkExtensions())
630 {
631 return;
632 }
633
634 uint8_t originalPixels[] = {77u};
635 GLColor expectedPixels(0u, 0u, 0u, 77u);
636
637 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
638 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &originalPixels);
639
Geoff Langfc72a072017-03-24 14:52:39 -0400640 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
641 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500642
643 EXPECT_GL_NO_ERROR();
644
645 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
646}
647
Geoff Lang97073d12016-04-20 10:42:34 -0700648// Use this to select which configurations (e.g. which renderer, which GLES major version) these
649// tests should be run against.
650ANGLE_INSTANTIATE_TEST(CopyTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES());
651
652} // namespace angle