blob: 903b80d8d28cef4ba9b2acf9c84bb89ad82d6aac [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
77 GLuint mTextures[2] = {
78 0, 0,
79 };
80 GLuint mFramebuffer = 0;
81
82 PFNGLCOPYTEXTURECHROMIUMPROC glCopyTextureCHROMIUM = nullptr;
83 PFNGLCOPYSUBTEXTURECHROMIUMPROC glCopySubTextureCHROMIUM = nullptr;
84};
85
Brandon Jones340b7b82017-06-26 13:02:31 -070086class CopyTextureTestDest : public CopyTextureTest
87{
88};
89
Geoff Lang4f0e0032017-05-01 16:04:35 -040090class CopyTextureTestES3 : public CopyTextureTest
91{
92};
93
Geoff Lang97073d12016-04-20 10:42:34 -070094// Test to ensure that the basic functionality of the extension works.
95TEST_P(CopyTextureTest, BasicCopyTexture)
96{
97 if (!checkExtensions())
98 {
99 return;
100 }
101
102 GLColor pixels = GLColor::red;
103
104 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
105 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
106
Geoff Langfc72a072017-03-24 14:52:39 -0400107 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
108 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700109
110 EXPECT_GL_NO_ERROR();
111
112 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
113}
114
115// Test to ensure that the basic functionality of the extension works.
116TEST_P(CopyTextureTest, BasicCopySubTexture)
117{
118 if (!checkExtensions())
119 {
120 return;
121 }
122
123 GLColor pixels = GLColor::red;
124
125 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
126 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
127
128 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
129 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
130
Geoff Langfc72a072017-03-24 14:52:39 -0400131 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
132 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700133
134 EXPECT_GL_NO_ERROR();
135
136 // Check that FB is complete.
137 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
138
139 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
140
141 EXPECT_GL_NO_ERROR();
142}
143
144// Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to
145// immutable textures
146TEST_P(CopyTextureTest, ImmutableTexture)
147{
148 if (!checkExtensions())
149 {
150 return;
151 }
152
153 if (getClientMajorVersion() < 3 &&
154 (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")))
155 {
156 std::cout
157 << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8"
158 << std::endl;
159 return;
160 }
161
162 GLColor pixels = GLColor::red;
163
164 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
165 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
166 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
167
168 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
169 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
170 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
171 EXPECT_GL_NO_ERROR();
172
173 // Should generate an error when the texture is redefined
Geoff Langfc72a072017-03-24 14:52:39 -0400174 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
175 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700176 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
177
178 // Should succeed when using CopySubTexture
Geoff Langfc72a072017-03-24 14:52:39 -0400179 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
180 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700181 EXPECT_GL_NO_ERROR();
182
183 // Check that FB is complete.
184 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
185
186 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
187
188 EXPECT_GL_NO_ERROR();
189}
190
191// Test validation of internal formats in CopyTexture and CopySubTexture
192TEST_P(CopyTextureTest, InternalFormat)
193{
194 if (!checkExtensions())
195 {
196 return;
197 }
198
199 std::vector<GLint> sourceFormats;
200 sourceFormats.push_back(GL_ALPHA);
201 sourceFormats.push_back(GL_RGB);
202 sourceFormats.push_back(GL_RGBA);
203 sourceFormats.push_back(GL_LUMINANCE);
204 sourceFormats.push_back(GL_LUMINANCE_ALPHA);
205
206 std::vector<GLint> destFormats;
207 destFormats.push_back(GL_RGB);
208 destFormats.push_back(GL_RGBA);
209
210 if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
211 {
212 sourceFormats.push_back(GL_BGRA_EXT);
213 destFormats.push_back(GL_BGRA_EXT);
214 }
215
216 // Test with glCopyTexture
217 for (GLint sourceFormat : sourceFormats)
218 {
219 for (GLint destFormat : destFormats)
220 {
221 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
222 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
223 nullptr);
224 EXPECT_GL_NO_ERROR();
225
Geoff Langfc72a072017-03-24 14:52:39 -0400226 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,
227 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700228
229 EXPECT_GL_NO_ERROR();
230 }
231 }
232
233 // Test with glCopySubTexture
234 for (GLint sourceFormat : sourceFormats)
235 {
236 for (GLint destFormat : destFormats)
237 {
238 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
239 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
240 nullptr);
241 EXPECT_GL_NO_ERROR();
242
243 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
244 glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE,
245 nullptr);
246 EXPECT_GL_NO_ERROR();
247
Geoff Langfc72a072017-03-24 14:52:39 -0400248 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1,
249 1, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700250
251 EXPECT_GL_NO_ERROR();
252 }
253 }
254}
255
Geoff Lang97073d12016-04-20 10:42:34 -0700256// Test to ensure that the destination texture is redefined if the properties are different.
257TEST_P(CopyTextureTest, RedefineDestinationTexture)
258{
Bryan Bernhart (Intel Americas Inc)2a357412017-09-05 10:42:47 -0700259 ANGLE_SKIP_TEST_IF(!checkExtensions());
260 ANGLE_SKIP_TEST_IF(!extensionEnabled("GL_EXT_texture_format_BGRA8888"));
Geoff Lang97073d12016-04-20 10:42:34 -0700261
262 GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
263
264 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
265 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
266
267 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
268 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
269 EXPECT_GL_NO_ERROR();
270
271 // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
272 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
273 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
274 // GL_INVALID_VALUE due to bad dimensions.
275 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
276 EXPECT_GL_ERROR(GL_INVALID_VALUE);
277
278 // If the dest texture has different properties, glCopyTextureCHROMIUM()
279 // redefines them.
Geoff Langfc72a072017-03-24 14:52:39 -0400280 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
281 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700282 EXPECT_GL_NO_ERROR();
283
284 // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2
285 // dimension and GL_RGBA format.
286 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
287 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
288 EXPECT_GL_NO_ERROR();
289
290 // Check that FB is complete.
291 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
292
293 EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);
294 EXPECT_GL_NO_ERROR();
295}
296
297// Test that invalid dimensions in CopySubTexture are validated
298TEST_P(CopyTextureTest, CopySubTextureDimension)
299{
300 if (!checkExtensions())
301 {
302 return;
303 }
304
305 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
306 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
307
308 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
309 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
310
Geoff Langfc72a072017-03-24 14:52:39 -0400311 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
312 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700313 EXPECT_GL_NO_ERROR();
314
315 // xoffset < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400316 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, -1, 1, 0, 0, 1, 1,
317 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700318 EXPECT_GL_ERROR(GL_INVALID_VALUE);
319
320 // x < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400321 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, -1, 0, 1, 1,
322 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700323 EXPECT_GL_ERROR(GL_INVALID_VALUE);
324
325 // xoffset + width > dest_width
Geoff Langfc72a072017-03-24 14:52:39 -0400326 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 2, 2, 0, 0, 2, 2,
327 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700328 EXPECT_GL_ERROR(GL_INVALID_VALUE);
329
330 // x + width > source_width
Geoff Langfc72a072017-03-24 14:52:39 -0400331 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 1, 1, 2, 2,
332 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700333 EXPECT_GL_ERROR(GL_INVALID_VALUE);
334}
335
336// Test that invalid IDs in CopyTexture are validated
337TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)
338{
339 if (!checkExtensions())
340 {
341 return;
342 }
343
344 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
345 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
346
347 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
348 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
349
Geoff Langfc72a072017-03-24 14:52:39 -0400350 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, GL_RGBA, GL_UNSIGNED_BYTE,
351 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700352 EXPECT_GL_ERROR(GL_INVALID_VALUE);
353
Geoff Langfc72a072017-03-24 14:52:39 -0400354 glCopyTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA, GL_UNSIGNED_BYTE,
355 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700356 EXPECT_GL_ERROR(GL_INVALID_VALUE);
357
Geoff Langfc72a072017-03-24 14:52:39 -0400358 glCopyTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, GL_RGBA, GL_UNSIGNED_BYTE, false,
359 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700360 EXPECT_GL_ERROR(GL_INVALID_VALUE);
361
Geoff Langfc72a072017-03-24 14:52:39 -0400362 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
363 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700364 EXPECT_GL_NO_ERROR();
365}
366
367// Test that invalid IDs in CopySubTexture are validated
368TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
369{
370 if (!checkExtensions())
371 {
372 return;
373 }
374
375 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
376 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
377
378 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
379 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
380
Geoff Langfc72a072017-03-24 14:52:39 -0400381 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, 1, 1, 0, 0, 1, 1, false,
382 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700383 EXPECT_GL_ERROR(GL_INVALID_VALUE);
384
Geoff Langfc72a072017-03-24 14:52:39 -0400385 glCopySubTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1, false,
386 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700387 EXPECT_GL_ERROR(GL_INVALID_VALUE);
388
Geoff Langfc72a072017-03-24 14:52:39 -0400389 glCopySubTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, 1, 1, 0, 0, 1, 1, false, false,
390 false);
Geoff Lang97073d12016-04-20 10:42:34 -0700391 EXPECT_GL_ERROR(GL_INVALID_VALUE);
392
Geoff Langfc72a072017-03-24 14:52:39 -0400393 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
394 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700395 EXPECT_GL_NO_ERROR();
396}
397
398// Test that using an offset in CopySubTexture works correctly
399TEST_P(CopyTextureTest, CopySubTextureOffset)
400{
401 if (!checkExtensions())
402 {
403 return;
404 }
405
406 GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
407 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
408 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
409
410 GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,
411 GLColor::transparentBlack, GLColor::transparentBlack};
412 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
413 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);
414
Geoff Langfc72a072017-03-24 14:52:39 -0400415 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
416 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700417 EXPECT_GL_NO_ERROR();
Geoff Langfc72a072017-03-24 14:52:39 -0400418 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 0, 1, 0, 1, 1,
419 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700420 EXPECT_GL_NO_ERROR();
Geoff Langfc72a072017-03-24 14:52:39 -0400421 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 1, 0, 1, 1, 1,
422 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700423 EXPECT_GL_NO_ERROR();
424
425 // Check that FB is complete.
426 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
427
428 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
429 EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
430 EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
431 EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
432 EXPECT_GL_NO_ERROR();
433}
434
435// Test that flipping the Y component works correctly
436TEST_P(CopyTextureTest, FlipY)
437{
438 if (!checkExtensions())
439 {
440 return;
441 }
442
443 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
444 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
445
446 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
447 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
448
Geoff Langfc72a072017-03-24 14:52:39 -0400449 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
450 GL_UNSIGNED_BYTE, GL_TRUE, GL_FALSE, GL_FALSE);
Geoff Lang97073d12016-04-20 10:42:34 -0700451 EXPECT_GL_NO_ERROR();
452
453 // Check that FB is complete.
454 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
455
456 EXPECT_PIXEL_COLOR_EQ(0, 0, rgbaPixels[2]);
457 EXPECT_PIXEL_COLOR_EQ(1, 0, rgbaPixels[3]);
458 EXPECT_PIXEL_COLOR_EQ(0, 1, rgbaPixels[0]);
459 EXPECT_PIXEL_COLOR_EQ(1, 1, rgbaPixels[1]);
460 EXPECT_GL_NO_ERROR();
461}
462
463// Test that premultipying the alpha on copy works correctly
464TEST_P(CopyTextureTest, PremultiplyAlpha)
465{
466 if (!checkExtensions())
467 {
468 return;
469 }
470
471 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(255u, 255u, 255u, 127u),
472 GLColor(127u, 127u, 127u, 127u), GLColor(255u, 255u, 255u, 0u)};
473
474 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
475 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
476
Geoff Langfc72a072017-03-24 14:52:39 -0400477 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
478 GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, GL_FALSE);
Geoff Lang97073d12016-04-20 10:42:34 -0700479 EXPECT_GL_NO_ERROR();
480
481 // Check that FB is complete.
482 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
483
484 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
485 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
486 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
487 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(0, 0, 0, 0), 1.0);
488 EXPECT_GL_NO_ERROR();
489}
490
491// Test that unmultipying the alpha on copy works correctly
492TEST_P(CopyTextureTest, UnmultiplyAlpha)
493{
494 if (!checkExtensions())
495 {
496 return;
497 }
498
499 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
500 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
501
502 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
503 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
504
Geoff Langfc72a072017-03-24 14:52:39 -0400505 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
506 GL_UNSIGNED_BYTE, GL_FALSE, GL_FALSE, GL_TRUE);
Geoff Lang97073d12016-04-20 10:42:34 -0700507 EXPECT_GL_NO_ERROR();
508
509 // Check that FB is complete.
510 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
511
512 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
513 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(255, 255, 255, 127), 1.0);
514 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(127, 127, 127, 127), 1.0);
515 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
516 EXPECT_GL_NO_ERROR();
517}
518
519// Test that unmultipying and premultiplying the alpha is the same as doing neither
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500520TEST_P(CopyTextureTest, UnmultiplyAndPremultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -0700521{
522 if (!checkExtensions())
523 {
524 return;
525 }
526
527 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
528 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
529
530 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
531 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
532
Geoff Langfc72a072017-03-24 14:52:39 -0400533 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
534 GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, GL_TRUE);
Geoff Lang97073d12016-04-20 10:42:34 -0700535 EXPECT_GL_NO_ERROR();
536
537 // Check that FB is complete.
538 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
539
540 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
541 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
542 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
543 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
544 EXPECT_GL_NO_ERROR();
545}
546
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500547// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture
548TEST_P(CopyTextureTest, LuminanceAlpha)
549{
550 if (!checkExtensions())
551 {
552 return;
553 }
554
555 uint8_t originalPixels[] = {163u, 67u};
556 GLColor expectedPixels(163u, 163u, 163u, 67u);
557
558 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
559 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
560 GL_UNSIGNED_BYTE, &originalPixels);
561
Geoff Langfc72a072017-03-24 14:52:39 -0400562 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
563 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500564
565 EXPECT_GL_NO_ERROR();
566
567 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
568}
569
570// Test to ensure that CopyTexture works with LUMINANCE texture
571TEST_P(CopyTextureTest, Luminance)
572{
573 if (!checkExtensions())
574 {
575 return;
576 }
577
578 uint8_t originalPixels[] = {57u};
579 GLColor expectedPixels(57u, 57u, 57u, 255u);
580
581 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
582 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
583 &originalPixels);
584
Geoff Langfc72a072017-03-24 14:52:39 -0400585 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
586 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500587
588 EXPECT_GL_NO_ERROR();
589
590 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
591}
592
593// Test to ensure that CopyTexture works with ALPHA texture
594TEST_P(CopyTextureTest, Alpha)
595{
596 if (!checkExtensions())
597 {
598 return;
599 }
600
601 uint8_t originalPixels[] = {77u};
602 GLColor expectedPixels(0u, 0u, 0u, 77u);
603
604 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
605 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &originalPixels);
606
Geoff Langfc72a072017-03-24 14:52:39 -0400607 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
608 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500609
610 EXPECT_GL_NO_ERROR();
611
612 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
613}
614
Geoff Lang4f0e0032017-05-01 16:04:35 -0400615// Test that copying to cube maps works
616TEST_P(CopyTextureTest, CubeMapTarget)
617{
618 if (!checkExtensions())
619 {
620 return;
621 }
622
623 GLColor pixels = GLColor::red;
624
625 GLTexture textures[2];
626
627 glBindTexture(GL_TEXTURE_2D, textures[0]);
628 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
629
630 glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
631 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
632 face++)
633 {
634 glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
635 }
636
637 glCopySubTextureCHROMIUM(textures[0], 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textures[1], 0, 0, 0,
638 0, 0, 1, 1, false, false, false);
639
640 EXPECT_GL_NO_ERROR();
641
642 GLFramebuffer fbo;
643 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
644 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
645 textures[1], 0);
646
647 // Check that FB is complete.
648 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
649
650 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
651
652 EXPECT_GL_NO_ERROR();
653}
654
655// Test that copying to non-zero mipmaps works
Geoff Lang165dcf12017-06-07 15:05:14 -0400656TEST_P(CopyTextureTest, CopyToMipmap)
Geoff Lang4f0e0032017-05-01 16:04:35 -0400657{
658 if (!checkExtensions())
659 {
660 return;
661 }
662
Geoff Lang165dcf12017-06-07 15:05:14 -0400663 if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_fbo_render_mipmap"))
664 {
665 std::cout << "Test skipped because ES3 or GL_OES_fbo_render_mipmap is missing."
666 << std::endl;
667 return;
668 }
669
Geoff Lang4f0e0032017-05-01 16:04:35 -0400670 if (IsOSX() && IsIntel())
671 {
672 std::cout << "Test skipped on Mac Intel." << std::endl;
673 return;
674 }
675
Geoff Lang165dcf12017-06-07 15:05:14 -0400676 GLColor pixels[] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
Geoff Lang4f0e0032017-05-01 16:04:35 -0400677
678 GLTexture textures[2];
679
Geoff Lang4f0e0032017-05-01 16:04:35 -0400680 glBindTexture(GL_TEXTURE_2D, textures[0]);
Geoff Lang165dcf12017-06-07 15:05:14 -0400681 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
682 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400683
684 glBindTexture(GL_TEXTURE_2D, textures[1]);
685 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
686 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
687 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
688
Geoff Lang165dcf12017-06-07 15:05:14 -0400689 std::vector<std::pair<GLint, GLint>> soureDestPairs;
690 soureDestPairs.push_back(std::make_pair(0, 1));
Geoff Lang4f0e0032017-05-01 16:04:35 -0400691
Geoff Lang165dcf12017-06-07 15:05:14 -0400692 // ES3 allows copying from non-zero mips
693 if (getClientMajorVersion() >= 3)
694 {
695 soureDestPairs.push_back(std::make_pair(1, 2));
696 }
Geoff Lang4f0e0032017-05-01 16:04:35 -0400697
Geoff Lang165dcf12017-06-07 15:05:14 -0400698 for (const auto &sourceDestPair : soureDestPairs)
699 {
700 const GLint sourceLevel = sourceDestPair.first;
701 const GLint destLevel = sourceDestPair.second;
Geoff Lang4f0e0032017-05-01 16:04:35 -0400702
Geoff Lang165dcf12017-06-07 15:05:14 -0400703 glCopyTextureCHROMIUM(textures[0], sourceLevel, GL_TEXTURE_2D, textures[1], destLevel,
704 GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400705
Geoff Lang165dcf12017-06-07 15:05:14 -0400706 EXPECT_GL_NO_ERROR();
Geoff Lang4f0e0032017-05-01 16:04:35 -0400707
Geoff Lang165dcf12017-06-07 15:05:14 -0400708 GLFramebuffer fbo;
709 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
710 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
711 destLevel);
712
713 // Check that FB is complete.
714 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
715
716 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[0]);
717
718 EXPECT_GL_NO_ERROR();
719 }
Geoff Lang4f0e0032017-05-01 16:04:35 -0400720}
721
Brandon Jones340b7b82017-06-26 13:02:31 -0700722// Test to ensure that CopyTexture works with LUMINANCE texture as a destination
723TEST_P(CopyTextureTestDest, Luminance)
724{
725 if (!checkExtensions())
726 {
727 return;
728 }
729
730 GLColor originalPixels(50u, 100u, 150u, 200u);
731 GLColor expectedPixels(50u, 50u, 50u, 255u);
732
733 // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
734 // texture to verify contents.
735 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
736 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
737 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
738 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
739
740 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
741 GL_UNSIGNED_BYTE, false, false, false);
742
743 EXPECT_GL_NO_ERROR();
744
745 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
746 GL_UNSIGNED_BYTE, false, false, false);
747
748 EXPECT_GL_NO_ERROR();
749
750 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
751}
752
753// Test to ensure that CopyTexture works with LUMINANCE texture as a destination with
754// UnpackPremultiply parameter
755TEST_P(CopyTextureTestDest, LuminanceMultiply)
756{
757 if (!checkExtensions())
758 {
759 return;
760 }
761
762 GLColor originalPixels(50u, 100u, 150u, 200u);
763 GLColor expectedPixels(39u, 39u, 39u, 255u);
764
765 // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
766 // texture to verify contents.
767 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
768 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
769 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
770 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
771
772 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
773 GL_UNSIGNED_BYTE, false, true, false);
774
775 EXPECT_GL_NO_ERROR();
776
777 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
778 GL_UNSIGNED_BYTE, false, false, false);
779
780 EXPECT_GL_NO_ERROR();
781
782 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
783}
784
785// Test to ensure that CopyTexture works with LUMINANCE texture as a destination with
786// UnpackUnmultiply parameter
787TEST_P(CopyTextureTestDest, LuminanceUnmultiply)
788{
789 if (!checkExtensions())
790 {
791 return;
792 }
793
794 GLColor originalPixels(50u, 100u, 150u, 200u);
795 GLColor expectedPixels(64u, 64u, 64u, 255u);
796
797 // ReadPixels doesn't work with LUMINANCE (non-renderable), so we copy again back to an RGBA
798 // texture to verify contents.
799 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
800 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
801 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
802 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, nullptr);
803
804 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE,
805 GL_UNSIGNED_BYTE, false, false, true);
806
807 EXPECT_GL_NO_ERROR();
808
809 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
810 GL_UNSIGNED_BYTE, false, false, false);
811
812 EXPECT_GL_NO_ERROR();
813
814 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
815}
816
817// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination
818TEST_P(CopyTextureTestDest, LuminanceAlpha)
819{
820 if (!checkExtensions())
821 {
822 return;
823 }
824
825 GLColor originalPixels(50u, 100u, 150u, 200u);
826 GLColor expectedPixels(50u, 50u, 50u, 200u);
827
828 // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
829 // RGBA texture to verify contents.
830 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
831 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
832 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
833 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
834 GL_UNSIGNED_BYTE, nullptr);
835
836 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
837 GL_UNSIGNED_BYTE, false, false, false);
838
839 EXPECT_GL_NO_ERROR();
840
841 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
842 GL_UNSIGNED_BYTE, false, false, false);
843
844 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
845}
846
847// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with
848// UnpackPremultiply parameter
849TEST_P(CopyTextureTestDest, LuminanceAlphaMultiply)
850{
851 if (!checkExtensions())
852 {
853 return;
854 }
855
856 GLColor originalPixels(50u, 100u, 150u, 200u);
857 GLColor expectedPixels(39u, 39u, 39u, 200u);
858
859 // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
860 // RGBA texture to verify contents.
861 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
862 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
863 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
864 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
865 GL_UNSIGNED_BYTE, nullptr);
866
867 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
868 GL_UNSIGNED_BYTE, false, true, false);
869
870 EXPECT_GL_NO_ERROR();
871
872 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
873 GL_UNSIGNED_BYTE, false, false, false);
874
875 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
876}
877
878// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture as a destination with
879// UnpackUnmultiplyAlpha parameter
880TEST_P(CopyTextureTestDest, LuminanceAlphaUnmultiply)
881{
882 if (!checkExtensions())
883 {
884 return;
885 }
886
887 GLColor originalPixels(50u, 100u, 150u, 200u);
888 GLColor expectedPixels(64u, 64u, 64u, 200u);
889
890 // ReadPixels doesn't work with LUMINANCE_ALPHA (non-renderable), so we copy again back to an
891 // RGBA texture to verify contents.
892 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
893 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
894 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
895 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
896 GL_UNSIGNED_BYTE, nullptr);
897
898 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_LUMINANCE_ALPHA,
899 GL_UNSIGNED_BYTE, false, false, true);
900
901 EXPECT_GL_NO_ERROR();
902
903 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
904 GL_UNSIGNED_BYTE, false, false, false);
905
906 EXPECT_GL_NO_ERROR();
907
908 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
909}
910
911// Test to ensure that CopyTexture works with ALPHA texture as a destination
912TEST_P(CopyTextureTestDest, Alpha)
913{
914 if (!checkExtensions())
915 {
916 return;
917 }
918
919 GLColor originalPixels(50u, 100u, 150u, 155u);
920 GLColor expectedPixels(0u, 0u, 0u, 155u);
921
922 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
923 // texture to verify contents.
924 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
925 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
926 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
927 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
928
929 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
930 GL_UNSIGNED_BYTE, false, false, false);
931
932 EXPECT_GL_NO_ERROR();
933
934 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
935 GL_UNSIGNED_BYTE, false, false, false);
936
937 EXPECT_GL_NO_ERROR();
938
939 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
940}
941
942// Test to ensure that CopyTexture works with ALPHA texture as a destination with
943// UnpackPremultiplyAlpha parameter
944TEST_P(CopyTextureTestDest, AlphaMultiply)
945{
946 if (!checkExtensions())
947 {
948 return;
949 }
950
951 GLColor originalPixels(50u, 100u, 150u, 155u);
952 GLColor expectedPixels(0u, 0u, 0u, 155u);
953
954 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
955 // texture to verify contents.
956 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
957 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
958 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
959 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
960
961 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
962 GL_UNSIGNED_BYTE, false, true, false);
963
964 EXPECT_GL_NO_ERROR();
965
966 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
967 GL_UNSIGNED_BYTE, false, false, false);
968
969 EXPECT_GL_NO_ERROR();
970
971 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
972}
973
974// Test to ensure that CopyTexture works with ALPHA texture as a destination with
975// UnpackUnmultiplyAlpha parameter
976TEST_P(CopyTextureTestDest, AlphaUnmultiply)
977{
978 if (!checkExtensions())
979 {
980 return;
981 }
982
983 GLColor originalPixels(50u, 100u, 150u, 155u);
984 GLColor expectedPixels(0u, 0u, 0u, 155u);
985
986 // ReadPixels doesn't work with ALPHA (non-renderable), so we copy again back to an RGBA
987 // texture to verify contents.
988 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
989 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &originalPixels);
990 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
991 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, nullptr);
992
993 glCopyTextureCHROMIUM(mTextures[1], 0, GL_TEXTURE_2D, mTextures[0], 0, GL_ALPHA,
994 GL_UNSIGNED_BYTE, false, false, true);
995
996 EXPECT_GL_NO_ERROR();
997
998 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
999 GL_UNSIGNED_BYTE, false, false, false);
1000
1001 EXPECT_GL_NO_ERROR();
1002
1003 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
1004}
1005
Geoff Lang4f0e0032017-05-01 16:04:35 -04001006// Test the newly added ES3 unorm formats
1007TEST_P(CopyTextureTestES3, ES3UnormFormats)
1008{
1009 if (!checkExtensions())
1010 {
1011 return;
1012 }
1013
1014 auto testOutput = [this](GLuint texture, const GLColor &expectedColor) {
1015 const std::string vs =
1016 "#version 300 es\n"
1017 "in vec4 position;\n"
1018 "out vec2 texcoord;\n"
1019 "void main()\n"
1020 "{\n"
1021 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1022 " texcoord = (position.xy * 0.5) + 0.5;\n"
1023 "}\n";
1024
1025 const std::string fs =
1026 "#version 300 es\n"
1027 "precision mediump float;\n"
1028 "uniform sampler2D tex;\n"
1029 "in vec2 texcoord;\n"
1030 "out vec4 color;\n"
1031 "void main()\n"
1032 "{\n"
1033 " color = texture(tex, texcoord);\n"
1034 "}\n";
1035
1036 ANGLE_GL_PROGRAM(program, vs, fs);
1037 glUseProgram(program);
1038
1039 GLRenderbuffer rbo;
1040 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1041 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
1042
1043 GLFramebuffer fbo;
1044 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1045 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1046
1047 glActiveTexture(GL_TEXTURE0);
1048 glBindTexture(GL_TEXTURE_2D, texture);
1049 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1050 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1051 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
1052
1053 drawQuad(program, "position", 0.5f, 1.0f, true);
1054
1055 EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, 1.0);
1056 };
1057
1058 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
1059 GLenum sourceType, const GLColor &sourceColor,
1060 GLenum destInternalFormat, GLenum destType,
1061 bool flipY, bool premultiplyAlpha,
1062 bool unmultiplyAlpha,
1063 const GLColor &expectedColor) {
1064
1065 GLTexture sourceTexture;
1066 glBindTexture(GL_TEXTURE_2D, sourceTexture);
1067 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
1068 &sourceColor);
1069
1070 GLTexture destTexture;
1071 glBindTexture(GL_TEXTURE_2D, destTexture);
1072
1073 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
1074 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
1075 ASSERT_GL_NO_ERROR();
1076
1077 testOutput(destTexture, expectedColor);
1078 };
1079
1080 // New LUMA source formats
1081 testCopyCombination(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGB,
1082 GL_UNSIGNED_BYTE, false, false, false, GLColor(128, 128, 128, 255));
1083 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
1084 GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, false,
1085 GLColor(128, 128, 128, 255));
1086 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
1087 GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, true, false,
1088 GLColor(32, 32, 32, 255));
1089 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
1090 GLColor(128, 128, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, true,
1091 GLColor(255, 255, 255, 255));
1092 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
1093 GL_UNSIGNED_BYTE, false, false, false, GLColor(0, 0, 0, 128));
1094 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
1095 GL_UNSIGNED_BYTE, false, false, true, GLColor(0, 0, 0, 128));
1096 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
1097 GL_UNSIGNED_BYTE, false, true, false, GLColor(0, 0, 0, 128));
1098
1099 // New sRGB dest formats
Geoff Langaadc8f32017-08-11 17:34:44 -04001100 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
1101 GL_UNSIGNED_BYTE, false, false, false, GLColor(55, 13, 4, 255));
1102 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
1103 GL_UNSIGNED_BYTE, false, true, false, GLColor(13, 4, 1, 255));
1104 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
1105 GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false, false,
1106 GLColor(55, 13, 4, 128));
Geoff Lang4f0e0032017-05-01 16:04:35 -04001107}
1108
1109// Test the newly added ES3 float formats
1110TEST_P(CopyTextureTestES3, ES3FloatFormats)
1111{
Jamie Madille59000c2017-08-16 11:13:49 -04001112 ANGLE_SKIP_TEST_IF(IsIntel() && IsWindows() && IsOpenGL());
1113
Geoff Lang4f0e0032017-05-01 16:04:35 -04001114 if (!checkExtensions())
1115 {
1116 return;
1117 }
1118
1119 if (!extensionEnabled("GL_EXT_color_buffer_float"))
1120 {
1121 std::cout << "Test skipped due to missing GL_EXT_color_buffer_float." << std::endl;
1122 return;
1123 }
1124
1125 auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {
1126 const std::string vs =
1127 "#version 300 es\n"
1128 "in vec4 position;\n"
1129 "out vec2 texcoord;\n"
1130 "void main()\n"
1131 "{\n"
1132 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1133 " texcoord = (position.xy * 0.5) + 0.5;\n"
1134 "}\n";
1135
1136 const std::string fs =
1137 "#version 300 es\n"
1138 "precision mediump float;\n"
1139 "uniform sampler2D tex;\n"
1140 "in vec2 texcoord;\n"
1141 "out vec4 color;\n"
1142 "void main()\n"
1143 "{\n"
1144 " color = texture(tex, texcoord);\n"
1145 "}\n";
1146
1147 ANGLE_GL_PROGRAM(program, vs, fs);
1148 glUseProgram(program);
1149
1150 GLRenderbuffer rbo;
1151 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1152 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);
1153
1154 GLFramebuffer fbo;
1155 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1156 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1157
1158 glActiveTexture(GL_TEXTURE0);
1159 glBindTexture(GL_TEXTURE_2D, texture);
1160 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1161 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1162 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
1163
1164 drawQuad(program, "position", 0.5f, 1.0f, true);
1165
1166 EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);
1167 };
1168
1169 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
1170 GLenum sourceType, const GLColor &sourceColor,
1171 GLenum destInternalFormat, GLenum destType,
1172 bool flipY, bool premultiplyAlpha,
1173 bool unmultiplyAlpha,
1174 const GLColor32F &expectedColor) {
1175
1176 GLTexture sourceTexture;
1177 glBindTexture(GL_TEXTURE_2D, sourceTexture);
1178 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
1179 &sourceColor);
1180
1181 GLTexture destTexture;
1182 glBindTexture(GL_TEXTURE_2D, destTexture);
1183
1184 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
1185 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
1186 ASSERT_GL_NO_ERROR();
1187
1188 testOutput(destTexture, expectedColor);
1189 };
1190
1191 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
1192 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 0.5f));
1193 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
1194 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 0.5f));
1195 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
1196 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 0.5f));
1197
1198 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
1199 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.0f, 0.0f, 1.0f));
1200 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
1201 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.0f, 0.0f, 1.0f));
1202 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
1203 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.0f, 0.0f, 1.0f));
1204
1205 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
1206 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.0f, 1.0f));
1207 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
1208 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0f, 1.0f));
1209 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
1210 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.0f, 1.0f));
1211
1212 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
1213 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
1214 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
1215 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
1216 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
1217 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
1218
1219 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
1220 GL_R11F_G11F_B10F, GL_FLOAT, false, false, false,
1221 GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
1222 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
1223 GL_R11F_G11F_B10F, GL_FLOAT, false, true, false,
1224 GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
1225 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
1226 GL_R11F_G11F_B10F, GL_FLOAT, false, false, true,
1227 GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
1228
Geoff Langaadc8f32017-08-11 17:34:44 -04001229 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
1230 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
1231 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
1232 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
1233 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB9_E5,
1234 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
Geoff Lang4f0e0032017-05-01 16:04:35 -04001235}
1236
1237// Test the newly added ES3 unsigned integer formats
1238TEST_P(CopyTextureTestES3, ES3UintFormats)
1239{
Jamie Madill3dfaf262017-08-18 12:32:14 -04001240 ANGLE_SKIP_TEST_IF(IsLinux() && IsOpenGL() && IsIntel());
1241
Geoff Lang4f0e0032017-05-01 16:04:35 -04001242 if (!checkExtensions())
1243 {
1244 return;
1245 }
1246
Geoff Lang4f0e0032017-05-01 16:04:35 -04001247 using GLColor32U = std::tuple<GLuint, GLuint, GLuint, GLuint>;
1248
1249 auto testOutput = [this](GLuint texture, const GLColor32U &expectedColor) {
1250 const std::string vs =
1251 "#version 300 es\n"
1252 "in vec4 position;\n"
1253 "out vec2 texcoord;\n"
1254 "void main()\n"
1255 "{\n"
1256 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
1257 " texcoord = (position.xy * 0.5) + 0.5;\n"
1258 "}\n";
1259
1260 std::string fs =
1261 "#version 300 es\n"
1262 "precision mediump float;\n"
1263 "precision mediump usampler2D;\n"
1264 "in vec2 texcoord;\n"
1265 "uniform usampler2D tex;\n"
1266 "out uvec4 color;\n"
1267 "void main()\n"
1268 "{\n"
1269 " color = texture(tex, texcoord);\n"
1270 "}\n";
1271
1272 ANGLE_GL_PROGRAM(program, vs, fs);
1273 glUseProgram(program);
1274
1275 GLRenderbuffer rbo;
1276 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1277 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8UI, 1, 1);
1278
1279 GLFramebuffer fbo;
1280 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1281 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1282
1283 glActiveTexture(GL_TEXTURE0);
1284 glBindTexture(GL_TEXTURE_2D, texture);
1285 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1286 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1287 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
1288
1289 drawQuad(program, "position", 0.5f, 1.0f, true);
1290 ASSERT_GL_NO_ERROR();
1291
1292 GLuint pixel[4] = {0};
1293 glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);
1294 ASSERT_GL_NO_ERROR();
1295 EXPECT_NEAR(std::get<0>(expectedColor), pixel[0], 1);
1296 EXPECT_NEAR(std::get<1>(expectedColor), pixel[1], 1);
1297 EXPECT_NEAR(std::get<2>(expectedColor), pixel[2], 1);
1298 EXPECT_NEAR(std::get<3>(expectedColor), pixel[3], 1);
1299 };
1300
1301 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
1302 GLenum sourceType, const GLColor &sourceColor,
1303 GLenum destInternalFormat, GLenum destType,
1304 bool flipY, bool premultiplyAlpha,
1305 bool unmultiplyAlpha,
1306 const GLColor32U &expectedColor) {
1307
1308 GLTexture sourceTexture;
1309 glBindTexture(GL_TEXTURE_2D, sourceTexture);
1310 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
1311 &sourceColor);
1312
1313 GLTexture destTexture;
1314 glBindTexture(GL_TEXTURE_2D, destTexture);
1315
1316 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
1317 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
1318 ASSERT_GL_NO_ERROR();
1319
1320 testOutput(destTexture, expectedColor);
1321 };
1322
1323 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
1324 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 128));
1325 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
1326 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 128));
1327 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
1328 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 128));
1329
Geoff Langaadc8f32017-08-11 17:34:44 -04001330 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
1331 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 1));
1332 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
1333 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 1));
1334 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
1335 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 1));
Geoff Lang4f0e0032017-05-01 16:04:35 -04001336
1337 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
1338 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 0, 1));
1339 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
1340 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 0, 1));
1341 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
1342 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 0, 1));
1343
1344 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
1345 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 0, 0, 1));
1346 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
1347 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 0, 0, 1));
1348 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(120, 64, 32, 128), GL_R8UI,
1349 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(240, 0, 0, 1));
1350}
1351
Geoff Lang97073d12016-04-20 10:42:34 -07001352// Use this to select which configurations (e.g. which renderer, which GLES major version) these
1353// tests should be run against.
1354ANGLE_INSTANTIATE_TEST(CopyTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES());
Brandon Jones340b7b82017-06-26 13:02:31 -07001355ANGLE_INSTANTIATE_TEST(CopyTextureTestDest, ES2_D3D11());
Geoff Lang4f0e0032017-05-01 16:04:35 -04001356ANGLE_INSTANTIATE_TEST(CopyTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Geoff Lang97073d12016-04-20 10:42:34 -07001357
1358} // namespace angle