Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/angle
Path: blob/main_old/src/tests/gl_tests/CopyTexture3DTest.cpp
1693 views
1
//
2
// Copyright 2018 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
// CopyTexture3DTest.cpp: Tests of the GL_ANGLE_copy_texture_3d extension
8
9
#include "test_utils/ANGLETest.h"
10
11
#include "test_utils/gl_raii.h"
12
13
namespace angle
14
{
15
16
class CopyTexture3DTest : public ANGLETest
17
{
18
protected:
19
CopyTexture3DTest()
20
{
21
setWindowWidth(256);
22
setWindowHeight(256);
23
setConfigRedBits(8);
24
setConfigGreenBits(8);
25
setConfigBlueBits(8);
26
setConfigAlphaBits(8);
27
}
28
29
void testSetUp() override
30
{
31
const char *vertexShaderSource = getVertexShaderSource();
32
const char *fragmentShaderSource = getFragmentShaderSource();
33
34
mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
35
ASSERT_NE(0u, mProgram);
36
37
glUseProgram(mProgram);
38
39
ASSERT_GL_NO_ERROR();
40
}
41
42
const char *getVertexShaderSource()
43
{
44
return "#version 300 es\n"
45
"out vec3 texcoord;\n"
46
"in vec4 position;\n"
47
"void main()\n"
48
"{\n"
49
" gl_Position = vec4(position.xy, 0.0, 1.0);\n"
50
" texcoord = (position.xyz * 0.5) + 0.5;\n"
51
"}\n";
52
}
53
54
bool checkExtensions() const
55
{
56
if (!IsGLExtensionEnabled("GL_ANGLE_copy_texture_3d"))
57
{
58
std::cout << "Test skipped because GL_ANGLE_copy_texture_3d is not available."
59
<< std::endl;
60
return false;
61
}
62
63
EXPECT_NE(nullptr, glCopyTexture3DANGLE);
64
EXPECT_NE(nullptr, glCopySubTexture3DANGLE);
65
return true;
66
}
67
68
void testCopy(const GLenum testTarget,
69
const GLColor &sourceColor,
70
GLenum destInternalFormat,
71
GLenum destType,
72
bool flipY,
73
bool premultiplyAlpha,
74
bool unmultiplyAlpha,
75
const GLColor &expectedColor)
76
{
77
std::vector<GLColor> texDataColor(2u * 2u * 2u, sourceColor);
78
79
glBindTexture(testTarget, sourceTexture.get());
80
glTexImage3D(testTarget, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
81
texDataColor.data());
82
glTexParameteri(testTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
83
glTexParameteri(testTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
84
glTexParameteri(testTarget, GL_TEXTURE_BASE_LEVEL, 0);
85
glTexParameteri(testTarget, GL_TEXTURE_MAX_LEVEL, 0);
86
EXPECT_GL_NO_ERROR();
87
88
glActiveTexture(GL_TEXTURE0);
89
glBindTexture(testTarget, destTexture.get());
90
glCopyTexture3DANGLE(sourceTexture.get(), 0, testTarget, destTexture.get(), 0,
91
destInternalFormat, destType, flipY, premultiplyAlpha,
92
unmultiplyAlpha);
93
EXPECT_GL_NO_ERROR();
94
95
GLRenderbuffer rbo;
96
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
97
98
GLenum renderType = 0;
99
100
switch (destInternalFormat)
101
{
102
case GL_RGB:
103
case GL_RGBA:
104
case GL_LUMINANCE:
105
case GL_LUMINANCE_ALPHA:
106
case GL_ALPHA:
107
case GL_R8:
108
case GL_RG:
109
case GL_RG8:
110
case GL_RGB8:
111
case GL_RGBA8:
112
case GL_SRGB8:
113
case GL_RGB565:
114
case GL_SRGB8_ALPHA8:
115
case GL_RGB5_A1:
116
case GL_RGBA4:
117
case GL_R8_SNORM:
118
case GL_RG8_SNORM:
119
case GL_RGB8_SNORM:
120
case GL_RGBA8_SNORM:
121
case GL_RGB10_A2:
122
renderType = GL_RGBA8;
123
break;
124
case GL_R8I:
125
case GL_R16I:
126
case GL_R32I:
127
case GL_RG8I:
128
case GL_RG16I:
129
case GL_RG32I:
130
case GL_RGB8I:
131
case GL_RGB16I:
132
case GL_RGB32I:
133
case GL_RGBA8I:
134
case GL_RGBA16I:
135
case GL_RGBA32I:
136
renderType = GL_RGBA8I;
137
break;
138
case GL_R8UI:
139
case GL_R16UI:
140
case GL_R32UI:
141
case GL_RG8UI:
142
case GL_RG16UI:
143
case GL_RG32UI:
144
case GL_RGB8UI:
145
case GL_RGB16UI:
146
case GL_RGB32UI:
147
case GL_RGBA8UI:
148
case GL_RGBA16UI:
149
case GL_RGBA32UI:
150
case GL_RGB10_A2UI:
151
renderType = GL_RGBA8UI;
152
break;
153
case GL_R16F:
154
case GL_RGB16F:
155
case GL_RGB32F:
156
case GL_R32F:
157
case GL_RG16F:
158
case GL_RG32F:
159
case GL_RGBA16F:
160
case GL_RGBA32F:
161
case GL_R11F_G11F_B10F:
162
case GL_RGB9_E5:
163
renderType = GL_RGBA32F;
164
break;
165
default:
166
ASSERT_TRUE(false);
167
}
168
169
glRenderbufferStorage(GL_RENDERBUFFER, renderType, 1, 1);
170
171
GLFramebuffer fbo;
172
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
173
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, rbo);
174
175
glTexParameteri(testTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
176
glTexParameteri(testTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
177
glTexParameteri(testTarget, GL_TEXTURE_BASE_LEVEL, 0);
178
glTexParameteri(testTarget, GL_TEXTURE_MAX_LEVEL, 0);
179
180
drawQuad(mProgram, "position", 0.5f);
181
EXPECT_GL_NO_ERROR();
182
183
if (renderType == GL_RGBA8)
184
{
185
uint32_t tolerance = 1;
186
// The destination formats may be emulated, so the precision may be higher than
187
// required. Increase the tolerance to 2^(8-width). 8 is for the 8-bit format used for
188
// emulation. Even though Vulkan recommends round to nearest, it's not a requirement
189
// so the full-range of precision is used as tolerance.
190
switch (destType)
191
{
192
case GL_UNSIGNED_SHORT_5_6_5:
193
tolerance = 8;
194
break;
195
case GL_UNSIGNED_SHORT_5_5_5_1:
196
tolerance = 8;
197
break;
198
case GL_UNSIGNED_SHORT_4_4_4_4:
199
tolerance = 16;
200
break;
201
default:
202
break;
203
}
204
switch (destInternalFormat)
205
{
206
case GL_RGB565:
207
tolerance = 8;
208
break;
209
case GL_RGB5_A1:
210
tolerance = 8;
211
break;
212
case GL_RGBA4:
213
tolerance = 16;
214
break;
215
default:
216
break;
217
}
218
219
// If destination is SNORM, values in between representable values could round either
220
// way.
221
switch (destInternalFormat)
222
{
223
case GL_R8_SNORM:
224
case GL_RG8_SNORM:
225
case GL_RGB8_SNORM:
226
case GL_RGBA8_SNORM:
227
tolerance *= 2;
228
break;
229
default:
230
break;
231
}
232
233
GLColor actual;
234
glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &actual.R);
235
EXPECT_GL_NO_ERROR();
236
EXPECT_COLOR_NEAR(expectedColor, actual, tolerance);
237
return;
238
}
239
else if (renderType == GL_RGBA32F)
240
{
241
float expectedColorFloat[4] = {static_cast<float>(expectedColor.R) / 255,
242
static_cast<float>(expectedColor.G) / 255,
243
static_cast<float>(expectedColor.B) / 255,
244
static_cast<float>(expectedColor.A) / 255};
245
EXPECT_PIXEL_COLOR32F_NEAR(0, 0,
246
GLColor32F(expectedColorFloat[0], expectedColorFloat[1],
247
expectedColorFloat[2], expectedColorFloat[3]),
248
0.015);
249
return;
250
}
251
else if (renderType == GL_RGBA8UI)
252
{
253
GLuint pixel[4] = {0};
254
glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_UNSIGNED_INT, pixel);
255
EXPECT_COLOR_NEAR(
256
expectedColor,
257
GLColor(static_cast<GLubyte>(pixel[0]), static_cast<GLubyte>(pixel[1]),
258
static_cast<GLubyte>(pixel[2]), static_cast<GLubyte>(pixel[3])),
259
0.2);
260
}
261
else if (renderType == GL_RGBA8I)
262
{
263
GLint pixel[4] = {0};
264
glReadPixels(0, 0, 1, 1, GL_RGBA_INTEGER, GL_INT, pixel);
265
EXPECT_COLOR_NEAR(
266
expectedColor,
267
GLColor(static_cast<GLubyte>(pixel[0]), static_cast<GLubyte>(pixel[1]),
268
static_cast<GLubyte>(pixel[2]), static_cast<GLubyte>(pixel[3])),
269
0.2);
270
}
271
else
272
{
273
ASSERT_TRUE(false);
274
}
275
}
276
277
void testUnsizedFormats(const GLenum testTarget);
278
void testSnormFormats(const GLenum testTarget);
279
void testUnsignedByteFormats(const GLenum testTarget);
280
void testFloatFormats(const GLenum testTarget);
281
void testIntFormats(const GLenum testTarget);
282
void testUintFormats(const GLenum testTarget);
283
284
virtual const char *getFragmentShaderSource() = 0;
285
286
GLuint mProgram = 0;
287
GLTexture sourceTexture;
288
GLTexture destTexture;
289
};
290
291
class Texture3DCopy : public CopyTexture3DTest
292
{
293
protected:
294
Texture3DCopy() {}
295
296
const char *getFragmentShaderSource() override
297
{
298
return "#version 300 es\n"
299
"precision highp float;\n"
300
"uniform highp sampler3D tex3D;\n"
301
"in vec3 texcoord;\n"
302
"out vec4 fragColor;\n"
303
"void main()\n"
304
"{\n"
305
" fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
306
"}\n";
307
}
308
};
309
310
class Texture2DArrayCopy : public CopyTexture3DTest
311
{
312
protected:
313
Texture2DArrayCopy() {}
314
315
const char *getFragmentShaderSource() override
316
{
317
return "#version 300 es\n"
318
"precision highp float;\n"
319
"uniform highp sampler2DArray tex2DArray;\n"
320
"in vec3 texcoord;\n"
321
"out vec4 fragColor;\n"
322
"void main()\n"
323
"{\n"
324
" fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
325
"}\n";
326
}
327
};
328
329
// Test that glCopySubTexture3DANGLE correctly copies to and from a GL_TEXTURE_3D texture.
330
TEST_P(Texture3DCopy, CopySubTexture)
331
{
332
ANGLE_SKIP_TEST_IF(!checkExtensions());
333
334
sourceTexture.get();
335
std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
336
std::vector<GLColor> texDataRed(2u * 2u * 2u, GLColor::red);
337
338
glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
339
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
340
texDataGreen.data());
341
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
342
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
343
EXPECT_GL_NO_ERROR();
344
345
glActiveTexture(GL_TEXTURE0);
346
glBindTexture(GL_TEXTURE_3D, destTexture.get());
347
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
348
texDataRed.data());
349
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
350
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
351
EXPECT_GL_NO_ERROR();
352
glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 0, 0, 0, 0,
353
0, 0, 2, 2, 2, false, false, false);
354
glBindTexture(GL_TEXTURE_3D, destTexture.get());
355
EXPECT_GL_NO_ERROR();
356
drawQuad(mProgram, "position", 0.5f);
357
358
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
359
}
360
361
// Test that glCopyTexture3DANGLE correctly copies from a non-zero mipmap on a GL_TEXTURE_3D
362
// texture.
363
TEST_P(Texture3DCopy, CopyFromMipmap)
364
{
365
ANGLE_SKIP_TEST_IF(!checkExtensions());
366
367
std::vector<GLColor> texDataGreen(4u * 4u * 4u, GLColor::green);
368
369
glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
370
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
371
texDataGreen.data());
372
glTexImage3D(GL_TEXTURE_3D, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
373
texDataGreen.data());
374
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
375
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
376
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 1);
377
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 1);
378
379
EXPECT_GL_NO_ERROR();
380
381
glActiveTexture(GL_TEXTURE0);
382
glBindTexture(GL_TEXTURE_3D, destTexture.get());
383
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
384
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
385
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
386
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
387
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
388
EXPECT_GL_NO_ERROR();
389
390
glCopyTexture3DANGLE(sourceTexture.get(), 1, GL_TEXTURE_3D, destTexture.get(), 0, GL_RGBA,
391
GL_UNSIGNED_BYTE, false, false, false);
392
glBindTexture(GL_TEXTURE_3D, destTexture.get());
393
EXPECT_GL_NO_ERROR();
394
drawQuad(mProgram, "position", 0.5f);
395
396
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
397
}
398
399
// Test that glCopySubTexture3DANGLE's offset and dimension parameters work correctly with a
400
// GL_TEXTURE_3D texture.
401
TEST_P(Texture3DCopy, OffsetSubCopy)
402
{
403
ANGLE_SKIP_TEST_IF(!checkExtensions());
404
405
GLColor rgbaPixels[27];
406
407
// Create pixel data for a 3x3x3 red cube
408
for (int i = 0; i < 27; i++)
409
{
410
rgbaPixels[i] = GLColor(255u, 0u, 0u, 255u);
411
}
412
413
// Change a pixel to create a 1x1x1 blue cube at (0, 0, 0)
414
rgbaPixels[0] = GLColor(0u, 0u, 255u, 255u);
415
416
// Change some pixels to green to create a 2x2x2 cube starting at (1, 1, 1)
417
rgbaPixels[13] = GLColor(0u, 255u, 0u, 255u);
418
rgbaPixels[14] = GLColor(0u, 255u, 0u, 255u);
419
rgbaPixels[16] = GLColor(0u, 255u, 0u, 255u);
420
rgbaPixels[17] = GLColor(0u, 255u, 0u, 255u);
421
rgbaPixels[22] = GLColor(0u, 255u, 0u, 255u);
422
rgbaPixels[23] = GLColor(0u, 255u, 0u, 255u);
423
rgbaPixels[25] = GLColor(0u, 255u, 0u, 255u);
424
rgbaPixels[26] = GLColor(0u, 255u, 0u, 255u);
425
426
glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
427
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 3, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
428
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
429
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
430
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
431
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
432
EXPECT_GL_NO_ERROR();
433
434
glActiveTexture(GL_TEXTURE0);
435
glBindTexture(GL_TEXTURE_3D, destTexture.get());
436
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
437
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
438
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
439
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
440
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
441
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
442
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
443
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
444
445
EXPECT_GL_NO_ERROR();
446
// Copy the 2x2x2 green cube into a new texture
447
glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 0, 0, 0, 1,
448
1, 1, 2, 2, 2, false, false, false);
449
glBindTexture(GL_TEXTURE_3D, destTexture.get());
450
EXPECT_GL_NO_ERROR();
451
drawQuad(mProgram, "position", 1.0f);
452
int width = getWindowWidth() - 1;
453
int height = getWindowHeight() - 1;
454
455
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
456
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
457
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
458
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
459
460
// Copy the 1x1x1 blue cube into the the 2x2x2 green cube at location (1, 1, 1)
461
glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, 1, 1, 1, 0,
462
0, 0, 1, 1, 1, false, false, false);
463
EXPECT_GL_NO_ERROR();
464
drawQuad(mProgram, "position", 1.0f);
465
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
466
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
467
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
468
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::blue);
469
}
470
471
// Test that the flipY parameter works with a GL_TEXTURE_3D texture.
472
TEST_P(Texture3DCopy, FlipY)
473
{
474
ANGLE_SKIP_TEST_IF(!checkExtensions());
475
476
// Create a 2x2x2 cube. The top half is red. The bottom half is green.
477
GLColor rgbaPixels[8] = {GLColor::green, GLColor::green, GLColor::red, GLColor::red,
478
GLColor::green, GLColor::green, GLColor::red, GLColor::red};
479
480
glBindTexture(GL_TEXTURE_3D, sourceTexture.get());
481
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, rgbaPixels);
482
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
483
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
484
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
485
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
486
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
487
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
488
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
489
490
// mProgram creates a quad with the colors from the top (y-direction) layer of the 3D texture.
491
// 3D pixel (<x>, <y>, <z>) is drawn to 2D pixel (<x>, <z>) for <y> = 1.
492
drawQuad(mProgram, "position", 1.0f);
493
494
int width = getWindowWidth() - 1;
495
int height = getWindowHeight() - 1;
496
497
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
498
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::red);
499
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::red);
500
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::red);
501
502
EXPECT_GL_NO_ERROR();
503
504
glActiveTexture(GL_TEXTURE0);
505
glBindTexture(GL_TEXTURE_3D, destTexture.get());
506
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
507
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
508
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
509
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_BASE_LEVEL, 0);
510
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, 0);
511
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
512
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
513
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
514
EXPECT_GL_NO_ERROR();
515
516
// Flip the y coordinate. This will put the greem half on top, and the red half on the bottom.
517
glCopyTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_3D, destTexture.get(), 0, GL_RGBA,
518
GL_UNSIGNED_BYTE, true, false, false);
519
520
glBindTexture(GL_TEXTURE_3D, destTexture.get());
521
EXPECT_GL_NO_ERROR();
522
drawQuad(mProgram, "position", 1.0f);
523
524
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
525
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
526
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
527
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
528
}
529
530
void CopyTexture3DTest::testUnsizedFormats(const GLenum testTarget)
531
{
532
const GLColor kColorNoAlpha(250, 200, 150, 100);
533
const GLColor kColorPreAlpha(250, 200, 150, 100);
534
const GLColor kColorUnAlpha(101, 150, 200, 200);
535
536
testCopy(testTarget, kColorNoAlpha, GL_RGB, GL_UNSIGNED_BYTE, false, false, false,
537
GLColor(250, 200, 150, 255));
538
testCopy(testTarget, kColorPreAlpha, GL_RGB, GL_UNSIGNED_BYTE, false, true, false,
539
GLColor(98, 78, 59, 255));
540
testCopy(testTarget, kColorUnAlpha, GL_RGB, GL_UNSIGNED_BYTE, false, false, true,
541
GLColor(128, 191, 255, 255));
542
543
testCopy(testTarget, kColorNoAlpha, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, false, false,
544
GLColor(247, 199, 148, 255));
545
testCopy(testTarget, kColorPreAlpha, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, true, false,
546
GLColor(99, 77, 57, 255));
547
testCopy(testTarget, kColorUnAlpha, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, false, false, true,
548
GLColor(132, 190, 255, 255));
549
550
testCopy(testTarget, kColorNoAlpha, GL_RGBA, GL_UNSIGNED_BYTE, false, false, false,
551
GLColor(250, 200, 150, 100));
552
testCopy(testTarget, kColorPreAlpha, GL_RGBA, GL_UNSIGNED_BYTE, false, true, false,
553
GLColor(98, 78, 59, 100));
554
testCopy(testTarget, kColorUnAlpha, GL_RGBA, GL_UNSIGNED_BYTE, false, false, true,
555
GLColor(128, 191, 255, 200));
556
557
testCopy(testTarget, kColorNoAlpha, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, false, false,
558
GLColor(255, 204, 153, 102));
559
testCopy(testTarget, kColorPreAlpha, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, true, false,
560
GLColor(102, 85, 51, 102));
561
testCopy(testTarget, kColorUnAlpha, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, false, false, true,
562
GLColor(136, 187, 255, 204));
563
564
testCopy(testTarget, kColorNoAlpha, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false, false, false,
565
GLColor(247, 198, 148, 0));
566
testCopy(testTarget, kColorPreAlpha, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false, true, false,
567
GLColor(99, 82, 57, 0));
568
testCopy(testTarget, kColorUnAlpha, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, false, false, true,
569
GLColor(132, 189, 255, 255));
570
571
testCopy(testTarget, kColorNoAlpha, GL_LUMINANCE, GL_UNSIGNED_BYTE, false, false, false,
572
GLColor(250, 250, 250, 255));
573
testCopy(testTarget, kColorPreAlpha, GL_LUMINANCE, GL_UNSIGNED_BYTE, false, true, false,
574
GLColor(98, 98, 98, 255));
575
testCopy(testTarget, kColorUnAlpha, GL_LUMINANCE, GL_UNSIGNED_BYTE, false, false, true,
576
GLColor(128, 128, 128, 255));
577
578
testCopy(testTarget, kColorNoAlpha, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, false, false, false,
579
GLColor(250, 250, 250, 100));
580
testCopy(testTarget, kColorPreAlpha, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, false, true, false,
581
GLColor(98, 98, 98, 100));
582
testCopy(testTarget, kColorUnAlpha, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, false, false, true,
583
GLColor(128, 128, 128, 200));
584
585
testCopy(testTarget, kColorNoAlpha, GL_ALPHA, GL_UNSIGNED_BYTE, false, false, false,
586
GLColor(0, 0, 0, 100));
587
testCopy(testTarget, kColorNoAlpha, GL_ALPHA, GL_UNSIGNED_BYTE, false, false, false,
588
GLColor(0, 0, 0, 100));
589
testCopy(testTarget, kColorNoAlpha, GL_ALPHA, GL_UNSIGNED_BYTE, false, false, false,
590
GLColor(0, 0, 0, 100));
591
}
592
593
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsized
594
// formats.
595
TEST_P(Texture3DCopy, UnsizedFormats)
596
{
597
ANGLE_SKIP_TEST_IF(!checkExtensions());
598
599
testUnsizedFormats(GL_TEXTURE_3D);
600
}
601
602
void CopyTexture3DTest::testSnormFormats(const GLenum testTarget)
603
{
604
const GLColor kColorNoAlpha(250, 200, 150, 190);
605
const GLColor kColorPreAlpha(250, 200, 150, 190);
606
const GLColor kColorUnAlpha(200, 150, 100, 230);
607
608
testCopy(testTarget, kColorNoAlpha, GL_R8_SNORM, GL_BYTE, false, false, false,
609
GLColor(251, 0, 0, 255));
610
testCopy(testTarget, kColorPreAlpha, GL_R8_SNORM, GL_BYTE, false, true, false,
611
GLColor(187, 0, 0, 255));
612
testCopy(testTarget, kColorUnAlpha, GL_R8_SNORM, GL_BYTE, false, false, true,
613
GLColor(221, 0, 0, 255));
614
615
testCopy(testTarget, kColorNoAlpha, GL_RG8_SNORM, GL_BYTE, false, false, false,
616
GLColor(251, 201, 0, 255));
617
testCopy(testTarget, kColorPreAlpha, GL_RG8_SNORM, GL_BYTE, false, true, false,
618
GLColor(187, 149, 0, 255));
619
testCopy(testTarget, kColorUnAlpha, GL_RG8_SNORM, GL_BYTE, false, false, true,
620
GLColor(221, 167, 0, 255));
621
622
testCopy(testTarget, kColorNoAlpha, GL_RGB8_SNORM, GL_BYTE, false, false, false,
623
GLColor(251, 201, 151, 255));
624
testCopy(testTarget, kColorPreAlpha, GL_RGB8_SNORM, GL_BYTE, false, true, false,
625
GLColor(187, 149, 112, 255));
626
testCopy(testTarget, kColorUnAlpha, GL_RGB8_SNORM, GL_BYTE, false, false, true,
627
GLColor(221, 167, 110, 255));
628
629
testCopy(testTarget, kColorNoAlpha, GL_RGBA8_SNORM, GL_BYTE, false, false, false,
630
GLColor(251, 201, 151, 191));
631
testCopy(testTarget, kColorPreAlpha, GL_RGBA8_SNORM, GL_BYTE, false, true, false,
632
GLColor(187, 149, 112, 191));
633
testCopy(testTarget, kColorUnAlpha, GL_RGBA8_SNORM, GL_BYTE, false, false, true,
634
GLColor(221, 167, 110, 231));
635
636
testCopy(testTarget, GLColor(250, 200, 150, 100), GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV,
637
false, false, false, GLColor(250, 200, 150, 85));
638
testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV,
639
false, true, false, GLColor(196, 157, 118, 170));
640
testCopy(testTarget, GLColor(101, 150, 190, 200), GL_RGB10_A2, GL_UNSIGNED_INT_2_10_10_10_REV,
641
false, false, true, GLColor(128, 191, 242, 170));
642
}
643
644
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with snorm
645
// formats.
646
TEST_P(Texture3DCopy, SnormFormats)
647
{
648
ANGLE_SKIP_TEST_IF(!checkExtensions());
649
650
testSnormFormats(GL_TEXTURE_3D);
651
}
652
653
void CopyTexture3DTest::testUnsignedByteFormats(const GLenum testTarget)
654
{
655
{
656
const GLColor kColorNoAlpha(250, 200, 150, 100);
657
const GLColor kColorPreAlpha(250, 200, 150, 100);
658
const GLColor kColorUnAlpha(200, 150, 100, 230);
659
660
testCopy(testTarget, kColorNoAlpha, GL_R8, GL_UNSIGNED_BYTE, false, false, false,
661
GLColor(250, 0, 0, 255));
662
testCopy(testTarget, kColorPreAlpha, GL_R8, GL_UNSIGNED_BYTE, false, true, false,
663
GLColor(98, 0, 0, 255));
664
testCopy(testTarget, kColorUnAlpha, GL_R8, GL_UNSIGNED_BYTE, false, false, true,
665
GLColor(221, 0, 0, 255));
666
667
testCopy(testTarget, kColorNoAlpha, GL_RG8, GL_UNSIGNED_BYTE, false, false, false,
668
GLColor(250, 200, 0, 255));
669
testCopy(testTarget, kColorPreAlpha, GL_RG8, GL_UNSIGNED_BYTE, false, true, false,
670
GLColor(98, 78, 0, 255));
671
testCopy(testTarget, kColorUnAlpha, GL_RG8, GL_UNSIGNED_BYTE, false, false, true,
672
GLColor(221, 167, 0, 255));
673
674
testCopy(testTarget, kColorNoAlpha, GL_RGB8, GL_UNSIGNED_BYTE, false, false, false,
675
GLColor(250, 200, 150, 255));
676
testCopy(testTarget, kColorPreAlpha, GL_RGB8, GL_UNSIGNED_BYTE, false, true, false,
677
GLColor(98, 78, 59, 255));
678
testCopy(testTarget, kColorUnAlpha, GL_RGB8, GL_UNSIGNED_BYTE, false, false, true,
679
GLColor(221, 167, 110, 255));
680
681
testCopy(testTarget, kColorNoAlpha, GL_RGBA8, GL_UNSIGNED_BYTE, false, false, false,
682
GLColor(250, 200, 150, 100));
683
testCopy(testTarget, kColorPreAlpha, GL_RGBA8, GL_UNSIGNED_BYTE, false, true, false,
684
GLColor(98, 78, 59, 100));
685
testCopy(testTarget, kColorUnAlpha, GL_RGBA8, GL_UNSIGNED_BYTE, false, false, true,
686
GLColor(221, 167, 110, 230));
687
688
testCopy(testTarget, kColorNoAlpha, GL_RGBA4, GL_UNSIGNED_BYTE, false, false, false,
689
GLColor(255, 204, 153, 102));
690
testCopy(testTarget, kColorPreAlpha, GL_RGBA4, GL_UNSIGNED_BYTE, false, true, false,
691
GLColor(102, 85, 51, 102));
692
testCopy(testTarget, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_BYTE, false, false,
693
true, GLColor(119, 187, 238, 204));
694
695
testCopy(testTarget, kColorNoAlpha, GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false, false,
696
false, GLColor(255, 204, 153, 102));
697
testCopy(testTarget, kColorPreAlpha, GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4, false, true,
698
false, GLColor(102, 85, 51, 102));
699
testCopy(testTarget, GLColor(100, 150, 200, 210), GL_RGBA4, GL_UNSIGNED_SHORT_4_4_4_4,
700
false, false, true, GLColor(119, 187, 238, 204));
701
702
testCopy(testTarget, kColorNoAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, false, false,
703
GLColor(244, 148, 78, 255));
704
testCopy(testTarget, kColorPreAlpha, GL_SRGB8, GL_UNSIGNED_BYTE, false, true, false,
705
GLColor(31, 19, 11, 255));
706
testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8, GL_UNSIGNED_BYTE, false, false,
707
true, GLColor(49, 120, 228, 255));
708
709
testCopy(testTarget, kColorNoAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, false, false,
710
GLColor(244, 148, 78, 100));
711
testCopy(testTarget, kColorPreAlpha, GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false, true, false,
712
GLColor(31, 19, 11, 100));
713
testCopy(testTarget, GLColor(100, 150, 200, 210), GL_SRGB8_ALPHA8, GL_UNSIGNED_BYTE, false,
714
false, true, GLColor(49, 120, 228, 210));
715
716
testCopy(testTarget, GLColor(250, 200, 150, 200), GL_RGB5_A1, GL_UNSIGNED_BYTE, false,
717
false, false, GLColor(247, 198, 148, 255));
718
testCopy(testTarget, kColorPreAlpha, GL_RGB5_A1, GL_UNSIGNED_BYTE, false, true, false,
719
GLColor(99, 82, 57, 0));
720
testCopy(testTarget, kColorUnAlpha, GL_RGB5_A1, GL_UNSIGNED_BYTE, false, false, true,
721
GLColor(221, 167, 110, 255));
722
}
723
724
{
725
const GLColor kColorNoAlpha(250, 200, 150, 200);
726
const GLColor kColorPreAlpha(250, 200, 150, 200);
727
const GLColor kColorUnAlpha(101, 150, 190, 200);
728
729
testCopy(testTarget, kColorNoAlpha, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, false,
730
false, false, GLColor(247, 198, 148, 255));
731
testCopy(testTarget, kColorPreAlpha, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, false,
732
true, false, GLColor(198, 156, 115, 255));
733
testCopy(testTarget, kColorUnAlpha, GL_RGB5_A1, GL_UNSIGNED_INT_2_10_10_10_REV, false,
734
false, true, GLColor(132, 189, 242, 255));
735
736
testCopy(testTarget, kColorNoAlpha, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, false, false,
737
false, GLColor(247, 198, 148, 255));
738
testCopy(testTarget, kColorPreAlpha, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, false, true,
739
false, GLColor(198, 156, 115, 255));
740
testCopy(testTarget, kColorUnAlpha, GL_RGB5_A1, GL_UNSIGNED_SHORT_5_5_5_1, false, false,
741
true, GLColor(132, 189, 242, 255));
742
743
testCopy(testTarget, kColorNoAlpha, GL_RGB565, GL_UNSIGNED_BYTE, false, false, false,
744
GLColor(247, 199, 148, 255));
745
testCopy(testTarget, kColorPreAlpha, GL_RGB565, GL_UNSIGNED_BYTE, false, true, false,
746
GLColor(198, 158, 115, 255));
747
testCopy(testTarget, kColorUnAlpha, GL_RGB565, GL_UNSIGNED_BYTE, false, false, true,
748
GLColor(132, 190, 242, 255));
749
750
testCopy(testTarget, kColorNoAlpha, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false, false, false,
751
GLColor(247, 199, 148, 255));
752
testCopy(testTarget, kColorPreAlpha, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false, true, false,
753
GLColor(198, 158, 115, 255));
754
testCopy(testTarget, kColorUnAlpha, GL_RGB565, GL_UNSIGNED_SHORT_5_6_5, false, false, true,
755
GLColor(132, 190, 242, 255));
756
}
757
}
758
759
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsigned
760
// byte formats.
761
TEST_P(Texture3DCopy, UnsignedByteFormats)
762
{
763
ANGLE_SKIP_TEST_IF(!checkExtensions());
764
765
testUnsignedByteFormats(GL_TEXTURE_3D);
766
}
767
768
void CopyTexture3DTest::testFloatFormats(const GLenum testTarget)
769
{
770
std::vector<GLenum> floatTypes = {GL_FLOAT, GL_HALF_FLOAT, GL_UNSIGNED_INT_10F_11F_11F_REV,
771
GL_UNSIGNED_INT_5_9_9_9_REV};
772
773
const GLColor kColor(210, 200, 150, 235);
774
775
for (GLenum floatType : floatTypes)
776
{
777
if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV &&
778
floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
779
{
780
testCopy(testTarget, kColor, GL_R16F, floatType, false, false, false,
781
GLColor(210, 0, 0, 255));
782
testCopy(testTarget, kColor, GL_R16F, floatType, false, true, false,
783
GLColor(191, 0, 0, 255));
784
testCopy(testTarget, kColor, GL_R16F, floatType, false, false, true,
785
GLColor(227, 0, 0, 255));
786
787
testCopy(testTarget, kColor, GL_RG16F, floatType, false, false, false,
788
GLColor(210, 200, 0, 255));
789
testCopy(testTarget, kColor, GL_RG16F, floatType, false, true, false,
790
GLColor(191, 184, 0, 255));
791
testCopy(testTarget, kColor, GL_RG16F, floatType, false, false, true,
792
GLColor(227, 217, 0, 255));
793
794
testCopy(testTarget, kColor, GL_RGB16F, floatType, false, false, false,
795
GLColor(210, 200, 150, 255));
796
testCopy(testTarget, kColor, GL_RGB16F, floatType, false, true, false,
797
GLColor(191, 184, 138, 255));
798
testCopy(testTarget, kColor, GL_RGB16F, floatType, false, false, true,
799
GLColor(227, 217, 161, 255));
800
801
testCopy(testTarget, kColor, GL_RGBA16F, floatType, false, false, false,
802
GLColor(210, 200, 150, 235));
803
testCopy(testTarget, kColor, GL_RGBA16F, floatType, false, true, false,
804
GLColor(191, 184, 138, 235));
805
testCopy(testTarget, kColor, GL_RGBA16F, floatType, false, false, true,
806
GLColor(227, 217, 161, 235));
807
}
808
809
if (floatType != GL_UNSIGNED_INT_5_9_9_9_REV)
810
{
811
testCopy(testTarget, kColor, GL_R11F_G11F_B10F, floatType, false, false, false,
812
GLColor(210, 200, 148, 255));
813
testCopy(testTarget, kColor, GL_R11F_G11F_B10F, floatType, false, true, false,
814
GLColor(191, 184, 138, 255));
815
testCopy(testTarget, kColor, GL_R11F_G11F_B10F, floatType, false, false, true,
816
GLColor(227, 217, 161, 255));
817
}
818
819
if (floatType != GL_UNSIGNED_INT_10F_11F_11F_REV)
820
{
821
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, false,
822
GLColor(210, 200, 148, 255));
823
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, true, false,
824
GLColor(192, 184, 138, 255));
825
testCopy(testTarget, kColor, GL_RGB9_E5, floatType, false, false, true,
826
GLColor(227, 217, 161, 255));
827
}
828
}
829
830
testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, false, false, GLColor(210, 0, 0, 255));
831
testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, true, false, GLColor(191, 0, 0, 255));
832
testCopy(testTarget, kColor, GL_R32F, GL_FLOAT, false, false, true, GLColor(227, 0, 0, 255));
833
834
testCopy(testTarget, kColor, GL_RG32F, GL_FLOAT, false, false, false,
835
GLColor(210, 200, 0, 255));
836
testCopy(testTarget, kColor, GL_RG32F, GL_FLOAT, false, true, false, GLColor(191, 184, 0, 255));
837
testCopy(testTarget, kColor, GL_RG32F, GL_FLOAT, false, false, true, GLColor(227, 217, 0, 255));
838
839
testCopy(testTarget, kColor, GL_RGB32F, GL_FLOAT, false, false, false,
840
GLColor(210, 200, 150, 255));
841
testCopy(testTarget, kColor, GL_RGB32F, GL_FLOAT, false, true, false,
842
GLColor(191, 184, 138, 255));
843
testCopy(testTarget, kColor, GL_RGB32F, GL_FLOAT, false, false, true,
844
GLColor(227, 217, 161, 255));
845
846
testCopy(testTarget, kColor, GL_RGBA32F, GL_FLOAT, false, false, false,
847
GLColor(210, 200, 150, 235));
848
testCopy(testTarget, kColor, GL_RGBA32F, GL_FLOAT, false, true, false,
849
GLColor(191, 184, 138, 235));
850
testCopy(testTarget, kColor, GL_RGBA32F, GL_FLOAT, false, false, true,
851
GLColor(227, 217, 161, 235));
852
}
853
854
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with float
855
// formats.
856
TEST_P(Texture3DCopy, FloatFormats)
857
{
858
ANGLE_SKIP_TEST_IF(!checkExtensions());
859
860
// http://anglebug.com/4756
861
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
862
863
testFloatFormats(GL_TEXTURE_3D);
864
}
865
866
void CopyTexture3DTest::testIntFormats(const GLenum testTarget)
867
{
868
const GLColor kColor(255, 140, 150, 230);
869
870
// Pixels will be read as if the most significant bit is data, not the sign. The expected colors
871
// reflect this.
872
testCopy(testTarget, kColor, GL_R8I, GL_BYTE, false, false, false, GLColor(127, 0, 0, 1));
873
testCopy(testTarget, kColor, GL_R8I, GL_BYTE, false, true, false, GLColor(115, 0, 0, 1));
874
testCopy(testTarget, kColor, GL_R8I, GL_BYTE, false, false, true, GLColor(127, 0, 0, 1));
875
876
testCopy(testTarget, kColor, GL_R16I, GL_SHORT, false, false, false, GLColor(127, 0, 0, 1));
877
testCopy(testTarget, kColor, GL_R16I, GL_SHORT, false, true, false, GLColor(115, 0, 0, 1));
878
testCopy(testTarget, kColor, GL_R16I, GL_SHORT, false, false, true, GLColor(127, 0, 0, 1));
879
880
testCopy(testTarget, kColor, GL_R32I, GL_INT, false, false, false, GLColor(127, 0, 0, 1));
881
testCopy(testTarget, kColor, GL_R32I, GL_INT, false, true, false, GLColor(115, 0, 0, 1));
882
testCopy(testTarget, kColor, GL_R32I, GL_INT, false, false, true, GLColor(127, 0, 0, 1));
883
884
testCopy(testTarget, kColor, GL_RG8I, GL_BYTE, false, false, false, GLColor(127, 70, 0, 1));
885
testCopy(testTarget, kColor, GL_RG8I, GL_BYTE, false, true, false, GLColor(115, 63, 0, 1));
886
testCopy(testTarget, kColor, GL_RG8I, GL_BYTE, false, false, true, GLColor(127, 77, 0, 1));
887
888
testCopy(testTarget, kColor, GL_RG16I, GL_SHORT, false, false, false, GLColor(127, 70, 0, 1));
889
testCopy(testTarget, kColor, GL_RG16I, GL_SHORT, false, true, false, GLColor(115, 63, 0, 1));
890
testCopy(testTarget, kColor, GL_RG16I, GL_SHORT, false, false, true, GLColor(127, 77, 0, 1));
891
892
testCopy(testTarget, kColor, GL_RG32I, GL_INT, false, false, false, GLColor(127, 70, 0, 1));
893
testCopy(testTarget, kColor, GL_RG32I, GL_INT, false, true, false, GLColor(115, 63, 0, 1));
894
testCopy(testTarget, kColor, GL_RG32I, GL_INT, false, false, true, GLColor(127, 77, 0, 1));
895
896
testCopy(testTarget, kColor, GL_RGB8I, GL_BYTE, false, false, false, GLColor(127, 70, 75, 1));
897
testCopy(testTarget, kColor, GL_RGB8I, GL_BYTE, false, true, false, GLColor(115, 63, 67, 1));
898
testCopy(testTarget, kColor, GL_RGB8I, GL_BYTE, false, false, true, GLColor(127, 77, 83, 1));
899
900
testCopy(testTarget, kColor, GL_RGB16I, GL_SHORT, false, false, false, GLColor(127, 70, 75, 1));
901
testCopy(testTarget, kColor, GL_RGB16I, GL_SHORT, false, true, false, GLColor(115, 63, 67, 1));
902
testCopy(testTarget, kColor, GL_RGB16I, GL_SHORT, false, false, true, GLColor(127, 77, 83, 1));
903
904
testCopy(testTarget, kColor, GL_RGB32I, GL_INT, false, false, false, GLColor(127, 70, 75, 1));
905
testCopy(testTarget, kColor, GL_RGB32I, GL_INT, false, true, false, GLColor(115, 63, 67, 1));
906
testCopy(testTarget, kColor, GL_RGB32I, GL_INT, false, false, true, GLColor(127, 77, 83, 1));
907
908
testCopy(testTarget, kColor, GL_RGBA8I, GL_BYTE, false, false, false,
909
GLColor(127, 70, 75, 115));
910
testCopy(testTarget, kColor, GL_RGBA8I, GL_BYTE, false, true, false, GLColor(115, 63, 67, 115));
911
testCopy(testTarget, kColor, GL_RGBA8I, GL_BYTE, false, false, true, GLColor(127, 77, 83, 115));
912
913
testCopy(testTarget, kColor, GL_RGBA16I, GL_SHORT, false, false, false,
914
GLColor(127, 70, 75, 115));
915
testCopy(testTarget, kColor, GL_RGBA16I, GL_SHORT, false, true, false,
916
GLColor(115, 63, 67, 115));
917
testCopy(testTarget, kColor, GL_RGBA16I, GL_SHORT, false, false, true,
918
GLColor(127, 77, 83, 115));
919
920
testCopy(testTarget, kColor, GL_RGBA32I, GL_INT, false, false, false,
921
GLColor(127, 70, 75, 115));
922
testCopy(testTarget, kColor, GL_RGBA32I, GL_INT, false, true, false, GLColor(115, 63, 67, 115));
923
testCopy(testTarget, kColor, GL_RGBA32I, GL_INT, false, false, true, GLColor(127, 77, 83, 115));
924
}
925
926
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with integer
927
// formats.
928
TEST_P(Texture3DCopy, IntFormats)
929
{
930
ANGLE_SKIP_TEST_IF(!checkExtensions());
931
932
// Vulkan multiplies source by 255 unconditionally, which is wrong for signed integer formats.
933
// http://anglebug.com/4741
934
ANGLE_SKIP_TEST_IF(IsVulkan());
935
936
constexpr char kFS[] =
937
"#version 300 es\n"
938
"precision highp float;\n"
939
"uniform highp isampler3D tex3D;\n"
940
"in vec3 texcoord;\n"
941
"out ivec4 fragColor;\n"
942
"void main()\n"
943
"{\n"
944
" fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
945
"}\n";
946
947
mProgram = CompileProgram(getVertexShaderSource(), kFS);
948
ASSERT_NE(0u, mProgram);
949
ASSERT_GL_NO_ERROR();
950
951
glUseProgram(mProgram);
952
953
testIntFormats(GL_TEXTURE_3D);
954
}
955
956
void CopyTexture3DTest::testUintFormats(const GLenum testTarget)
957
{
958
const GLColor kColor(128, 84, 32, 100);
959
960
testCopy(testTarget, kColor, GL_R8UI, GL_UNSIGNED_BYTE, false, false, false,
961
GLColor(128, 0, 0, 1));
962
testCopy(testTarget, kColor, GL_R8UI, GL_UNSIGNED_BYTE, false, true, false,
963
GLColor(50, 0, 0, 1));
964
testCopy(testTarget, kColor, GL_R8UI, GL_UNSIGNED_BYTE, false, false, true,
965
GLColor(255, 0, 0, 1));
966
967
testCopy(testTarget, kColor, GL_R16UI, GL_UNSIGNED_SHORT, false, false, false,
968
GLColor(128, 0, 0, 1));
969
testCopy(testTarget, kColor, GL_R16UI, GL_UNSIGNED_SHORT, false, true, false,
970
GLColor(50, 0, 0, 1));
971
testCopy(testTarget, kColor, GL_R16UI, GL_UNSIGNED_SHORT, false, false, true,
972
GLColor(255, 0, 0, 1));
973
974
testCopy(testTarget, kColor, GL_R32UI, GL_UNSIGNED_INT, false, false, false,
975
GLColor(128, 0, 0, 1));
976
testCopy(testTarget, kColor, GL_R32UI, GL_UNSIGNED_INT, false, true, false,
977
GLColor(50, 0, 0, 1));
978
testCopy(testTarget, kColor, GL_R32UI, GL_UNSIGNED_INT, false, false, true,
979
GLColor(255, 0, 0, 1));
980
981
testCopy(testTarget, kColor, GL_RG8UI, GL_UNSIGNED_BYTE, false, false, false,
982
GLColor(128, 84, 0, 1));
983
testCopy(testTarget, kColor, GL_RG8UI, GL_UNSIGNED_BYTE, false, true, false,
984
GLColor(50, 32, 0, 1));
985
testCopy(testTarget, kColor, GL_RG8UI, GL_UNSIGNED_BYTE, false, false, true,
986
GLColor(255, 214, 0, 1));
987
988
testCopy(testTarget, kColor, GL_RG16UI, GL_UNSIGNED_SHORT, false, false, false,
989
GLColor(128, 84, 0, 1));
990
testCopy(testTarget, kColor, GL_RG16UI, GL_UNSIGNED_SHORT, false, true, false,
991
GLColor(50, 32, 0, 1));
992
testCopy(testTarget, kColor, GL_RG16UI, GL_UNSIGNED_SHORT, false, false, true,
993
GLColor(255, 214, 0, 1));
994
995
testCopy(testTarget, kColor, GL_RG32UI, GL_UNSIGNED_INT, false, false, false,
996
GLColor(128, 84, 0, 1));
997
testCopy(testTarget, kColor, GL_RG32UI, GL_UNSIGNED_INT, false, true, false,
998
GLColor(50, 32, 0, 1));
999
testCopy(testTarget, kColor, GL_RG32UI, GL_UNSIGNED_INT, false, false, true,
1000
GLColor(255, 214, 0, 1));
1001
1002
testCopy(testTarget, kColor, GL_RGB8UI, GL_UNSIGNED_BYTE, false, false, false,
1003
GLColor(128, 84, 32, 1));
1004
testCopy(testTarget, kColor, GL_RGB8UI, GL_UNSIGNED_BYTE, false, true, false,
1005
GLColor(50, 32, 12, 1));
1006
testCopy(testTarget, kColor, GL_RGB8UI, GL_UNSIGNED_BYTE, false, false, true,
1007
GLColor(255, 214, 81, 1));
1008
1009
testCopy(testTarget, kColor, GL_RGB16UI, GL_UNSIGNED_SHORT, false, false, false,
1010
GLColor(128, 84, 32, 1));
1011
testCopy(testTarget, kColor, GL_RGB16UI, GL_UNSIGNED_SHORT, false, true, false,
1012
GLColor(50, 32, 12, 1));
1013
testCopy(testTarget, kColor, GL_RGB16UI, GL_UNSIGNED_SHORT, false, false, true,
1014
GLColor(255, 214, 81, 1));
1015
1016
testCopy(testTarget, kColor, GL_RGB32UI, GL_UNSIGNED_INT, false, false, false,
1017
GLColor(128, 84, 32, 1));
1018
testCopy(testTarget, kColor, GL_RGB32UI, GL_UNSIGNED_INT, false, true, false,
1019
GLColor(50, 32, 12, 1));
1020
testCopy(testTarget, kColor, GL_RGB32UI, GL_UNSIGNED_INT, false, false, true,
1021
GLColor(255, 214, 81, 1));
1022
1023
testCopy(testTarget, kColor, GL_RGBA8UI, GL_UNSIGNED_BYTE, false, false, false,
1024
GLColor(128, 84, 32, 100));
1025
testCopy(testTarget, kColor, GL_RGBA8UI, GL_UNSIGNED_BYTE, false, true, false,
1026
GLColor(50, 32, 12, 100));
1027
testCopy(testTarget, kColor, GL_RGBA8UI, GL_UNSIGNED_BYTE, false, false, true,
1028
GLColor(255, 214, 81, 100));
1029
1030
testCopy(testTarget, kColor, GL_RGBA16UI, GL_UNSIGNED_SHORT, false, false, false,
1031
GLColor(128, 84, 32, 100));
1032
testCopy(testTarget, kColor, GL_RGBA16UI, GL_UNSIGNED_SHORT, false, true, false,
1033
GLColor(50, 32, 12, 100));
1034
testCopy(testTarget, kColor, GL_RGBA16UI, GL_UNSIGNED_SHORT, false, false, true,
1035
GLColor(255, 214, 81, 100));
1036
1037
testCopy(testTarget, kColor, GL_RGBA32UI, GL_UNSIGNED_INT, false, false, false,
1038
GLColor(128, 84, 32, 100));
1039
testCopy(testTarget, kColor, GL_RGBA32UI, GL_UNSIGNED_INT, false, true, false,
1040
GLColor(50, 32, 12, 100));
1041
testCopy(testTarget, kColor, GL_RGBA32UI, GL_UNSIGNED_INT, false, false, true,
1042
GLColor(255, 214, 81, 100));
1043
1044
testCopy(testTarget, kColor, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, false, false, false,
1045
GLColor(128, 84, 32, 3));
1046
testCopy(testTarget, kColor, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, false, true, false,
1047
GLColor(50, 32, 12, 3));
1048
testCopy(testTarget, kColor, GL_RGB10_A2UI, GL_UNSIGNED_INT_2_10_10_10_REV, false, false, true,
1049
GLColor(255, 214, 81, 3));
1050
}
1051
1052
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_3D with unsigned
1053
// integer formats.
1054
TEST_P(Texture3DCopy, UintFormats)
1055
{
1056
ANGLE_SKIP_TEST_IF(!checkExtensions());
1057
1058
// Vulkan multiplies source by 255 unconditionally, which is wrong for non-8-bit integer
1059
// formats. http://anglebug.com/4741
1060
ANGLE_SKIP_TEST_IF(IsVulkan());
1061
1062
constexpr char kFS[] =
1063
"#version 300 es\n"
1064
"precision highp float;\n"
1065
"uniform highp usampler3D tex3D;\n"
1066
"in vec3 texcoord;\n"
1067
"out uvec4 fragColor;\n"
1068
"void main()\n"
1069
"{\n"
1070
" fragColor = texture(tex3D, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
1071
"}\n";
1072
1073
mProgram = CompileProgram(getVertexShaderSource(), kFS);
1074
ASSERT_NE(0u, mProgram);
1075
ASSERT_GL_NO_ERROR();
1076
1077
glUseProgram(mProgram);
1078
1079
testUintFormats(GL_TEXTURE_3D);
1080
}
1081
1082
// Test that glCopySubTexture3DANGLE correctly copies to and from a GL_TEXTURE_2D_ARRAY texture.
1083
TEST_P(Texture2DArrayCopy, CopySubTexture)
1084
{
1085
ANGLE_SKIP_TEST_IF(!checkExtensions());
1086
1087
std::vector<GLColor> texDataGreen(2u * 2u * 2u, GLColor::green);
1088
std::vector<GLColor> texDataRed(2u * 2u * 2u, GLColor::red);
1089
1090
glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1091
EXPECT_GL_NO_ERROR();
1092
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1093
texDataGreen.data());
1094
EXPECT_GL_NO_ERROR();
1095
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1096
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
1097
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1098
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1099
EXPECT_GL_NO_ERROR();
1100
1101
glActiveTexture(GL_TEXTURE0);
1102
glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1103
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1104
texDataRed.data());
1105
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
1106
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
1107
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1108
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1109
EXPECT_GL_NO_ERROR();
1110
glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 0, 0,
1111
0, 0, 0, 0, 2, 2, 2, false, false, false);
1112
EXPECT_GL_NO_ERROR();
1113
drawQuad(mProgram, "position", 0.5f);
1114
1115
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1116
}
1117
1118
// Test that glCopyTexture3DANGLE correctly copies from a non-zero mipmap on a GL_TEXTURE_2D_ARRAY
1119
// texture.
1120
TEST_P(Texture2DArrayCopy, CopyFromMipmap)
1121
{
1122
ANGLE_SKIP_TEST_IF(!checkExtensions());
1123
1124
std::vector<GLColor> texDataGreen4(4u * 4u * 4u, GLColor::green);
1125
std::vector<GLColor> texDataGreen2(2u * 2u * 2u, GLColor::green);
1126
std::vector<GLColor> texDataRed2(2u * 2u * 2u, GLColor::red);
1127
1128
glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1129
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 4, 4, 4, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1130
texDataGreen4.data());
1131
glTexImage3D(GL_TEXTURE_2D_ARRAY, 1, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1132
texDataGreen2.data());
1133
EXPECT_GL_NO_ERROR();
1134
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1135
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1136
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 1);
1137
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 1);
1138
EXPECT_GL_NO_ERROR();
1139
1140
glActiveTexture(GL_TEXTURE0);
1141
glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1142
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1143
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1144
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1145
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1146
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1147
1148
EXPECT_GL_NO_ERROR();
1149
glCopyTexture3DANGLE(sourceTexture.get(), 1, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, GL_RGBA,
1150
GL_UNSIGNED_BYTE, false, false, false);
1151
1152
EXPECT_GL_NO_ERROR();
1153
drawQuad(mProgram, "position", 1.0f);
1154
1155
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1156
}
1157
1158
// Test that glCopySubTexture3DANGLE's offset and dimension parameters work correctly with a
1159
// GL_TEXTURE_2D_ARRAY texture.
1160
TEST_P(Texture2DArrayCopy, OffsetSubCopy)
1161
{
1162
ANGLE_SKIP_TEST_IF(!checkExtensions());
1163
1164
GLColor rgbaPixels[27];
1165
1166
// Create pixel data for a 3x3x3 red cube
1167
for (int i = 0; i < 27; i++)
1168
{
1169
rgbaPixels[i] = GLColor(255u, 0u, 0u, 255u);
1170
}
1171
1172
// Change a pixel to create a 1x1x1 blue cube at (0, 0, 0)
1173
rgbaPixels[0] = GLColor(0u, 0u, 255u, 255u);
1174
1175
// Change some pixels to green to create a 2x2x2 cube starting at (1, 1, 1)
1176
rgbaPixels[13] = GLColor(0u, 255u, 0u, 255u);
1177
rgbaPixels[14] = GLColor(0u, 255u, 0u, 255u);
1178
rgbaPixels[16] = GLColor(0u, 255u, 0u, 255u);
1179
rgbaPixels[17] = GLColor(0u, 255u, 0u, 255u);
1180
rgbaPixels[22] = GLColor(0u, 255u, 0u, 255u);
1181
rgbaPixels[23] = GLColor(0u, 255u, 0u, 255u);
1182
rgbaPixels[25] = GLColor(0u, 255u, 0u, 255u);
1183
rgbaPixels[26] = GLColor(0u, 255u, 0u, 255u);
1184
1185
glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1186
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 3, 3, 3, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1187
rgbaPixels);
1188
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1189
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1190
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1191
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1192
EXPECT_GL_NO_ERROR();
1193
1194
glActiveTexture(GL_TEXTURE0);
1195
glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1196
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1197
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1198
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1199
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1200
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1201
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1202
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1203
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1204
1205
EXPECT_GL_NO_ERROR();
1206
// Copy the 2x2x2 green cube into a new texture
1207
glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 0, 0,
1208
0, 1, 1, 1, 2, 2, 2, false, false, false);
1209
glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1210
EXPECT_GL_NO_ERROR();
1211
drawQuad(mProgram, "position", 1.0f);
1212
int width = getWindowWidth() - 1;
1213
int height = getWindowHeight() - 1;
1214
1215
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1216
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
1217
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
1218
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
1219
1220
// Copy the 1x1x1 blue cube into the the 2x2x2 green cube at location (1, 1, 1)
1221
glCopySubTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, 1, 1,
1222
1, 0, 0, 0, 1, 1, 1, false, false, false);
1223
EXPECT_GL_NO_ERROR();
1224
drawQuad(mProgram, "position", 1.0f);
1225
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1226
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
1227
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
1228
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::blue);
1229
}
1230
1231
// Test that the flipY parameter works with a GL_TEXTURE_2D_ARRAY texture.
1232
TEST_P(Texture2DArrayCopy, FlipY)
1233
{
1234
ANGLE_SKIP_TEST_IF(!checkExtensions());
1235
1236
// Create a 2x2x2 cube. The top half is red. The bottom half is green.
1237
GLColor rgbaPixels[8] = {GLColor::green, GLColor::green, GLColor::red, GLColor::red,
1238
GLColor::green, GLColor::green, GLColor::red, GLColor::red};
1239
1240
glBindTexture(GL_TEXTURE_2D_ARRAY, sourceTexture.get());
1241
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 2, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE,
1242
rgbaPixels);
1243
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1244
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1245
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1246
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1247
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1248
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1249
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1250
1251
drawQuad(mProgram, "position", 1.0f);
1252
1253
int width = getWindowWidth() - 1;
1254
int height = getWindowHeight() - 1;
1255
1256
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
1257
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::red);
1258
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::red);
1259
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::red);
1260
1261
EXPECT_GL_NO_ERROR();
1262
1263
glActiveTexture(GL_TEXTURE0);
1264
glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1265
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_RGBA, 1, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr);
1266
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
1267
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
1268
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_BASE_LEVEL, 0);
1269
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAX_LEVEL, 0);
1270
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
1271
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
1272
glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
1273
EXPECT_GL_NO_ERROR();
1274
1275
// Flip the y coordinate. This will put the greem half on top, and the red half on the bottom.
1276
glCopyTexture3DANGLE(sourceTexture.get(), 0, GL_TEXTURE_2D_ARRAY, destTexture.get(), 0, GL_RGBA,
1277
GL_UNSIGNED_BYTE, true, false, false);
1278
1279
glBindTexture(GL_TEXTURE_2D_ARRAY, destTexture.get());
1280
EXPECT_GL_NO_ERROR();
1281
drawQuad(mProgram, "position", 1.0f);
1282
1283
EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
1284
EXPECT_PIXEL_COLOR_EQ(0, height, GLColor::green);
1285
EXPECT_PIXEL_COLOR_EQ(width, 0, GLColor::green);
1286
EXPECT_PIXEL_COLOR_EQ(width, height, GLColor::green);
1287
}
1288
1289
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1290
// unsized formats.
1291
TEST_P(Texture2DArrayCopy, UnsizedFormats)
1292
{
1293
ANGLE_SKIP_TEST_IF(!checkExtensions());
1294
1295
testUnsizedFormats(GL_TEXTURE_2D_ARRAY);
1296
}
1297
1298
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1299
// snorm formats.
1300
TEST_P(Texture2DArrayCopy, SnormFormats)
1301
{
1302
ANGLE_SKIP_TEST_IF(!checkExtensions());
1303
1304
testSnormFormats(GL_TEXTURE_2D_ARRAY);
1305
}
1306
1307
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1308
// unsigned byte formats.
1309
TEST_P(Texture2DArrayCopy, UnsignedByteFormats)
1310
{
1311
ANGLE_SKIP_TEST_IF(!checkExtensions());
1312
1313
// Flay on Windows D3D11. http://anglebug.com/2896
1314
ANGLE_SKIP_TEST_IF(IsWindows() && IsD3D11());
1315
1316
testUnsignedByteFormats(GL_TEXTURE_2D_ARRAY);
1317
}
1318
1319
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1320
// float formats.
1321
TEST_P(Texture2DArrayCopy, FloatFormats)
1322
{
1323
ANGLE_SKIP_TEST_IF(!checkExtensions());
1324
1325
// http://anglebug.com/4756
1326
ANGLE_SKIP_TEST_IF(IsVulkan() && IsAndroid());
1327
1328
testFloatFormats(GL_TEXTURE_2D_ARRAY);
1329
}
1330
1331
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1332
// integer formats.
1333
TEST_P(Texture2DArrayCopy, IntFormats)
1334
{
1335
ANGLE_SKIP_TEST_IF(!checkExtensions());
1336
1337
// Vulkan multiplies source by 255 unconditionally, which is wrong for signed integer formats.
1338
// http://anglebug.com/4741
1339
ANGLE_SKIP_TEST_IF(IsVulkan());
1340
1341
constexpr char kFS[] =
1342
"#version 300 es\n"
1343
"precision highp float;\n"
1344
"uniform highp isampler2DArray tex2DArray;\n"
1345
"in vec3 texcoord;\n"
1346
"out ivec4 fragColor;\n"
1347
"void main()\n"
1348
"{\n"
1349
" fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
1350
"}\n";
1351
1352
mProgram = CompileProgram(getVertexShaderSource(), kFS);
1353
ASSERT_NE(0u, mProgram);
1354
ASSERT_GL_NO_ERROR();
1355
1356
glUseProgram(mProgram);
1357
1358
testIntFormats(GL_TEXTURE_2D_ARRAY);
1359
}
1360
1361
// Test passthrough, premultiply alpha, and unmultiply alpha copies for GL_TEXTURE_2D_ARRAY with
1362
// unsigned integer formats.
1363
TEST_P(Texture2DArrayCopy, UintFormats)
1364
{
1365
ANGLE_SKIP_TEST_IF(!checkExtensions());
1366
1367
// Vulkan multiplies source by 255 unconditionally, which is wrong for non-8-bit integer
1368
// formats. http://anglebug.com/4741
1369
ANGLE_SKIP_TEST_IF(IsVulkan());
1370
1371
constexpr char kFS[] =
1372
"#version 300 es\n"
1373
"precision highp float;\n"
1374
"uniform highp usampler2DArray tex2DArray;\n"
1375
"in vec3 texcoord;\n"
1376
"out uvec4 fragColor;\n"
1377
"void main()\n"
1378
"{\n"
1379
" fragColor = texture(tex2DArray, vec3(texcoord.x, texcoord.z, texcoord.y));\n"
1380
"}\n";
1381
1382
mProgram = CompileProgram(getVertexShaderSource(), kFS);
1383
ASSERT_NE(0u, mProgram);
1384
ASSERT_GL_NO_ERROR();
1385
1386
glUseProgram(mProgram);
1387
1388
testUintFormats(GL_TEXTURE_2D_ARRAY);
1389
}
1390
1391
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture3DCopy);
1392
ANGLE_INSTANTIATE_TEST_ES3(Texture3DCopy);
1393
1394
GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Texture2DArrayCopy);
1395
ANGLE_INSTANTIATE_TEST_ES3(Texture2DArrayCopy);
1396
1397
} // namespace angle
1398
1399