Move TF Feedback linked varyings into D3D-only.

The LinkedVarying structure is a D3D-specific type, and the GL
back-end doesn't need the extra info. Isolate this into the D3D
back-end so we can clean up the Impl inteface.

BUG=angleproject:1123

Change-Id: I76d77ac505876d865e3e02f47acbfd6665a9507e
Reviewed-on: https://chromium-review.googlesource.com/293764
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/libANGLE/renderer/d3d/ProgramD3D.cpp b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
index b4b88a3..f4f9a99 100644
--- a/src/libANGLE/renderer/d3d/ProgramD3D.cpp
+++ b/src/libANGLE/renderer/d3d/ProgramD3D.cpp
@@ -1096,9 +1096,11 @@
     return LinkResult(linkSuccess, gl::Error(GL_NO_ERROR));
 }
 
-LinkResult ProgramD3D::link(const gl::Data &data, gl::InfoLog &infoLog,
-                            gl::Shader *fragmentShader, gl::Shader *vertexShader,
-                            int *registers, std::vector<gl::LinkedVarying> *linkedVaryings,
+LinkResult ProgramD3D::link(const gl::Data &data,
+                            gl::InfoLog &infoLog,
+                            gl::Shader *fragmentShader,
+                            gl::Shader *vertexShader,
+                            int *registers,
                             std::map<int, gl::VariableLocation> *outputVariables)
 {
     ShaderD3D *vertexShaderD3D = GetImplAs<ShaderD3D>(vertexShader);
@@ -1126,7 +1128,7 @@
     // Map the varyings to the register file
     VaryingPacking packing = {};
     *registers = mDynamicHLSL->packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D,
-                                            mData.getTransformFeedbackVaryings());
+                                            mData.getTransformFeedbackVaryingNames());
 
     if (*registers < 0)
     {
@@ -1135,10 +1137,11 @@
 
     LinkVaryingRegisters(infoLog, vertexShaderD3D, fragmentShaderD3D);
 
-    if (!mDynamicHLSL->generateShaderLinkHLSL(data, infoLog, *registers, packing, mPixelHLSL,
-                                              mVertexHLSL, fragmentShaderD3D, vertexShaderD3D,
-                                              mData.getTransformFeedbackVaryings(), linkedVaryings,
-                                              outputVariables, &mPixelShaderKey, &mUsesFragDepth))
+    std::vector<gl::LinkedVarying> linkedVaryings;
+    if (!mDynamicHLSL->generateShaderLinkHLSL(
+            data, infoLog, *registers, packing, mPixelHLSL, mVertexHLSL, fragmentShaderD3D,
+            vertexShaderD3D, mData.getTransformFeedbackVaryingNames(), &linkedVaryings,
+            outputVariables, &mPixelShaderKey, &mUsesFragDepth))
     {
         return LinkResult(false, gl::Error(GL_NO_ERROR));
     }
@@ -1154,6 +1157,8 @@
 
     defineUniformBlocks(*data.caps);
 
+    gatherTransformFeedbackVaryings(linkedVaryings);
+
     return LinkResult(true, gl::Error(GL_NO_ERROR));
 }
 
@@ -2052,6 +2057,8 @@
     mDirtySamplerMapping = true;
 
     std::fill(mAttributesByLayout, mAttributesByLayout + ArraySize(mAttributesByLayout), -1);
+
+    mTransformFeedbackLinkedVaryings.clear();
 }
 
 unsigned int ProgramD3D::getSerial() const
@@ -2110,4 +2117,21 @@
     }
 }
 
+void ProgramD3D::gatherTransformFeedbackVaryings(
+    const std::vector<gl::LinkedVarying> &linkedVaryings)
+{
+    // Gather the linked varyings that are used for transform feedback, they should all exist.
+    mTransformFeedbackLinkedVaryings.clear();
+    for (const std::string &tfVaryingName : mData.getTransformFeedbackVaryingNames())
+    {
+        for (const gl::LinkedVarying &linkedVarying : linkedVaryings)
+        {
+            if (tfVaryingName == linkedVarying.name)
+            {
+                mTransformFeedbackLinkedVaryings.push_back(linkedVarying);
+                break;
+            }
+        }
+    }
+}
 }