Fix variable vs. function name conflict in HLSL output
GLSL ES spec accepts the case where an initializer of a variable calls
a function with the same name as the variable. The HLSL compiler
doesn't accept that. Work around this limitation in the HLSL compiler
by disambiguating user-defined functions from variables with a
different prefix.
BUG=angleproject:2095
TEST=angle_end2end_test, angle_unittests
Change-Id: I41b32a3fcc6fd4c548e8dc3aa680d1b07fcf8719
Reviewed-on: https://chromium-review.googlesource.com/557872
Reviewed-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Commit-Queue: Olli Etuaho <oetuaho@nvidia.com>
diff --git a/src/compiler/translator/OutputHLSL.cpp b/src/compiler/translator/OutputHLSL.cpp
index 897b26b..c1eb444 100644
--- a/src/compiler/translator/OutputHLSL.cpp
+++ b/src/compiler/translator/OutputHLSL.cpp
@@ -783,8 +783,7 @@
ensureStructDefined(nodeType);
- const TName &nameWithMetadata = node->getName();
- out << DecorateUniform(nameWithMetadata, nodeType);
+ out << DecorateVariableIfNeeded(node->getName());
}
else if (qualifier == EvqAttribute || qualifier == EvqVertexIn)
{
@@ -873,7 +872,7 @@
}
else
{
- out << DecorateIfNeeded(node->getName());
+ out << DecorateVariableIfNeeded(node->getName());
}
}
}
@@ -1593,7 +1592,7 @@
}
else
{
- out << DecorateIfNeeded(node->getFunctionSymbolInfo()->getNameObj())
+ out << DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj())
<< DisambiguateFunctionName(parameters) << (mOutputLod0Function ? "Lod0(" : "(");
}
@@ -1725,7 +1724,7 @@
TIntermSequence *arguments = node->getSequence();
- TString name = DecorateIfNeeded(node->getFunctionSymbolInfo()->getNameObj());
+ TString name = DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj());
out << TypeString(node->getType()) << " " << name << DisambiguateFunctionName(arguments)
<< (mOutputLod0Function ? "Lod0(" : "(");
@@ -1779,7 +1778,7 @@
ASSERT(index != CallDAG::InvalidIndex);
lod0 &= mASTMetadataList[index].mNeedsLod0;
- out << DecorateIfNeeded(node->getFunctionSymbolInfo()->getNameObj());
+ out << DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj());
out << DisambiguateFunctionName(node->getSequence());
out << (lod0 ? "Lod0(" : "(");
}
@@ -1787,7 +1786,7 @@
{
// This path is used for internal functions that don't have their definitions in the
// AST, such as precision emulation functions.
- out << DecorateIfNeeded(node->getFunctionSymbolInfo()->getNameObj()) << "(";
+ out << DecorateFunctionIfNeeded(node->getFunctionSymbolInfo()->getNameObj()) << "(";
}
else
{
@@ -2537,7 +2536,7 @@
}
else
{
- nameStr = DecorateIfNeeded(name);
+ nameStr = DecorateVariableIfNeeded(name);
}
if (IsSampler(type.getBasicType()))