blob: b47b3f76c6049f4c77919bfe4d3fb8d5577a6571 [file] [log] [blame]
Jamie Madill96509e42014-05-29 14:33:27 -04001#include "ANGLETest.h"
2
Jamie Madill2bf8b372014-06-16 17:18:51 -04003class GLSLTest : public ANGLETest
Jamie Madill96509e42014-05-29 14:33:27 -04004{
5protected:
Jamie Madill2bf8b372014-06-16 17:18:51 -04006 GLSLTest()
Jamie Madill96509e42014-05-29 14:33:27 -04007 {
8 setWindowWidth(128);
9 setWindowHeight(128);
10 setConfigRedBits(8);
11 setConfigGreenBits(8);
12 setConfigBlueBits(8);
13 setConfigAlphaBits(8);
14 }
Jamie Madillbfa91f42014-06-05 15:45:18 -040015
16 virtual void SetUp()
17 {
18 ANGLETest::SetUp();
19
Jamie Madill2bf8b372014-06-16 17:18:51 -040020 mSimpleVSSource = SHADER_SOURCE
Jamie Madillbfa91f42014-06-05 15:45:18 -040021 (
22 attribute vec4 inputAttribute;
23 void main()
24 {
25 gl_Position = inputAttribute;
26 }
27 );
28 }
29
Jamie Madill2bf8b372014-06-16 17:18:51 -040030 std::string mSimpleVSSource;
Jamie Madill96509e42014-05-29 14:33:27 -040031};
32
Jamie Madillb759a742014-07-17 10:40:49 -040033TEST_F(GLSLTest, NamelessScopedStructs)
Jamie Madill96509e42014-05-29 14:33:27 -040034{
Jamie Madillbfa91f42014-06-05 15:45:18 -040035 const std::string fragmentShaderSource = SHADER_SOURCE
Jamie Madill96509e42014-05-29 14:33:27 -040036 (
Jamie Madillbfa91f42014-06-05 15:45:18 -040037 precision mediump float;
38
Jamie Madill96509e42014-05-29 14:33:27 -040039 void main()
40 {
Jamie Madillbfa91f42014-06-05 15:45:18 -040041 struct
42 {
43 float q;
44 } b;
45
46 gl_FragColor = vec4(1, 0, 0, 1);
47 gl_FragColor.a += b.q;
Jamie Madill96509e42014-05-29 14:33:27 -040048 }
49 );
50
Jamie Madill5599c8f2014-08-26 13:16:39 -040051 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -040052 EXPECT_NE(0u, program);
53}
Jamie Madillb759a742014-07-17 10:40:49 -040054TEST_F(GLSLTest, ScopedStructsOrderBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -040055{
56 const std::string fragmentShaderSource = SHADER_SOURCE
57 (
58 precision mediump float;
59
60 struct T
61 {
62 float f;
63 };
64
65 void main()
66 {
67 T a;
68
69 struct T
70 {
71 float q;
72 };
73
74 T b;
75
76 gl_FragColor = vec4(1, 0, 0, 1);
77 gl_FragColor.a += a.f;
78 gl_FragColor.a += b.q;
79 }
80 );
81
Jamie Madill5599c8f2014-08-26 13:16:39 -040082 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -040083 EXPECT_NE(0u, program);
84}
85
Jamie Madillb759a742014-07-17 10:40:49 -040086TEST_F(GLSLTest, ScopedStructsBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -040087{
Jamie Madill96509e42014-05-29 14:33:27 -040088 const std::string fragmentShaderSource = SHADER_SOURCE
89 (
90 precision mediump float;
91
92 struct T_0
93 {
94 float f;
95 };
96
97 void main()
98 {
99 gl_FragColor = vec4(1, 0, 0, 1);
100
101 struct T
102 {
103 vec2 v;
104 };
105
106 T_0 a;
107 T b;
108
109 gl_FragColor.a += a.f;
110 gl_FragColor.a += b.v.x;
111 }
112 );
113
Jamie Madill5599c8f2014-08-26 13:16:39 -0400114 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madill2bf8b372014-06-16 17:18:51 -0400115 EXPECT_NE(0u, program);
116}
117
Jamie Madillb759a742014-07-17 10:40:49 -0400118TEST_F(GLSLTest, DxPositionBug)
Jamie Madill2bf8b372014-06-16 17:18:51 -0400119{
120 const std::string &vertexShaderSource = SHADER_SOURCE
121 (
122 attribute vec4 inputAttribute;
123 varying float dx_Position;
124 void main()
125 {
126 gl_Position = vec4(inputAttribute);
127 dx_Position = 0.0;
128 }
129 );
130
131 const std::string &fragmentShaderSource = SHADER_SOURCE
132 (
133 precision mediump float;
134
135 varying float dx_Position;
136
137 void main()
138 {
139 gl_FragColor = vec4(dx_Position, 0, 0, 1);
140 }
141 );
142
Jamie Madill5599c8f2014-08-26 13:16:39 -0400143 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill96509e42014-05-29 14:33:27 -0400144 EXPECT_NE(0u, program);
145}
Jamie Madill4836d222014-07-24 06:55:51 -0400146
147TEST_F(GLSLTest, ElseIfRewriting)
148{
149 const std::string &vertexShaderSource =
150 "attribute vec4 a_position;\n"
151 "varying float v;\n"
152 "void main() {\n"
153 " gl_Position = a_position;\n"
154 " v = 1.0;\n"
155 " if (a_position.x <= 0.5) {\n"
156 " v = 0.0;\n"
157 " } else if (a_position.x >= 0.5) {\n"
158 " v = 2.0;\n"
159 " }\n"
160 "}\n";
161
162 const std::string &fragmentShaderSource =
163 "precision highp float;\n"
164 "varying float v;\n"
165 "void main() {\n"
166 " vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\n"
167 " if (v >= 1.0) color = vec4(0.0, 1.0, 0.0, 1.0);\n"
168 " if (v >= 2.0) color = vec4(0.0, 0.0, 1.0, 1.0);\n"
169 " gl_FragColor = color;\n"
170 "}\n";
171
Jamie Madill5599c8f2014-08-26 13:16:39 -0400172 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400173 ASSERT_NE(0u, program);
174
175 drawQuad(program, "a_position", 0.5f);
176 swapBuffers();
177
178 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
179 EXPECT_PIXEL_EQ(getWindowWidth()-1, 0, 0, 255, 0, 255);
180}
181
182TEST_F(GLSLTest, TwoElseIfRewriting)
183{
184 const std::string &vertexShaderSource =
185 "attribute vec4 a_position;\n"
186 "varying float v;\n"
187 "void main() {\n"
188 " gl_Position = a_position;\n"
Jamie Madill778d5272014-08-04 13:13:25 -0400189 " if (a_position.x == 0.0) {\n"
Jamie Madill4836d222014-07-24 06:55:51 -0400190 " v = 1.0;\n"
191 " } else if (a_position.x > 0.5) {\n"
192 " v = 0.0;\n"
193 " } else if (a_position.x > 0.75) {\n"
194 " v = 0.5;\n"
195 " }\n"
196 "}\n";
197
198 const std::string &fragmentShaderSource =
199 "precision highp float;\n"
200 "varying float v;\n"
201 "void main() {\n"
202 " gl_FragColor = vec4(v, 0.0, 0.0, 1.0);\n"
203 "}\n";
204
Jamie Madill5599c8f2014-08-26 13:16:39 -0400205 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400206 EXPECT_NE(0u, program);
207}
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400208
209TEST_F(GLSLTest, InvariantVaryingOut)
210{
211 const std::string fragmentShaderSource = SHADER_SOURCE
212 (
213 precision mediump float;
214 varying float v_varying;
215 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
216 );
217
218 const std::string vertexShaderSource = SHADER_SOURCE
219 (
220 attribute vec4 a_position;
221 invariant varying float v_varying;
222 void main() { v_varying = a_position.x; gl_Position = a_position; }
223 );
224
Jamie Madill5599c8f2014-08-26 13:16:39 -0400225 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400226 EXPECT_NE(0u, program);
227}
228
Jamie Madille6256f82014-09-17 10:31:15 -0400229TEST_F(GLSLTest, FrontFacingAndVarying)
230{
231 const std::string vertexShaderSource = SHADER_SOURCE
232 (
233 attribute vec4 a_position;
234 varying float v_varying;
235 void main()
236 {
237 v_varying = a_position.x;
238 gl_Position = a_position;
239 }
240 );
241
242 const std::string fragmentShaderSource = SHADER_SOURCE
243 (
244 precision mediump float;
245 varying float v_varying;
246 void main()
247 {
248 vec4 c;
249
250 if (gl_FrontFacing)
251 {
252 c = vec4(v_varying, 0, 0, 1.0);
253 }
254 else
255 {
256 c = vec4(0, v_varying, 0, 1.0);
257 }
258 gl_FragColor = c;
259 }
260 );
261
262 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
263 EXPECT_NE(0u, program);
264}
265
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400266TEST_F(GLSLTest, InvariantVaryingIn)
267{
268 const std::string fragmentShaderSource = SHADER_SOURCE
269 (
270 precision mediump float;
271 invariant varying float v_varying;
272 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
273 );
274
275 const std::string vertexShaderSource = SHADER_SOURCE
276 (
277 attribute vec4 a_position;
278 varying float v_varying;
279 void main() { v_varying = a_position.x; gl_Position = a_position; }
280 );
281
Jamie Madill5599c8f2014-08-26 13:16:39 -0400282 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400283 EXPECT_NE(0u, program);
284}
285
286TEST_F(GLSLTest, InvariantVaryingBoth)
287{
288 const std::string fragmentShaderSource = SHADER_SOURCE
289 (
290 precision mediump float;
291 invariant varying float v_varying;
292 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
293 );
294
295 const std::string vertexShaderSource = SHADER_SOURCE
296 (
297 attribute vec4 a_position;
298 invariant varying float v_varying;
299 void main() { v_varying = a_position.x; gl_Position = a_position; }
300 );
301
Jamie Madill5599c8f2014-08-26 13:16:39 -0400302 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400303 EXPECT_NE(0u, program);
304}
305
306TEST_F(GLSLTest, InvariantGLPosition)
307{
308 const std::string fragmentShaderSource = SHADER_SOURCE
309 (
310 precision mediump float;
311 varying float v_varying;
312 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
313 );
314
315 const std::string vertexShaderSource = SHADER_SOURCE
316 (
317 attribute vec4 a_position;
318 invariant gl_Position;
319 varying float v_varying;
320 void main() { v_varying = a_position.x; gl_Position = a_position; }
321 );
322
Jamie Madill5599c8f2014-08-26 13:16:39 -0400323 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400324 EXPECT_NE(0u, program);
325}
326
327TEST_F(GLSLTest, InvariantAll)
328{
329 const std::string fragmentShaderSource = SHADER_SOURCE
330 (
331 precision mediump float;
332 varying float v_varying;
333 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
334 );
335
336 const std::string vertexShaderSource =
337 "#pragma STDGL invariant(all)\n"
338 "attribute vec4 a_position;\n"
339 "varying float v_varying;\n"
340 "void main() { v_varying = a_position.x; gl_Position = a_position; }\n";
341
Jamie Madill5599c8f2014-08-26 13:16:39 -0400342 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400343 EXPECT_NE(0u, program);
344}