Only output referenced attributes, uniforms and varyings

TRAC #11590 Signed-off-by: Shannon Woods Signed-off-by: Daniel Koch Author: Nicolas Capens git-svn-id: https://angleproject.googlecode.com/svn/trunk@163 736b8ea6-26fd-11df-bfd4-992fa37f6226
parent 5024cc49
...@@ -94,16 +94,22 @@ void OutputHLSL::header() ...@@ -94,16 +94,22 @@ void OutputHLSL::header()
if (qualifier == EvqUniform) if (qualifier == EvqUniform)
{ {
if (mReferencedUniforms.find(name.c_str()) != mReferencedUniforms.end())
{
uniforms += "uniform " + typeString(type) + " " + decorate(name) + arrayString(type) + ";\n"; uniforms += "uniform " + typeString(type) + " " + decorate(name) + arrayString(type) + ";\n";
} }
}
else if (qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn) else if (qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn)
{ {
if (mReferencedVaryings.find(name.c_str()) != mReferencedVaryings.end())
{
// Program linking depends on this exact format // Program linking depends on this exact format
varyingInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD" + str(semanticIndex) + ";\n"; varyingInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD" + str(semanticIndex) + ";\n";
varyingGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n"; varyingGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n";
semanticIndex += type.isArray() ? type.getArraySize() : 1; semanticIndex += type.isArray() ? type.getArraySize() : 1;
} }
}
else if (qualifier == EvqGlobal || qualifier == EvqTemporary) else if (qualifier == EvqGlobal || qualifier == EvqTemporary)
{ {
// Globals are declared and intialized as an aggregate node // Globals are declared and intialized as an aggregate node
...@@ -231,21 +237,30 @@ void OutputHLSL::header() ...@@ -231,21 +237,30 @@ void OutputHLSL::header()
if (qualifier == EvqUniform) if (qualifier == EvqUniform)
{ {
if (mReferencedUniforms.find(name.c_str()) != mReferencedUniforms.end())
{
uniforms += "uniform " + typeString(type) + " " + decorate(name) + arrayString(type) + ";\n"; uniforms += "uniform " + typeString(type) + " " + decorate(name) + arrayString(type) + ";\n";
} }
}
else if (qualifier == EvqAttribute) else if (qualifier == EvqAttribute)
{ {
if (mReferencedAttributes.find(name.c_str()) != mReferencedAttributes.end())
{
attributeInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD" + str(semanticIndex) + ";\n"; attributeInput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD" + str(semanticIndex) + ";\n";
attributeGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n"; attributeGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n";
semanticIndex += type.isArray() ? type.getArraySize() : 1; semanticIndex += type.isArray() ? type.getArraySize() : 1;
} }
}
else if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut) else if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut)
{ {
if (mReferencedVaryings.find(name.c_str()) != mReferencedVaryings.end())
{
// Program linking depends on this exact format // Program linking depends on this exact format
varyingOutput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD0;\n"; // Actual semantic index assigned during link varyingOutput += " " + typeString(type) + " " + decorate(name) + arrayString(type) + " : TEXCOORD0;\n"; // Actual semantic index assigned during link
varyingGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n"; varyingGlobals += "static " + typeString(type) + " " + decorate(name) + arrayString(type) + " = " + initializer(type) + ";\n";
} }
}
else if (qualifier == EvqGlobal || qualifier == EvqTemporary) else if (qualifier == EvqGlobal || qualifier == EvqTemporary)
{ {
// Globals are declared and intialized as an aggregate node // Globals are declared and intialized as an aggregate node
...@@ -617,12 +632,15 @@ void OutputHLSL::footer() ...@@ -617,12 +632,15 @@ void OutputHLSL::footer()
const TType &type = variable->getType(); const TType &type = variable->getType();
TQualifier qualifier = type.getQualifier(); TQualifier qualifier = type.getQualifier();
if (qualifier == EvqVaryingIn) if (qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn)
{
if (mReferencedVaryings.find(name.c_str()) != mReferencedVaryings.end())
{ {
out << " " + decorate(name) + " = input." + decorate(name) + ";\n"; out << " " + decorate(name) + " = input." + decorate(name) + ";\n";
} }
} }
} }
}
out << "\n" out << "\n"
" gl_main();\n" " gl_main();\n"
...@@ -648,10 +666,13 @@ void OutputHLSL::footer() ...@@ -648,10 +666,13 @@ void OutputHLSL::footer()
if (qualifier == EvqAttribute) if (qualifier == EvqAttribute)
{ {
if (mReferencedAttributes.find(name.c_str()) != mReferencedAttributes.end())
{
out << " " + decorate(name) + " = input." + decorate(name) + ";\n"; out << " " + decorate(name) + " = input." + decorate(name) + ";\n";
} }
} }
} }
}
out << "\n" out << "\n"
" gl_main();\n" " gl_main();\n"
...@@ -678,12 +699,15 @@ void OutputHLSL::footer() ...@@ -678,12 +699,15 @@ void OutputHLSL::footer()
if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut) if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut)
{ {
if (mReferencedVaryings.find(name.c_str()) != mReferencedVaryings.end())
{
// Program linking depends on this exact format // Program linking depends on this exact format
out << " output." + decorate(name) + " = " + decorate(name) + ";\n"; out << " output." + decorate(name) + " = " + decorate(name) + ";\n";
} }
} }
} }
} }
}
out << " return output;\n" out << " return output;\n"
"}\n"; "}\n";
...@@ -705,6 +729,21 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node) ...@@ -705,6 +729,21 @@ void OutputHLSL::visitSymbol(TIntermSymbol *node)
} }
else else
{ {
TQualifier qualifier = node->getQualifier();
if (qualifier == EvqUniform)
{
mReferencedUniforms.insert(name.c_str());
}
else if (qualifier == EvqAttribute)
{
mReferencedAttributes.insert(name.c_str());
}
else if (qualifier == EvqVaryingOut || qualifier == EvqInvariantVaryingOut || qualifier == EvqVaryingIn || qualifier == EvqInvariantVaryingIn)
{
mReferencedVaryings.insert(name.c_str());
}
out << decorate(name); out << decorate(name);
} }
} }
......
...@@ -57,6 +57,10 @@ class OutputHLSL : public TIntermTraverser ...@@ -57,6 +57,10 @@ class OutputHLSL : public TIntermTraverser
TInfoSinkBase mBody; TInfoSinkBase mBody;
TInfoSinkBase mFooter; TInfoSinkBase mFooter;
std::set<std::string> mReferencedUniforms;
std::set<std::string> mReferencedAttributes;
std::set<std::string> mReferencedVaryings;
// Parameters determining what goes in the header output // Parameters determining what goes in the header output
bool mUsesTexture2D; bool mUsesTexture2D;
bool mUsesTexture2D_bias; bool mUsesTexture2D_bias;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment