blob: 6e22bf063b36332e43d070cb265e79089a8e49b3 [file] [log] [blame]
Jamie Madill55def582015-05-04 11:24:57 -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 Wallez9cb95832015-05-11 10:21:48 -07007#include "test_utils/ANGLETest.h"
Jamie Madill96509e42014-05-29 14:33:27 -04008
Jamie Madill55def582015-05-04 11:24:57 -04009#include "libANGLE/Context.h"
10#include "libANGLE/Program.h"
11
Jamie Madillfa05f602015-05-07 13:47:11 -040012using namespace angle;
Austin Kinross18b931d2014-09-29 12:58:31 -070013
Jamie Madill2bf8b372014-06-16 17:18:51 -040014class GLSLTest : public ANGLETest
Jamie Madill96509e42014-05-29 14:33:27 -040015{
Jamie Madillfa05f602015-05-07 13:47:11 -040016 protected:
17 GLSLTest()
Jamie Madill96509e42014-05-29 14:33:27 -040018 {
19 setWindowWidth(128);
20 setWindowHeight(128);
21 setConfigRedBits(8);
22 setConfigGreenBits(8);
23 setConfigBlueBits(8);
24 setConfigAlphaBits(8);
25 }
Jamie Madillbfa91f42014-06-05 15:45:18 -040026
27 virtual void SetUp()
28 {
29 ANGLETest::SetUp();
30
Jamie Madill2bf8b372014-06-16 17:18:51 -040031 mSimpleVSSource = SHADER_SOURCE
Jamie Madillbfa91f42014-06-05 15:45:18 -040032 (
33 attribute vec4 inputAttribute;
34 void main()
35 {
36 gl_Position = inputAttribute;
37 }
38 );
39 }
40
Austin Kinrossaf875522014-08-25 21:06:07 -070041 std::string GenerateVaryingType(GLint vectorSize)
42 {
43 char varyingType[10];
44
45 if (vectorSize == 1)
46 {
47 sprintf(varyingType, "float");
48 }
49 else
50 {
51 sprintf(varyingType, "vec%d", vectorSize);
52 }
53
54 return std::string(varyingType);
55 }
56
57 std::string GenerateVectorVaryingDeclaration(GLint vectorSize, GLint arraySize, GLint id)
58 {
59 char buff[100];
60
61 if (arraySize == 1)
62 {
63 sprintf(buff, "varying %s v%d;\n", GenerateVaryingType(vectorSize).c_str(), id);
64 }
65 else
66 {
67 sprintf(buff, "varying %s v%d[%d];\n", GenerateVaryingType(vectorSize).c_str(), id, arraySize);
68 }
69
70 return std::string(buff);
71 }
72
73 std::string GenerateVectorVaryingSettingCode(GLint vectorSize, GLint arraySize, GLint id)
74 {
75 std::string returnString;
76 char buff[100];
77
78 if (arraySize == 1)
79 {
80 sprintf(buff, "\t v%d = %s(1.0);\n", id, GenerateVaryingType(vectorSize).c_str());
81 returnString += buff;
82 }
83 else
84 {
85 for (int i = 0; i < arraySize; i++)
86 {
87 sprintf(buff, "\t v%d[%d] = %s(1.0);\n", id, i, GenerateVaryingType(vectorSize).c_str());
88 returnString += buff;
89 }
90 }
91
92 return returnString;
93 }
94
95 std::string GenerateVectorVaryingUseCode(GLint arraySize, GLint id)
96 {
97 if (arraySize == 1)
98 {
99 char buff[100];
100 sprintf(buff, "v%d + ", id);
101 return std::string(buff);
102 }
103 else
104 {
105 std::string returnString;
106 for (int i = 0; i < arraySize; i++)
107 {
108 char buff[100];
109 sprintf(buff, "v%d[%d] + ", id, i);
110 returnString += buff;
111 }
112 return returnString;
113 }
114 }
115
Austin Kinross8b695ee2015-03-12 13:12:20 -0700116 void GenerateGLSLWithVaryings(GLint floatCount, GLint floatArrayCount, GLint vec2Count, GLint vec2ArrayCount, GLint vec3Count, GLint vec3ArrayCount,
117 GLint vec4Count, GLint vec4ArrayCount, bool useFragCoord, bool usePointCoord, bool usePointSize,
118 std::string* fragmentShader, std::string* vertexShader)
Austin Kinrossaf875522014-08-25 21:06:07 -0700119 {
120 // Generate a string declaring the varyings, to share between the fragment shader and the vertex shader.
121 std::string varyingDeclaration;
122
123 unsigned int varyingCount = 0;
124
125 for (GLint i = 0; i < floatCount; i++)
126 {
127 varyingDeclaration += GenerateVectorVaryingDeclaration(1, 1, varyingCount);
128 varyingCount += 1;
129 }
130
131 for (GLint i = 0; i < floatArrayCount; i++)
132 {
133 varyingDeclaration += GenerateVectorVaryingDeclaration(1, 2, varyingCount);
134 varyingCount += 1;
135 }
136
137 for (GLint i = 0; i < vec2Count; i++)
138 {
139 varyingDeclaration += GenerateVectorVaryingDeclaration(2, 1, varyingCount);
140 varyingCount += 1;
141 }
142
143 for (GLint i = 0; i < vec2ArrayCount; i++)
144 {
145 varyingDeclaration += GenerateVectorVaryingDeclaration(2, 2, varyingCount);
146 varyingCount += 1;
147 }
148
149 for (GLint i = 0; i < vec3Count; i++)
150 {
151 varyingDeclaration += GenerateVectorVaryingDeclaration(3, 1, varyingCount);
152 varyingCount += 1;
153 }
154
155 for (GLint i = 0; i < vec3ArrayCount; i++)
156 {
157 varyingDeclaration += GenerateVectorVaryingDeclaration(3, 2, varyingCount);
158 varyingCount += 1;
159 }
160
Austin Kinross8b695ee2015-03-12 13:12:20 -0700161 for (GLint i = 0; i < vec4Count; i++)
162 {
163 varyingDeclaration += GenerateVectorVaryingDeclaration(4, 1, varyingCount);
164 varyingCount += 1;
165 }
166
167 for (GLint i = 0; i < vec4ArrayCount; i++)
168 {
169 varyingDeclaration += GenerateVectorVaryingDeclaration(4, 2, varyingCount);
170 varyingCount += 1;
171 }
172
Austin Kinrossaf875522014-08-25 21:06:07 -0700173 // Generate the vertex shader
174 vertexShader->clear();
175 vertexShader->append(varyingDeclaration);
176 vertexShader->append("\nvoid main()\n{\n");
177
178 unsigned int currentVSVarying = 0;
179
180 for (GLint i = 0; i < floatCount; i++)
181 {
182 vertexShader->append(GenerateVectorVaryingSettingCode(1, 1, currentVSVarying));
183 currentVSVarying += 1;
184 }
185
186 for (GLint i = 0; i < floatArrayCount; i++)
187 {
188 vertexShader->append(GenerateVectorVaryingSettingCode(1, 2, currentVSVarying));
189 currentVSVarying += 1;
190 }
191
192 for (GLint i = 0; i < vec2Count; i++)
193 {
194 vertexShader->append(GenerateVectorVaryingSettingCode(2, 1, currentVSVarying));
195 currentVSVarying += 1;
196 }
197
198 for (GLint i = 0; i < vec2ArrayCount; i++)
199 {
200 vertexShader->append(GenerateVectorVaryingSettingCode(2, 2, currentVSVarying));
201 currentVSVarying += 1;
202 }
203
204 for (GLint i = 0; i < vec3Count; i++)
205 {
206 vertexShader->append(GenerateVectorVaryingSettingCode(3, 1, currentVSVarying));
207 currentVSVarying += 1;
208 }
209
210 for (GLint i = 0; i < vec3ArrayCount; i++)
211 {
212 vertexShader->append(GenerateVectorVaryingSettingCode(3, 2, currentVSVarying));
213 currentVSVarying += 1;
214 }
215
Austin Kinross8b695ee2015-03-12 13:12:20 -0700216 for (GLint i = 0; i < vec4Count; i++)
217 {
218 vertexShader->append(GenerateVectorVaryingSettingCode(4, 1, currentVSVarying));
219 currentVSVarying += 1;
220 }
221
222 for (GLint i = 0; i < vec4ArrayCount; i++)
223 {
224 vertexShader->append(GenerateVectorVaryingSettingCode(4, 2, currentVSVarying));
225 currentVSVarying += 1;
226 }
227
228 if (usePointSize)
229 {
230 vertexShader->append("gl_PointSize = 1.0;\n");
231 }
232
Austin Kinrossaf875522014-08-25 21:06:07 -0700233 vertexShader->append("}\n");
234
235 // Generate the fragment shader
236 fragmentShader->clear();
237 fragmentShader->append("precision highp float;\n");
238 fragmentShader->append(varyingDeclaration);
239 fragmentShader->append("\nvoid main() \n{ \n\tvec4 retColor = vec4(0,0,0,0);\n");
240
241 unsigned int currentFSVarying = 0;
242
243 // Make use of the float varyings
244 fragmentShader->append("\tretColor += vec4(");
245
246 for (GLint i = 0; i < floatCount; i++)
247 {
248 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
249 currentFSVarying += 1;
250 }
251
252 for (GLint i = 0; i < floatArrayCount; i++)
253 {
254 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
255 currentFSVarying += 1;
256 }
257
258 fragmentShader->append("0.0, 0.0, 0.0, 0.0);\n");
259
260 // Make use of the vec2 varyings
261 fragmentShader->append("\tretColor += vec4(");
262
263 for (GLint i = 0; i < vec2Count; i++)
264 {
265 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
266 currentFSVarying += 1;
267 }
268
269 for (GLint i = 0; i < vec2ArrayCount; i++)
270 {
271 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
272 currentFSVarying += 1;
273 }
274
275 fragmentShader->append("vec2(0.0, 0.0), 0.0, 0.0);\n");
276
277 // Make use of the vec3 varyings
278 fragmentShader->append("\tretColor += vec4(");
279
280 for (GLint i = 0; i < vec3Count; i++)
281 {
282 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
283 currentFSVarying += 1;
284 }
285
286 for (GLint i = 0; i < vec3ArrayCount; i++)
287 {
288 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
289 currentFSVarying += 1;
290 }
291
292 fragmentShader->append("vec3(0.0, 0.0, 0.0), 0.0);\n");
Austin Kinross8b695ee2015-03-12 13:12:20 -0700293
294 // Make use of the vec4 varyings
295 fragmentShader->append("\tretColor += ");
296
297 for (GLint i = 0; i < vec4Count; i++)
298 {
299 fragmentShader->append(GenerateVectorVaryingUseCode(1, currentFSVarying));
300 currentFSVarying += 1;
301 }
302
303 for (GLint i = 0; i < vec4ArrayCount; i++)
304 {
305 fragmentShader->append(GenerateVectorVaryingUseCode(2, currentFSVarying));
306 currentFSVarying += 1;
307 }
308
309 fragmentShader->append("vec4(0.0, 0.0, 0.0, 0.0);\n");
310
311 // Set gl_FragColor, and use special variables if requested
312 fragmentShader->append("\tgl_FragColor = retColor");
313
314 if (useFragCoord)
315 {
316 fragmentShader->append(" + gl_FragCoord");
317 }
318
319 if (usePointCoord)
320 {
321 fragmentShader->append(" + vec4(gl_PointCoord, 0.0, 0.0)");
322 }
323
324 fragmentShader->append(";\n}");
325 }
326
327 void VaryingTestBase(GLint floatCount, GLint floatArrayCount, GLint vec2Count, GLint vec2ArrayCount, GLint vec3Count, GLint vec3ArrayCount,
328 GLint vec4Count, GLint vec4ArrayCount, bool useFragCoord, bool usePointCoord, bool usePointSize, bool expectSuccess)
329 {
330 std::string fragmentShaderSource;
331 std::string vertexShaderSource;
332
333 GenerateGLSLWithVaryings(floatCount, floatArrayCount, vec2Count, vec2ArrayCount, vec3Count, vec3ArrayCount,
334 vec4Count, vec4ArrayCount, useFragCoord, usePointCoord, usePointSize,
335 &fragmentShaderSource, &vertexShaderSource);
336
337 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
338
339 if (expectSuccess)
340 {
341 EXPECT_NE(0u, program);
342 }
343 else
344 {
345 EXPECT_EQ(0u, program);
346 }
Austin Kinrossaf875522014-08-25 21:06:07 -0700347 }
348
Jamie Madill2bf8b372014-06-16 17:18:51 -0400349 std::string mSimpleVSSource;
Jamie Madill96509e42014-05-29 14:33:27 -0400350};
351
Jamie Madillfa05f602015-05-07 13:47:11 -0400352class GLSLTest_ES3 : public GLSLTest
Gregoire Payen de La Garanderieb3dced22015-01-12 14:54:55 +0000353{
354};
355
Jamie Madillfa05f602015-05-07 13:47:11 -0400356TEST_P(GLSLTest, NamelessScopedStructs)
Jamie Madill96509e42014-05-29 14:33:27 -0400357{
Jamie Madillbfa91f42014-06-05 15:45:18 -0400358 const std::string fragmentShaderSource = SHADER_SOURCE
Jamie Madill96509e42014-05-29 14:33:27 -0400359 (
Jamie Madillbfa91f42014-06-05 15:45:18 -0400360 precision mediump float;
361
Jamie Madill96509e42014-05-29 14:33:27 -0400362 void main()
363 {
Jamie Madillbfa91f42014-06-05 15:45:18 -0400364 struct
365 {
366 float q;
367 } b;
368
369 gl_FragColor = vec4(1, 0, 0, 1);
370 gl_FragColor.a += b.q;
Jamie Madill96509e42014-05-29 14:33:27 -0400371 }
372 );
373
Jamie Madill5599c8f2014-08-26 13:16:39 -0400374 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -0400375 EXPECT_NE(0u, program);
376}
Austin Kinross18b931d2014-09-29 12:58:31 -0700377
Jamie Madillfa05f602015-05-07 13:47:11 -0400378TEST_P(GLSLTest, ScopedStructsOrderBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -0400379{
380 const std::string fragmentShaderSource = SHADER_SOURCE
381 (
382 precision mediump float;
383
384 struct T
385 {
386 float f;
387 };
388
389 void main()
390 {
391 T a;
392
393 struct T
394 {
395 float q;
396 };
397
398 T b;
399
400 gl_FragColor = vec4(1, 0, 0, 1);
401 gl_FragColor.a += a.f;
402 gl_FragColor.a += b.q;
403 }
404 );
405
Jamie Madill5599c8f2014-08-26 13:16:39 -0400406 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madillbfa91f42014-06-05 15:45:18 -0400407 EXPECT_NE(0u, program);
408}
409
Jamie Madillfa05f602015-05-07 13:47:11 -0400410TEST_P(GLSLTest, ScopedStructsBug)
Jamie Madillbfa91f42014-06-05 15:45:18 -0400411{
Jamie Madill96509e42014-05-29 14:33:27 -0400412 const std::string fragmentShaderSource = SHADER_SOURCE
413 (
414 precision mediump float;
415
416 struct T_0
417 {
418 float f;
419 };
420
421 void main()
422 {
423 gl_FragColor = vec4(1, 0, 0, 1);
424
425 struct T
426 {
427 vec2 v;
428 };
429
430 T_0 a;
431 T b;
432
433 gl_FragColor.a += a.f;
434 gl_FragColor.a += b.v.x;
435 }
436 );
437
Jamie Madill5599c8f2014-08-26 13:16:39 -0400438 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
Jamie Madill2bf8b372014-06-16 17:18:51 -0400439 EXPECT_NE(0u, program);
440}
441
Jamie Madillfa05f602015-05-07 13:47:11 -0400442TEST_P(GLSLTest, DxPositionBug)
Jamie Madill2bf8b372014-06-16 17:18:51 -0400443{
444 const std::string &vertexShaderSource = SHADER_SOURCE
445 (
446 attribute vec4 inputAttribute;
447 varying float dx_Position;
448 void main()
449 {
450 gl_Position = vec4(inputAttribute);
451 dx_Position = 0.0;
452 }
453 );
454
455 const std::string &fragmentShaderSource = SHADER_SOURCE
456 (
457 precision mediump float;
458
459 varying float dx_Position;
460
461 void main()
462 {
463 gl_FragColor = vec4(dx_Position, 0, 0, 1);
464 }
465 );
466
Jamie Madill5599c8f2014-08-26 13:16:39 -0400467 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill96509e42014-05-29 14:33:27 -0400468 EXPECT_NE(0u, program);
469}
Jamie Madill4836d222014-07-24 06:55:51 -0400470
Jamie Madillfa05f602015-05-07 13:47:11 -0400471TEST_P(GLSLTest, ElseIfRewriting)
Jamie Madill4836d222014-07-24 06:55:51 -0400472{
473 const std::string &vertexShaderSource =
474 "attribute vec4 a_position;\n"
475 "varying float v;\n"
476 "void main() {\n"
477 " gl_Position = a_position;\n"
478 " v = 1.0;\n"
479 " if (a_position.x <= 0.5) {\n"
480 " v = 0.0;\n"
481 " } else if (a_position.x >= 0.5) {\n"
482 " v = 2.0;\n"
483 " }\n"
484 "}\n";
485
486 const std::string &fragmentShaderSource =
487 "precision highp float;\n"
488 "varying float v;\n"
489 "void main() {\n"
490 " vec4 color = vec4(1.0, 0.0, 0.0, 1.0);\n"
491 " if (v >= 1.0) color = vec4(0.0, 1.0, 0.0, 1.0);\n"
492 " if (v >= 2.0) color = vec4(0.0, 0.0, 1.0, 1.0);\n"
493 " gl_FragColor = color;\n"
494 "}\n";
495
Jamie Madill5599c8f2014-08-26 13:16:39 -0400496 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400497 ASSERT_NE(0u, program);
498
499 drawQuad(program, "a_position", 0.5f);
500 swapBuffers();
501
502 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
503 EXPECT_PIXEL_EQ(getWindowWidth()-1, 0, 0, 255, 0, 255);
504}
505
Jamie Madillfa05f602015-05-07 13:47:11 -0400506TEST_P(GLSLTest, TwoElseIfRewriting)
Jamie Madill4836d222014-07-24 06:55:51 -0400507{
508 const std::string &vertexShaderSource =
509 "attribute vec4 a_position;\n"
510 "varying float v;\n"
511 "void main() {\n"
512 " gl_Position = a_position;\n"
Jamie Madill778d5272014-08-04 13:13:25 -0400513 " if (a_position.x == 0.0) {\n"
Jamie Madill4836d222014-07-24 06:55:51 -0400514 " v = 1.0;\n"
515 " } else if (a_position.x > 0.5) {\n"
516 " v = 0.0;\n"
517 " } else if (a_position.x > 0.75) {\n"
518 " v = 0.5;\n"
519 " }\n"
520 "}\n";
521
522 const std::string &fragmentShaderSource =
523 "precision highp float;\n"
524 "varying float v;\n"
525 "void main() {\n"
526 " gl_FragColor = vec4(v, 0.0, 0.0, 1.0);\n"
527 "}\n";
528
Jamie Madill5599c8f2014-08-26 13:16:39 -0400529 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill4836d222014-07-24 06:55:51 -0400530 EXPECT_NE(0u, program);
531}
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400532
Jamie Madillfa05f602015-05-07 13:47:11 -0400533TEST_P(GLSLTest, InvariantVaryingOut)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400534{
535 const std::string fragmentShaderSource = SHADER_SOURCE
536 (
537 precision mediump float;
538 varying float v_varying;
539 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
540 );
541
542 const std::string vertexShaderSource = SHADER_SOURCE
543 (
544 attribute vec4 a_position;
545 invariant varying float v_varying;
546 void main() { v_varying = a_position.x; gl_Position = a_position; }
547 );
548
Jamie Madill5599c8f2014-08-26 13:16:39 -0400549 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400550 EXPECT_NE(0u, program);
551}
552
Jamie Madillfa05f602015-05-07 13:47:11 -0400553TEST_P(GLSLTest, FrontFacingAndVarying)
Jamie Madille6256f82014-09-17 10:31:15 -0400554{
Jamie Madillfa05f602015-05-07 13:47:11 -0400555 EGLPlatformParameters platform = GetParam().mEGLPlatformParameters;
Austin Kinross8b695ee2015-03-12 13:12:20 -0700556
557 // Disable this test on D3D11 feature level 9_3, since gl_FrontFacing isn't supported.
558 if (platform.renderer == EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE)
559 {
560 if (platform.majorVersion == 9 && platform.minorVersion == 3)
561 {
562 return;
563 }
564 }
565
Jamie Madille6256f82014-09-17 10:31:15 -0400566 const std::string vertexShaderSource = SHADER_SOURCE
567 (
568 attribute vec4 a_position;
569 varying float v_varying;
570 void main()
571 {
572 v_varying = a_position.x;
573 gl_Position = a_position;
574 }
575 );
576
577 const std::string fragmentShaderSource = SHADER_SOURCE
578 (
579 precision mediump float;
580 varying float v_varying;
581 void main()
582 {
583 vec4 c;
584
585 if (gl_FrontFacing)
586 {
587 c = vec4(v_varying, 0, 0, 1.0);
588 }
589 else
590 {
591 c = vec4(0, v_varying, 0, 1.0);
592 }
593 gl_FragColor = c;
594 }
595 );
596
597 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
598 EXPECT_NE(0u, program);
599}
600
Jamie Madillfa05f602015-05-07 13:47:11 -0400601TEST_P(GLSLTest, InvariantVaryingIn)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400602{
603 const std::string fragmentShaderSource = SHADER_SOURCE
604 (
605 precision mediump float;
606 invariant varying float v_varying;
607 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
608 );
609
610 const std::string vertexShaderSource = SHADER_SOURCE
611 (
612 attribute vec4 a_position;
613 varying float v_varying;
614 void main() { v_varying = a_position.x; gl_Position = a_position; }
615 );
616
Jamie Madill5599c8f2014-08-26 13:16:39 -0400617 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400618 EXPECT_NE(0u, program);
619}
620
Jamie Madillfa05f602015-05-07 13:47:11 -0400621TEST_P(GLSLTest, InvariantVaryingBoth)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400622{
623 const std::string fragmentShaderSource = SHADER_SOURCE
624 (
625 precision mediump float;
626 invariant varying float v_varying;
627 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
628 );
629
630 const std::string vertexShaderSource = SHADER_SOURCE
631 (
632 attribute vec4 a_position;
633 invariant varying float v_varying;
634 void main() { v_varying = a_position.x; gl_Position = a_position; }
635 );
636
Jamie Madill5599c8f2014-08-26 13:16:39 -0400637 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400638 EXPECT_NE(0u, program);
639}
640
Jamie Madillfa05f602015-05-07 13:47:11 -0400641TEST_P(GLSLTest, InvariantGLPosition)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400642{
643 const std::string fragmentShaderSource = SHADER_SOURCE
644 (
645 precision mediump float;
646 varying float v_varying;
647 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
648 );
649
650 const std::string vertexShaderSource = SHADER_SOURCE
651 (
652 attribute vec4 a_position;
653 invariant gl_Position;
654 varying float v_varying;
655 void main() { v_varying = a_position.x; gl_Position = a_position; }
656 );
657
Jamie Madill5599c8f2014-08-26 13:16:39 -0400658 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400659 EXPECT_NE(0u, program);
660}
661
Jamie Madillfa05f602015-05-07 13:47:11 -0400662TEST_P(GLSLTest, InvariantAll)
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400663{
664 const std::string fragmentShaderSource = SHADER_SOURCE
665 (
666 precision mediump float;
667 varying float v_varying;
668 void main() { gl_FragColor = vec4(v_varying, 0, 0, 1.0); }
669 );
670
671 const std::string vertexShaderSource =
672 "#pragma STDGL invariant(all)\n"
673 "attribute vec4 a_position;\n"
674 "varying float v_varying;\n"
675 "void main() { v_varying = a_position.x; gl_Position = a_position; }\n";
676
Jamie Madill5599c8f2014-08-26 13:16:39 -0400677 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
Jamie Madill1c28e1f2014-08-04 11:37:54 -0400678 EXPECT_NE(0u, program);
679}
Austin Kinrossaf875522014-08-25 21:06:07 -0700680
Jamie Madillfa05f602015-05-07 13:47:11 -0400681TEST_P(GLSLTest, MaxVaryingVec4)
Austin Kinross8b695ee2015-03-12 13:12:20 -0700682{
683 GLint maxVaryings = 0;
684 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
685
686 VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings, 0, false, false, false, true);
687}
688
Jamie Madillfa05f602015-05-07 13:47:11 -0400689TEST_P(GLSLTest, MaxMinusTwoVaryingVec4PlusTwoSpecialVariables)
Austin Kinross8b695ee2015-03-12 13:12:20 -0700690{
691 GLint maxVaryings = 0;
692 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
693
694 // Generate shader code that uses gl_FragCoord and gl_PointCoord, two special fragment shader variables.
695 VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings - 2, 0, true, true, false, true);
696}
697
Jamie Madillfa05f602015-05-07 13:47:11 -0400698TEST_P(GLSLTest, MaxMinusTwoVaryingVec4PlusThreeSpecialVariables)
Austin Kinross8b695ee2015-03-12 13:12:20 -0700699{
700 GLint maxVaryings = 0;
701 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
702
703 // Generate shader code that uses gl_FragCoord, gl_PointCoord and gl_PointSize.
704 VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings - 2, 0, true, true, true, true);
705}
706
Jamie Madillfa05f602015-05-07 13:47:11 -0400707TEST_P(GLSLTest, MaxVaryingVec4PlusFragCoord)
Austin Kinross8b695ee2015-03-12 13:12:20 -0700708{
709 GLint maxVaryings = 0;
710 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
711
712 // Generate shader code that uses gl_FragCoord, a special fragment shader variables.
713 // This test should fail, since we are really using (maxVaryings + 1) varyings.
714 VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings, 0, true, false, false, false);
715}
716
Jamie Madillfa05f602015-05-07 13:47:11 -0400717TEST_P(GLSLTest, MaxVaryingVec4PlusPointCoord)
Austin Kinross8b695ee2015-03-12 13:12:20 -0700718{
719 GLint maxVaryings = 0;
720 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
721
722 // Generate shader code that uses gl_FragCoord, a special fragment shader variables.
723 // This test should fail, since we are really using (maxVaryings + 1) varyings.
724 VaryingTestBase(0, 0, 0, 0, 0, 0, maxVaryings, 0, false, true, false, false);
725}
726
Jamie Madillfa05f602015-05-07 13:47:11 -0400727TEST_P(GLSLTest, MaxVaryingVec3)
Austin Kinrossaf875522014-08-25 21:06:07 -0700728{
729 GLint maxVaryings = 0;
730 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
731
Austin Kinross8b695ee2015-03-12 13:12:20 -0700732 VaryingTestBase(0, 0, 0, 0, maxVaryings, 0, 0, 0, false, false, false, true);
Austin Kinrossaf875522014-08-25 21:06:07 -0700733}
734
Jamie Madillfa05f602015-05-07 13:47:11 -0400735TEST_P(GLSLTest, MaxVaryingVec3Array)
Austin Kinrossaf875522014-08-25 21:06:07 -0700736{
737 GLint maxVaryings = 0;
738 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
739
Austin Kinross8b695ee2015-03-12 13:12:20 -0700740 VaryingTestBase(0, 0, 0, 0, 0, maxVaryings / 2, 0, 0, false, false, false, true);
Austin Kinrossaf875522014-08-25 21:06:07 -0700741}
742
Jamie Madillbee59e02014-10-02 10:44:18 -0400743// Disabled because of a failure in D3D9
Jamie Madillfa05f602015-05-07 13:47:11 -0400744TEST_P(GLSLTest, DISABLED_MaxVaryingVec3AndOneFloat)
Austin Kinrossaf875522014-08-25 21:06:07 -0700745{
746 GLint maxVaryings = 0;
747 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
748
Austin Kinross8b695ee2015-03-12 13:12:20 -0700749 VaryingTestBase(1, 0, 0, 0, maxVaryings, 0, 0, 0, false, false, false, true);
Austin Kinrossaf875522014-08-25 21:06:07 -0700750}
751
Jamie Madillbee59e02014-10-02 10:44:18 -0400752// Disabled because of a failure in D3D9
Jamie Madillfa05f602015-05-07 13:47:11 -0400753TEST_P(GLSLTest, DISABLED_MaxVaryingVec3ArrayAndOneFloatArray)
Austin Kinrossaf875522014-08-25 21:06:07 -0700754{
755 GLint maxVaryings = 0;
756 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
757
Austin Kinross8b695ee2015-03-12 13:12:20 -0700758 VaryingTestBase(0, 1, 0, 0, 0, maxVaryings / 2, 0, 0, false, false, false, true);
Austin Kinrossaf875522014-08-25 21:06:07 -0700759}
760
Jamie Madillbee59e02014-10-02 10:44:18 -0400761// Disabled because of a failure in D3D9
Jamie Madillfa05f602015-05-07 13:47:11 -0400762TEST_P(GLSLTest, DISABLED_TwiceMaxVaryingVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700763{
764 GLint maxVaryings = 0;
765 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
766
Austin Kinross8b695ee2015-03-12 13:12:20 -0700767 VaryingTestBase(0, 0, 2 * maxVaryings, 0, 0, 0, 0, 0, false, false, false, true);
Austin Kinrossaf875522014-08-25 21:06:07 -0700768}
769
Jamie Madillbee59e02014-10-02 10:44:18 -0400770// Disabled because of a failure in D3D9
Jamie Madillfa05f602015-05-07 13:47:11 -0400771TEST_P(GLSLTest, DISABLED_MaxVaryingVec2Arrays)
Austin Kinrossaf875522014-08-25 21:06:07 -0700772{
773 GLint maxVaryings = 0;
774 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
775
Austin Kinross8b695ee2015-03-12 13:12:20 -0700776 VaryingTestBase(0, 0, 0, maxVaryings, 0, 0, 0, 0, false, false, false, true);
Austin Kinrossaf875522014-08-25 21:06:07 -0700777}
778
Jamie Madillfa05f602015-05-07 13:47:11 -0400779TEST_P(GLSLTest, MaxPlusOneVaryingVec3)
Austin Kinrossaf875522014-08-25 21:06:07 -0700780{
781 GLint maxVaryings = 0;
782 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
783
Austin Kinross8b695ee2015-03-12 13:12:20 -0700784 VaryingTestBase(0, 0, 0, 0, maxVaryings + 1, 0, 0, 0, false, false, false, false);
Austin Kinrossaf875522014-08-25 21:06:07 -0700785}
786
Jamie Madillfa05f602015-05-07 13:47:11 -0400787TEST_P(GLSLTest, MaxPlusOneVaryingVec3Array)
Austin Kinrossaf875522014-08-25 21:06:07 -0700788{
789 GLint maxVaryings = 0;
790 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
791
Austin Kinross8b695ee2015-03-12 13:12:20 -0700792 VaryingTestBase(0, 0, 0, 0, 0, maxVaryings / 2 + 1, 0, 0, false, false, false, false);
Austin Kinrossaf875522014-08-25 21:06:07 -0700793}
794
Jamie Madillfa05f602015-05-07 13:47:11 -0400795TEST_P(GLSLTest, MaxVaryingVec3AndOneVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700796{
797 GLint maxVaryings = 0;
798 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
799
Austin Kinross8b695ee2015-03-12 13:12:20 -0700800 VaryingTestBase(0, 0, 1, 0, maxVaryings, 0, 0, 0, false, false, false, false);
Austin Kinrossaf875522014-08-25 21:06:07 -0700801}
802
Jamie Madillfa05f602015-05-07 13:47:11 -0400803TEST_P(GLSLTest, MaxPlusOneVaryingVec2)
Austin Kinrossaf875522014-08-25 21:06:07 -0700804{
805 GLint maxVaryings = 0;
806 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
807
Austin Kinross8b695ee2015-03-12 13:12:20 -0700808 VaryingTestBase(0, 0, 2 * maxVaryings + 1, 0, 0, 0, 0, 0, false, false, false, false);
Austin Kinrossaf875522014-08-25 21:06:07 -0700809}
810
Jamie Madillfa05f602015-05-07 13:47:11 -0400811TEST_P(GLSLTest, MaxVaryingVec3ArrayAndMaxPlusOneFloatArray)
Austin Kinrossaf875522014-08-25 21:06:07 -0700812{
813 GLint maxVaryings = 0;
814 glGetIntegerv(GL_MAX_VARYING_VECTORS, &maxVaryings);
815
Austin Kinross8b695ee2015-03-12 13:12:20 -0700816 VaryingTestBase(0, maxVaryings / 2 + 1, 0, 0, 0, 0, 0, maxVaryings / 2, false, false, false, false);
Austin Kinrossaf875522014-08-25 21:06:07 -0700817}
Geoff Langf60fab62014-11-24 11:21:20 -0500818
819// Verify shader source with a fixed length that is less than the null-terminated length will compile.
Jamie Madillfa05f602015-05-07 13:47:11 -0400820TEST_P(GLSLTest, FixedShaderLength)
Geoff Langf60fab62014-11-24 11:21:20 -0500821{
822 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
823
824 const std::string appendGarbage = "abcasdfasdfasdfasdfasdf";
825 const std::string source = "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" + appendGarbage;
826 const char *sourceArray[1] = { source.c_str() };
827 GLint lengths[1] = { source.length() - appendGarbage.length() };
828 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
829 glCompileShader(shader);
830
831 GLint compileResult;
832 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
833 EXPECT_NE(compileResult, 0);
834}
835
836// Verify that a negative shader source length is treated as a null-terminated length.
Jamie Madillfa05f602015-05-07 13:47:11 -0400837TEST_P(GLSLTest, NegativeShaderLength)
Geoff Langf60fab62014-11-24 11:21:20 -0500838{
839 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
840
841 const char *sourceArray[1] = { "void main() { gl_FragColor = vec4(0, 0, 0, 0); }" };
842 GLint lengths[1] = { -10 };
843 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
844 glCompileShader(shader);
845
846 GLint compileResult;
847 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
848 EXPECT_NE(compileResult, 0);
849}
850
851// Verify that a length array with mixed positive and negative values compiles.
Jamie Madillfa05f602015-05-07 13:47:11 -0400852TEST_P(GLSLTest, MixedShaderLengths)
Geoff Langf60fab62014-11-24 11:21:20 -0500853{
854 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
855
856 const char *sourceArray[] =
857 {
858 "void main()",
859 "{",
860 " gl_FragColor = vec4(0, 0, 0, 0);",
861 "}",
862 };
863 GLint lengths[] =
864 {
865 -10,
866 1,
867 std::strlen(sourceArray[2]),
868 -1,
869 };
870 ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths));
871
872 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
873 glCompileShader(shader);
874
875 GLint compileResult;
876 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
877 EXPECT_NE(compileResult, 0);
878}
879
880// Verify that zero-length shader source does not affect shader compilation.
Jamie Madillfa05f602015-05-07 13:47:11 -0400881TEST_P(GLSLTest, ZeroShaderLength)
Geoff Langf60fab62014-11-24 11:21:20 -0500882{
883 GLuint shader = glCreateShader(GL_FRAGMENT_SHADER);
884
885 const char *sourceArray[] =
886 {
887 "adfasdf",
888 "34534",
889 "void main() { gl_FragColor = vec4(0, 0, 0, 0); }",
890 "",
891 "asdfasdfsdsdf",
892 };
893 GLint lengths[] =
894 {
895 0,
896 0,
897 -1,
898 0,
899 0,
900 };
901 ASSERT_EQ(ArraySize(sourceArray), ArraySize(lengths));
902
903 glShaderSource(shader, ArraySize(sourceArray), sourceArray, lengths);
904 glCompileShader(shader);
905
906 GLint compileResult;
907 glGetShaderiv(shader, GL_COMPILE_STATUS, &compileResult);
908 EXPECT_NE(compileResult, 0);
909}
Jamie Madill21c1e452014-12-29 11:33:41 -0500910
911// Tests that bad index expressions don't crash ANGLE's translator.
912// https://code.google.com/p/angleproject/issues/detail?id=857
Jamie Madillfa05f602015-05-07 13:47:11 -0400913TEST_P(GLSLTest, BadIndexBug)
Jamie Madill21c1e452014-12-29 11:33:41 -0500914{
915 const std::string &fragmentShaderSourceVec =
916 "precision mediump float;\n"
917 "uniform vec4 uniformVec;\n"
918 "void main()\n"
919 "{\n"
920 " gl_FragColor = vec4(uniformVec[int()]);\n"
921 "}";
922
923 GLuint shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceVec);
924 EXPECT_EQ(0u, shader);
925
926 if (shader != 0)
927 {
928 glDeleteShader(shader);
929 }
930
931 const std::string &fragmentShaderSourceMat =
932 "precision mediump float;\n"
933 "uniform mat4 uniformMat;\n"
934 "void main()\n"
935 "{\n"
936 " gl_FragColor = vec4(uniformMat[int()]);\n"
937 "}";
938
939 shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceMat);
940 EXPECT_EQ(0u, shader);
941
942 if (shader != 0)
943 {
944 glDeleteShader(shader);
945 }
946
947 const std::string &fragmentShaderSourceArray =
948 "precision mediump float;\n"
949 "uniform vec4 uniformArray;\n"
950 "void main()\n"
951 "{\n"
952 " gl_FragColor = vec4(uniformArray[int()]);\n"
953 "}";
954
955 shader = CompileShader(GL_FRAGMENT_SHADER, fragmentShaderSourceArray);
956 EXPECT_EQ(0u, shader);
957
958 if (shader != 0)
959 {
960 glDeleteShader(shader);
961 }
Jamie Madill37997142015-01-28 10:06:34 -0500962}
963
964// Tests that using a global static initialized from a varying works as expected.
965// See: https://code.google.com/p/angleproject/issues/detail?id=878
Jamie Madillfa05f602015-05-07 13:47:11 -0400966TEST_P(GLSLTest, GlobalStaticAndVarying)
Jamie Madill37997142015-01-28 10:06:34 -0500967{
968 const std::string &vertexShaderSource =
969 "attribute vec4 a_position;\n"
970 "varying float v;\n"
971 "void main() {\n"
972 " gl_Position = a_position;\n"
973 " v = 1.0;\n"
974 "}\n";
975
976 const std::string &fragmentShaderSource =
977 "precision highp float;\n"
978 "varying float v;\n"
979 "float x = v;"
980 "float global_v = x;"
981 "void main() {\n"
982 " gl_FragColor = vec4(global_v, 0.0, 0.0, 1.0);\n"
983 "}\n";
984
985 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
986 ASSERT_NE(0u, program);
987
988 drawQuad(program, "a_position", 0.5f);
989 swapBuffers();
990
991 ASSERT_GL_NO_ERROR();
992 EXPECT_PIXEL_EQ(0, 0, 255, 0, 0, 255);
993}
Gregoire Payen de La Garanderieb3dced22015-01-12 14:54:55 +0000994
995// Tests that using a global static initialized from gl_InstanceID works as expected.
Jamie Madillfa05f602015-05-07 13:47:11 -0400996TEST_P(GLSLTest_ES3, GlobalStaticAndInstanceID)
Gregoire Payen de La Garanderieb3dced22015-01-12 14:54:55 +0000997{
998 const std::string &vertexShaderSource =
999 "#version 300 es\n"
1000 "precision highp float;\n"
1001 "in vec4 a_position;\n"
1002 "out vec4 vColour;"
1003 "int x = gl_InstanceID;"
1004 "int global_v = x;"
1005 "void main() {\n"
1006 " gl_Position = a_position;\n"
1007 " vColour = vec4(float(global_v)/255., 0.0, 0.0, 1.0);\n"
1008 "}\n";
1009
1010 const std::string &fragmentShaderSource =
1011 "#version 300 es\n"
1012 "precision highp float;\n"
1013 "in vec4 vColour;"
1014 "out vec4 colour;"
1015 "void main() {\n"
1016 " colour = vColour;\n"
1017 "}\n";
1018
1019 GLuint program = CompileProgram(vertexShaderSource, fragmentShaderSource);
1020 ASSERT_NE(0u, program);
1021
1022 GLint positionLocation = glGetAttribLocation(program, "a_position");
1023
1024 glUseProgram(program);
1025
1026 const GLfloat vertices[] =
1027 {
1028 -1.0f, 1.0f, 0.5f,
1029 -1.0f, -1.0f, 0.5f,
1030 1.0f, -1.0f, 0.5f,
1031
1032 -1.0f, 1.0f, 0.5f,
1033 1.0f, -1.0f, 0.5f,
1034 1.0f, 1.0f, 0.5f,
1035 };
1036
1037 glVertexAttribPointer(positionLocation, 3, GL_FLOAT, GL_FALSE, 0, vertices);
1038 glEnableVertexAttribArray(positionLocation);
1039
1040 glDrawArraysInstanced(GL_TRIANGLES, 0, 6, 7);
1041
1042 glDisableVertexAttribArray(positionLocation);
1043 glVertexAttribPointer(positionLocation, 4, GL_FLOAT, GL_FALSE, 0, NULL);
1044
1045 glUseProgram(0);
1046
1047 swapBuffers();
1048
1049 ASSERT_GL_NO_ERROR();
1050 EXPECT_PIXEL_EQ(0, 0, 6, 0, 0, 255);
1051}
Jamie Madill2e295e22015-04-29 10:41:33 -04001052
1053// Test that structs defined in uniforms are translated correctly.
Jamie Madillfa05f602015-05-07 13:47:11 -04001054TEST_P(GLSLTest, StructSpecifiersUniforms)
Jamie Madill2e295e22015-04-29 10:41:33 -04001055{
1056 const std::string fragmentShaderSource = SHADER_SOURCE
1057 (
1058 precision mediump float;
1059
1060 uniform struct S { float field;} s;
1061
1062 void main()
1063 {
1064 gl_FragColor = vec4(1, 0, 0, 1);
1065 gl_FragColor.a += s.field;
1066 }
1067 );
1068
1069 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
1070 EXPECT_NE(0u, program);
1071}
Jamie Madill55def582015-05-04 11:24:57 -04001072
1073// Test that gl_DepthRange is not stored as a uniform location. Since uniforms
1074// beginning with "gl_" are filtered out by our validation logic, we must
1075// bypass the validation to test the behaviour of the implementation.
1076// (note this test is still Impl-independent)
Jamie Madillfa05f602015-05-07 13:47:11 -04001077TEST_P(GLSLTest, DepthRangeUniforms)
Jamie Madill55def582015-05-04 11:24:57 -04001078{
1079 const std::string fragmentShaderSource = SHADER_SOURCE
1080 (
1081 precision mediump float;
1082
1083 void main()
1084 {
1085 gl_FragColor = vec4(gl_DepthRange.near, gl_DepthRange.far, gl_DepthRange.diff, 1);
1086 }
1087 );
1088
1089 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
1090 EXPECT_NE(0u, program);
1091
1092 // dive into the ANGLE internals, so we can bypass validation.
1093 gl::Context *context = reinterpret_cast<gl::Context *>(getEGLWindow()->getContext());
1094 gl::Program *glProgram = context->getProgram(program);
1095 GLint nearIndex = glProgram->getUniformLocation("gl_DepthRange.near");
1096 EXPECT_EQ(-1, nearIndex);
1097
1098 // Test drawing does not throw an exception.
1099 drawQuad(program, "inputAttribute", 0.5f);
1100
1101 EXPECT_GL_NO_ERROR();
1102
1103 glDeleteProgram(program);
1104}
Jamie Madill4052dfc2015-05-06 15:18:49 -04001105
1106// Covers the WebGL test 'glsl/bugs/pow-of-small-constant-in-user-defined-function'
1107// See https://code.google.com/p/angleproject/issues/detail?id=851
1108// TODO(jmadill): ANGLE constant folding can fix this
Jamie Madillfa05f602015-05-07 13:47:11 -04001109TEST_P(GLSLTest, DISABLED_PowOfSmallConstant)
Jamie Madill4052dfc2015-05-06 15:18:49 -04001110{
1111 const std::string &fragmentShaderSource = SHADER_SOURCE
1112 (
1113 precision highp float;
1114
1115 float fun(float arg)
1116 {
1117 // These values are still easily within the highp range.
1118 // The minimum range in terms of 10's exponent is around -19 to 19, and IEEE-754 single precision range is higher than that.
1119 return pow(arg, 2.0);
1120 }
1121
1122 void main()
1123 {
1124 // Note that the bug did not reproduce if an uniform was passed to the function instead of a constant,
1125 // or if the expression was moved outside the user-defined function.
1126 const float a = 1.0e-6;
1127 float b = 1.0e12 * fun(a);
1128 if (abs(b - 1.0) < 0.01)
1129 {
1130 gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0); // green
1131 }
1132 else
1133 {
1134 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); // red
1135 }
1136 }
1137 );
1138
1139 GLuint program = CompileProgram(mSimpleVSSource, fragmentShaderSource);
1140 EXPECT_NE(0u, program);
1141
1142 drawQuad(program, "inputAttribute", 0.5f);
1143 EXPECT_PIXEL_EQ(0, 0, 0, 255, 0, 255);
1144 EXPECT_GL_NO_ERROR();
1145}
Jamie Madillfa05f602015-05-07 13:47:11 -04001146
1147// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
1148ANGLE_INSTANTIATE_TEST(GLSLTest, ES2_D3D9(), ES2_D3D11());
1149
1150// Use this to select which configurations (e.g. which renderer, which GLES major version) these tests should be run against.
1151ANGLE_INSTANTIATE_TEST(GLSLTest_ES3, ES3_D3D11());