blob: 6762a46f66b4c7d10f870ab1695c5a82163594ce [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
Geoff Lang4f0e0032017-05-01 16:04:35 -040086class CopyTextureTestES3 : public CopyTextureTest
87{
88};
89
Geoff Lang97073d12016-04-20 10:42:34 -070090// Test to ensure that the basic functionality of the extension works.
91TEST_P(CopyTextureTest, BasicCopyTexture)
92{
93 if (!checkExtensions())
94 {
95 return;
96 }
97
98 GLColor pixels = GLColor::red;
99
100 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
101 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
102
Geoff Langfc72a072017-03-24 14:52:39 -0400103 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
104 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700105
106 EXPECT_GL_NO_ERROR();
107
108 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
109}
110
111// Test to ensure that the basic functionality of the extension works.
112TEST_P(CopyTextureTest, BasicCopySubTexture)
113{
114 if (!checkExtensions())
115 {
116 return;
117 }
118
119 GLColor pixels = GLColor::red;
120
121 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
122 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
123
124 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
125 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
126
Geoff Langfc72a072017-03-24 14:52:39 -0400127 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
128 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700129
130 EXPECT_GL_NO_ERROR();
131
132 // Check that FB is complete.
133 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
134
135 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
136
137 EXPECT_GL_NO_ERROR();
138}
139
140// Test that CopyTexture cannot redefine an immutable texture and CopySubTexture can copy data to
141// immutable textures
142TEST_P(CopyTextureTest, ImmutableTexture)
143{
144 if (!checkExtensions())
145 {
146 return;
147 }
148
149 if (getClientMajorVersion() < 3 &&
150 (!extensionEnabled("GL_EXT_texture_storage") || !extensionEnabled("GL_OES_rgb8_rgba8")))
151 {
152 std::cout
153 << "Test skipped due to missing ES3 or GL_EXT_texture_storage or GL_OES_rgb8_rgba8"
154 << std::endl;
155 return;
156 }
157
158 GLColor pixels = GLColor::red;
159
160 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
161 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
162 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
163
164 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
165 glTexStorage2DEXT(GL_TEXTURE_2D, 1, GL_RGBA8_OES, 1, 1);
166 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, mTextures[1], 0);
167 EXPECT_GL_NO_ERROR();
168
169 // Should generate an error when the texture is redefined
Geoff Langfc72a072017-03-24 14:52:39 -0400170 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
171 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700172 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
173
174 // Should succeed when using CopySubTexture
Geoff Langfc72a072017-03-24 14:52:39 -0400175 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1, 1,
176 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700177 EXPECT_GL_NO_ERROR();
178
179 // Check that FB is complete.
180 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
181
182 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
183
184 EXPECT_GL_NO_ERROR();
185}
186
187// Test validation of internal formats in CopyTexture and CopySubTexture
188TEST_P(CopyTextureTest, InternalFormat)
189{
190 if (!checkExtensions())
191 {
192 return;
193 }
194
195 std::vector<GLint> sourceFormats;
196 sourceFormats.push_back(GL_ALPHA);
197 sourceFormats.push_back(GL_RGB);
198 sourceFormats.push_back(GL_RGBA);
199 sourceFormats.push_back(GL_LUMINANCE);
200 sourceFormats.push_back(GL_LUMINANCE_ALPHA);
201
202 std::vector<GLint> destFormats;
203 destFormats.push_back(GL_RGB);
204 destFormats.push_back(GL_RGBA);
205
206 if (extensionEnabled("GL_EXT_texture_format_BGRA8888"))
207 {
208 sourceFormats.push_back(GL_BGRA_EXT);
209 destFormats.push_back(GL_BGRA_EXT);
210 }
211
212 // Test with glCopyTexture
213 for (GLint sourceFormat : sourceFormats)
214 {
215 for (GLint destFormat : destFormats)
216 {
217 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
218 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
219 nullptr);
220 EXPECT_GL_NO_ERROR();
221
Geoff Langfc72a072017-03-24 14:52:39 -0400222 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, destFormat,
223 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700224
225 EXPECT_GL_NO_ERROR();
226 }
227 }
228
229 // Test with glCopySubTexture
230 for (GLint sourceFormat : sourceFormats)
231 {
232 for (GLint destFormat : destFormats)
233 {
234 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
235 glTexImage2D(GL_TEXTURE_2D, 0, sourceFormat, 1, 1, 0, sourceFormat, GL_UNSIGNED_BYTE,
236 nullptr);
237 EXPECT_GL_NO_ERROR();
238
239 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
240 glTexImage2D(GL_TEXTURE_2D, 0, destFormat, 1, 1, 0, destFormat, GL_UNSIGNED_BYTE,
241 nullptr);
242 EXPECT_GL_NO_ERROR();
243
Geoff Langfc72a072017-03-24 14:52:39 -0400244 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 0, 0, 1,
245 1, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700246
247 EXPECT_GL_NO_ERROR();
248 }
249 }
250}
251
Geoff Lang97073d12016-04-20 10:42:34 -0700252// Test to ensure that the destination texture is redefined if the properties are different.
253TEST_P(CopyTextureTest, RedefineDestinationTexture)
254{
255 if (!checkExtensions())
256 {
257 return;
258 }
259
260 GLColor pixels[4] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
261
262 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
263 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
264
265 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
266 glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, 1, 1, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
267 EXPECT_GL_NO_ERROR();
268
269 // GL_INVALID_OPERATION due to "intrinsic format" != "internal format".
270 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
271 EXPECT_GL_ERROR(GL_INVALID_OPERATION);
272 // GL_INVALID_VALUE due to bad dimensions.
273 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pixels);
274 EXPECT_GL_ERROR(GL_INVALID_VALUE);
275
276 // If the dest texture has different properties, glCopyTextureCHROMIUM()
277 // redefines them.
Geoff Langfc72a072017-03-24 14:52:39 -0400278 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
279 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700280 EXPECT_GL_NO_ERROR();
281
282 // glTexSubImage2D() succeeds because mTextures[1] is redefined into 2x2
283 // dimension and GL_RGBA format.
284 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
285 glTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
286 EXPECT_GL_NO_ERROR();
287
288 // Check that FB is complete.
289 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
290
291 EXPECT_PIXEL_COLOR_EQ(1, 1, pixels[3]);
292 EXPECT_GL_NO_ERROR();
293}
294
295// Test that invalid dimensions in CopySubTexture are validated
296TEST_P(CopyTextureTest, CopySubTextureDimension)
297{
298 if (!checkExtensions())
299 {
300 return;
301 }
302
303 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
304 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
305
306 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
307 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
308
Geoff Langfc72a072017-03-24 14:52:39 -0400309 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
310 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700311 EXPECT_GL_NO_ERROR();
312
313 // xoffset < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400314 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, -1, 1, 0, 0, 1, 1,
315 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700316 EXPECT_GL_ERROR(GL_INVALID_VALUE);
317
318 // x < 0
Geoff Langfc72a072017-03-24 14:52:39 -0400319 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, -1, 0, 1, 1,
320 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700321 EXPECT_GL_ERROR(GL_INVALID_VALUE);
322
323 // xoffset + width > dest_width
Geoff Langfc72a072017-03-24 14:52:39 -0400324 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 2, 2, 0, 0, 2, 2,
325 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700326 EXPECT_GL_ERROR(GL_INVALID_VALUE);
327
328 // x + width > source_width
Geoff Langfc72a072017-03-24 14:52:39 -0400329 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 0, 1, 1, 2, 2,
330 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700331 EXPECT_GL_ERROR(GL_INVALID_VALUE);
332}
333
334// Test that invalid IDs in CopyTexture are validated
335TEST_P(CopyTextureTest, CopyTextureInvalidTextureIds)
336{
337 if (!checkExtensions())
338 {
339 return;
340 }
341
342 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
343 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
344
345 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
346 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
347
Geoff Langfc72a072017-03-24 14:52:39 -0400348 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, GL_RGBA, GL_UNSIGNED_BYTE,
349 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700350 EXPECT_GL_ERROR(GL_INVALID_VALUE);
351
Geoff Langfc72a072017-03-24 14:52:39 -0400352 glCopyTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA, GL_UNSIGNED_BYTE,
353 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700354 EXPECT_GL_ERROR(GL_INVALID_VALUE);
355
Geoff Langfc72a072017-03-24 14:52:39 -0400356 glCopyTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, GL_RGBA, GL_UNSIGNED_BYTE, false,
357 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700358 EXPECT_GL_ERROR(GL_INVALID_VALUE);
359
Geoff Langfc72a072017-03-24 14:52:39 -0400360 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
361 GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700362 EXPECT_GL_NO_ERROR();
363}
364
365// Test that invalid IDs in CopySubTexture are validated
366TEST_P(CopyTextureTest, CopySubTextureInvalidTextureIds)
367{
368 if (!checkExtensions())
369 {
370 return;
371 }
372
373 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
374 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
375
376 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
377 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
378
Geoff Langfc72a072017-03-24 14:52:39 -0400379 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, 99993, 0, 1, 1, 0, 0, 1, 1, false,
380 false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700381 EXPECT_GL_ERROR(GL_INVALID_VALUE);
382
Geoff Langfc72a072017-03-24 14:52:39 -0400383 glCopySubTextureCHROMIUM(99994, 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1, false,
384 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 glCopySubTextureCHROMIUM(99995, 0, GL_TEXTURE_2D, 99996, 0, 1, 1, 0, 0, 1, 1, false, false,
388 false);
Geoff Lang97073d12016-04-20 10:42:34 -0700389 EXPECT_GL_ERROR(GL_INVALID_VALUE);
390
Geoff Langfc72a072017-03-24 14:52:39 -0400391 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
392 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700393 EXPECT_GL_NO_ERROR();
394}
395
396// Test that using an offset in CopySubTexture works correctly
397TEST_P(CopyTextureTest, CopySubTextureOffset)
398{
399 if (!checkExtensions())
400 {
401 return;
402 }
403
404 GLColor rgbaPixels[4 * 4] = {GLColor::red, GLColor::green, GLColor::blue, GLColor::black};
405 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
406 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
407
408 GLColor transparentPixels[4 * 4] = {GLColor::transparentBlack, GLColor::transparentBlack,
409 GLColor::transparentBlack, GLColor::transparentBlack};
410 glBindTexture(GL_TEXTURE_2D, mTextures[1]);
411 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, transparentPixels);
412
Geoff Langfc72a072017-03-24 14:52:39 -0400413 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 1, 0, 0, 1, 1,
414 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700415 EXPECT_GL_NO_ERROR();
Geoff Langfc72a072017-03-24 14:52:39 -0400416 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 1, 0, 1, 0, 1, 1,
417 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700418 EXPECT_GL_NO_ERROR();
Geoff Langfc72a072017-03-24 14:52:39 -0400419 glCopySubTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, 0, 1, 0, 1, 1, 1,
420 false, false, false);
Geoff Lang97073d12016-04-20 10:42:34 -0700421 EXPECT_GL_NO_ERROR();
422
423 // Check that FB is complete.
424 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
425
426 EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::transparentBlack);
427 EXPECT_PIXEL_COLOR_EQ(1, 1, GLColor::red);
428 EXPECT_PIXEL_COLOR_EQ(1, 0, GLColor::green);
429 EXPECT_PIXEL_COLOR_EQ(0, 1, GLColor::blue);
430 EXPECT_GL_NO_ERROR();
431}
432
433// Test that flipping the Y component works correctly
434TEST_P(CopyTextureTest, FlipY)
435{
436 if (!checkExtensions())
437 {
438 return;
439 }
440
441 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
442 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
443
444 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
445 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
446
Geoff Langfc72a072017-03-24 14:52:39 -0400447 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
448 GL_UNSIGNED_BYTE, GL_TRUE, GL_FALSE, GL_FALSE);
Geoff Lang97073d12016-04-20 10:42:34 -0700449 EXPECT_GL_NO_ERROR();
450
451 // Check that FB is complete.
452 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
453
454 EXPECT_PIXEL_COLOR_EQ(0, 0, rgbaPixels[2]);
455 EXPECT_PIXEL_COLOR_EQ(1, 0, rgbaPixels[3]);
456 EXPECT_PIXEL_COLOR_EQ(0, 1, rgbaPixels[0]);
457 EXPECT_PIXEL_COLOR_EQ(1, 1, rgbaPixels[1]);
458 EXPECT_GL_NO_ERROR();
459}
460
461// Test that premultipying the alpha on copy works correctly
462TEST_P(CopyTextureTest, PremultiplyAlpha)
463{
464 if (!checkExtensions())
465 {
466 return;
467 }
468
469 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(255u, 255u, 255u, 127u),
470 GLColor(127u, 127u, 127u, 127u), GLColor(255u, 255u, 255u, 0u)};
471
472 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
473 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
474
Geoff Langfc72a072017-03-24 14:52:39 -0400475 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
476 GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, GL_FALSE);
Geoff Lang97073d12016-04-20 10:42:34 -0700477 EXPECT_GL_NO_ERROR();
478
479 // Check that FB is complete.
480 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
481
482 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
483 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
484 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
485 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(0, 0, 0, 0), 1.0);
486 EXPECT_GL_NO_ERROR();
487}
488
489// Test that unmultipying the alpha on copy works correctly
490TEST_P(CopyTextureTest, UnmultiplyAlpha)
491{
492 if (!checkExtensions())
493 {
494 return;
495 }
496
497 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
498 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
499
500 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
501 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
502
Geoff Langfc72a072017-03-24 14:52:39 -0400503 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
504 GL_UNSIGNED_BYTE, GL_FALSE, GL_FALSE, GL_TRUE);
Geoff Lang97073d12016-04-20 10:42:34 -0700505 EXPECT_GL_NO_ERROR();
506
507 // Check that FB is complete.
508 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
509
510 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
511 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(255, 255, 255, 127), 1.0);
512 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(127, 127, 127, 127), 1.0);
513 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
514 EXPECT_GL_NO_ERROR();
515}
516
517// Test that unmultipying and premultiplying the alpha is the same as doing neither
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500518TEST_P(CopyTextureTest, UnmultiplyAndPremultiplyAlpha)
Geoff Lang97073d12016-04-20 10:42:34 -0700519{
520 if (!checkExtensions())
521 {
522 return;
523 }
524
525 GLColor rgbaPixels[4] = {GLColor(255u, 255u, 255u, 255u), GLColor(127u, 127u, 127u, 127u),
526 GLColor(63u, 63u, 63u, 127u), GLColor(255u, 255u, 255u, 0u)};
527
528 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
529 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
530
Geoff Langfc72a072017-03-24 14:52:39 -0400531 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
532 GL_UNSIGNED_BYTE, GL_FALSE, GL_TRUE, GL_TRUE);
Geoff Lang97073d12016-04-20 10:42:34 -0700533 EXPECT_GL_NO_ERROR();
534
535 // Check that FB is complete.
536 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
537
538 EXPECT_PIXEL_COLOR_NEAR(0, 0, GLColor(255, 255, 255, 255), 1.0);
539 EXPECT_PIXEL_COLOR_NEAR(1, 0, GLColor(127, 127, 127, 127), 1.0);
540 EXPECT_PIXEL_COLOR_NEAR(0, 1, GLColor(63, 63, 63, 127), 1.0);
541 EXPECT_PIXEL_COLOR_NEAR(1, 1, GLColor(255, 255, 255, 0), 1.0);
542 EXPECT_GL_NO_ERROR();
543}
544
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500545// Test to ensure that CopyTexture works with LUMINANCE_ALPHA texture
546TEST_P(CopyTextureTest, LuminanceAlpha)
547{
548 if (!checkExtensions())
549 {
550 return;
551 }
552
553 uint8_t originalPixels[] = {163u, 67u};
554 GLColor expectedPixels(163u, 163u, 163u, 67u);
555
556 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
557 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 1, 1, 0, GL_LUMINANCE_ALPHA,
558 GL_UNSIGNED_BYTE, &originalPixels);
559
Geoff Langfc72a072017-03-24 14:52:39 -0400560 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
561 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500562
563 EXPECT_GL_NO_ERROR();
564
565 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
566}
567
568// Test to ensure that CopyTexture works with LUMINANCE texture
569TEST_P(CopyTextureTest, Luminance)
570{
571 if (!checkExtensions())
572 {
573 return;
574 }
575
576 uint8_t originalPixels[] = {57u};
577 GLColor expectedPixels(57u, 57u, 57u, 255u);
578
579 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
580 glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 1, 1, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE,
581 &originalPixels);
582
Geoff Langfc72a072017-03-24 14:52:39 -0400583 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
584 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500585
586 EXPECT_GL_NO_ERROR();
587
588 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
589}
590
591// Test to ensure that CopyTexture works with ALPHA texture
592TEST_P(CopyTextureTest, Alpha)
593{
594 if (!checkExtensions())
595 {
596 return;
597 }
598
599 uint8_t originalPixels[] = {77u};
600 GLColor expectedPixels(0u, 0u, 0u, 77u);
601
602 glBindTexture(GL_TEXTURE_2D, mTextures[0]);
603 glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1, 1, 0, GL_ALPHA, GL_UNSIGNED_BYTE, &originalPixels);
604
Geoff Langfc72a072017-03-24 14:52:39 -0400605 glCopyTextureCHROMIUM(mTextures[0], 0, GL_TEXTURE_2D, mTextures[1], 0, GL_RGBA,
606 GL_UNSIGNED_BYTE, false, false, false);
Corentin Wallez133a2ec2016-11-17 16:28:03 -0500607
608 EXPECT_GL_NO_ERROR();
609
610 EXPECT_PIXEL_COLOR_EQ(0, 0, expectedPixels);
611}
612
Geoff Lang4f0e0032017-05-01 16:04:35 -0400613// Test that copying to cube maps works
614TEST_P(CopyTextureTest, CubeMapTarget)
615{
616 if (!checkExtensions())
617 {
618 return;
619 }
620
621 GLColor pixels = GLColor::red;
622
623 GLTexture textures[2];
624
625 glBindTexture(GL_TEXTURE_2D, textures[0]);
626 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &pixels);
627
628 glBindTexture(GL_TEXTURE_CUBE_MAP, textures[1]);
629 for (GLenum face = GL_TEXTURE_CUBE_MAP_POSITIVE_X; face <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z;
630 face++)
631 {
632 glTexImage2D(face, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
633 }
634
635 glCopySubTextureCHROMIUM(textures[0], 0, GL_TEXTURE_CUBE_MAP_POSITIVE_X, textures[1], 0, 0, 0,
636 0, 0, 1, 1, false, false, false);
637
638 EXPECT_GL_NO_ERROR();
639
640 GLFramebuffer fbo;
641 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
642 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X,
643 textures[1], 0);
644
645 // Check that FB is complete.
646 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
647
648 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels);
649
650 EXPECT_GL_NO_ERROR();
651}
652
653// Test that copying to non-zero mipmaps works
Geoff Lang165dcf12017-06-07 15:05:14 -0400654TEST_P(CopyTextureTest, CopyToMipmap)
Geoff Lang4f0e0032017-05-01 16:04:35 -0400655{
656 if (!checkExtensions())
657 {
658 return;
659 }
660
Geoff Lang165dcf12017-06-07 15:05:14 -0400661 if (getClientMajorVersion() < 3 && !extensionEnabled("GL_OES_fbo_render_mipmap"))
662 {
663 std::cout << "Test skipped because ES3 or GL_OES_fbo_render_mipmap is missing."
664 << std::endl;
665 return;
666 }
667
Geoff Lang4f0e0032017-05-01 16:04:35 -0400668 if (IsOSX() && IsIntel())
669 {
670 std::cout << "Test skipped on Mac Intel." << std::endl;
671 return;
672 }
673
Geoff Lang165dcf12017-06-07 15:05:14 -0400674 GLColor pixels[] = {GLColor::red, GLColor::red, GLColor::red, GLColor::red};
Geoff Lang4f0e0032017-05-01 16:04:35 -0400675
676 GLTexture textures[2];
677
Geoff Lang4f0e0032017-05-01 16:04:35 -0400678 glBindTexture(GL_TEXTURE_2D, textures[0]);
Geoff Lang165dcf12017-06-07 15:05:14 -0400679 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
680 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400681
682 glBindTexture(GL_TEXTURE_2D, textures[1]);
683 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
684 glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
685 glTexImage2D(GL_TEXTURE_2D, 2, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
686
Geoff Lang165dcf12017-06-07 15:05:14 -0400687 std::vector<std::pair<GLint, GLint>> soureDestPairs;
688 soureDestPairs.push_back(std::make_pair(0, 1));
Geoff Lang4f0e0032017-05-01 16:04:35 -0400689
Geoff Lang165dcf12017-06-07 15:05:14 -0400690 // ES3 allows copying from non-zero mips
691 if (getClientMajorVersion() >= 3)
692 {
693 soureDestPairs.push_back(std::make_pair(1, 2));
694 }
Geoff Lang4f0e0032017-05-01 16:04:35 -0400695
Geoff Lang165dcf12017-06-07 15:05:14 -0400696 for (const auto &sourceDestPair : soureDestPairs)
697 {
698 const GLint sourceLevel = sourceDestPair.first;
699 const GLint destLevel = sourceDestPair.second;
Geoff Lang4f0e0032017-05-01 16:04:35 -0400700
Geoff Lang165dcf12017-06-07 15:05:14 -0400701 glCopyTextureCHROMIUM(textures[0], sourceLevel, GL_TEXTURE_2D, textures[1], destLevel,
702 GL_RGBA, GL_UNSIGNED_BYTE, false, false, false);
Geoff Lang4f0e0032017-05-01 16:04:35 -0400703
Geoff Lang165dcf12017-06-07 15:05:14 -0400704 EXPECT_GL_NO_ERROR();
Geoff Lang4f0e0032017-05-01 16:04:35 -0400705
Geoff Lang165dcf12017-06-07 15:05:14 -0400706 GLFramebuffer fbo;
707 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
708 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textures[1],
709 destLevel);
710
711 // Check that FB is complete.
712 EXPECT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
713
714 EXPECT_PIXEL_COLOR_EQ(0, 0, pixels[0]);
715
716 EXPECT_GL_NO_ERROR();
717 }
Geoff Lang4f0e0032017-05-01 16:04:35 -0400718}
719
720// Test the newly added ES3 unorm formats
721TEST_P(CopyTextureTestES3, ES3UnormFormats)
722{
723 if (!checkExtensions())
724 {
725 return;
726 }
727
728 auto testOutput = [this](GLuint texture, const GLColor &expectedColor) {
729 const std::string vs =
730 "#version 300 es\n"
731 "in vec4 position;\n"
732 "out vec2 texcoord;\n"
733 "void main()\n"
734 "{\n"
735 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
736 " texcoord = (position.xy * 0.5) + 0.5;\n"
737 "}\n";
738
739 const std::string fs =
740 "#version 300 es\n"
741 "precision mediump float;\n"
742 "uniform sampler2D tex;\n"
743 "in vec2 texcoord;\n"
744 "out vec4 color;\n"
745 "void main()\n"
746 "{\n"
747 " color = texture(tex, texcoord);\n"
748 "}\n";
749
750 ANGLE_GL_PROGRAM(program, vs, fs);
751 glUseProgram(program);
752
753 GLRenderbuffer rbo;
754 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
755 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, 1, 1);
756
757 GLFramebuffer fbo;
758 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
759 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
760
761 glActiveTexture(GL_TEXTURE0);
762 glBindTexture(GL_TEXTURE_2D, texture);
763 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
764 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
765 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
766
767 drawQuad(program, "position", 0.5f, 1.0f, true);
768
769 EXPECT_PIXEL_COLOR_NEAR(0, 0, expectedColor, 1.0);
770 };
771
772 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
773 GLenum sourceType, const GLColor &sourceColor,
774 GLenum destInternalFormat, GLenum destType,
775 bool flipY, bool premultiplyAlpha,
776 bool unmultiplyAlpha,
777 const GLColor &expectedColor) {
778
779 GLTexture sourceTexture;
780 glBindTexture(GL_TEXTURE_2D, sourceTexture);
781 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
782 &sourceColor);
783
784 GLTexture destTexture;
785 glBindTexture(GL_TEXTURE_2D, destTexture);
786
787 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
788 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
789 ASSERT_GL_NO_ERROR();
790
791 testOutput(destTexture, expectedColor);
792 };
793
794 // New LUMA source formats
795 testCopyCombination(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGB,
796 GL_UNSIGNED_BYTE, false, false, false, GLColor(128, 128, 128, 255));
797 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
798 GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, false,
799 GLColor(128, 128, 128, 255));
800 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
801 GLColor(128, 64, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, true, false,
802 GLColor(32, 32, 32, 255));
803 testCopyCombination(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
804 GLColor(128, 128, 0, 0), GL_RGB, GL_UNSIGNED_BYTE, false, false, true,
805 GLColor(255, 255, 255, 255));
806 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
807 GL_UNSIGNED_BYTE, false, false, false, GLColor(0, 0, 0, 128));
808 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
809 GL_UNSIGNED_BYTE, false, false, true, GLColor(0, 0, 0, 128));
810 testCopyCombination(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, GLColor(128, 0, 0, 0), GL_RGBA,
811 GL_UNSIGNED_BYTE, false, true, false, GLColor(0, 0, 0, 128));
812
813 // New sRGB dest formats
Geoff Lang88318b42017-07-05 14:39:01 -0400814 if (IsOpenGLES() || IsOpenGL())
Geoff Lang4f0e0032017-05-01 16:04:35 -0400815 {
816 std::cout << "Skipping GL_SRGB and GL_SRGB_ALPHA because it is not implemented yet."
817 << std::endl;
818 }
819 else
820 {
821 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
Geoff Lang88318b42017-07-05 14:39:01 -0400822 GL_UNSIGNED_BYTE, false, false, false, GLColor(55, 13, 4, 255));
Geoff Lang4f0e0032017-05-01 16:04:35 -0400823 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_SRGB,
Geoff Lang88318b42017-07-05 14:39:01 -0400824 GL_UNSIGNED_BYTE, false, true, false, GLColor(13, 4, 1, 255));
Geoff Lang4f0e0032017-05-01 16:04:35 -0400825 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
826 GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, false, false, false,
Geoff Lang88318b42017-07-05 14:39:01 -0400827 GLColor(55, 13, 4, 128));
Geoff Lang4f0e0032017-05-01 16:04:35 -0400828 }
829}
830
831// Test the newly added ES3 float formats
832TEST_P(CopyTextureTestES3, ES3FloatFormats)
833{
834 if (!checkExtensions())
835 {
836 return;
837 }
838
839 if (!extensionEnabled("GL_EXT_color_buffer_float"))
840 {
841 std::cout << "Test skipped due to missing GL_EXT_color_buffer_float." << std::endl;
842 return;
843 }
844
845 auto testOutput = [this](GLuint texture, const GLColor32F &expectedColor) {
846 const std::string vs =
847 "#version 300 es\n"
848 "in vec4 position;\n"
849 "out vec2 texcoord;\n"
850 "void main()\n"
851 "{\n"
852 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
853 " texcoord = (position.xy * 0.5) + 0.5;\n"
854 "}\n";
855
856 const std::string fs =
857 "#version 300 es\n"
858 "precision mediump float;\n"
859 "uniform sampler2D tex;\n"
860 "in vec2 texcoord;\n"
861 "out vec4 color;\n"
862 "void main()\n"
863 "{\n"
864 " color = texture(tex, texcoord);\n"
865 "}\n";
866
867 ANGLE_GL_PROGRAM(program, vs, fs);
868 glUseProgram(program);
869
870 GLRenderbuffer rbo;
871 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
872 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA32F, 1, 1);
873
874 GLFramebuffer fbo;
875 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
876 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
877
878 glActiveTexture(GL_TEXTURE0);
879 glBindTexture(GL_TEXTURE_2D, texture);
880 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
881 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
882 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
883
884 drawQuad(program, "position", 0.5f, 1.0f, true);
885
886 EXPECT_PIXEL_COLOR32F_NEAR(0, 0, expectedColor, 0.05);
887 };
888
889 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
890 GLenum sourceType, const GLColor &sourceColor,
891 GLenum destInternalFormat, GLenum destType,
892 bool flipY, bool premultiplyAlpha,
893 bool unmultiplyAlpha,
894 const GLColor32F &expectedColor) {
895
896 GLTexture sourceTexture;
897 glBindTexture(GL_TEXTURE_2D, sourceTexture);
898 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
899 &sourceColor);
900
901 GLTexture destTexture;
902 glBindTexture(GL_TEXTURE_2D, destTexture);
903
904 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
905 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
906 ASSERT_GL_NO_ERROR();
907
908 testOutput(destTexture, expectedColor);
909 };
910
911 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
912 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 0.5f));
913 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
914 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 0.5f));
915 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA32F,
916 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 0.5f));
917
918 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
919 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.0f, 0.0f, 1.0f));
920 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
921 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.0f, 0.0f, 1.0f));
922 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R16F,
923 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.0f, 0.0f, 1.0f));
924
925 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
926 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.0f, 1.0f));
927 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
928 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0f, 1.0f));
929 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG16F,
930 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.0f, 1.0f));
931
932 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
933 GL_FLOAT, false, false, false, GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
934 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
935 GL_FLOAT, false, true, false, GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
936 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB16F,
937 GL_FLOAT, false, false, true, GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
938
939 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
940 GL_R11F_G11F_B10F, GL_FLOAT, false, false, false,
941 GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
942 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
943 GL_R11F_G11F_B10F, GL_FLOAT, false, true, false,
944 GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
945 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
946 GL_R11F_G11F_B10F, GL_FLOAT, false, false, true,
947 GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
948
Geoff Lang80616212017-05-17 15:40:03 -0400949 if (IsOpenGL() || IsOpenGLES())
Geoff Lang4f0e0032017-05-01 16:04:35 -0400950 {
951 std::cout << "Skipping GL_RGB9_E5 because it is not implemented yet." << std::endl;
952 }
953 else
954 {
955 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
956 GL_RGB9_E5, GL_FLOAT, false, false, false,
957 GLColor32F(0.5f, 0.25f, 0.125f, 1.0f));
958 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
959 GL_RGB9_E5, GL_FLOAT, false, true, false,
960 GLColor32F(0.25f, 0.125f, 0.0625f, 1.0f));
961 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128),
962 GL_RGB9_E5, GL_FLOAT, false, false, true,
963 GLColor32F(1.0f, 0.5f, 0.25f, 1.0f));
964 }
965}
966
967// Test the newly added ES3 unsigned integer formats
968TEST_P(CopyTextureTestES3, ES3UintFormats)
969{
970 if (!checkExtensions())
971 {
972 return;
973 }
974
975 if (IsOpenGL() || IsOpenGLES())
976 {
977 std::cout << "Test on OpenGL and OpenGLES because not all formats are implemented yet."
978 << std::endl;
979 return;
980 }
981
982 using GLColor32U = std::tuple<GLuint, GLuint, GLuint, GLuint>;
983
984 auto testOutput = [this](GLuint texture, const GLColor32U &expectedColor) {
985 const std::string vs =
986 "#version 300 es\n"
987 "in vec4 position;\n"
988 "out vec2 texcoord;\n"
989 "void main()\n"
990 "{\n"
991 " gl_Position = vec4(position.xy, 0.0, 1.0);\n"
992 " texcoord = (position.xy * 0.5) + 0.5;\n"
993 "}\n";
994
995 std::string fs =
996 "#version 300 es\n"
997 "precision mediump float;\n"
998 "precision mediump usampler2D;\n"
999 "in vec2 texcoord;\n"
1000 "uniform usampler2D tex;\n"
1001 "out uvec4 color;\n"
1002 "void main()\n"
1003 "{\n"
1004 " color = texture(tex, texcoord);\n"
1005 "}\n";
1006
1007 ANGLE_GL_PROGRAM(program, vs, fs);
1008 glUseProgram(program);
1009
1010 GLRenderbuffer rbo;
1011 glBindRenderbuffer(GL_RENDERBUFFER, rbo);
1012 glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8UI, 1, 1);
1013
1014 GLFramebuffer fbo;
1015 glBindFramebuffer(GL_FRAMEBUFFER, fbo);
1016 glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
1017
1018 glActiveTexture(GL_TEXTURE0);
1019 glBindTexture(GL_TEXTURE_2D, texture);
1020 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1021 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1022 glUniform1i(glGetUniformLocation(program.get(), "tex"), 0);
1023
1024 drawQuad(program, "position", 0.5f, 1.0f, true);
1025 ASSERT_GL_NO_ERROR();
1026
1027 GLuint pixel[4] = {0};
1028 glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);
1029 ASSERT_GL_NO_ERROR();
1030 EXPECT_NEAR(std::get<0>(expectedColor), pixel[0], 1);
1031 EXPECT_NEAR(std::get<1>(expectedColor), pixel[1], 1);
1032 EXPECT_NEAR(std::get<2>(expectedColor), pixel[2], 1);
1033 EXPECT_NEAR(std::get<3>(expectedColor), pixel[3], 1);
1034 };
1035
1036 auto testCopyCombination = [this, testOutput](GLenum sourceInternalFormat, GLenum sourceFormat,
1037 GLenum sourceType, const GLColor &sourceColor,
1038 GLenum destInternalFormat, GLenum destType,
1039 bool flipY, bool premultiplyAlpha,
1040 bool unmultiplyAlpha,
1041 const GLColor32U &expectedColor) {
1042
1043 GLTexture sourceTexture;
1044 glBindTexture(GL_TEXTURE_2D, sourceTexture);
1045 glTexImage2D(GL_TEXTURE_2D, 0, sourceInternalFormat, 1, 1, 0, sourceFormat, sourceType,
1046 &sourceColor);
1047
1048 GLTexture destTexture;
1049 glBindTexture(GL_TEXTURE_2D, destTexture);
1050
1051 glCopyTextureCHROMIUM(sourceTexture, 0, GL_TEXTURE_2D, destTexture, 0, destInternalFormat,
1052 destType, flipY, premultiplyAlpha, unmultiplyAlpha);
1053 ASSERT_GL_NO_ERROR();
1054
1055 testOutput(destTexture, expectedColor);
1056 };
1057
1058 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
1059 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 128));
1060 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
1061 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 128));
1062 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGBA8UI,
1063 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 128));
1064
1065 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
1066 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 32, 1));
1067 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
1068 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 16, 1));
1069 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RGB8UI,
1070 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 64, 1));
1071
1072 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
1073 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 64, 0, 1));
1074 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
1075 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 32, 0, 1));
1076 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_RG8UI,
1077 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(255, 128, 0, 1));
1078
1079 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
1080 GL_UNSIGNED_BYTE, false, false, false, GLColor32U(128, 0, 0, 1));
1081 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(128, 64, 32, 128), GL_R8UI,
1082 GL_UNSIGNED_BYTE, false, true, false, GLColor32U(64, 0, 0, 1));
1083 testCopyCombination(GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, GLColor(120, 64, 32, 128), GL_R8UI,
1084 GL_UNSIGNED_BYTE, false, false, true, GLColor32U(240, 0, 0, 1));
1085}
1086
Geoff Lang97073d12016-04-20 10:42:34 -07001087// Use this to select which configurations (e.g. which renderer, which GLES major version) these
1088// tests should be run against.
1089ANGLE_INSTANTIATE_TEST(CopyTextureTest, ES2_D3D9(), ES2_D3D11(), ES2_OPENGL(), ES2_OPENGLES());
Geoff Lang4f0e0032017-05-01 16:04:35 -04001090ANGLE_INSTANTIATE_TEST(CopyTextureTestES3, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGLES());
Geoff Lang97073d12016-04-20 10:42:34 -07001091
1092} // namespace angle