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