blob: 946dae0be67dd1078020401c371f391b43ebe021 [file] [log] [blame]
Jamie Madillfa05f602015-05-07 13:47:11 -04001//
2// Copyright 2015 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
Corentin Wallezd3970de2015-05-14 11:07:48 -04007#include "test_utils/ANGLETest.h"
Geoff Lang2c254d82014-01-15 14:51:23 -05008
9#include <vector>
10
Jamie Madillfa05f602015-05-07 13:47:11 -040011using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070012
Jamie Madillfa05f602015-05-07 13:47:11 -040013namespace
14{
15
Geoff Lang2c254d82014-01-15 14:51:23 -050016class SwizzleTest : public ANGLETest
17{
Jamie Madillfa05f602015-05-07 13:47:11 -040018 protected:
19 SwizzleTest()
Geoff Lang2c254d82014-01-15 14:51:23 -050020 {
21 setWindowWidth(128);
22 setWindowHeight(128);
23 setConfigRedBits(8);
24 setConfigGreenBits(8);
25 setConfigBlueBits(8);
26 setConfigAlphaBits(8);
Geoff Lang2c254d82014-01-15 14:51:23 -050027
28 GLenum swizzles[] =
29 {
30 GL_RED,
31 GL_GREEN,
32 GL_BLUE,
33 GL_ALPHA,
34 GL_ZERO,
35 GL_ONE,
36 };
37
38 for (int r = 0; r < 6; r++)
39 {
40 for (int g = 0; g < 6; g++)
41 {
42 for (int b = 0; b < 6; b++)
43 {
44 for (int a = 0; a < 6; a++)
45 {
46 swizzlePermutation permutation;
47 permutation.swizzleRed = swizzles[r];
48 permutation.swizzleGreen = swizzles[g];
49 permutation.swizzleBlue = swizzles[b];
50 permutation.swizzleAlpha = swizzles[a];
51 mPermutations.push_back(permutation);
52 }
53 }
54 }
55 }
56 }
57
Jamie Madillfa05f602015-05-07 13:47:11 -040058 void SetUp() override
Geoff Lang2c254d82014-01-15 14:51:23 -050059 {
60 ANGLETest::SetUp();
61
62 const std::string vertexShaderSource = SHADER_SOURCE
63 (
64 precision highp float;
65 attribute vec4 position;
66 varying vec2 texcoord;
67
68 void main()
69 {
70 gl_Position = position;
71 texcoord = (position.xy * 0.5) + 0.5;
72 }
73 );
74
75 const std::string fragmentShaderSource = SHADER_SOURCE
76 (
77 precision highp float;
78 uniform sampler2D tex;
79 varying vec2 texcoord;
80
81 void main()
82 {
83 gl_FragColor = texture2D(tex, texcoord);
84 }
85 );
86
Jamie Madill5599c8f2014-08-26 13:16:39 -040087 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
Olli Etuaho7b591902016-02-26 14:37:57 +020088 ASSERT_NE(0u, mProgram);
Geoff Lang2c254d82014-01-15 14:51:23 -050089
90 mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
Olli Etuaho7b591902016-02-26 14:37:57 +020091 ASSERT_NE(-1, mTextureUniformLocation);
Geoff Lang2c254d82014-01-15 14:51:23 -050092
93 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
Jamie Madill1ea9aaa2015-10-07 11:13:55 -040094 ASSERT_GL_NO_ERROR();
Geoff Lang2c254d82014-01-15 14:51:23 -050095 }
96
Jamie Madillfa05f602015-05-07 13:47:11 -040097 void TearDown() override
Geoff Lang2c254d82014-01-15 14:51:23 -050098 {
99 glDeleteProgram(mProgram);
100 glDeleteTextures(1, &mTexture);
101
102 ANGLETest::TearDown();
103 }
104
105 template <typename T>
106 void init2DTexture(GLenum internalFormat, GLenum dataFormat, GLenum dataType, const T* data)
107 {
108 glGenTextures(1, &mTexture);
109 glBindTexture(GL_TEXTURE_2D, mTexture);
Geoff Lang53b8aec2015-08-24 10:33:25 -0400110 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, dataFormat, dataType, data);
Geoff Lang2c254d82014-01-15 14:51:23 -0500111
112 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
113 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
114 }
115
116 void init2DCompressedTexture(GLenum internalFormat, GLsizei width, GLsizei height, GLsizei dataSize, const GLubyte* data)
117 {
118 glGenTextures(1, &mTexture);
119 glBindTexture(GL_TEXTURE_2D, mTexture);
120 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, width, height, 0, dataSize, data);
121
122 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
123 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
124 }
125
126 GLubyte getExpectedValue(GLenum swizzle, GLubyte unswizzled[4])
127 {
128 switch (swizzle)
129 {
130 case GL_RED: return unswizzled[0];
131 case GL_GREEN: return unswizzled[1];
132 case GL_BLUE: return unswizzled[2];
133 case GL_ALPHA: return unswizzled[3];
134 case GL_ZERO: return 0;
135 case GL_ONE: return 255;
136 default: return 0;
137 }
138 }
139
140 void runTest2D()
141 {
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400142 // TODO(jmadill): Figure out why this fails on Intel.
Jamie Madill518b9fa2016-03-02 11:26:02 -0500143 if (IsIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400144 {
145 std::cout << "Test skipped on Intel." << std::endl;
146 return;
147 }
148
Geoff Lang2c254d82014-01-15 14:51:23 -0500149 glUseProgram(mProgram);
150 glBindTexture(GL_TEXTURE_2D, mTexture);
151 glUniform1i(mTextureUniformLocation, 0);
152
153 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
154 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
155 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
156 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
157
158 glClear(GL_COLOR_BUFFER_BIT);
159 drawQuad(mProgram, "position", 0.5f);
160
161 GLubyte unswizzled[4];
162 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &unswizzled);
163
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400164 ASSERT_GL_NO_ERROR();
165
Geoff Lang2c254d82014-01-15 14:51:23 -0500166 for (size_t i = 0; i < mPermutations.size(); i++)
167 {
168 const swizzlePermutation& permutation = mPermutations[i];
169
170 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, permutation.swizzleRed);
171 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, permutation.swizzleGreen);
172 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, permutation.swizzleBlue);
173 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, permutation.swizzleAlpha);
174
175 glClear(GL_COLOR_BUFFER_BIT);
176 drawQuad(mProgram, "position", 0.5f);
177
178 EXPECT_PIXEL_EQ(0, 0,
179 getExpectedValue(permutation.swizzleRed, unswizzled),
180 getExpectedValue(permutation.swizzleGreen, unswizzled),
181 getExpectedValue(permutation.swizzleBlue, unswizzled),
182 getExpectedValue(permutation.swizzleAlpha, unswizzled));
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400183
184 ASSERT_GL_NO_ERROR();
Geoff Lang2c254d82014-01-15 14:51:23 -0500185 }
186 }
187
188 GLuint mProgram;
189 GLint mTextureUniformLocation;
190
191 GLuint mTexture;
192
193 struct swizzlePermutation
194 {
195 GLenum swizzleRed;
196 GLenum swizzleGreen;
197 GLenum swizzleBlue;
198 GLenum swizzleAlpha;
199 };
200 std::vector<swizzlePermutation> mPermutations;
201};
202
Olli Etuaho7b591902016-02-26 14:37:57 +0200203class SwizzleIntegerTest : public SwizzleTest
204{
205 protected:
206 void SetUp() override
207 {
208 ANGLETest::SetUp();
209
210 const std::string vertexShaderSource =
211 "#version 300 es\n"
212 "precision highp float;\n"
213 "in vec4 position;\n"
214 "out vec2 texcoord;\n"
215 "\n"
216 "void main()\n"
217 "{\n"
218 " gl_Position = position;\n"
219 " texcoord = (position.xy * 0.5) + 0.5;\n"
220 "}\n";
221
222 const std::string fragmentShaderSource =
223 "#version 300 es\n"
224 "precision highp float;\n"
225 "precision highp usampler2D;\n"
226 "uniform usampler2D tex;\n"
227 "in vec2 texcoord;\n"
228 "out vec4 my_FragColor;\n"
229 "\n"
230 "void main()\n"
231 "{\n"
232 " uvec4 s = texture(tex, texcoord);\n"
233 " if (s[0] == 1u) s[0] = 255u;\n"
234 " if (s[1] == 1u) s[1] = 255u;\n"
235 " if (s[2] == 1u) s[2] = 255u;\n"
236 " if (s[3] == 1u) s[3] = 255u;\n"
237 " my_FragColor = vec4(s) / 255.0;\n"
238 "}\n";
239
240 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
241 ASSERT_NE(0u, mProgram);
242
243 mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
244 ASSERT_NE(-1, mTextureUniformLocation);
245
246 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
247 ASSERT_GL_NO_ERROR();
248 }
249};
250
Jamie Madillfa05f602015-05-07 13:47:11 -0400251TEST_P(SwizzleTest, RGBA8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500252{
253 GLubyte data[] = { 1, 64, 128, 200 };
254 init2DTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data);
255 runTest2D();
256}
257
Jamie Madillfa05f602015-05-07 13:47:11 -0400258TEST_P(SwizzleTest, RGB8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500259{
260 GLubyte data[] = { 77, 66, 55 };
261 init2DTexture(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, data);
262 runTest2D();
263}
264
Jamie Madillfa05f602015-05-07 13:47:11 -0400265TEST_P(SwizzleTest, RG8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500266{
267 GLubyte data[] = { 11, 99 };
268 init2DTexture(GL_RG8, GL_RG, GL_UNSIGNED_BYTE, data);
269 runTest2D();
270}
271
Jamie Madillfa05f602015-05-07 13:47:11 -0400272TEST_P(SwizzleTest, R8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500273{
274 GLubyte data[] = { 2 };
Nico Weberce8bb2f2014-12-30 13:32:25 -0800275 init2DTexture(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data);
Geoff Lang2c254d82014-01-15 14:51:23 -0500276 runTest2D();
277}
278
Olli Etuahobc497582016-02-23 14:43:19 +0200279TEST_P(SwizzleTest, RGB10_A2_2D)
280{
281 GLuint data[] = {20u | (40u << 10) | (60u << 20) | (2u << 30)};
282 init2DTexture(GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, data);
283 runTest2D();
284}
285
Jamie Madillfa05f602015-05-07 13:47:11 -0400286TEST_P(SwizzleTest, RGBA32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500287{
288 GLfloat data[] = { 0.25f, 0.5f, 0.75f, 0.8f };
289 init2DTexture(GL_RGBA32F, GL_RGBA, GL_FLOAT, data);
290 runTest2D();
291}
292
Jamie Madillfa05f602015-05-07 13:47:11 -0400293TEST_P(SwizzleTest, RGB32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500294{
295 GLfloat data[] = { 0.1f, 0.2f, 0.3f };
296 init2DTexture(GL_RGB32F, GL_RGB, GL_FLOAT, data);
297 runTest2D();
298}
299
Jamie Madillfa05f602015-05-07 13:47:11 -0400300TEST_P(SwizzleTest, RG32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500301{
302 GLfloat data[] = { 0.9f, 0.1f };
303 init2DTexture(GL_RG32F, GL_RG, GL_FLOAT, data);
304 runTest2D();
305}
306
Jamie Madillfa05f602015-05-07 13:47:11 -0400307TEST_P(SwizzleTest, R32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500308{
309 GLfloat data[] = { 0.5f };
310 init2DTexture(GL_R32F, GL_RED, GL_FLOAT, data);
311 runTest2D();
312}
313
Jamie Madillfa05f602015-05-07 13:47:11 -0400314TEST_P(SwizzleTest, D32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500315{
316 GLfloat data[] = { 0.5f };
317 init2DTexture(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, data);
318 runTest2D();
319}
320
Jamie Madillfa05f602015-05-07 13:47:11 -0400321TEST_P(SwizzleTest, D16_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500322{
323 GLushort data[] = { 0xFF };
324 init2DTexture(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, data);
325 runTest2D();
326}
327
Jamie Madillfa05f602015-05-07 13:47:11 -0400328TEST_P(SwizzleTest, D24_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500329{
330 GLuint data[] = { 0xFFFF };
331 init2DTexture(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, data);
332 runTest2D();
333}
334
Geoff Lang53b8aec2015-08-24 10:33:25 -0400335TEST_P(SwizzleTest, L8_2D)
336{
337 GLubyte data[] = {0x77};
338 init2DTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
339 runTest2D();
340}
341
342TEST_P(SwizzleTest, A8_2D)
343{
344 GLubyte data[] = {0x55};
345 init2DTexture(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, data);
346 runTest2D();
347}
348
349TEST_P(SwizzleTest, LA8_2D)
350{
351 GLubyte data[] = {0x77, 0x66};
352 init2DTexture(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
353 runTest2D();
354}
355
356TEST_P(SwizzleTest, L32F_2D)
357{
358 GLfloat data[] = {0.7f};
359 init2DTexture(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT, data);
360 runTest2D();
361}
362
363TEST_P(SwizzleTest, A32F_2D)
364{
365 GLfloat data[] = {
366 0.4f,
367 };
368 init2DTexture(GL_ALPHA, GL_ALPHA, GL_FLOAT, data);
369 runTest2D();
370}
371
372TEST_P(SwizzleTest, LA32F_2D)
373{
374 GLfloat data[] = {
375 0.5f, 0.6f,
376 };
377 init2DTexture(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT, data);
378 runTest2D();
379}
380
Geoff Lang2c254d82014-01-15 14:51:23 -0500381#include "media/pixel.inl"
382
Jamie Madillfa05f602015-05-07 13:47:11 -0400383TEST_P(SwizzleTest, CompressedDXT_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500384{
Geoff Lang167dceb2015-03-31 12:49:57 -0400385 if (!extensionEnabled("GL_EXT_texture_compression_dxt1"))
386 {
Geoff Langf34d1db2015-05-20 14:10:46 -0400387 std::cout << "Test skipped due to missing GL_EXT_texture_compression_dxt1." << std::endl;
Geoff Lang167dceb2015-03-31 12:49:57 -0400388 return;
389 }
390
Geoff Lang2c254d82014-01-15 14:51:23 -0500391 init2DCompressedTexture(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, pixel_0_size, pixel_0_data);
392 runTest2D();
393}
Jamie Madillfa05f602015-05-07 13:47:11 -0400394
Olli Etuaho7b591902016-02-26 14:37:57 +0200395TEST_P(SwizzleIntegerTest, RGB8UI_2D)
396{
397 GLubyte data[] = {77, 66, 55};
398 init2DTexture(GL_RGB8UI, GL_RGB_INTEGER, GL_UNSIGNED_BYTE, data);
399 runTest2D();
400}
401
Jamie Madillfa05f602015-05-07 13:47:11 -0400402// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lange0cc2a42016-01-20 10:58:17 -0500403ANGLE_INSTANTIATE_TEST(SwizzleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGL(3, 3), ES3_OPENGLES());
Olli Etuaho7b591902016-02-26 14:37:57 +0200404ANGLE_INSTANTIATE_TEST(SwizzleIntegerTest,
405 ES3_D3D11(),
406 ES3_OPENGL(),
407 ES3_OPENGL(3, 3),
408 ES3_OPENGLES());
Jamie Madillfa05f602015-05-07 13:47:11 -0400409
410} // namespace