1 #include "ANGLETest.h"
2
3 #include <vector>
4
5 class SwizzleTest : public ANGLETest
6 {
7 protected:
SwizzleTest()8 SwizzleTest()
9 {
10 setWindowWidth(128);
11 setWindowHeight(128);
12 setConfigRedBits(8);
13 setConfigGreenBits(8);
14 setConfigBlueBits(8);
15 setConfigAlphaBits(8);
16 setClientVersion(3);
17
18 GLenum swizzles[] =
19 {
20 GL_RED,
21 GL_GREEN,
22 GL_BLUE,
23 GL_ALPHA,
24 GL_ZERO,
25 GL_ONE,
26 };
27
28 for (int r = 0; r < 6; r++)
29 {
30 for (int g = 0; g < 6; g++)
31 {
32 for (int b = 0; b < 6; b++)
33 {
34 for (int a = 0; a < 6; a++)
35 {
36 swizzlePermutation permutation;
37 permutation.swizzleRed = swizzles[r];
38 permutation.swizzleGreen = swizzles[g];
39 permutation.swizzleBlue = swizzles[b];
40 permutation.swizzleAlpha = swizzles[a];
41 mPermutations.push_back(permutation);
42 }
43 }
44 }
45 }
46 }
47
SetUp()48 virtual void SetUp()
49 {
50 ANGLETest::SetUp();
51
52 const std::string vertexShaderSource = SHADER_SOURCE
53 (
54 precision highp float;
55 attribute vec4 position;
56 varying vec2 texcoord;
57
58 void main()
59 {
60 gl_Position = position;
61 texcoord = (position.xy * 0.5) + 0.5;
62 }
63 );
64
65 const std::string fragmentShaderSource = SHADER_SOURCE
66 (
67 precision highp float;
68 uniform sampler2D tex;
69 varying vec2 texcoord;
70
71 void main()
72 {
73 gl_FragColor = texture2D(tex, texcoord);
74 }
75 );
76
77 mProgram = CompileProgram(vertexShaderSource, fragmentShaderSource);
78 if (mProgram == 0)
79 {
80 FAIL() << "shader compilation failed.";
81 }
82
83 mTextureUniformLocation = glGetUniformLocation(mProgram, "tex");
84
85 glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
86 }
87
TearDown()88 virtual void TearDown()
89 {
90 glDeleteProgram(mProgram);
91 glDeleteTextures(1, &mTexture);
92
93 ANGLETest::TearDown();
94 }
95
96 template <typename T>
init2DTexture(GLenum internalFormat,GLenum dataFormat,GLenum dataType,const T * data)97 void init2DTexture(GLenum internalFormat, GLenum dataFormat, GLenum dataType, const T* data)
98 {
99 glGenTextures(1, &mTexture);
100 glBindTexture(GL_TEXTURE_2D, mTexture);
101 glTexStorage2D(GL_TEXTURE_2D, 1, internalFormat, 1, 1);
102 glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 1, 1, dataFormat, dataType, data);
103
104 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
105 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
106 }
107
init2DCompressedTexture(GLenum internalFormat,GLsizei width,GLsizei height,GLsizei dataSize,const GLubyte * data)108 void init2DCompressedTexture(GLenum internalFormat, GLsizei width, GLsizei height, GLsizei dataSize, const GLubyte* data)
109 {
110 glGenTextures(1, &mTexture);
111 glBindTexture(GL_TEXTURE_2D, mTexture);
112 glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, width, height, 0, dataSize, data);
113
114 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
115 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
116 }
117
getExpectedValue(GLenum swizzle,GLubyte unswizzled[4])118 GLubyte getExpectedValue(GLenum swizzle, GLubyte unswizzled[4])
119 {
120 switch (swizzle)
121 {
122 case GL_RED: return unswizzled[0];
123 case GL_GREEN: return unswizzled[1];
124 case GL_BLUE: return unswizzled[2];
125 case GL_ALPHA: return unswizzled[3];
126 case GL_ZERO: return 0;
127 case GL_ONE: return 255;
128 default: return 0;
129 }
130 }
131
runTest2D()132 void runTest2D()
133 {
134 glUseProgram(mProgram);
135 glBindTexture(GL_TEXTURE_2D, mTexture);
136 glUniform1i(mTextureUniformLocation, 0);
137
138 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_RED);
139 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, GL_GREEN);
140 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_BLUE);
141 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, GL_ALPHA);
142
143 glClear(GL_COLOR_BUFFER_BIT);
144 drawQuad(mProgram, "position", 0.5f);
145
146 GLubyte unswizzled[4];
147 glReadPixels(0, 0, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, &unswizzled);
148
149 for (size_t i = 0; i < mPermutations.size(); i++)
150 {
151 const swizzlePermutation& permutation = mPermutations[i];
152
153 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, permutation.swizzleRed);
154 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_G, permutation.swizzleGreen);
155 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, permutation.swizzleBlue);
156 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_A, permutation.swizzleAlpha);
157
158 glClear(GL_COLOR_BUFFER_BIT);
159 drawQuad(mProgram, "position", 0.5f);
160
161 EXPECT_PIXEL_EQ(0, 0,
162 getExpectedValue(permutation.swizzleRed, unswizzled),
163 getExpectedValue(permutation.swizzleGreen, unswizzled),
164 getExpectedValue(permutation.swizzleBlue, unswizzled),
165 getExpectedValue(permutation.swizzleAlpha, unswizzled));
166 }
167 }
168
169 GLuint mProgram;
170 GLint mTextureUniformLocation;
171
172 GLuint mTexture;
173
174 struct swizzlePermutation
175 {
176 GLenum swizzleRed;
177 GLenum swizzleGreen;
178 GLenum swizzleBlue;
179 GLenum swizzleAlpha;
180 };
181 std::vector<swizzlePermutation> mPermutations;
182 };
183
TEST_F(SwizzleTest,RGBA8_2D)184 TEST_F(SwizzleTest, RGBA8_2D)
185 {
186 GLubyte data[] = { 1, 64, 128, 200 };
187 init2DTexture(GL_RGBA8, GL_RGBA, GL_UNSIGNED_BYTE, data);
188 runTest2D();
189 }
190
TEST_F(SwizzleTest,RGB8_2D)191 TEST_F(SwizzleTest, RGB8_2D)
192 {
193 GLubyte data[] = { 77, 66, 55 };
194 init2DTexture(GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE, data);
195 runTest2D();
196 }
197
TEST_F(SwizzleTest,RG8_2D)198 TEST_F(SwizzleTest, RG8_2D)
199 {
200 GLubyte data[] = { 11, 99 };
201 init2DTexture(GL_RG8, GL_RG, GL_UNSIGNED_BYTE, data);
202 runTest2D();
203 }
204
TEST_F(SwizzleTest,R8_2D)205 TEST_F(SwizzleTest, R8_2D)
206 {
207 GLubyte data[] = { 2 };
208 init2DTexture<GLubyte>(GL_R8, GL_RED, GL_UNSIGNED_BYTE, data);
209 runTest2D();
210 }
211
TEST_F(SwizzleTest,RGBA32F_2D)212 TEST_F(SwizzleTest, RGBA32F_2D)
213 {
214 GLfloat data[] = { 0.25f, 0.5f, 0.75f, 0.8f };
215 init2DTexture(GL_RGBA32F, GL_RGBA, GL_FLOAT, data);
216 runTest2D();
217 }
218
TEST_F(SwizzleTest,RGB32F_2D)219 TEST_F(SwizzleTest, RGB32F_2D)
220 {
221 GLfloat data[] = { 0.1f, 0.2f, 0.3f };
222 init2DTexture(GL_RGB32F, GL_RGB, GL_FLOAT, data);
223 runTest2D();
224 }
225
TEST_F(SwizzleTest,RG32F_2D)226 TEST_F(SwizzleTest, RG32F_2D)
227 {
228 GLfloat data[] = { 0.9f, 0.1f };
229 init2DTexture(GL_RG32F, GL_RG, GL_FLOAT, data);
230 runTest2D();
231 }
232
TEST_F(SwizzleTest,R32F_2D)233 TEST_F(SwizzleTest, R32F_2D)
234 {
235 GLfloat data[] = { 0.5f };
236 init2DTexture(GL_R32F, GL_RED, GL_FLOAT, data);
237 runTest2D();
238 }
239
TEST_F(SwizzleTest,D32F_2D)240 TEST_F(SwizzleTest, D32F_2D)
241 {
242 GLfloat data[] = { 0.5f };
243 init2DTexture(GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT, data);
244 runTest2D();
245 }
246
TEST_F(SwizzleTest,D16_2D)247 TEST_F(SwizzleTest, D16_2D)
248 {
249 GLushort data[] = { 0xFF };
250 init2DTexture(GL_DEPTH_COMPONENT16, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, data);
251 runTest2D();
252 }
253
TEST_F(SwizzleTest,D24_2D)254 TEST_F(SwizzleTest, D24_2D)
255 {
256 GLuint data[] = { 0xFFFF };
257 init2DTexture(GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, data);
258 runTest2D();
259 }
260
261 #include "media/pixel.inl"
262
TEST_F(SwizzleTest,CompressedDXT_2D)263 TEST_F(SwizzleTest, CompressedDXT_2D)
264 {
265 init2DCompressedTexture(GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, pixel_0_width, pixel_0_height, pixel_0_size, pixel_0_data);
266 runTest2D();
267 }
268