Refactor GL tests to use a shader library

Instead of having the same simple shaders repeated over and over in
the test code, reuse a single shader library.

BUG=angleproject:2474
TEST=angle_end2end_tests

Change-Id: I13f8ca8c0125e6d30f1761639bf8c3f69e0e77d2
Reviewed-on: https://chromium-review.googlesource.com/1012078
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/tests/gl_tests/WebGLCompatibilityTest.cpp b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
index 7d5e374..2ef0146 100644
--- a/src/tests/gl_tests/WebGLCompatibilityTest.cpp
+++ b/src/tests/gl_tests/WebGLCompatibilityTest.cpp
@@ -200,27 +200,14 @@
 
         ASSERT_GLENUM_EQ(GL_FRAMEBUFFER_COMPLETE, glCheckFramebufferStatus(GL_FRAMEBUFFER));
 
-        const std::string renderingVs =
-            "attribute vec4 position;\n"
-            "void main()\n"
-            "{\n"
-            "    gl_Position = vec4(position.xy, 0.0, 1.0);\n"
-            "}\n";
-
-        const std::string renderingFs =
-            "precision mediump float;\n"
-            "uniform vec4 writeValue;\n"
-            "void main()\n"
-            "{\n"
-            "   gl_FragColor = writeValue;\n"
-            "}\n";
-
-        ANGLE_GL_PROGRAM(renderingProgram, renderingVs, renderingFs);
+        ANGLE_GL_PROGRAM(renderingProgram, essl1_shaders::vs::Simple(),
+                         essl1_shaders::fs::UniformColor());
         glUseProgram(renderingProgram.get());
 
-        glUniform4fv(glGetUniformLocation(renderingProgram.get(), "writeValue"), 1, floatData);
+        glUniform4fv(glGetUniformLocation(renderingProgram.get(), essl1_shaders::ColorUniform()), 1,
+                     floatData);
 
-        drawQuad(renderingProgram.get(), "position", 0.5f, 1.0f, true);
+        drawQuad(renderingProgram.get(), essl1_shaders::PositionAttrib(), 0.5f, 1.0f, true);
 
         EXPECT_PIXEL_COLOR32F_NEAR(
             0, 0, GLColor32F(floatData[0], floatData[1], floatData[2], floatData[3]), 1.0f);
@@ -1294,14 +1281,7 @@
         "    gl_Position = vec4(a_pos, a_pos, a_pos, 1.0);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     ASSERT_NE(-1, posLocation);
     glUseProgram(program.get());
@@ -1357,14 +1337,7 @@
         "    gl_Position = vec4(a_pos, a_pos, a_pos, a_w);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     GLint wLocation = glGetAttribLocation(program.get(), "a_w");
     ASSERT_NE(-1, posLocation);
@@ -1430,14 +1403,7 @@
         "    gl_Position = vec4(a_pos, a_pos, a_pos, a_w);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     GLint wLocation = glGetAttribLocation(program.get(), "a_w");
     ASSERT_NE(-1, posLocation);
@@ -1498,14 +1464,7 @@
         "    gl_Position = vec4(a_pos, a_pos, a_pos, 1.0);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     ASSERT_NE(-1, posLocation);
     glUseProgram(program.get());
@@ -1558,14 +1517,7 @@
         "    gl_Position = vec4(a_pos, a_pos, a_pos, 1.0);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     ASSERT_NE(-1, posLocation);
     glUseProgram(program.get());
@@ -1829,14 +1781,7 @@
         "    gl_Position = vec4(a_pos, a_pos, a_pos, 1.0);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
 
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     ASSERT_NE(-1, posLocation);
@@ -2056,14 +2001,7 @@
         "    gl_Position = vec4(a_pos, 1.0);\n"
         "}\n";
 
-    const std::string &frag =
-        "precision highp float;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_FragColor = vec4(1.0);\n"
-        "}\n";
-
-    ANGLE_GL_PROGRAM(program, vert, frag);
+    ANGLE_GL_PROGRAM(program, vert, essl1_shaders::fs::Red());
 
     GLint posLocation = glGetAttribLocation(program.get(), "a_pos");
     ASSERT_NE(-1, posLocation);
@@ -3640,20 +3578,6 @@
 
     ASSERT_GL_NO_ERROR();
 
-    const char *vertESSL1 =
-        "attribute vec4 a_pos;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_Position = a_pos;\n"
-        "}\n";
-    const char *vertESSL3 =
-        "#version 300 es\n"
-        "in vec4 a_pos;\n"
-        "void main()\n"
-        "{\n"
-        "    gl_Position = a_pos;\n"
-        "}\n";
-
     GLenum allDrawBuffers[] = {
         GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2, GL_COLOR_ATTACHMENT3,
     };
@@ -3669,14 +3593,14 @@
         "{\n"
         "    gl_FragColor = vec4(0.0, 1.0, 0.0, 1.0);\n"
         "}\n";
-    ANGLE_GL_PROGRAM(programESSL1, vertESSL1, fragESSL1);
+    ANGLE_GL_PROGRAM(programESSL1, essl1_shaders::vs::Simple(), fragESSL1);
 
     {
         ClearEverythingToRed(renderbuffers);
 
         glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
         DrawBuffers(useEXT, 4, allDrawBuffers);
-        drawQuad(programESSL1, "a_pos", 0.5, 1.0, true);
+        drawQuad(programESSL1, essl1_shaders::PositionAttrib(), 0.5, 1.0, true);
         ASSERT_GL_NO_ERROR();
 
         CheckColors(renderbuffers, 0b0001, GLColor::green);
@@ -3690,7 +3614,7 @@
 
         glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
         DrawBuffers(useEXT, 4, halfDrawBuffers);
-        drawQuad(programESSL1, "a_pos", 0.5, 1.0, true);
+        drawQuad(programESSL1, essl1_shaders::PositionAttrib(), 0.5, 1.0, true);
         ASSERT_GL_NO_ERROR();
 
         CheckColors(renderbuffers, 0b1111, GLColor::red);
@@ -3701,6 +3625,7 @@
     // array of size MAX_DRAW_BUFFERS, so the WebGL spec stipulates that elements not written to
     // should default to 0. On the contrary, in ES3 outputs are specified one by one, so
     // attachments not declared in the shader should not be written to.
+    const char *positionAttrib;
     const char *writeOddOutputsVert;
     const char *writeOddOutputsFrag;
     GLColor unwrittenColor;
@@ -3708,7 +3633,8 @@
     {
         // In the extension, when an attachment isn't written to, it should get 0's
         unwrittenColor      = GLColor(0, 0, 0, 0);
-        writeOddOutputsVert = vertESSL1;
+        positionAttrib      = essl1_shaders::PositionAttrib();
+        writeOddOutputsVert = essl1_shaders::vs::Simple();
         writeOddOutputsFrag =
             "#extension GL_EXT_draw_buffers : require\n"
             "precision highp float;\n"
@@ -3723,7 +3649,8 @@
         // In ES3 if an attachment isn't declared, it shouldn't get written and should be red
         // because of the preceding clears.
         unwrittenColor      = GLColor::red;
-        writeOddOutputsVert = vertESSL3;
+        positionAttrib      = essl3_shaders::PositionAttrib();
+        writeOddOutputsVert = essl3_shaders::vs::Simple();
         writeOddOutputsFrag =
             "#version 300 es\n"
             "precision highp float;\n"
@@ -3743,7 +3670,7 @@
 
         glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
         DrawBuffers(useEXT, 4, allDrawBuffers);
-        drawQuad(writeOddOutputsProgram, "a_pos", 0.5, 1.0, true);
+        drawQuad(writeOddOutputsProgram, positionAttrib, 0.5, 1.0, true);
         ASSERT_GL_NO_ERROR();
 
         CheckColors(renderbuffers, 0b1010, GLColor::green);
@@ -3757,7 +3684,7 @@
 
         glBindFramebuffer(GL_FRAMEBUFFER, drawFBO);
         DrawBuffers(useEXT, 4, halfDrawBuffers);
-        drawQuad(writeOddOutputsProgram, "a_pos", 0.5, 1.0, true);
+        drawQuad(writeOddOutputsProgram, positionAttrib, 0.5, 1.0, true);
         ASSERT_GL_NO_ERROR();
 
         CheckColors(renderbuffers, 0b1000, GLColor::green);
@@ -4044,21 +3971,13 @@
         "    ivec2 xy = ivec2(gl_VertexID % 2, (gl_VertexID / 2 + gl_VertexID / 3) % 2);\n"
         "    gl_Position = vec4(vec2(xy) * 2. - 1., 0, 1);\n"
         "}";
-    const std::string fragmentShader =
-        "#version 300 es\n"
-        "precision mediump float;\n"
-        "out vec4 result;\n"
-        "void main()\n"
-        "{\n"
-        "    result = vec4(0, 1, 0, 1);\n"
-        "}";
 
-    ANGLE_GL_PROGRAM(program, vertexShader, fragmentShader);
+    ANGLE_GL_PROGRAM(program, vertexShader, essl3_shaders::fs::Red());
     glUseProgram(program);
 
     glDrawArrays(GL_TRIANGLES, 0, 6);
     ASSERT_GL_NO_ERROR();
-    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::green);
+    EXPECT_PIXEL_COLOR_EQ(0, 0, GLColor::red);
 }
 
 // Tests bindAttribLocations for length limit