blob: a91030cb6e30ae0b6f20edd887d80e81199dc3fd [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);
Geoff Lang2c254d82014-01-15 14:51:23 -050088 if (mProgram == 0)
89 {
90 FAIL() << "shader compilation failed.";
91 }
92
93 mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
94
95 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
Jamie Madill1ea9aaa2015-10-07 11:13:55 -040096 ASSERT_GL_NO_ERROR();
Geoff Lang2c254d82014-01-15 14:51:23 -050097 }
98
Jamie Madillfa05f602015-05-07 13:47:11 -040099 void TearDown() override
Geoff Lang2c254d82014-01-15 14:51:23 -0500100 {
101 glDeleteProgram(mProgram);
102 glDeleteTextures(1, &mTexture);
103
104 ANGLETest::TearDown();
105 }
106
107 template <typename T>
108 void init2DTexture(GLenum internalFormat, GLenum dataFormat, GLenum dataType, const T* data)
109 {
110 glGenTextures(1, &mTexture);
111 glBindTexture(GL_TEXTURE_2D, mTexture);
Geoff Lang53b8aec2015-08-24 10:33:25 -0400112 glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 1, 1, 0, dataFormat, dataType, data);
Geoff Lang2c254d82014-01-15 14:51:23 -0500113
114 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
115 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
116 }
117
118 void init2DCompressedTexture(GLenum internalFormat, GLsizei width, GLsizei height, GLsizei dataSize, const GLubyte* data)
119 {
120 glGenTextures(1, &mTexture);
121 glBindTexture(GL_TEXTURE_2D, mTexture);
122 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, width, height, 0, dataSize, data);
123
124 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
125 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
126 }
127
128 GLubyte getExpectedValue(GLenum swizzle, GLubyte unswizzled[4])
129 {
130 switch (swizzle)
131 {
132 case GL_RED: return unswizzled[0];
133 case GL_GREEN: return unswizzled[1];
134 case GL_BLUE: return unswizzled[2];
135 case GL_ALPHA: return unswizzled[3];
136 case GL_ZERO: return 0;
137 case GL_ONE: return 255;
138 default: return 0;
139 }
140 }
141
142 void runTest2D()
143 {
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400144 // TODO(jmadill): Figure out why this fails on Intel.
145 if (isIntel() && GetParam().getRenderer() == EGL_PLATFORM_ANGLE_TYPE_OPENGL_ANGLE)
146 {
147 std::cout << "Test skipped on Intel." << std::endl;
148 return;
149 }
150
Geoff Lang2c254d82014-01-15 14:51:23 -0500151 glUseProgram(mProgram);
152 glBindTexture(GL_TEXTURE_2D, mTexture);
153 glUniform1i(mTextureUniformLocation, 0);
154
155 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
156 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
157 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
158 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
159
160 glClear(GL_COLOR_BUFFER_BIT);
161 drawQuad(mProgram, "position", 0.5f);
162
163 GLubyte unswizzled[4];
164 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &unswizzled);
165
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400166 ASSERT_GL_NO_ERROR();
167
Geoff Lang2c254d82014-01-15 14:51:23 -0500168 for (size_t i = 0; i < mPermutations.size(); i++)
169 {
170 const swizzlePermutation& permutation = mPermutations[i];
171
172 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, permutation.swizzleRed);
173 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, permutation.swizzleGreen);
174 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, permutation.swizzleBlue);
175 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, permutation.swizzleAlpha);
176
177 glClear(GL_COLOR_BUFFER_BIT);
178 drawQuad(mProgram, "position", 0.5f);
179
180 EXPECT_PIXEL_EQ(0, 0,
181 getExpectedValue(permutation.swizzleRed, unswizzled),
182 getExpectedValue(permutation.swizzleGreen, unswizzled),
183 getExpectedValue(permutation.swizzleBlue, unswizzled),
184 getExpectedValue(permutation.swizzleAlpha, unswizzled));
Jamie Madill1ea9aaa2015-10-07 11:13:55 -0400185
186 ASSERT_GL_NO_ERROR();
Geoff Lang2c254d82014-01-15 14:51:23 -0500187 }
188 }
189
190 GLuint mProgram;
191 GLint mTextureUniformLocation;
192
193 GLuint mTexture;
194
195 struct swizzlePermutation
196 {
197 GLenum swizzleRed;
198 GLenum swizzleGreen;
199 GLenum swizzleBlue;
200 GLenum swizzleAlpha;
201 };
202 std::vector<swizzlePermutation> mPermutations;
203};
204
Jamie Madillfa05f602015-05-07 13:47:11 -0400205TEST_P(SwizzleTest, RGBA8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500206{
207 GLubyte data[] = { 1, 64, 128, 200 };
208 init2DTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data);
209 runTest2D();
210}
211
Jamie Madillfa05f602015-05-07 13:47:11 -0400212TEST_P(SwizzleTest, RGB8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500213{
214 GLubyte data[] = { 77, 66, 55 };
215 init2DTexture(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, data);
216 runTest2D();
217}
218
Jamie Madillfa05f602015-05-07 13:47:11 -0400219TEST_P(SwizzleTest, RG8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500220{
221 GLubyte data[] = { 11, 99 };
222 init2DTexture(GL_RG8, GL_RG, GL_UNSIGNED_BYTE, data);
223 runTest2D();
224}
225
Jamie Madillfa05f602015-05-07 13:47:11 -0400226TEST_P(SwizzleTest, R8_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500227{
228 GLubyte data[] = { 2 };
Nico Weberce8bb2f2014-12-30 13:32:25 -0800229 init2DTexture(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data);
Geoff Lang2c254d82014-01-15 14:51:23 -0500230 runTest2D();
231}
232
Jamie Madillfa05f602015-05-07 13:47:11 -0400233TEST_P(SwizzleTest, RGBA32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500234{
235 GLfloat data[] = { 0.25f, 0.5f, 0.75f, 0.8f };
236 init2DTexture(GL_RGBA32F, GL_RGBA, GL_FLOAT, data);
237 runTest2D();
238}
239
Jamie Madillfa05f602015-05-07 13:47:11 -0400240TEST_P(SwizzleTest, RGB32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500241{
242 GLfloat data[] = { 0.1f, 0.2f, 0.3f };
243 init2DTexture(GL_RGB32F, GL_RGB, GL_FLOAT, data);
244 runTest2D();
245}
246
Jamie Madillfa05f602015-05-07 13:47:11 -0400247TEST_P(SwizzleTest, RG32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500248{
249 GLfloat data[] = { 0.9f, 0.1f };
250 init2DTexture(GL_RG32F, GL_RG, GL_FLOAT, data);
251 runTest2D();
252}
253
Jamie Madillfa05f602015-05-07 13:47:11 -0400254TEST_P(SwizzleTest, R32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500255{
256 GLfloat data[] = { 0.5f };
257 init2DTexture(GL_R32F, GL_RED, GL_FLOAT, data);
258 runTest2D();
259}
260
Jamie Madillfa05f602015-05-07 13:47:11 -0400261TEST_P(SwizzleTest, D32F_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500262{
263 GLfloat data[] = { 0.5f };
264 init2DTexture(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, data);
265 runTest2D();
266}
267
Jamie Madillfa05f602015-05-07 13:47:11 -0400268TEST_P(SwizzleTest, D16_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500269{
270 GLushort data[] = { 0xFF };
271 init2DTexture(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, data);
272 runTest2D();
273}
274
Jamie Madillfa05f602015-05-07 13:47:11 -0400275TEST_P(SwizzleTest, D24_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500276{
277 GLuint data[] = { 0xFFFF };
278 init2DTexture(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, data);
279 runTest2D();
280}
281
Geoff Lang53b8aec2015-08-24 10:33:25 -0400282TEST_P(SwizzleTest, L8_2D)
283{
284 GLubyte data[] = {0x77};
285 init2DTexture(GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
286 runTest2D();
287}
288
289TEST_P(SwizzleTest, A8_2D)
290{
291 GLubyte data[] = {0x55};
292 init2DTexture(GL_ALPHA, GL_ALPHA, GL_UNSIGNED_BYTE, data);
293 runTest2D();
294}
295
296TEST_P(SwizzleTest, LA8_2D)
297{
298 GLubyte data[] = {0x77, 0x66};
299 init2DTexture(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, data);
300 runTest2D();
301}
302
303TEST_P(SwizzleTest, L32F_2D)
304{
305 GLfloat data[] = {0.7f};
306 init2DTexture(GL_LUMINANCE, GL_LUMINANCE, GL_FLOAT, data);
307 runTest2D();
308}
309
310TEST_P(SwizzleTest, A32F_2D)
311{
312 GLfloat data[] = {
313 0.4f,
314 };
315 init2DTexture(GL_ALPHA, GL_ALPHA, GL_FLOAT, data);
316 runTest2D();
317}
318
319TEST_P(SwizzleTest, LA32F_2D)
320{
321 GLfloat data[] = {
322 0.5f, 0.6f,
323 };
324 init2DTexture(GL_LUMINANCE_ALPHA, GL_LUMINANCE_ALPHA, GL_FLOAT, data);
325 runTest2D();
326}
327
Geoff Lang2c254d82014-01-15 14:51:23 -0500328#include "media/pixel.inl"
329
Jamie Madillfa05f602015-05-07 13:47:11 -0400330TEST_P(SwizzleTest, CompressedDXT_2D)
Geoff Lang2c254d82014-01-15 14:51:23 -0500331{
Geoff Lang167dceb2015-03-31 12:49:57 -0400332 if (!extensionEnabled("GL_EXT_texture_compression_dxt1"))
333 {
Geoff Langf34d1db2015-05-20 14:10:46 -0400334 std::cout << "Test skipped due to missing GL_EXT_texture_compression_dxt1." << std::endl;
Geoff Lang167dceb2015-03-31 12:49:57 -0400335 return;
336 }
337
Geoff Lang2c254d82014-01-15 14:51:23 -0500338 init2DCompressedTexture(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, pixel_0_size, pixel_0_data);
339 runTest2D();
340}
Jamie Madillfa05f602015-05-07 13:47:11 -0400341
342// 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 -0500343ANGLE_INSTANTIATE_TEST(SwizzleTest, ES3_D3D11(), ES3_OPENGL(), ES3_OPENGL(3, 3), ES3_OPENGLES());
Jamie Madillfa05f602015-05-07 13:47:11 -0400344
345} // namespace