Revert "Revert "Clean up interface to ProgramImpl::link.""

Should be fixed now with the fix the prior CL.

BUG=angleproject:1123

This reverts commit 63069dfc20bc34fe6962dee694953893ee6fc663.

Change-Id: Ie1826673820e3a24f9bb3e4ff5c723ac47570041
Reviewed-on: https://chromium-review.googlesource.com/297050
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/libANGLE/Program.cpp b/src/libANGLE/Program.cpp
index 060bfd6..40ec835 100644
--- a/src/libANGLE/Program.cpp
+++ b/src/libANGLE/Program.cpp
@@ -312,9 +312,7 @@
 
     linkOutputVariables();
 
-    rx::LinkResult result =
-        mProgram->link(data, mInfoLog, mData.mAttachedFragmentShader, mData.mAttachedVertexShader);
-
+    rx::LinkResult result = mProgram->link(data, mInfoLog);
     if (result.error.isError() || !result.linkSuccess)
     {
         return result.error;
diff --git a/src/libANGLE/renderer/ProgramImpl.h b/src/libANGLE/renderer/ProgramImpl.h
index 453fdb7..94da0c7 100644
--- a/src/libANGLE/renderer/ProgramImpl.h
+++ b/src/libANGLE/renderer/ProgramImpl.h
@@ -40,11 +40,7 @@
     virtual LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) = 0;
     virtual gl::Error save(gl::BinaryOutputStream *stream) = 0;
 
-    virtual LinkResult link(const gl::Data &data,
-                            gl::InfoLog &infoLog,
-                            gl::Shader *fragmentShader,
-                            gl::Shader *vertexShader) = 0;
-
+    virtual LinkResult link(const gl::Data &data, gl::InfoLog &infoLog) = 0;
     virtual GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) = 0;
 
     virtual void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) = 0;
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index 6d1d46e..38b4f5f 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -1124,24 +1124,24 @@
     return LinkResult(linkSuccess, gl::Error(GL_NO_ERROR));
 }
 
-LinkResult ProgramD3D::link(const gl::Data &data,
-                            gl::InfoLog &infoLog,
-                            gl::Shader *fragmentShader,
-                            gl::Shader *vertexShader)
+LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog)
 {
-    ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(vertexShader);
-    ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(fragmentShader);
+    const gl::Shader *vertexShader   = mData.getAttachedVertexShader();
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
 
-    mSamplersPS.resize(data.caps->maxTextureImageUnits);
+    const ShaderD3D *vertexShaderD3D   = GetImplAs<ShaderD3D>(vertexShader);
+    const ShaderD3D *fragmentShaderD3D = GetImplAs<ShaderD3D>(fragmentShader);
+
     mSamplersVS.resize(data.caps->maxVertexTextureImageUnits);
-
-    mPixelHLSL = fragmentShaderD3D->getTranslatedSource();
-    fragmentShaderD3D->generateWorkarounds(&mPixelWorkarounds);
+    mSamplersPS.resize(data.caps->maxTextureImageUnits);
 
     mVertexHLSL = vertexShaderD3D->getTranslatedSource();
     vertexShaderD3D->generateWorkarounds(&mVertexWorkarounds);
     mShaderVersion = vertexShaderD3D->getShaderVersion();
 
+    mPixelHLSL = fragmentShaderD3D->getTranslatedSource();
+    fragmentShaderD3D->generateWorkarounds(&mPixelWorkarounds);
+
     if (mRenderer->getRendererLimitations().noFrontFacingSupport)
     {
         if (fragmentShaderD3D->usesFrontFacing())
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.h b/src/libANGLE/renderer/d3d/ProgramD3D.h
index 9ce3b0d..6efc654 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.h
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.h
@@ -70,11 +70,7 @@
     gl::Error getVertexExecutableForInputLayout(const gl::InputLayout &inputLayout, ShaderExecutableD3D **outExectuable, gl::InfoLog *infoLog);
     ShaderExecutableD3D *getGeometryExecutable() const { return mGeometryExecutable; }
 
-    LinkResult link(const gl::Data &data,
-                    gl::InfoLog &infoLog,
-                    gl::Shader *fragmentShader,
-                    gl::Shader *vertexShader) override;
-
+    LinkResult link(const gl::Data &data, gl::InfoLog &infoLog) override;
     GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
 
     void initializeUniformStorage();
diff --git a/src/libANGLE/renderer/gl/ProgramGL.cpp b/src/libANGLE/renderer/gl/ProgramGL.cpp
index eb2093e..3a70ae9 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.cpp
+++ b/src/libANGLE/renderer/gl/ProgramGL.cpp
@@ -58,14 +58,14 @@
     return gl::Error(GL_INVALID_OPERATION);
 }
 
-LinkResult ProgramGL::link(const gl::Data &data,
-                           gl::InfoLog &infoLog,
-                           gl::Shader *fragmentShader,
-                           gl::Shader *vertexShader)
+LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog)
 {
     // Reset the program state, delete the current program if one exists
     reset();
 
+    const gl::Shader *vertexShader   = mData.getAttachedVertexShader();
+    const gl::Shader *fragmentShader = mData.getAttachedFragmentShader();
+
     const ShaderGL *vertexShaderGL   = GetImplAs<ShaderGL>(vertexShader);
     const ShaderGL *fragmentShaderGL = GetImplAs<ShaderGL>(fragmentShader);
 
diff --git a/src/libANGLE/renderer/gl/ProgramGL.h b/src/libANGLE/renderer/gl/ProgramGL.h
index dbe65f5..e83d7da 100644
--- a/src/libANGLE/renderer/gl/ProgramGL.h
+++ b/src/libANGLE/renderer/gl/ProgramGL.h
@@ -37,11 +37,7 @@
     LinkResult load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) override;
     gl::Error save(gl::BinaryOutputStream *stream) override;
 
-    LinkResult link(const gl::Data &data,
-                    gl::InfoLog &infoLog,
-                    gl::Shader *fragmentShader,
-                    gl::Shader *vertexShader) override;
-
+    LinkResult link(const gl::Data &data, gl::InfoLog &infoLog) override;
     GLboolean validate(const gl::Caps &caps, gl::InfoLog *infoLog) override;
 
     void setUniform1fv(GLint location, GLsizei count, const GLfloat *v) override;