Commit d68924e5 by Olli Etuaho Committed by Commit Bot

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: 's avatarJamie Madill <jmadill@chromium.org>
parent a1325179
...@@ -228,10 +228,10 @@ void BuiltInFunctionEmulator::Cleanup() ...@@ -228,10 +228,10 @@ void BuiltInFunctionEmulator::Cleanup()
} }
// static // static
TString BuiltInFunctionEmulator::GetEmulatedFunctionName(const TString &name) void BuiltInFunctionEmulator::WriteEmulatedFunctionName(TInfoSinkBase &out, const char *name)
{ {
ASSERT(name[name.length() - 1] == '('); ASSERT(name[strlen(name) - 1] != '(');
return "webgl_" + name.substr(0, name.length() - 1) + "_emu("; out << "webgl_" << name << "_emu";
} }
BuiltInFunctionEmulator::FunctionId::FunctionId() BuiltInFunctionEmulator::FunctionId::FunctionId()
......
...@@ -27,8 +27,8 @@ class BuiltInFunctionEmulator ...@@ -27,8 +27,8 @@ class BuiltInFunctionEmulator
void Cleanup(); void Cleanup();
// "name(" becomes "webgl_name_emu(". // "name" gets written as "webgl_name_emu".
static TString GetEmulatedFunctionName(const TString &name); static void WriteEmulatedFunctionName(TInfoSinkBase &out, const char *name);
bool IsOutputEmpty() const; bool IsOutputEmpty() const;
......
...@@ -676,12 +676,12 @@ bool EmulatePrecision::visitUnary(Visit visit, TIntermUnary *node) ...@@ -676,12 +676,12 @@ bool EmulatePrecision::visitUnary(Visit visit, TIntermUnary *node)
switch (node->getOp()) switch (node->getOp())
{ {
case EOpNegative: case EOpNegative:
case EOpVectorLogicalNot:
case EOpLogicalNot: case EOpLogicalNot:
case EOpPostIncrement: case EOpPostIncrement:
case EOpPostDecrement: case EOpPostDecrement:
case EOpPreIncrement: case EOpPreIncrement:
case EOpPreDecrement: case EOpPreDecrement:
case EOpLogicalNotComponentWise:
break; break;
default: default:
if (canRoundFloat(node->getType()) && visit == PreVisit) if (canRoundFloat(node->getType()) && visit == PreVisit)
......
...@@ -272,7 +272,7 @@ void InsertBuiltInFunctions(sh::GLenum type, ...@@ -272,7 +272,7 @@ void InsertBuiltInFunctions(sh::GLenum type,
bvec); bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAny, bool1, "any", bvec); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAny, bool1, "any", bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAll, bool1, "all", bvec); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpAll, bool1, "all", bvec);
symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpVectorLogicalNot, bvec, "not", bvec); symbolTable.insertBuiltIn(COMMON_BUILTINS, EOpLogicalNotComponentWise, bvec, "not", bvec);
const TType *sampler2D = TCache::getType(EbtSampler2D); const TType *sampler2D = TCache::getType(EbtSampler2D);
const TType *samplerCube = TCache::getType(EbtSamplerCube); const TType *samplerCube = TCache::getType(EbtSamplerCube);
......
...@@ -2123,7 +2123,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryComponentWise(TOperator op, ...@@ -2123,7 +2123,7 @@ TConstantUnion *TIntermConstantUnion::foldUnaryComponentWise(TOperator op,
} }
break; break;
case EOpVectorLogicalNot: case EOpLogicalNotComponentWise:
ASSERT(getType().getBasicType() == EbtBool); ASSERT(getType().getBasicType() == EbtBool);
resultArray[i].setBConst(!operandArray[i].getBConst()); resultArray[i].setBConst(!operandArray[i].getBConst());
break; break;
......
...@@ -18,8 +18,6 @@ const char *GetOperatorString(TOperator op) ...@@ -18,8 +18,6 @@ const char *GetOperatorString(TOperator op)
return "+"; return "+";
case EOpLogicalNot: case EOpLogicalNot:
return "!"; return "!";
case EOpVectorLogicalNot:
return "not";
case EOpBitwiseNot: case EOpBitwiseNot:
return "~"; return "~";
...@@ -251,6 +249,8 @@ const char *GetOperatorString(TOperator op) ...@@ -251,6 +249,8 @@ const char *GetOperatorString(TOperator op)
return "any"; return "any";
case EOpAll: case EOpAll:
return "all"; return "all";
case EOpLogicalNotComponentWise:
return "not";
case EOpKill: case EOpKill:
return "kill"; return "kill";
......
...@@ -25,7 +25,6 @@ enum TOperator ...@@ -25,7 +25,6 @@ enum TOperator
EOpNegative, EOpNegative,
EOpPositive, EOpPositive,
EOpLogicalNot, EOpLogicalNot,
EOpVectorLogicalNot,
EOpBitwiseNot, EOpBitwiseNot,
EOpPostIncrement, EOpPostIncrement,
...@@ -34,7 +33,8 @@ enum TOperator ...@@ -34,7 +33,8 @@ enum TOperator
EOpPreDecrement, EOpPreDecrement,
// //
// binary operations // binary operations (ones with special GLSL syntax are used in TIntermBinary nodes, others in
// TIntermAggregate nodes)
// //
EOpAdd, EOpAdd,
...@@ -82,7 +82,7 @@ enum TOperator ...@@ -82,7 +82,7 @@ enum TOperator
EOpIndexDirectInterfaceBlock, EOpIndexDirectInterfaceBlock,
// //
// Built-in functions potentially mapped to operators // Built-in functions mapped to operators (either unary or with multiple parameters)
// //
EOpRadians, EOpRadians,
...@@ -161,6 +161,7 @@ enum TOperator ...@@ -161,6 +161,7 @@ enum TOperator
EOpAny, EOpAny,
EOpAll, EOpAll,
EOpLogicalNotComponentWise,
// //
// Branch // Branch
......
...@@ -143,13 +143,24 @@ void TOutputGLSLBase::writeBuiltInFunctionTriplet(Visit visit, ...@@ -143,13 +143,24 @@ void TOutputGLSLBase::writeBuiltInFunctionTriplet(Visit visit,
TOperator op, TOperator op,
bool useEmulatedFunction) bool useEmulatedFunction)
{ {
TString opStr(GetOperatorString(op)); TInfoSinkBase &out = objSink();
opStr += "("; if (visit == PreVisit)
if (useEmulatedFunction) {
const char *opStr(GetOperatorString(op));
if (useEmulatedFunction)
{
BuiltInFunctionEmulator::WriteEmulatedFunctionName(out, opStr);
}
else
{
out << opStr;
}
out << "(";
}
else
{ {
opStr = BuiltInFunctionEmulator::GetEmulatedFunctionName(opStr); writeTriplet(visit, nullptr, ", ", ")");
} }
writeTriplet(visit, opStr.c_str(), ", ", ")");
} }
void TOutputGLSLBase::writeLayoutQualifier(const TType &type) void TOutputGLSLBase::writeLayoutQualifier(const TType &type)
...@@ -641,9 +652,6 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) ...@@ -641,9 +652,6 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node)
case EOpPositive: case EOpPositive:
preString = "(+"; preString = "(+";
break; break;
case EOpVectorLogicalNot:
preString = "not(";
break;
case EOpLogicalNot: case EOpLogicalNot:
preString = "(!"; preString = "(!";
break; break;
...@@ -667,171 +675,62 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node) ...@@ -667,171 +675,62 @@ bool TOutputGLSLBase::visitUnary(Visit visit, TIntermUnary *node)
break; break;
case EOpRadians: case EOpRadians:
preString = "radians(";
break;
case EOpDegrees: case EOpDegrees:
preString = "degrees(";
break;
case EOpSin: case EOpSin:
preString = "sin(";
break;
case EOpCos: case EOpCos:
preString = "cos(";
break;
case EOpTan: case EOpTan:
preString = "tan(";
break;
case EOpAsin: case EOpAsin:
preString = "asin(";
break;
case EOpAcos: case EOpAcos:
preString = "acos(";
break;
case EOpAtan: case EOpAtan:
preString = "atan(";
break;
case EOpSinh: case EOpSinh:
preString = "sinh(";
break;
case EOpCosh: case EOpCosh:
preString = "cosh(";
break;
case EOpTanh: case EOpTanh:
preString = "tanh(";
break;
case EOpAsinh: case EOpAsinh:
preString = "asinh(";
break;
case EOpAcosh: case EOpAcosh:
preString = "acosh(";
break;
case EOpAtanh: case EOpAtanh:
preString = "atanh(";
break;
case EOpExp: case EOpExp:
preString = "exp(";
break;
case EOpLog: case EOpLog:
preString = "log(";
break;
case EOpExp2: case EOpExp2:
preString = "exp2(";
break;
case EOpLog2: case EOpLog2:
preString = "log2(";
break;
case EOpSqrt: case EOpSqrt:
preString = "sqrt(";
break;
case EOpInverseSqrt: case EOpInverseSqrt:
preString = "inversesqrt(";
break;
case EOpAbs: case EOpAbs:
preString = "abs(";
break;
case EOpSign: case EOpSign:
preString = "sign(";
break;
case EOpFloor: case EOpFloor:
preString = "floor(";
break;
case EOpTrunc: case EOpTrunc:
preString = "trunc(";
break;
case EOpRound: case EOpRound:
preString = "round(";
break;
case EOpRoundEven: case EOpRoundEven:
preString = "roundEven(";
break;
case EOpCeil: case EOpCeil:
preString = "ceil(";
break;
case EOpFract: case EOpFract:
preString = "fract(";
break;
case EOpIsNan: case EOpIsNan:
preString = "isnan(";
break;
case EOpIsInf: case EOpIsInf:
preString = "isinf(";
break;
case EOpFloatBitsToInt: case EOpFloatBitsToInt:
preString = "floatBitsToInt(";
break;
case EOpFloatBitsToUint: case EOpFloatBitsToUint:
preString = "floatBitsToUint(";
break;
case EOpIntBitsToFloat: case EOpIntBitsToFloat:
preString = "intBitsToFloat(";
break;
case EOpUintBitsToFloat: case EOpUintBitsToFloat:
preString = "uintBitsToFloat(";
break;
case EOpPackSnorm2x16: case EOpPackSnorm2x16:
preString = "packSnorm2x16(";
break;
case EOpPackUnorm2x16: case EOpPackUnorm2x16:
preString = "packUnorm2x16(";
break;
case EOpPackHalf2x16: case EOpPackHalf2x16:
preString = "packHalf2x16(";
break;
case EOpUnpackSnorm2x16: case EOpUnpackSnorm2x16:
preString = "unpackSnorm2x16(";
break;
case EOpUnpackUnorm2x16: case EOpUnpackUnorm2x16:
preString = "unpackUnorm2x16(";
break;
case EOpUnpackHalf2x16: case EOpUnpackHalf2x16:
preString = "unpackHalf2x16(";
break;
case EOpLength: case EOpLength:
preString = "length(";
break;
case EOpNormalize: case EOpNormalize:
preString = "normalize(";
break;
case EOpDFdx: case EOpDFdx:
preString = "dFdx(";
break;
case EOpDFdy: case EOpDFdy:
preString = "dFdy(";
break;
case EOpFwidth: case EOpFwidth:
preString = "fwidth(";
break;
case EOpTranspose: case EOpTranspose:
preString = "transpose(";
break;
case EOpDeterminant: case EOpDeterminant:
preString = "determinant(";
break;
case EOpInverse: case EOpInverse:
preString = "inverse(";
break;
case EOpAny: case EOpAny:
preString = "any(";
break;
case EOpAll: case EOpAll:
preString = "all("; case EOpLogicalNotComponentWise:
break; writeBuiltInFunctionTriplet(visit, node->getOp(), node->getUseEmulatedFunction());
return true;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
if (visit == PreVisit && node->getUseEmulatedFunction())
preString = BuiltInFunctionEmulator::GetEmulatedFunctionName(preString);
writeTriplet(visit, preString.c_str(), NULL, postString.c_str()); writeTriplet(visit, preString.c_str(), NULL, postString.c_str());
return true; return true;
...@@ -976,7 +875,6 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -976,7 +875,6 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node)
{ {
bool visitChildren = true; bool visitChildren = true;
TInfoSinkBase &out = objSink(); TInfoSinkBase &out = objSink();
bool useEmulatedFunction = (visit == PreVisit && node->getUseEmulatedFunction());
switch (node->getOp()) switch (node->getOp())
{ {
case EOpPrototype: case EOpPrototype:
...@@ -1074,7 +972,7 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1074,7 +972,7 @@ bool TOutputGLSLBase::visitAggregate(Visit visit, TIntermAggregate *node)
case EOpMemoryBarrierImage: case EOpMemoryBarrierImage:
case EOpMemoryBarrierShared: case EOpMemoryBarrierShared:
case EOpGroupMemoryBarrier: case EOpGroupMemoryBarrier:
writeBuiltInFunctionTriplet(visit, node->getOp(), useEmulatedFunction); writeBuiltInFunctionTriplet(visit, node->getOp(), node->getUseEmulatedFunction());
break; break;
default: default:
UNREACHABLE(); UNREACHABLE();
......
...@@ -1199,9 +1199,6 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1199,9 +1199,6 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
case EOpPositive: case EOpPositive:
outputTriplet(out, visit, "(+", "", ")"); outputTriplet(out, visit, "(+", "", ")");
break; break;
case EOpVectorLogicalNot:
outputTriplet(out, visit, "(!", "", ")");
break;
case EOpLogicalNot: case EOpLogicalNot:
outputTriplet(out, visit, "(!", "", ")"); outputTriplet(out, visit, "(!", "", ")");
break; break;
...@@ -1254,16 +1251,10 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1254,16 +1251,10 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
outputTriplet(out, visit, "tanh(", "", ")"); outputTriplet(out, visit, "tanh(", "", ")");
break; break;
case EOpAsinh: case EOpAsinh:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "asinh(");
break;
case EOpAcosh: case EOpAcosh:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "acosh(");
break;
case EOpAtanh: case EOpAtanh:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "atanh("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpExp: case EOpExp:
outputTriplet(out, visit, "exp(", "", ")"); outputTriplet(out, visit, "exp(", "", ")");
...@@ -1300,7 +1291,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1300,7 +1291,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
break; break;
case EOpRoundEven: case EOpRoundEven:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "roundEven("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpCeil: case EOpCeil:
outputTriplet(out, visit, "ceil(", "", ")"); outputTriplet(out, visit, "ceil(", "", ")");
...@@ -1310,7 +1301,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1310,7 +1301,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
break; break;
case EOpIsNan: case EOpIsNan:
if (node->getUseEmulatedFunction()) if (node->getUseEmulatedFunction())
writeEmulatedFunctionTriplet(out, visit, "isnan("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
else else
outputTriplet(out, visit, "isnan(", "", ")"); outputTriplet(out, visit, "isnan(", "", ")");
mRequiresIEEEStrictCompiling = true; mRequiresIEEEStrictCompiling = true;
...@@ -1331,28 +1322,13 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1331,28 +1322,13 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
outputTriplet(out, visit, "asfloat(", "", ")"); outputTriplet(out, visit, "asfloat(", "", ")");
break; break;
case EOpPackSnorm2x16: case EOpPackSnorm2x16:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "packSnorm2x16(");
break;
case EOpPackUnorm2x16: case EOpPackUnorm2x16:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "packUnorm2x16(");
break;
case EOpPackHalf2x16: case EOpPackHalf2x16:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "packHalf2x16(");
break;
case EOpUnpackSnorm2x16: case EOpUnpackSnorm2x16:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "unpackSnorm2x16(");
break;
case EOpUnpackUnorm2x16: case EOpUnpackUnorm2x16:
ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "unpackUnorm2x16(");
break;
case EOpUnpackHalf2x16: case EOpUnpackHalf2x16:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "unpackHalf2x16("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpLength: case EOpLength:
outputTriplet(out, visit, "length(", "", ")"); outputTriplet(out, visit, "length(", "", ")");
...@@ -1398,7 +1374,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1398,7 +1374,7 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
break; break;
case EOpInverse: case EOpInverse:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "inverse("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpAny: case EOpAny:
...@@ -1407,6 +1383,9 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node) ...@@ -1407,6 +1383,9 @@ bool OutputHLSL::visitUnary(Visit visit, TIntermUnary *node)
case EOpAll: case EOpAll:
outputTriplet(out, visit, "all(", "", ")"); outputTriplet(out, visit, "all(", "", ")");
break; break;
case EOpLogicalNotComponentWise:
outputTriplet(out, visit, "(!", "", ")");
break;
default: default:
UNREACHABLE(); UNREACHABLE();
} }
...@@ -1866,7 +1845,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1866,7 +1845,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
break; break;
case EOpMod: case EOpMod:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "mod("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpModf: case EOpModf:
outputTriplet(out, visit, "modf(", ", ", ")"); outputTriplet(out, visit, "modf(", ", ", ")");
...@@ -1877,7 +1856,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1877,7 +1856,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
case EOpAtan: case EOpAtan:
ASSERT(node->getSequence()->size() == 2); // atan(x) is a unary operator ASSERT(node->getSequence()->size() == 2); // atan(x) is a unary operator
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "atan("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpMin: case EOpMin:
outputTriplet(out, visit, "min(", ", ", ")"); outputTriplet(out, visit, "min(", ", ", ")");
...@@ -1897,7 +1876,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1897,7 +1876,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
// y, genBType a)", // y, genBType a)",
// so use emulated version. // so use emulated version.
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "mix("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
} }
else else
{ {
...@@ -1922,7 +1901,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1922,7 +1901,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
break; break;
case EOpFaceForward: case EOpFaceForward:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "faceforward("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpReflect: case EOpReflect:
outputTriplet(out, visit, "reflect(", ", ", ")"); outputTriplet(out, visit, "reflect(", ", ", ")");
...@@ -1932,7 +1911,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node) ...@@ -1932,7 +1911,7 @@ bool OutputHLSL::visitAggregate(Visit visit, TIntermAggregate *node)
break; break;
case EOpOuterProduct: case EOpOuterProduct:
ASSERT(node->getUseEmulatedFunction()); ASSERT(node->getUseEmulatedFunction());
writeEmulatedFunctionTriplet(out, visit, "outerProduct("); writeEmulatedFunctionTriplet(out, visit, node->getOp());
break; break;
case EOpMulMatrixComponentWise: case EOpMulMatrixComponentWise:
outputTriplet(out, visit, "(", " * ", ")"); outputTriplet(out, visit, "(", " * ", ")");
...@@ -2634,10 +2613,18 @@ const TConstantUnion *OutputHLSL::writeConstantUnion(TInfoSinkBase &out, ...@@ -2634,10 +2613,18 @@ const TConstantUnion *OutputHLSL::writeConstantUnion(TInfoSinkBase &out,
return constUnionIterated; return constUnionIterated;
} }
void OutputHLSL::writeEmulatedFunctionTriplet(TInfoSinkBase &out, Visit visit, const char *preStr) void OutputHLSL::writeEmulatedFunctionTriplet(TInfoSinkBase &out, Visit visit, TOperator op)
{ {
TString preString = BuiltInFunctionEmulator::GetEmulatedFunctionName(preStr); if (visit == PreVisit)
outputTriplet(out, visit, preString.c_str(), ", ", ")"); {
const char *opStr = GetOperatorString(op);
BuiltInFunctionEmulator::WriteEmulatedFunctionName(out, opStr);
out << "(";
}
else
{
outputTriplet(out, visit, nullptr, ", ", ")");
}
} }
bool OutputHLSL::writeSameSymbolInitializer(TInfoSinkBase &out, bool OutputHLSL::writeSameSymbolInitializer(TInfoSinkBase &out,
......
...@@ -109,7 +109,7 @@ class OutputHLSL : public TIntermTraverser ...@@ -109,7 +109,7 @@ class OutputHLSL : public TIntermTraverser
void outputEqual(Visit visit, const TType &type, TOperator op, TInfoSinkBase &out); void outputEqual(Visit visit, const TType &type, TOperator op, TInfoSinkBase &out);
void writeEmulatedFunctionTriplet(TInfoSinkBase &out, Visit visit, const char *preStr); void writeEmulatedFunctionTriplet(TInfoSinkBase &out, Visit visit, TOperator op);
void makeFlaggedStructMaps(const std::vector<TIntermTyped *> &flaggedStructs); void makeFlaggedStructMaps(const std::vector<TIntermTyped *> &flaggedStructs);
// Returns true if it found a 'same symbol' initializer (initializer that references the // Returns true if it found a 'same symbol' initializer (initializer that references the
...@@ -122,7 +122,6 @@ class OutputHLSL : public TIntermTraverser ...@@ -122,7 +122,6 @@ class OutputHLSL : public TIntermTraverser
TIntermSymbol *symbolNode, TIntermSymbol *symbolNode,
TIntermTyped *expression); TIntermTyped *expression);
void writeDeferredGlobalInitializers(TInfoSinkBase &out);
void writeIfElse(TInfoSinkBase &out, TIntermIfElse *node); void writeIfElse(TInfoSinkBase &out, TIntermIfElse *node);
// Returns the function name // Returns the function name
......
...@@ -300,9 +300,8 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -300,9 +300,8 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node)
case EOpPositive: case EOpPositive:
out << "Positive sign"; out << "Positive sign";
break; break;
case EOpVectorLogicalNot:
case EOpLogicalNot: case EOpLogicalNot:
out << "Negate conditional"; out << "negation";
break; break;
case EOpBitwiseNot: case EOpBitwiseNot:
out << "bit-wise not"; out << "bit-wise not";
...@@ -474,6 +473,9 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node) ...@@ -474,6 +473,9 @@ bool TOutputTraverser::visitUnary(Visit visit, TIntermUnary *node)
case EOpAll: case EOpAll:
out << "all"; out << "all";
break; break;
case EOpLogicalNotComponentWise:
out << "component-wise not";
break;
default: default:
out.prefix(SH_ERROR); out.prefix(SH_ERROR);
......
...@@ -197,7 +197,7 @@ TEST_F(TypeTrackingTest, BuiltInBoolFunctionResultType) ...@@ -197,7 +197,7 @@ TEST_F(TypeTrackingTest, BuiltInBoolFunctionResultType)
ASSERT_FALSE(foundErrorInIntermediateTree()); ASSERT_FALSE(foundErrorInIntermediateTree());
ASSERT_TRUE(foundInIntermediateTree("any (bool)")); ASSERT_TRUE(foundInIntermediateTree("any (bool)"));
ASSERT_TRUE(foundInIntermediateTree("all (bool)")); ASSERT_TRUE(foundInIntermediateTree("all (bool)"));
ASSERT_TRUE(foundInIntermediateTree("Negate conditional (4-component vector of bool)")); ASSERT_TRUE(foundInIntermediateTree("component-wise not (4-component vector of bool)"));
} }
TEST_F(TypeTrackingTest, BuiltInVecToBoolFunctionResultType) TEST_F(TypeTrackingTest, BuiltInVecToBoolFunctionResultType)
......
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