Use GetOperatorString when writing GLSL unary built-in calls
GetOperatorString is now used when writing GLSL for built-in calls
that fall under TIntermUnary. Component-wise not TOperator enum is
renamed for consistency.
This also cleans up some unnecessary creation of string objects when
writing built-in functions.
BUG=angleproject:1682
TEST=angle_unittests, angle_end2end_tests, WebGL conformance tests
Change-Id: I89b2ef222bf5af479d4977417f320789b58ace85
Reviewed-on: https://chromium-review.googlesource.com/424552
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
Reviewed-by: Jamie Madill <jmadill@chromium.org>
diff --git a/src/compiler/translator/OutputGLSLBase.cpp b/src/compiler/translator/OutputGLSLBase.cpp
index 790a1bf..e7684ed 100644
--- a/src/compiler/translator/OutputGLSLBase.cpp
+++ b/src/compiler/translator/OutputGLSLBase.cpp
@@ -143,13 +143,24 @@
TOperator op,
bool useEmulatedFunction)
{
- TString opStr(GetOperatorString(op));
- opStr += "(";
- if (useEmulatedFunction)
+ TInfoSinkBase &out = objSink();
+ if (visit == PreVisit)
{
- opStr = BuiltInFunctionEmulator::GetEmulatedFunctionName(opStr);
+ const char *opStr(GetOperatorString(op));
+ if (useEmulatedFunction)
+ {
+ BuiltInFunctionEmulator::WriteEmulatedFunctionName(out, opStr);
+ }
+ else
+ {
+ out << opStr;
+ }
+ out << "(";
}
- writeTriplet(visit, opStr.c_str(), ", ", ")");
+ else
+ {
+ writeTriplet(visit, nullptr, ", ", ")");
+ }
}
void TOutputGLSLBase::writeLayoutQualifier(const TType &type)
@@ -641,9 +652,6 @@
case EOpPositive:
preString = "(+";
break;
- case EOpVectorLogicalNot:
- preString = "not(";
- break;
case EOpLogicalNot:
preString = "(!";
break;
@@ -667,171 +675,62 @@
break;
case EOpRadians:
- preString = "radians(";
- break;
case EOpDegrees:
- preString = "degrees(";
- break;
case EOpSin:
- preString = "sin(";
- break;
case EOpCos:
- preString = "cos(";
- break;
case EOpTan:
- preString = "tan(";
- break;
case EOpAsin:
- preString = "asin(";
- break;
case EOpAcos:
- preString = "acos(";
- break;
case EOpAtan:
- preString = "atan(";
- break;
-
case EOpSinh:
- preString = "sinh(";
- break;
case EOpCosh:
- preString = "cosh(";
- break;
case EOpTanh:
- preString = "tanh(";
- break;
case EOpAsinh:
- preString = "asinh(";
- break;
case EOpAcosh:
- preString = "acosh(";
- break;
case EOpAtanh:
- preString = "atanh(";
- break;
-
case EOpExp:
- preString = "exp(";
- break;
case EOpLog:
- preString = "log(";
- break;
case EOpExp2:
- preString = "exp2(";
- break;
case EOpLog2:
- preString = "log2(";
- break;
case EOpSqrt:
- preString = "sqrt(";
- break;
case EOpInverseSqrt:
- preString = "inversesqrt(";
- break;
-
case EOpAbs:
- preString = "abs(";
- break;
case EOpSign:
- preString = "sign(";
- break;
case EOpFloor:
- preString = "floor(";
- break;
case EOpTrunc:
- preString = "trunc(";
- break;
case EOpRound:
- preString = "round(";
- break;
case EOpRoundEven:
- preString = "roundEven(";
- break;
case EOpCeil:
- preString = "ceil(";
- break;
case EOpFract:
- preString = "fract(";
- break;
case EOpIsNan:
- preString = "isnan(";
- break;
case EOpIsInf:
- preString = "isinf(";
- break;
-
case EOpFloatBitsToInt:
- preString = "floatBitsToInt(";
- break;
case EOpFloatBitsToUint:
- preString = "floatBitsToUint(";
- break;
case EOpIntBitsToFloat:
- preString = "intBitsToFloat(";
- break;
case EOpUintBitsToFloat:
- preString = "uintBitsToFloat(";
- break;
-
case EOpPackSnorm2x16:
- preString = "packSnorm2x16(";
- break;
case EOpPackUnorm2x16:
- preString = "packUnorm2x16(";
- break;
case EOpPackHalf2x16:
- preString = "packHalf2x16(";
- break;
case EOpUnpackSnorm2x16:
- preString = "unpackSnorm2x16(";
- break;
case EOpUnpackUnorm2x16:
- preString = "unpackUnorm2x16(";
- break;
case EOpUnpackHalf2x16:
- preString = "unpackHalf2x16(";
- break;
-
case EOpLength:
- preString = "length(";
- break;
case EOpNormalize:
- preString = "normalize(";
- break;
-
case EOpDFdx:
- preString = "dFdx(";
- break;
case EOpDFdy:
- preString = "dFdy(";
- break;
case EOpFwidth:
- preString = "fwidth(";
- break;
-
case EOpTranspose:
- preString = "transpose(";
- break;
case EOpDeterminant:
- preString = "determinant(";
- break;
case EOpInverse:
- preString = "inverse(";
- break;
-
case EOpAny:
- preString = "any(";
- break;
case EOpAll:
- preString = "all(";
- break;
-
+ case EOpLogicalNotComponentWise:
+ writeBuiltInFunctionTriplet(visit, node->getOp(), node->getUseEmulatedFunction());
+ return true;
default:
UNREACHABLE();
}
- if (visit == PreVisit && node->getUseEmulatedFunction())
- preString = BuiltInFunctionEmulator::GetEmulatedFunctionName(preString);
writeTriplet(visit, preString.c_str(), NULL, postString.c_str());
return true;
@@ -976,7 +875,6 @@
{
bool visitChildren = true;
TInfoSinkBase &out = objSink();
- bool useEmulatedFunction = (visit == PreVisit && node->getUseEmulatedFunction());
switch (node->getOp())
{
case EOpPrototype:
@@ -1074,7 +972,7 @@
case EOpMemoryBarrierImage:
case EOpMemoryBarrierShared:
case EOpGroupMemoryBarrier:
- writeBuiltInFunctionTriplet(visit, node->getOp(), useEmulatedFunction);
+ writeBuiltInFunctionTriplet(visit, node->getOp(), node->getUseEmulatedFunction());
break;
default:
UNREACHABLE();