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;
+ }
+ }
+ }
+}
}