Fix the bug that long varying varibales are mapped into different names in fragment/vertex shaders.
ANGLEBUG=144
TEST=the same long varying variable name in fragment/vertex shaders map to the same shortened name if using the same translator.
Review URL: http://codereview.appspot.com/4547063
git-svn-id: https://angleproject.googlecode.com/svn/trunk@660 736b8ea6-26fd-11df-bfd4-992fa37f6226
diff --git a/src/compiler/MapLongVariableNames.cpp b/src/compiler/MapLongVariableNames.cpp
index 9968262..847e6e6 100644
--- a/src/compiler/MapLongVariableNames.cpp
+++ b/src/compiler/MapLongVariableNames.cpp
@@ -8,22 +8,44 @@
namespace {
-TString mapLongName(int id, const TString& name)
+TString mapLongName(int id, const TString& name, bool isVarying)
{
ASSERT(name.size() > MAX_IDENTIFIER_NAME_SIZE);
TStringStream stream;
- stream << "webgl_" << id << "_";
+ stream << "webgl_";
+ if (isVarying)
+ stream << "v";
+ stream << id << "_";
stream << name.substr(0, MAX_IDENTIFIER_NAME_SIZE - stream.str().size());
return stream.str();
}
} // anonymous namespace
+MapLongVariableNames::MapLongVariableNames(
+ TMap<TString, TString>& varyingLongNameMap)
+ : mVaryingLongNameMap(varyingLongNameMap)
+{
+}
+
void MapLongVariableNames::visitSymbol(TIntermSymbol* symbol)
{
ASSERT(symbol != NULL);
- if (symbol->getSymbol().size() > MAX_IDENTIFIER_NAME_SIZE)
- symbol->setSymbol(mapLongName(symbol->getId(), symbol->getSymbol()));
+ if (symbol->getSymbol().size() > MAX_IDENTIFIER_NAME_SIZE) {
+ switch (symbol->getQualifier()) {
+ case EvqVaryingIn:
+ case EvqVaryingOut:
+ case EvqInvariantVaryingIn:
+ case EvqInvariantVaryingOut:
+ symbol->setSymbol(
+ mapVaryingLongName(symbol->getSymbol()));
+ break;
+ default:
+ symbol->setSymbol(
+ mapLongName(symbol->getId(), symbol->getSymbol(), false));
+ break;
+ };
+ }
}
void MapLongVariableNames::visitConstantUnion(TIntermConstantUnion*)
@@ -59,3 +81,16 @@
{
return true;
}
+
+TString MapLongVariableNames::mapVaryingLongName(const TString& name)
+{
+ TMap<TString, TString>::const_iterator it = mVaryingLongNameMap.find(name);
+ if (it != mVaryingLongNameMap.end())
+ return (*it).second;
+
+ int id = mVaryingLongNameMap.size();
+ TString mappedName = mapLongName(id, name, true);
+ mVaryingLongNameMap.insert(
+ TMap<TString, TString>::value_type(name, mappedName));
+ return mappedName;
+}