blob: 1277576108432a30d9083d07e67fb73d575adfec [file] [log] [blame]
Jamie Madill96509e42014-05-29 14:33:27 -04001#include "ANGLETest.h"
2
Austin Kinross18b931d2014-09-29 12:58:31 -07003// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
Geoff Lang0d3683c2014-10-23 11:08:16 -04004ANGLE_TYPED_TEST_CASE(GLSLTest, ES2_D3D9, ES2_D3D11);
Austin Kinross18b931d2014-09-29 12:58:31 -07005
6template<typename T>
Jamie Madill2bf8b372014-06-16 17:18:51 -04007class GLSLTest : public ANGLETest
Jamie Madill96509e42014-05-29 14:33:27 -04008{
9protected:
Geoff Lang0d3683c2014-10-23 11:08:16 -040010 GLSLTest() : ANGLETest(T::GetGlesMajorVersion(), T::GetPlatform())
Jamie Madill96509e42014-05-29 14:33:27 -040011 {
12 setWindowWidth(128);
13 setWindowHeight(128);
14 setConfigRedBits(8);
15 setConfigGreenBits(8);
16 setConfigBlueBits(8);
17 setConfigAlphaBits(8);
18 }
Jamie Madillbfa91f42014-06-05 15:45:18 -040019
20 virtual void SetUp()
21 {
22 ANGLETest::SetUp();
23
Jamie Madill2bf8b372014-06-16 17:18:51 -040024 mSimpleVSSource = SHADER_SOURCE
Jamie Madillbfa91f42014-06-05 15:45:18 -040025 (
26 attribute vec4 inputAttribute;
27 void main()
28 {
29 gl_Position = inputAttribute;
30 }
31 );
32 }
33
Austin Kinrossaf875522014-08-25 21:06:07 -070034 std::string GenerateVaryingType(GLint vectorSize)
35 {
36 char varyingType[10];
37
38 if (vectorSize == 1)
39 {
40 sprintf(varyingType, "float");
41 }
42 else
43 {
44 sprintf(varyingType, "vec%d", vectorSize);
45 }
46
47 return std::string(varyingType);
48 }
49
50 std::string GenerateVectorVaryingDeclaration(GLint vectorSize, GLint arraySize, GLint id)
51 {
52 char buff[100];
53
54 if (arraySize == 1)
55 {
56 sprintf(buff, "varying %s v%d;\n", GenerateVaryingType(vectorSize).c_str(), id);
57 }
58 else
59 {
60 sprintf(buff, "varying %s v%d[%d];\n", GenerateVaryingType(vectorSize).c_str(), id, arraySize);
61 }
62
63 return std::string(buff);
64 }
65
66 std::string GenerateVectorVaryingSettingCode(GLint vectorSize, GLint arraySize, GLint id)
67 {
68 std::string returnString;
69 char buff[100];
70
71 if (arraySize == 1)
72 {
73 sprintf(buff, "\t v%d = %s(1.0);\n", id, GenerateVaryingType(vectorSize).c_str());
74 returnString += buff;
75 }
76 else
77 {
78 for (int i = 0; i < arraySize; i++)
79 {
80 sprintf(buff, "\t v%d[%d] = %s(1.0);\n", id, i, GenerateVaryingType(vectorSize).c_str());
81 returnString += buff;
82 }
83 }
84
85 return returnString;
86 }
87
88 std::string GenerateVectorVaryingUseCode(GLint arraySize, GLint id)
89 {
90 if (arraySize == 1)
91 {
92 char buff[100];
93 sprintf(buff, "v%d + ", id);
94 return std::string(buff);
95 }
96 else
97 {
98 std::string returnString;
99 for (int i = 0; i < arraySize; i++)
100 {
101 char buff[100];
102 sprintf(buff, "v%d[%d] + ", id, i);
103 returnString += buff;
104 }
105 return returnString;
106 }
107 }
108
109 void GenerateGLSLWithVaryings(GLint floatCount, GLint floatArrayCount, GLint vec2Count, GLint vec2ArrayCount, GLint vec3Count, GLint vec3ArrayCount, std::string* fragmentShader, std::string* vertexShader)
110 {
111 // Generate a string declaring the varyings, to share between the fragment shader and the vertex shader.
112 std::string varyingDeclaration;
113
114 unsigned int varyingCount = 0;
115
116 for (GLint i = 0; i < floatCount; i++)
117 {
118 varyingDeclaration += GenerateVectorVaryingDeclaration(1, 1, varyingCount);
119 varyingCount += 1;
120 }
121
122 for (GLint i = 0; i < floatArrayCount; i++)
123 {
124 varyingDeclaration += GenerateVectorVaryingDeclaration(1, 2, varyingCount);
125 varyingCount += 1;
126 }
127
128 for (GLint i = 0; i < vec2Count; i++)
129 {
130 varyingDeclaration += GenerateVectorVaryingDeclaration(2, 1, varyingCount);
131 varyingCount += 1;
132 }
133
134 for (GLint i = 0; i < vec2ArrayCount; i++)
135 {
136 varyingDeclaration += GenerateVectorVaryingDeclaration(2, 2, varyingCount);
137 varyingCount += 1;
138 }
139
140 for (GLint i = 0; i < vec3Count; i++)
141 {
142 varyingDeclaration += GenerateVectorVaryingDeclaration(3, 1, varyingCount);
143 varyingCount += 1;
144 }
145
146 for (GLint i = 0; i < vec3ArrayCount; i++)
147 {
148 varyingDeclaration += GenerateVectorVaryingDeclaration(3, 2, varyingCount);
149 varyingCount += 1;
150 }
151
152 // Generate the vertex shader
153 vertexShader->clear();
154 vertexShader->append(varyingDeclaration);
155 vertexShader->append("\nvoid main()\n{\n");
156
157 unsigned int currentVSVarying = 0;
158
159 for (GLint i = 0; i < floatCount; i++)
160 {
161 vertexShader->append(GenerateVectorVaryingSettingCode(1, 1, currentVSVarying));
162 currentVSVarying += 1;
163 }
164
165 for (GLint i = 0; i < floatArrayCount; i++)
166 {
167 vertexShader->append(GenerateVectorVaryingSettingCode(1, 2, currentVSVarying));
168 currentVSVarying += 1;
169 }
170
171 for (GLint i = 0; i < vec2Count; i++)
172 {
173 vertexShader->append(GenerateVectorVaryingSettingCode(2, 1, currentVSVarying));
174 currentVSVarying += 1;
175 }
176
177 for (GLint i = 0; i < vec2ArrayCount; i++)
178 {
179 vertexShader->append(GenerateVectorVaryingSettingCode(2, 2, currentVSVarying));
180 currentVSVarying += 1;
181 }
182
183 for (GLint i = 0; i < vec3Count; i++)
184 {
185 vertexShader->append(GenerateVectorVaryingSettingCode(3, 1, currentVSVarying));
186 currentVSVarying += 1;
187 }
188
189 for (GLint i = 0; i < vec3ArrayCount; i++)
190 {
191 vertexShader->append(GenerateVectorVaryingSettingCode(3, 2, currentVSVarying));
192 currentVSVarying += 1;
193 }
194
195 vertexShader->append("}\n");
196
197 // Generate the fragment shader
198 fragmentShader->clear();
199 fragmentShader->append("precision highp float;\n");
200 fragmentShader->append(varyingDeclaration);
201 fragmentShader->append("\nvoid main() \n{ \n\tvec4 retColor = vec4(0,0,0,0);\n");
202
203 unsigned int currentFSVarying = 0;
204
205 // Make use of the float varyings
206 fragmentShader->append("\tretColor += vec4(");
207
208 for (GLint i = 0; i < floatCount; i++)
209 {
210 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
211 currentFSVarying += 1;
212 }
213
214 for (GLint i = 0; i < floatArrayCount; i++)
215 {
216 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
217 currentFSVarying += 1;
218 }
219
220 fragmentShader->append("0.0, 0.0, 0.0, 0.0);\n");
221
222 // Make use of the vec2 varyings
223 fragmentShader->append("\tretColor += vec4(");
224
225 for (GLint i = 0; i < vec2Count; i++)
226 {
227 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
228 currentFSVarying += 1;
229 }
230
231 for (GLint i = 0; i < vec2ArrayCount; i++)
232 {
233 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
234 currentFSVarying += 1;
235 }
236
237 fragmentShader->append("vec2(0.0, 0.0), 0.0, 0.0);\n");
238
239 // Make use of the vec3 varyings
240 fragmentShader->append("\tretColor += vec4(");
241
242 for (GLint i = 0; i < vec3Count; i++)
243 {
244 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
245 currentFSVarying += 1;
246 }
247
248 for (GLint i = 0; i < vec3ArrayCount; i++)
249 {
250 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
251 currentFSVarying += 1;
252 }
253
254 fragmentShader->append("vec3(0.0, 0.0, 0.0), 0.0);\n");
255 fragmentShader->append("\tgl_FragColor = retColor;\n}");
256 }
257
Jamie Madill2bf8b372014-06-16 17:18:51 -0400258 std::string mSimpleVSSource;
Jamie Madill96509e42014-05-29 14:33:27 -0400259};
260
Austin Kinross18b931d2014-09-29 12:58:31 -0700261TYPED_TEST(GLSLTest, NamelessScopedStructs)
Jamie Madill96509e42014-05-29 14:33:27 -0400262{
Jamie Madillbfa91f42014-06-05 15:45:18 -0400263 const std::string fragmentShaderSource = SHADER_SOURCE
Jamie Madill96509e42014-05-29 14:33:27 -0400264 (
Jamie Madillbfa91f42014-06-05 15:45:18 -0400265 precision mediump float;
266
Jamie Madill96509e42014-05-29 14:33:27 -0400267 void main()
268 {
Jamie Madillbfa91f42014-06-05 15:45:18 -0400269 struct
270 {
271 float q;
272 } b;
273
274 gl_FragColor = vec4(1, 0, 0, 1);
275 gl_FragColor.a += b.q;
Jamie Madill96509e42014-05-29 14:33:27 -0400276 }
277 );
278
Jamie Madill5599c8f2014-08-26 13:16:39 -0400279 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -0400280 EXPECT_NE(0u, program);
281}
Austin Kinross18b931d2014-09-29 12:58:31 -0700282
283TYPED_TEST(GLSLTest, ScopedStructsOrderBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -0400284{
285 const std::string fragmentShaderSource = SHADER_SOURCE
286 (
287 precision mediump float;
288
289 struct T
290 {
291 float f;
292 };
293
294 void main()
295 {
296 T a;
297
298 struct T
299 {
300 float q;
301 };
302
303 T b;
304
305 gl_FragColor = vec4(1, 0, 0, 1);
306 gl_FragColor.a += a.f;
307 gl_FragColor.a += b.q;
308 }
309 );
310
Jamie Madill5599c8f2014-08-26 13:16:39 -0400311 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -0400312 EXPECT_NE(0u, program);
313}
314
Austin Kinross18b931d2014-09-29 12:58:31 -0700315TYPED_TEST(GLSLTest, ScopedStructsBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -0400316{
Jamie Madill96509e42014-05-29 14:33:27 -0400317 const std::string fragmentShaderSource = SHADER_SOURCE
318 (
319 precision mediump float;
320
321 struct T_0
322 {
323 float f;
324 };
325
326 void main()
327 {
328 gl_FragColor = vec4(1, 0, 0, 1);
329
330 struct T
331 {
332 vec2 v;
333 };
334
335 T_0 a;
336 T b;
337
338 gl_FragColor.a += a.f;
339 gl_FragColor.a += b.v.x;
340 }
341 );
342
Jamie Madill5599c8f2014-08-26 13:16:39 -0400343 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madill2bf8b372014-06-16 17:18:51 -0400344 EXPECT_NE(0u, program);
345}
346
Austin Kinross18b931d2014-09-29 12:58:31 -0700347TYPED_TEST(GLSLTest, DxPositionBug)
Jamie Madill2bf8b372014-06-16 17:18:51 -0400348{
349 const std::string &vertexShaderSource = SHADER_SOURCE
350 (
351 attribute vec4 inputAttribute;
352 varying float dx_Position;
353 void main()
354 {
355 gl_Position = vec4(inputAttribute);
356 dx_Position = 0.0;
357 }
358 );
359
360 const std::string &fragmentShaderSource = SHADER_SOURCE
361 (
362 precision mediump float;
363
364 varying float dx_Position;
365
366 void main()
367 {
368 gl_FragColor = vec4(dx_Position, 0, 0, 1);
369 }
370 );
371
Jamie Madill5599c8f2014-08-26 13:16:39 -0400372 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill96509e42014-05-29 14:33:27 -0400373 EXPECT_NE(0u, program);
374}
Jamie Madill4836d222014-07-24 06:55:51 -0400375
Austin Kinross18b931d2014-09-29 12:58:31 -0700376TYPED_TEST(GLSLTest, ElseIfRewriting)
Jamie Madill4836d222014-07-24 06:55:51 -0400377{
378 const std::string &vertexShaderSource =
379 "attribute vec4 a_position;\n"
380 "varying float v;\n"
381 "void main() {\n"
382 " gl_Position = a_position;\n"
383 " v = 1.0;\n"
384 " if (a_position.x <= 0.5) {\n"
385 " v = 0.0;\n"
386 " } else if (a_position.x >= 0.5) {\n"
387 " v = 2.0;\n"
388 " }\n"
389 "}\n";
390
391 const std::string &fragmentShaderSource =
392 "precision highp float;\n"
393 "varying float v;\n"
394 "void main() {\n"
395 " vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\n"
396 " if (v >= 1.0) color = vec4(0.0, 1.0, 0.0, 1.0);\n"
397 " if (v >= 2.0) color = vec4(0.0, 0.0, 1.0, 1.0);\n"
398 " gl_FragColor = color;\n"
399 "}\n";
400
Jamie Madill5599c8f2014-08-26 13:16:39 -0400401 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400402 ASSERT_NE(0u, program);
403
404 drawQuad(program, "a_position", 0.5f);
405 swapBuffers();
406
407 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
408 EXPECT_PIXEL_EQ(getWindowWidth()-1, 0, 0, 255, 0, 255);
409}
410
Austin Kinross18b931d2014-09-29 12:58:31 -0700411TYPED_TEST(GLSLTest, TwoElseIfRewriting)
Jamie Madill4836d222014-07-24 06:55:51 -0400412{
413 const std::string &vertexShaderSource =
414 "attribute vec4 a_position;\n"
415 "varying float v;\n"
416 "void main() {\n"
417 " gl_Position = a_position;\n"
Jamie Madill778d5272014-08-04 13:13:25 -0400418 " if (a_position.x == 0.0) {\n"
Jamie Madill4836d222014-07-24 06:55:51 -0400419 " v = 1.0;\n"
420 " } else if (a_position.x > 0.5) {\n"
421 " v = 0.0;\n"
422 " } else if (a_position.x > 0.75) {\n"
423 " v = 0.5;\n"
424 " }\n"
425 "}\n";
426
427 const std::string &fragmentShaderSource =
428 "precision highp float;\n"
429 "varying float v;\n"
430 "void main() {\n"
431 " gl_FragColor = vec4(v, 0.0, 0.0, 1.0);\n"
432 "}\n";
433
Jamie Madill5599c8f2014-08-26 13:16:39 -0400434 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400435 EXPECT_NE(0u, program);
436}
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400437
Austin Kinross18b931d2014-09-29 12:58:31 -0700438TYPED_TEST(GLSLTest, InvariantVaryingOut)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400439{
440 const std::string fragmentShaderSource = SHADER_SOURCE
441 (
442 precision mediump float;
443 varying float v_varying;
444 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
445 );
446
447 const std::string vertexShaderSource = SHADER_SOURCE
448 (
449 attribute vec4 a_position;
450 invariant varying float v_varying;
451 void main() { v_varying = a_position.x; gl_Position = a_position; }
452 );
453
Jamie Madill5599c8f2014-08-26 13:16:39 -0400454 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400455 EXPECT_NE(0u, program);
456}
457
Austin Kinross18b931d2014-09-29 12:58:31 -0700458TYPED_TEST(GLSLTest, FrontFacingAndVarying)
Jamie Madille6256f82014-09-17 10:31:15 -0400459{
460 const std::string vertexShaderSource = SHADER_SOURCE
461 (
462 attribute vec4 a_position;
463 varying float v_varying;
464 void main()
465 {
466 v_varying = a_position.x;
467 gl_Position = a_position;
468 }
469 );
470
471 const std::string fragmentShaderSource = SHADER_SOURCE
472 (
473 precision mediump float;
474 varying float v_varying;
475 void main()
476 {
477 vec4 c;
478
479 if (gl_FrontFacing)
480 {
481 c = vec4(v_varying, 0, 0, 1.0);
482 }
483 else
484 {
485 c = vec4(0, v_varying, 0, 1.0);
486 }
487 gl_FragColor = c;
488 }
489 );
490
491 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
492 EXPECT_NE(0u, program);
493}
494
Austin Kinross18b931d2014-09-29 12:58:31 -0700495TYPED_TEST(GLSLTest, InvariantVaryingIn)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400496{
497 const std::string fragmentShaderSource = SHADER_SOURCE
498 (
499 precision mediump float;
500 invariant varying float v_varying;
501 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
502 );
503
504 const std::string vertexShaderSource = SHADER_SOURCE
505 (
506 attribute vec4 a_position;
507 varying float v_varying;
508 void main() { v_varying = a_position.x; gl_Position = a_position; }
509 );
510
Jamie Madill5599c8f2014-08-26 13:16:39 -0400511 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400512 EXPECT_NE(0u, program);
513}
514
Austin Kinross18b931d2014-09-29 12:58:31 -0700515TYPED_TEST(GLSLTest, InvariantVaryingBoth)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400516{
517 const std::string fragmentShaderSource = SHADER_SOURCE
518 (
519 precision mediump float;
520 invariant varying float v_varying;
521 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
522 );
523
524 const std::string vertexShaderSource = SHADER_SOURCE
525 (
526 attribute vec4 a_position;
527 invariant varying float v_varying;
528 void main() { v_varying = a_position.x; gl_Position = a_position; }
529 );
530
Jamie Madill5599c8f2014-08-26 13:16:39 -0400531 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400532 EXPECT_NE(0u, program);
533}
534
Austin Kinross18b931d2014-09-29 12:58:31 -0700535TYPED_TEST(GLSLTest, InvariantGLPosition)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400536{
537 const std::string fragmentShaderSource = SHADER_SOURCE
538 (
539 precision mediump float;
540 varying float v_varying;
541 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
542 );
543
544 const std::string vertexShaderSource = SHADER_SOURCE
545 (
546 attribute vec4 a_position;
547 invariant gl_Position;
548 varying float v_varying;
549 void main() { v_varying = a_position.x; gl_Position = a_position; }
550 );
551
Jamie Madill5599c8f2014-08-26 13:16:39 -0400552 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400553 EXPECT_NE(0u, program);
554}
555
Austin Kinross18b931d2014-09-29 12:58:31 -0700556TYPED_TEST(GLSLTest, InvariantAll)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400557{
558 const std::string fragmentShaderSource = SHADER_SOURCE
559 (
560 precision mediump float;
561 varying float v_varying;
562 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
563 );
564
565 const std::string vertexShaderSource =
566 "#pragma STDGL invariant(all)\n"
567 "attribute vec4 a_position;\n"
568 "varying float v_varying;\n"
569 "void main() { v_varying = a_position.x; gl_Position = a_position; }\n";
570
Jamie Madill5599c8f2014-08-26 13:16:39 -0400571 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400572 EXPECT_NE(0u, program);
573}
Austin Kinrossaf875522014-08-25 21:06:07 -0700574
Austin Kinross18b931d2014-09-29 12:58:31 -0700575TYPED_TEST(GLSLTest, MaxVaryingVec3)
Austin Kinrossaf875522014-08-25 21:06:07 -0700576{
577 GLint maxVaryings = 0;
578 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
579
580 std::string fragmentShaderSource;
581 std::string vertexShaderSource;
582
583 GenerateGLSLWithVaryings(0, 0, 0, 0, maxVaryings, 0, &fragmentShaderSource, &vertexShaderSource);
584
585 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
586 EXPECT_NE(0u, program);
587}
588
Austin Kinross18b931d2014-09-29 12:58:31 -0700589TYPED_TEST(GLSLTest, MaxVaryingVec3Array)
Austin Kinrossaf875522014-08-25 21:06:07 -0700590{
591 GLint maxVaryings = 0;
592 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
593
594 std::string fragmentShaderSource;
595 std::string vertexShaderSource;
596
597 GenerateGLSLWithVaryings(0, 0, 0, 0, 0, maxVaryings / 2, &fragmentShaderSource, &vertexShaderSource);
598
599 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
600 EXPECT_NE(0u, program);
601}
602
Jamie Madillbee59e02014-10-02 10:44:18 -0400603// Disabled because of a failure in D3D9
604TYPED_TEST(GLSLTest, DISABLED_MaxVaryingVec3AndOneFloat)
Austin Kinrossaf875522014-08-25 21:06:07 -0700605{
606 GLint maxVaryings = 0;
607 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
608
609 std::string fragmentShaderSource;
610 std::string vertexShaderSource;
611
612 GenerateGLSLWithVaryings(1, 0, 0, 0, maxVaryings, 0, &fragmentShaderSource, &vertexShaderSource);
613
614 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
615 EXPECT_NE(0u, program);
616}
617
Jamie Madillbee59e02014-10-02 10:44:18 -0400618// Disabled because of a failure in D3D9
619TYPED_TEST(GLSLTest, DISABLED_MaxVaryingVec3ArrayAndOneFloatArray)
Austin Kinrossaf875522014-08-25 21:06:07 -0700620{
621 GLint maxVaryings = 0;
622 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
623
624 std::string fragmentShaderSource;
625 std::string vertexShaderSource;
626
627 GenerateGLSLWithVaryings(0, 1, 0, 0, 0, maxVaryings / 2, &fragmentShaderSource, &vertexShaderSource);
628
629 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
630 EXPECT_NE(0u, program);
631}
632
Jamie Madillbee59e02014-10-02 10:44:18 -0400633// Disabled because of a failure in D3D9
634TYPED_TEST(GLSLTest, DISABLED_TwiceMaxVaryingVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700635{
636 GLint maxVaryings = 0;
637 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
638
639 std::string fragmentShaderSource;
640 std::string vertexShaderSource;
641
642 GenerateGLSLWithVaryings(0, 0, 2 * maxVaryings, 0, 0, 0, &fragmentShaderSource, &vertexShaderSource);
643
644 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
645 EXPECT_NE(0u, program);
646}
647
Jamie Madillbee59e02014-10-02 10:44:18 -0400648// Disabled because of a failure in D3D9
649TYPED_TEST(GLSLTest, DISABLED_MaxVaryingVec2Arrays)
Austin Kinrossaf875522014-08-25 21:06:07 -0700650{
651 GLint maxVaryings = 0;
652 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
653
654 std::string fragmentShaderSource;
655 std::string vertexShaderSource;
656
657 GenerateGLSLWithVaryings(0, 0, 0, maxVaryings, 0, 0, &fragmentShaderSource, &vertexShaderSource);
658
659 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
660 EXPECT_NE(0u, program);
661}
662
Austin Kinross18b931d2014-09-29 12:58:31 -0700663TYPED_TEST(GLSLTest, MaxPlusOneVaryingVec3)
Austin Kinrossaf875522014-08-25 21:06:07 -0700664{
665 GLint maxVaryings = 0;
666 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
667
668 std::string fragmentShaderSource;
669 std::string vertexShaderSource;
670
671 GenerateGLSLWithVaryings(0, 0, 0, 0, maxVaryings + 1, 0, &fragmentShaderSource, &vertexShaderSource);
672
673 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
674 EXPECT_EQ(0u, program);
675}
676
Austin Kinross18b931d2014-09-29 12:58:31 -0700677TYPED_TEST(GLSLTest, MaxPlusOneVaryingVec3Array)
Austin Kinrossaf875522014-08-25 21:06:07 -0700678{
679 GLint maxVaryings = 0;
680 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
681
682 std::string fragmentShaderSource;
683 std::string vertexShaderSource;
684
685 GenerateGLSLWithVaryings(0, 0, 0, 0, 0, maxVaryings / 2 + 1, &fragmentShaderSource, &vertexShaderSource);
686
687 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
688 EXPECT_EQ(0u, program);
689}
690
Austin Kinross18b931d2014-09-29 12:58:31 -0700691TYPED_TEST(GLSLTest, MaxVaryingVec3AndOneVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700692{
693 GLint maxVaryings = 0;
694 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
695
696 std::string fragmentShaderSource;
697 std::string vertexShaderSource;
698
699 GenerateGLSLWithVaryings(0, 0, 1, 0, maxVaryings, 0, &fragmentShaderSource, &vertexShaderSource);
700
701 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
702 EXPECT_EQ(0u, program);
703}
704
Austin Kinross18b931d2014-09-29 12:58:31 -0700705TYPED_TEST(GLSLTest, MaxPlusOneVaryingVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700706{
707 GLint maxVaryings = 0;
708 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
709
710 std::string fragmentShaderSource;
711 std::string vertexShaderSource;
712
713 GenerateGLSLWithVaryings(0, 0, 2 * maxVaryings + 1, 0, 0, 0, &fragmentShaderSource, &vertexShaderSource);
714
715 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
716 EXPECT_EQ(0u, program);
717}
718
Austin Kinross18b931d2014-09-29 12:58:31 -0700719TYPED_TEST(GLSLTest, MaxVaryingVec3ArrayAndMaxPlusOneFloatArray)
Austin Kinrossaf875522014-08-25 21:06:07 -0700720{
721 GLint maxVaryings = 0;
722 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
723
724 std::string fragmentShaderSource;
725 std::string vertexShaderSource;
726
727 GenerateGLSLWithVaryings(0, maxVaryings / 2 + 1, 0, 0, 0, maxVaryings / 2, &fragmentShaderSource, &vertexShaderSource);
728
729 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
730 EXPECT_EQ(0u, program);
731}
Geoff Langf60fab62014-11-24 11:21:20 -0500732
733// Verify shader source with a fixed length that is less than the null-terminated length will compile.
734TYPED_TEST(GLSLTest, FixedShaderLength)
735{
736 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
737
738 const std::string appendGarbage = "abcasdfasdfasdfasdfasdf";
739 const std::string source = "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" + appendGarbage;
740 const char *sourceArray[1] = { source.c_str() };
741 GLint lengths[1] = { source.length() - appendGarbage.length() };
742 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
743 glCompileShader(shader);
744
745 GLint compileResult;
746 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
747 EXPECT_NE(compileResult, 0);
748}
749
750// Verify that a negative shader source length is treated as a null-terminated length.
751TYPED_TEST(GLSLTest, NegativeShaderLength)
752{
753 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
754
755 const char *sourceArray[1] = { "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" };
756 GLint lengths[1] = { -10 };
757 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
758 glCompileShader(shader);
759
760 GLint compileResult;
761 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
762 EXPECT_NE(compileResult, 0);
763}
764
765// Verify that a length array with mixed positive and negative values compiles.
766TYPED_TEST(GLSLTest, MixedShaderLengths)
767{
768 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
769
770 const char *sourceArray[] =
771 {
772 "void main()",
773 "{",
774 " gl_FragColor = vec4(0, 0, 0, 0);",
775 "}",
776 };
777 GLint lengths[] =
778 {
779 -10,
780 1,
781 std::strlen(sourceArray[2]),
782 -1,
783 };
784 ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths));
785
786 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
787 glCompileShader(shader);
788
789 GLint compileResult;
790 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
791 EXPECT_NE(compileResult, 0);
792}
793
794// Verify that zero-length shader source does not affect shader compilation.
795TYPED_TEST(GLSLTest, ZeroShaderLength)
796{
797 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
798
799 const char *sourceArray[] =
800 {
801 "adfasdf",
802 "34534",
803 "void main() { gl_FragColor = vec4(0, 0, 0, 0); }",
804 "",
805 "asdfasdfsdsdf",
806 };
807 GLint lengths[] =
808 {
809 0,
810 0,
811 -1,
812 0,
813 0,
814 };
815 ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths));
816
817 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
818 glCompileShader(shader);
819
820 GLint compileResult;
821 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
822 EXPECT_NE(compileResult, 0);
823}
Jamie Madill21c1e452014-12-29 11:33:41 -0500824
825// Tests that bad index expressions don't crash ANGLE's translator.
826// https://code.google.com/p/angleproject/issues/detail?id=857
827TYPED_TEST(GLSLTest, BadIndexBug)
828{
829 const std::string &fragmentShaderSourceVec =
830 "precision mediump float;\n"
831 "uniform vec4 uniformVec;\n"
832 "void main()\n"
833 "{\n"
834 " gl_FragColor = vec4(uniformVec[int()]);\n"
835 "}";
836
837 GLuint shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceVec);
838 EXPECT_EQ(0u, shader);
839
840 if (shader != 0)
841 {
842 glDeleteShader(shader);
843 }
844
845 const std::string &fragmentShaderSourceMat =
846 "precision mediump float;\n"
847 "uniform mat4 uniformMat;\n"
848 "void main()\n"
849 "{\n"
850 " gl_FragColor = vec4(uniformMat[int()]);\n"
851 "}";
852
853 shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceMat);
854 EXPECT_EQ(0u, shader);
855
856 if (shader != 0)
857 {
858 glDeleteShader(shader);
859 }
860
861 const std::string &fragmentShaderSourceArray =
862 "precision mediump float;\n"
863 "uniform vec4 uniformArray;\n"
864 "void main()\n"
865 "{\n"
866 " gl_FragColor = vec4(uniformArray[int()]);\n"
867 "}";
868
869 shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceArray);
870 EXPECT_EQ(0u, shader);
871
872 if (shader != 0)
873 {
874 glDeleteShader(shader);
875 }
Jamie Madill37997142015-01-28 10:06:34 -0500876}
877
878// Tests that using a global static initialized from a varying works as expected.
879// See: https://code.google.com/p/angleproject/issues/detail?id=878
880TYPED_TEST(GLSLTest, GlobalStaticAndVarying)
881{
882 const std::string &vertexShaderSource =
883 "attribute vec4 a_position;\n"
884 "varying float v;\n"
885 "void main() {\n"
886 " gl_Position = a_position;\n"
887 " v = 1.0;\n"
888 "}\n";
889
890 const std::string &fragmentShaderSource =
891 "precision highp float;\n"
892 "varying float v;\n"
893 "float x = v;"
894 "float global_v = x;"
895 "void main() {\n"
896 " gl_FragColor = vec4(global_v, 0.0, 0.0, 1.0);\n"
897 "}\n";
898
899 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
900 ASSERT_NE(0u, program);
901
902 drawQuad(program, "a_position", 0.5f);
903 swapBuffers();
904
905 ASSERT_GL_NO_ERROR();
906 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
907}