blob: 9178e1bae292241c161c091b90a7a0b16ad3c9e0 [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
Gregoire Payen de La Garanderieb3dced22015-01-12 14:54:55 +0000261// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
262ANGLE_TYPED_TEST_CASE(GLSLTest_ES3, ES3_D3D11);
263
264template<typename T>
265class GLSLTest_ES3 : public GLSLTest<T>
266{
267};
268
Austin Kinross18b931d2014-09-29 12:58:31 -0700269TYPED_TEST(GLSLTest, NamelessScopedStructs)
Jamie Madill96509e42014-05-29 14:33:27 -0400270{
Jamie Madillbfa91f42014-06-05 15:45:18 -0400271 const std::string fragmentShaderSource = SHADER_SOURCE
Jamie Madill96509e42014-05-29 14:33:27 -0400272 (
Jamie Madillbfa91f42014-06-05 15:45:18 -0400273 precision mediump float;
274
Jamie Madill96509e42014-05-29 14:33:27 -0400275 void main()
276 {
Jamie Madillbfa91f42014-06-05 15:45:18 -0400277 struct
278 {
279 float q;
280 } b;
281
282 gl_FragColor = vec4(1, 0, 0, 1);
283 gl_FragColor.a += b.q;
Jamie Madill96509e42014-05-29 14:33:27 -0400284 }
285 );
286
Jamie Madill5599c8f2014-08-26 13:16:39 -0400287 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -0400288 EXPECT_NE(0u, program);
289}
Austin Kinross18b931d2014-09-29 12:58:31 -0700290
291TYPED_TEST(GLSLTest, ScopedStructsOrderBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -0400292{
293 const std::string fragmentShaderSource = SHADER_SOURCE
294 (
295 precision mediump float;
296
297 struct T
298 {
299 float f;
300 };
301
302 void main()
303 {
304 T a;
305
306 struct T
307 {
308 float q;
309 };
310
311 T b;
312
313 gl_FragColor = vec4(1, 0, 0, 1);
314 gl_FragColor.a += a.f;
315 gl_FragColor.a += b.q;
316 }
317 );
318
Jamie Madill5599c8f2014-08-26 13:16:39 -0400319 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -0400320 EXPECT_NE(0u, program);
321}
322
Austin Kinross18b931d2014-09-29 12:58:31 -0700323TYPED_TEST(GLSLTest, ScopedStructsBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -0400324{
Jamie Madill96509e42014-05-29 14:33:27 -0400325 const std::string fragmentShaderSource = SHADER_SOURCE
326 (
327 precision mediump float;
328
329 struct T_0
330 {
331 float f;
332 };
333
334 void main()
335 {
336 gl_FragColor = vec4(1, 0, 0, 1);
337
338 struct T
339 {
340 vec2 v;
341 };
342
343 T_0 a;
344 T b;
345
346 gl_FragColor.a += a.f;
347 gl_FragColor.a += b.v.x;
348 }
349 );
350
Jamie Madill5599c8f2014-08-26 13:16:39 -0400351 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madill2bf8b372014-06-16 17:18:51 -0400352 EXPECT_NE(0u, program);
353}
354
Austin Kinross18b931d2014-09-29 12:58:31 -0700355TYPED_TEST(GLSLTest, DxPositionBug)
Jamie Madill2bf8b372014-06-16 17:18:51 -0400356{
357 const std::string &vertexShaderSource = SHADER_SOURCE
358 (
359 attribute vec4 inputAttribute;
360 varying float dx_Position;
361 void main()
362 {
363 gl_Position = vec4(inputAttribute);
364 dx_Position = 0.0;
365 }
366 );
367
368 const std::string &fragmentShaderSource = SHADER_SOURCE
369 (
370 precision mediump float;
371
372 varying float dx_Position;
373
374 void main()
375 {
376 gl_FragColor = vec4(dx_Position, 0, 0, 1);
377 }
378 );
379
Jamie Madill5599c8f2014-08-26 13:16:39 -0400380 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill96509e42014-05-29 14:33:27 -0400381 EXPECT_NE(0u, program);
382}
Jamie Madill4836d222014-07-24 06:55:51 -0400383
Austin Kinross18b931d2014-09-29 12:58:31 -0700384TYPED_TEST(GLSLTest, ElseIfRewriting)
Jamie Madill4836d222014-07-24 06:55:51 -0400385{
386 const std::string &vertexShaderSource =
387 "attribute vec4 a_position;\n"
388 "varying float v;\n"
389 "void main() {\n"
390 " gl_Position = a_position;\n"
391 " v = 1.0;\n"
392 " if (a_position.x <= 0.5) {\n"
393 " v = 0.0;\n"
394 " } else if (a_position.x >= 0.5) {\n"
395 " v = 2.0;\n"
396 " }\n"
397 "}\n";
398
399 const std::string &fragmentShaderSource =
400 "precision highp float;\n"
401 "varying float v;\n"
402 "void main() {\n"
403 " vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\n"
404 " if (v >= 1.0) color = vec4(0.0, 1.0, 0.0, 1.0);\n"
405 " if (v >= 2.0) color = vec4(0.0, 0.0, 1.0, 1.0);\n"
406 " gl_FragColor = color;\n"
407 "}\n";
408
Jamie Madill5599c8f2014-08-26 13:16:39 -0400409 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400410 ASSERT_NE(0u, program);
411
412 drawQuad(program, "a_position", 0.5f);
413 swapBuffers();
414
415 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
416 EXPECT_PIXEL_EQ(getWindowWidth()-1, 0, 0, 255, 0, 255);
417}
418
Austin Kinross18b931d2014-09-29 12:58:31 -0700419TYPED_TEST(GLSLTest, TwoElseIfRewriting)
Jamie Madill4836d222014-07-24 06:55:51 -0400420{
421 const std::string &vertexShaderSource =
422 "attribute vec4 a_position;\n"
423 "varying float v;\n"
424 "void main() {\n"
425 " gl_Position = a_position;\n"
Jamie Madill778d5272014-08-04 13:13:25 -0400426 " if (a_position.x == 0.0) {\n"
Jamie Madill4836d222014-07-24 06:55:51 -0400427 " v = 1.0;\n"
428 " } else if (a_position.x > 0.5) {\n"
429 " v = 0.0;\n"
430 " } else if (a_position.x > 0.75) {\n"
431 " v = 0.5;\n"
432 " }\n"
433 "}\n";
434
435 const std::string &fragmentShaderSource =
436 "precision highp float;\n"
437 "varying float v;\n"
438 "void main() {\n"
439 " gl_FragColor = vec4(v, 0.0, 0.0, 1.0);\n"
440 "}\n";
441
Jamie Madill5599c8f2014-08-26 13:16:39 -0400442 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400443 EXPECT_NE(0u, program);
444}
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400445
Austin Kinross18b931d2014-09-29 12:58:31 -0700446TYPED_TEST(GLSLTest, InvariantVaryingOut)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400447{
448 const std::string fragmentShaderSource = SHADER_SOURCE
449 (
450 precision mediump float;
451 varying float v_varying;
452 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
453 );
454
455 const std::string vertexShaderSource = SHADER_SOURCE
456 (
457 attribute vec4 a_position;
458 invariant varying float v_varying;
459 void main() { v_varying = a_position.x; gl_Position = a_position; }
460 );
461
Jamie Madill5599c8f2014-08-26 13:16:39 -0400462 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400463 EXPECT_NE(0u, program);
464}
465
Austin Kinross18b931d2014-09-29 12:58:31 -0700466TYPED_TEST(GLSLTest, FrontFacingAndVarying)
Jamie Madille6256f82014-09-17 10:31:15 -0400467{
468 const std::string vertexShaderSource = SHADER_SOURCE
469 (
470 attribute vec4 a_position;
471 varying float v_varying;
472 void main()
473 {
474 v_varying = a_position.x;
475 gl_Position = a_position;
476 }
477 );
478
479 const std::string fragmentShaderSource = SHADER_SOURCE
480 (
481 precision mediump float;
482 varying float v_varying;
483 void main()
484 {
485 vec4 c;
486
487 if (gl_FrontFacing)
488 {
489 c = vec4(v_varying, 0, 0, 1.0);
490 }
491 else
492 {
493 c = vec4(0, v_varying, 0, 1.0);
494 }
495 gl_FragColor = c;
496 }
497 );
498
499 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
500 EXPECT_NE(0u, program);
501}
502
Austin Kinross18b931d2014-09-29 12:58:31 -0700503TYPED_TEST(GLSLTest, InvariantVaryingIn)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400504{
505 const std::string fragmentShaderSource = SHADER_SOURCE
506 (
507 precision mediump float;
508 invariant varying float v_varying;
509 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
510 );
511
512 const std::string vertexShaderSource = SHADER_SOURCE
513 (
514 attribute vec4 a_position;
515 varying float v_varying;
516 void main() { v_varying = a_position.x; gl_Position = a_position; }
517 );
518
Jamie Madill5599c8f2014-08-26 13:16:39 -0400519 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400520 EXPECT_NE(0u, program);
521}
522
Austin Kinross18b931d2014-09-29 12:58:31 -0700523TYPED_TEST(GLSLTest, InvariantVaryingBoth)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400524{
525 const std::string fragmentShaderSource = SHADER_SOURCE
526 (
527 precision mediump float;
528 invariant varying float v_varying;
529 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
530 );
531
532 const std::string vertexShaderSource = SHADER_SOURCE
533 (
534 attribute vec4 a_position;
535 invariant varying float v_varying;
536 void main() { v_varying = a_position.x; gl_Position = a_position; }
537 );
538
Jamie Madill5599c8f2014-08-26 13:16:39 -0400539 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400540 EXPECT_NE(0u, program);
541}
542
Austin Kinross18b931d2014-09-29 12:58:31 -0700543TYPED_TEST(GLSLTest, InvariantGLPosition)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400544{
545 const std::string fragmentShaderSource = SHADER_SOURCE
546 (
547 precision mediump float;
548 varying float v_varying;
549 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
550 );
551
552 const std::string vertexShaderSource = SHADER_SOURCE
553 (
554 attribute vec4 a_position;
555 invariant gl_Position;
556 varying float v_varying;
557 void main() { v_varying = a_position.x; gl_Position = a_position; }
558 );
559
Jamie Madill5599c8f2014-08-26 13:16:39 -0400560 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400561 EXPECT_NE(0u, program);
562}
563
Austin Kinross18b931d2014-09-29 12:58:31 -0700564TYPED_TEST(GLSLTest, InvariantAll)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400565{
566 const std::string fragmentShaderSource = SHADER_SOURCE
567 (
568 precision mediump float;
569 varying float v_varying;
570 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
571 );
572
573 const std::string vertexShaderSource =
574 "#pragma STDGL invariant(all)\n"
575 "attribute vec4 a_position;\n"
576 "varying float v_varying;\n"
577 "void main() { v_varying = a_position.x; gl_Position = a_position; }\n";
578
Jamie Madill5599c8f2014-08-26 13:16:39 -0400579 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400580 EXPECT_NE(0u, program);
581}
Austin Kinrossaf875522014-08-25 21:06:07 -0700582
Austin Kinross18b931d2014-09-29 12:58:31 -0700583TYPED_TEST(GLSLTest, MaxVaryingVec3)
Austin Kinrossaf875522014-08-25 21:06:07 -0700584{
585 GLint maxVaryings = 0;
586 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
587
588 std::string fragmentShaderSource;
589 std::string vertexShaderSource;
590
591 GenerateGLSLWithVaryings(0, 0, 0, 0, maxVaryings, 0, &fragmentShaderSource, &vertexShaderSource);
592
593 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
594 EXPECT_NE(0u, program);
595}
596
Austin Kinross18b931d2014-09-29 12:58:31 -0700597TYPED_TEST(GLSLTest, MaxVaryingVec3Array)
Austin Kinrossaf875522014-08-25 21:06:07 -0700598{
599 GLint maxVaryings = 0;
600 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
601
602 std::string fragmentShaderSource;
603 std::string vertexShaderSource;
604
605 GenerateGLSLWithVaryings(0, 0, 0, 0, 0, maxVaryings / 2, &fragmentShaderSource, &vertexShaderSource);
606
607 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
608 EXPECT_NE(0u, program);
609}
610
Jamie Madillbee59e02014-10-02 10:44:18 -0400611// Disabled because of a failure in D3D9
612TYPED_TEST(GLSLTest, DISABLED_MaxVaryingVec3AndOneFloat)
Austin Kinrossaf875522014-08-25 21:06:07 -0700613{
614 GLint maxVaryings = 0;
615 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
616
617 std::string fragmentShaderSource;
618 std::string vertexShaderSource;
619
620 GenerateGLSLWithVaryings(1, 0, 0, 0, maxVaryings, 0, &fragmentShaderSource, &vertexShaderSource);
621
622 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
623 EXPECT_NE(0u, program);
624}
625
Jamie Madillbee59e02014-10-02 10:44:18 -0400626// Disabled because of a failure in D3D9
627TYPED_TEST(GLSLTest, DISABLED_MaxVaryingVec3ArrayAndOneFloatArray)
Austin Kinrossaf875522014-08-25 21:06:07 -0700628{
629 GLint maxVaryings = 0;
630 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
631
632 std::string fragmentShaderSource;
633 std::string vertexShaderSource;
634
635 GenerateGLSLWithVaryings(0, 1, 0, 0, 0, maxVaryings / 2, &fragmentShaderSource, &vertexShaderSource);
636
637 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
638 EXPECT_NE(0u, program);
639}
640
Jamie Madillbee59e02014-10-02 10:44:18 -0400641// Disabled because of a failure in D3D9
642TYPED_TEST(GLSLTest, DISABLED_TwiceMaxVaryingVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700643{
644 GLint maxVaryings = 0;
645 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
646
647 std::string fragmentShaderSource;
648 std::string vertexShaderSource;
649
650 GenerateGLSLWithVaryings(0, 0, 2 * maxVaryings, 0, 0, 0, &fragmentShaderSource, &vertexShaderSource);
651
652 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
653 EXPECT_NE(0u, program);
654}
655
Jamie Madillbee59e02014-10-02 10:44:18 -0400656// Disabled because of a failure in D3D9
657TYPED_TEST(GLSLTest, DISABLED_MaxVaryingVec2Arrays)
Austin Kinrossaf875522014-08-25 21:06:07 -0700658{
659 GLint maxVaryings = 0;
660 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
661
662 std::string fragmentShaderSource;
663 std::string vertexShaderSource;
664
665 GenerateGLSLWithVaryings(0, 0, 0, maxVaryings, 0, 0, &fragmentShaderSource, &vertexShaderSource);
666
667 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
668 EXPECT_NE(0u, program);
669}
670
Austin Kinross18b931d2014-09-29 12:58:31 -0700671TYPED_TEST(GLSLTest, MaxPlusOneVaryingVec3)
Austin Kinrossaf875522014-08-25 21:06:07 -0700672{
673 GLint maxVaryings = 0;
674 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
675
676 std::string fragmentShaderSource;
677 std::string vertexShaderSource;
678
679 GenerateGLSLWithVaryings(0, 0, 0, 0, maxVaryings + 1, 0, &fragmentShaderSource, &vertexShaderSource);
680
681 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
682 EXPECT_EQ(0u, program);
683}
684
Austin Kinross18b931d2014-09-29 12:58:31 -0700685TYPED_TEST(GLSLTest, MaxPlusOneVaryingVec3Array)
Austin Kinrossaf875522014-08-25 21:06:07 -0700686{
687 GLint maxVaryings = 0;
688 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
689
690 std::string fragmentShaderSource;
691 std::string vertexShaderSource;
692
693 GenerateGLSLWithVaryings(0, 0, 0, 0, 0, maxVaryings / 2 + 1, &fragmentShaderSource, &vertexShaderSource);
694
695 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
696 EXPECT_EQ(0u, program);
697}
698
Austin Kinross18b931d2014-09-29 12:58:31 -0700699TYPED_TEST(GLSLTest, MaxVaryingVec3AndOneVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700700{
701 GLint maxVaryings = 0;
702 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
703
704 std::string fragmentShaderSource;
705 std::string vertexShaderSource;
706
707 GenerateGLSLWithVaryings(0, 0, 1, 0, maxVaryings, 0, &fragmentShaderSource, &vertexShaderSource);
708
709 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
710 EXPECT_EQ(0u, program);
711}
712
Austin Kinross18b931d2014-09-29 12:58:31 -0700713TYPED_TEST(GLSLTest, MaxPlusOneVaryingVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700714{
715 GLint maxVaryings = 0;
716 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
717
718 std::string fragmentShaderSource;
719 std::string vertexShaderSource;
720
721 GenerateGLSLWithVaryings(0, 0, 2 * maxVaryings + 1, 0, 0, 0, &fragmentShaderSource, &vertexShaderSource);
722
723 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
724 EXPECT_EQ(0u, program);
725}
726
Austin Kinross18b931d2014-09-29 12:58:31 -0700727TYPED_TEST(GLSLTest, MaxVaryingVec3ArrayAndMaxPlusOneFloatArray)
Austin Kinrossaf875522014-08-25 21:06:07 -0700728{
729 GLint maxVaryings = 0;
730 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
731
732 std::string fragmentShaderSource;
733 std::string vertexShaderSource;
734
735 GenerateGLSLWithVaryings(0, maxVaryings / 2 + 1, 0, 0, 0, maxVaryings / 2, &fragmentShaderSource, &vertexShaderSource);
736
737 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
738 EXPECT_EQ(0u, program);
739}
Geoff Langf60fab62014-11-24 11:21:20 -0500740
741// Verify shader source with a fixed length that is less than the null-terminated length will compile.
742TYPED_TEST(GLSLTest, FixedShaderLength)
743{
744 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
745
746 const std::string appendGarbage = "abcasdfasdfasdfasdfasdf";
747 const std::string source = "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" + appendGarbage;
748 const char *sourceArray[1] = { source.c_str() };
749 GLint lengths[1] = { source.length() - appendGarbage.length() };
750 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
751 glCompileShader(shader);
752
753 GLint compileResult;
754 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
755 EXPECT_NE(compileResult, 0);
756}
757
758// Verify that a negative shader source length is treated as a null-terminated length.
759TYPED_TEST(GLSLTest, NegativeShaderLength)
760{
761 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
762
763 const char *sourceArray[1] = { "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" };
764 GLint lengths[1] = { -10 };
765 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
766 glCompileShader(shader);
767
768 GLint compileResult;
769 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
770 EXPECT_NE(compileResult, 0);
771}
772
773// Verify that a length array with mixed positive and negative values compiles.
774TYPED_TEST(GLSLTest, MixedShaderLengths)
775{
776 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
777
778 const char *sourceArray[] =
779 {
780 "void main()",
781 "{",
782 " gl_FragColor = vec4(0, 0, 0, 0);",
783 "}",
784 };
785 GLint lengths[] =
786 {
787 -10,
788 1,
789 std::strlen(sourceArray[2]),
790 -1,
791 };
792 ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths));
793
794 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
795 glCompileShader(shader);
796
797 GLint compileResult;
798 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
799 EXPECT_NE(compileResult, 0);
800}
801
802// Verify that zero-length shader source does not affect shader compilation.
803TYPED_TEST(GLSLTest, ZeroShaderLength)
804{
805 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
806
807 const char *sourceArray[] =
808 {
809 "adfasdf",
810 "34534",
811 "void main() { gl_FragColor = vec4(0, 0, 0, 0); }",
812 "",
813 "asdfasdfsdsdf",
814 };
815 GLint lengths[] =
816 {
817 0,
818 0,
819 -1,
820 0,
821 0,
822 };
823 ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths));
824
825 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
826 glCompileShader(shader);
827
828 GLint compileResult;
829 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
830 EXPECT_NE(compileResult, 0);
831}
Jamie Madill21c1e452014-12-29 11:33:41 -0500832
833// Tests that bad index expressions don't crash ANGLE's translator.
834// https://code.google.com/p/angleproject/issues/detail?id=857
835TYPED_TEST(GLSLTest, BadIndexBug)
836{
837 const std::string &fragmentShaderSourceVec =
838 "precision mediump float;\n"
839 "uniform vec4 uniformVec;\n"
840 "void main()\n"
841 "{\n"
842 " gl_FragColor = vec4(uniformVec[int()]);\n"
843 "}";
844
845 GLuint shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceVec);
846 EXPECT_EQ(0u, shader);
847
848 if (shader != 0)
849 {
850 glDeleteShader(shader);
851 }
852
853 const std::string &fragmentShaderSourceMat =
854 "precision mediump float;\n"
855 "uniform mat4 uniformMat;\n"
856 "void main()\n"
857 "{\n"
858 " gl_FragColor = vec4(uniformMat[int()]);\n"
859 "}";
860
861 shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceMat);
862 EXPECT_EQ(0u, shader);
863
864 if (shader != 0)
865 {
866 glDeleteShader(shader);
867 }
868
869 const std::string &fragmentShaderSourceArray =
870 "precision mediump float;\n"
871 "uniform vec4 uniformArray;\n"
872 "void main()\n"
873 "{\n"
874 " gl_FragColor = vec4(uniformArray[int()]);\n"
875 "}";
876
877 shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceArray);
878 EXPECT_EQ(0u, shader);
879
880 if (shader != 0)
881 {
882 glDeleteShader(shader);
883 }
Jamie Madill37997142015-01-28 10:06:34 -0500884}
885
886// Tests that using a global static initialized from a varying works as expected.
887// See: https://code.google.com/p/angleproject/issues/detail?id=878
888TYPED_TEST(GLSLTest, GlobalStaticAndVarying)
889{
890 const std::string &vertexShaderSource =
891 "attribute vec4 a_position;\n"
892 "varying float v;\n"
893 "void main() {\n"
894 " gl_Position = a_position;\n"
895 " v = 1.0;\n"
896 "}\n";
897
898 const std::string &fragmentShaderSource =
899 "precision highp float;\n"
900 "varying float v;\n"
901 "float x = v;"
902 "float global_v = x;"
903 "void main() {\n"
904 " gl_FragColor = vec4(global_v, 0.0, 0.0, 1.0);\n"
905 "}\n";
906
907 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
908 ASSERT_NE(0u, program);
909
910 drawQuad(program, "a_position", 0.5f);
911 swapBuffers();
912
913 ASSERT_GL_NO_ERROR();
914 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
915}
Gregoire Payen de La Garanderieb3dced22015-01-12 14:54:55 +0000916
917// Tests that using a global static initialized from gl_InstanceID works as expected.
918TYPED_TEST(GLSLTest_ES3, GlobalStaticAndInstanceID)
919{
920 const std::string &vertexShaderSource =
921 "#version 300 es\n"
922 "precision highp float;\n"
923 "in vec4 a_position;\n"
924 "out vec4 vColour;"
925 "int x = gl_InstanceID;"
926 "int global_v = x;"
927 "void main() {\n"
928 " gl_Position = a_position;\n"
929 " vColour = vec4(float(global_v)/255., 0.0, 0.0, 1.0);\n"
930 "}\n";
931
932 const std::string &fragmentShaderSource =
933 "#version 300 es\n"
934 "precision highp float;\n"
935 "in vec4 vColour;"
936 "out vec4 colour;"
937 "void main() {\n"
938 " colour = vColour;\n"
939 "}\n";
940
941 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
942 ASSERT_NE(0u, program);
943
944 GLint positionLocation = glGetAttribLocation(program, "a_position");
945
946 glUseProgram(program);
947
948 const GLfloat vertices[] =
949 {
950 -1.0f, 1.0f, 0.5f,
951 -1.0f, -1.0f, 0.5f,
952 1.0f, -1.0f, 0.5f,
953
954 -1.0f, 1.0f, 0.5f,
955 1.0f, -1.0f, 0.5f,
956 1.0f, 1.0f, 0.5f,
957 };
958
959 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
960 glEnableVertexAttribArray(positionLocation);
961
962 glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 7);
963
964 glDisableVertexAttribArray(positionLocation);
965 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
966
967 glUseProgram(0);
968
969 swapBuffers();
970
971 ASSERT_GL_NO_ERROR();
972 EXPECT_PIXEL_EQ(0, 0, 6, 0, 0, 255);
973}