Use GetOperatorString when writing GLSL built-in function calls

GetOperatorString is now used when writing GLSL for built-in calls
that fall under TIntermAggregate. Component wise and not component
wise TOperator enums are disambiguated from each other.

BUG=angleproject:1682
TEST=angle_unittests, angle_end2end_tests, WebGL conformance tests

Change-Id: I861f1e94eb695eb712592df99705848b442ef07b
Reviewed-on: https://chromium-review.googlesource.com/424532
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 9256faa..790a1bf 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -140,12 +140,16 @@
 }
 
 void TOutputGLSLBase::writeBuiltInFunctionTriplet(Visit visit,
-                                                  const char *preStr,
+                                                  TOperator op,
                                                   bool useEmulatedFunction)
 {
-    TString preString =
-        useEmulatedFunction ? BuiltInFunctionEmulator::GetEmulatedFunctionName(preStr) : preStr;
-    writeTriplet(visit, preString.c_str(), ", ", ")");
+    TString opStr(GetOperatorString(op));
+    opStr += "(";
+    if (useEmulatedFunction)
+    {
+        opStr = BuiltInFunctionEmulator::GetEmulatedFunctionName(opStr);
+    }
+    writeTriplet(visit, opStr.c_str(), ", ", ")");
 }
 
 void TOutputGLSLBase::writeLayoutQualifier(const TType &type)
@@ -1039,100 +1043,38 @@
             writeConstructorTriplet(visit, node->getType());
             break;
 
-        case EOpOuterProduct:
-            writeBuiltInFunctionTriplet(visit, "outerProduct(", useEmulatedFunction);
-            break;
-
-        case EOpLessThan:
-            writeBuiltInFunctionTriplet(visit, "lessThan(", useEmulatedFunction);
-            break;
-        case EOpGreaterThan:
-            writeBuiltInFunctionTriplet(visit, "greaterThan(", useEmulatedFunction);
-            break;
-        case EOpLessThanEqual:
-            writeBuiltInFunctionTriplet(visit, "lessThanEqual(", useEmulatedFunction);
-            break;
-        case EOpGreaterThanEqual:
-            writeBuiltInFunctionTriplet(visit, "greaterThanEqual(", useEmulatedFunction);
-            break;
-        case EOpVectorEqual:
-            writeBuiltInFunctionTriplet(visit, "equal(", useEmulatedFunction);
-            break;
-        case EOpVectorNotEqual:
-            writeBuiltInFunctionTriplet(visit, "notEqual(", useEmulatedFunction);
-            break;
-
+        case EOpEqualComponentWise:
+        case EOpNotEqualComponentWise:
+        case EOpLessThanComponentWise:
+        case EOpGreaterThanComponentWise:
+        case EOpLessThanEqualComponentWise:
+        case EOpGreaterThanEqualComponentWise:
         case EOpMod:
-            writeBuiltInFunctionTriplet(visit, "mod(", useEmulatedFunction);
-            break;
         case EOpModf:
-            writeBuiltInFunctionTriplet(visit, "modf(", useEmulatedFunction);
-            break;
         case EOpPow:
-            writeBuiltInFunctionTriplet(visit, "pow(", useEmulatedFunction);
-            break;
         case EOpAtan:
-            writeBuiltInFunctionTriplet(visit, "atan(", useEmulatedFunction);
-            break;
         case EOpMin:
-            writeBuiltInFunctionTriplet(visit, "min(", useEmulatedFunction);
-            break;
         case EOpMax:
-            writeBuiltInFunctionTriplet(visit, "max(", useEmulatedFunction);
-            break;
         case EOpClamp:
-            writeBuiltInFunctionTriplet(visit, "clamp(", useEmulatedFunction);
-            break;
         case EOpMix:
-            writeBuiltInFunctionTriplet(visit, "mix(", useEmulatedFunction);
-            break;
         case EOpStep:
-            writeBuiltInFunctionTriplet(visit, "step(", useEmulatedFunction);
-            break;
         case EOpSmoothStep:
-            writeBuiltInFunctionTriplet(visit, "smoothstep(", useEmulatedFunction);
-            break;
         case EOpDistance:
-            writeBuiltInFunctionTriplet(visit, "distance(", useEmulatedFunction);
-            break;
         case EOpDot:
-            writeBuiltInFunctionTriplet(visit, "dot(", useEmulatedFunction);
-            break;
         case EOpCross:
-            writeBuiltInFunctionTriplet(visit, "cross(", useEmulatedFunction);
-            break;
         case EOpFaceForward:
-            writeBuiltInFunctionTriplet(visit, "faceforward(", useEmulatedFunction);
-            break;
         case EOpReflect:
-            writeBuiltInFunctionTriplet(visit, "reflect(", useEmulatedFunction);
-            break;
         case EOpRefract:
-            writeBuiltInFunctionTriplet(visit, "refract(", useEmulatedFunction);
-            break;
-        case EOpMul:
-            writeBuiltInFunctionTriplet(visit, "matrixCompMult(", useEmulatedFunction);
-            break;
+        case EOpMulMatrixComponentWise:
+        case EOpOuterProduct:
         case EOpBarrier:
-            writeBuiltInFunctionTriplet(visit, "barrier(", useEmulatedFunction);
-            break;
         case EOpMemoryBarrier:
-            writeBuiltInFunctionTriplet(visit, "memoryBarrier(", useEmulatedFunction);
-            break;
         case EOpMemoryBarrierAtomicCounter:
-            writeBuiltInFunctionTriplet(visit, "memoryBarrierAtomicCounter(", useEmulatedFunction);
-            break;
         case EOpMemoryBarrierBuffer:
-            writeBuiltInFunctionTriplet(visit, "memoryBarrierBuffer(", useEmulatedFunction);
-            break;
         case EOpMemoryBarrierImage:
-            writeBuiltInFunctionTriplet(visit, "memoryBarrierImage(", useEmulatedFunction);
-            break;
         case EOpMemoryBarrierShared:
-            writeBuiltInFunctionTriplet(visit, "memoryBarrierShared(", useEmulatedFunction);
-            break;
         case EOpGroupMemoryBarrier:
-            writeBuiltInFunctionTriplet(visit, "groupMemoryBarrier(", useEmulatedFunction);
+            writeBuiltInFunctionTriplet(visit, node->getOp(), useEmulatedFunction);
             break;
         default:
             UNREACHABLE();