Extend LinkProgramPerfTest to support compile only

Add an option for "compie_only" and "compile_and_link".

Bug: chromium:849576

Change-Id: Id796ebb85ad5aff1a5272173f11ce2ff42685dce
Reviewed-on: https://chromium-review.googlesource.com/1186159
Commit-Queue: Jie A Chen <jie.a.chen@intel.com>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/tests/perf_tests/LinkProgramPerfTest.cpp b/src/tests/perf_tests/LinkProgramPerfTest.cpp
index c050662..a33d734 100644
--- a/src/tests/perf_tests/LinkProgramPerfTest.cpp
+++ b/src/tests/perf_tests/LinkProgramPerfTest.cpp
@@ -19,14 +19,23 @@
 namespace
 {
 
+enum class LinkProgramOption
+{
+    CompileOnly,
+    CompileAndLink,
+
+    Unspecified
+};
+
 struct LinkProgramParams final : public RenderTestParams
 {
-    LinkProgramParams()
+    LinkProgramParams(LinkProgramOption optionIn)
     {
         majorVersion = 2;
         minorVersion = 0;
         windowWidth  = 256;
         windowHeight = 256;
+        option       = optionIn;
     }
 
     std::string suffix() const override
@@ -34,6 +43,11 @@
         std::stringstream strstr;
         strstr << RenderTestParams::suffix();
 
+        if (option == LinkProgramOption::CompileOnly)
+        {
+            strstr << "_compile_only";
+        }
+
         if (eglParameters.deviceType == EGL_PLATFORM_ANGLE_DEVICE_TYPE_NULL_ANGLE)
         {
             strstr << "_null";
@@ -41,6 +55,8 @@
 
         return strstr.str();
     }
+
+    LinkProgramOption option;
 };
 
 std::ostream &operator<<(std::ostream &os, const LinkProgramParams &params)
@@ -96,10 +112,26 @@
         "void main() {\n"
         "    gl_FragColor = vec4(1, 0, 0, 1);\n"
         "}";
+    GLuint vs = CompileShader(GL_VERTEX_SHADER, vertexShader);
+    GLuint fs = CompileShader(GL_FRAGMENT_SHADER, fragmentShader);
 
-    GLuint program = CompileProgram(vertexShader, fragmentShader);
+    ASSERT_NE(0u, vs);
+    ASSERT_NE(0u, fs);
+    if (GetParam().option == LinkProgramOption::CompileOnly)
+    {
+        glDeleteShader(vs);
+        glDeleteShader(fs);
+        return;
+    }
+
+    GLuint program = glCreateProgram();
     ASSERT_NE(0u, program);
 
+    glAttachShader(program, vs);
+    glDeleteShader(vs);
+    glAttachShader(program, fs);
+    glDeleteShader(fs);
+    glLinkProgram(program);
     glUseProgram(program);
 
     GLint positionLoc = glGetAttribLocation(program, "position");
@@ -114,30 +146,30 @@
 
 using namespace egl_platform;
 
-LinkProgramParams LinkProgramD3D11Params()
+LinkProgramParams LinkProgramD3D11Params(LinkProgramOption option)
 {
-    LinkProgramParams params;
+    LinkProgramParams params(option);
     params.eglParameters = D3D11();
     return params;
 }
 
-LinkProgramParams LinkProgramD3D9Params()
+LinkProgramParams LinkProgramD3D9Params(LinkProgramOption option)
 {
-    LinkProgramParams params;
+    LinkProgramParams params(option);
     params.eglParameters = D3D9();
     return params;
 }
 
-LinkProgramParams LinkProgramOpenGLOrGLESParams()
+LinkProgramParams LinkProgramOpenGLOrGLESParams(LinkProgramOption option)
 {
-    LinkProgramParams params;
+    LinkProgramParams params(option);
     params.eglParameters = OPENGL_OR_GLES(false);
     return params;
 }
 
-LinkProgramParams LinkProgramVulkanParams()
+LinkProgramParams LinkProgramVulkanParams(LinkProgramOption option)
 {
-    LinkProgramParams params;
+    LinkProgramParams params(option);
     params.eglParameters = VULKAN();
     return params;
 }
@@ -148,9 +180,13 @@
 }
 
 ANGLE_INSTANTIATE_TEST(LinkProgramBenchmark,
-                       LinkProgramD3D11Params(),
-                       LinkProgramD3D9Params(),
-                       LinkProgramOpenGLOrGLESParams(),
-                       LinkProgramVulkanParams());
+                       LinkProgramD3D11Params(LinkProgramOption::CompileOnly),
+                       LinkProgramD3D9Params(LinkProgramOption::CompileOnly),
+                       LinkProgramOpenGLOrGLESParams(LinkProgramOption::CompileOnly),
+                       LinkProgramVulkanParams(LinkProgramOption::CompileOnly),
+                       LinkProgramD3D11Params(LinkProgramOption::CompileAndLink),
+                       LinkProgramD3D9Params(LinkProgramOption::CompileAndLink),
+                       LinkProgramOpenGLOrGLESParams(LinkProgramOption::CompileAndLink),
+                       LinkProgramVulkanParams(LinkProgramOption::CompileAndLink));
 
 }  // anonymous namespace