compiler: Work around a HLSL compiler aliasing opt bug.
BUG=angleproject:1448
Change-Id: I7d5bcbd100069152cea0cb03bc4fa6af1044460b
Reviewed-on: https://chromium-review.googlesource.com/376020
Commit-Queue: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/src/compiler/translator/InitializeVariables.cpp b/src/compiler/translator/InitializeVariables.cpp
index 21f0093..6b01d62 100644
--- a/src/compiler/translator/InitializeVariables.cpp
+++ b/src/compiler/translator/InitializeVariables.cpp
@@ -14,46 +14,6 @@
namespace
{
-TIntermConstantUnion *constructConstUnionNode(const TType &type)
-{
- TType myType = type;
- myType.clearArrayness();
- myType.setQualifier(EvqConst);
- size_t size = myType.getObjectSize();
- TConstantUnion *u = new TConstantUnion[size];
- for (size_t ii = 0; ii < size; ++ii)
- {
- switch (type.getBasicType())
- {
- case EbtFloat:
- u[ii].setFConst(0.0f);
- break;
- case EbtInt:
- u[ii].setIConst(0);
- break;
- case EbtUInt:
- u[ii].setUConst(0u);
- break;
- default:
- UNREACHABLE();
- return nullptr;
- }
- }
-
- TIntermConstantUnion *node = new TIntermConstantUnion(u, myType);
- return node;
-}
-
-TIntermConstantUnion *constructIndexNode(int index)
-{
- TConstantUnion *u = new TConstantUnion[1];
- u[0].setIConst(index);
-
- TType type(EbtInt, EbpUndefined, EvqConst, 1);
- TIntermConstantUnion *node = new TIntermConstantUnion(u, type);
- return node;
-}
-
class VariableInitializer : public TIntermTraverser
{
public:
@@ -120,73 +80,44 @@
void VariableInitializer::insertInitCode(TIntermSequence *sequence)
{
- for (size_t ii = 0; ii < mVariables.size(); ++ii)
+ for (const auto &var : mVariables)
{
- const sh::ShaderVariable &var = mVariables[ii];
TString name = TString(var.name.c_str());
+ TType type = sh::GetShaderVariableType(var);
+
+ // Assign the array elements one by one to keep the AST compatible with ESSL 1.00 which
+ // doesn't have array assignment.
if (var.isArray())
{
- TType type = sh::ConvertShaderVariableTypeToTType(var.type);
size_t pos = name.find_last_of('[');
if (pos != TString::npos)
+ {
name = name.substr(0, pos);
- for (int index = static_cast<int>(var.arraySize) - 1; index >= 0; --index)
- {
- TIntermBinary *assign = new TIntermBinary(EOpAssign);
- sequence->insert(sequence->begin(), assign);
-
- TIntermBinary *indexDirect = new TIntermBinary(EOpIndexDirect);
- TIntermSymbol *symbol = new TIntermSymbol(0, name, type);
- indexDirect->setLeft(symbol);
- TIntermConstantUnion *indexNode = constructIndexNode(index);
- indexDirect->setRight(indexNode);
-
- assign->setLeft(indexDirect);
-
- TIntermConstantUnion *zeroConst = constructConstUnionNode(type);
- assign->setRight(zeroConst);
}
- }
- else if (var.isStruct())
- {
- TFieldList *fields = new TFieldList;
- TSourceLoc loc;
- for (auto field : var.fields)
- {
- fields->push_back(new TField(nullptr, new TString(field.name.c_str()), loc));
- }
- TStructure *structure = new TStructure(new TString(var.structName.c_str()), fields);
- TType type;
- type.setStruct(structure);
- for (int fieldIndex = 0; fieldIndex < static_cast<int>(var.fields.size()); ++fieldIndex)
- {
- TIntermBinary *assign = new TIntermBinary(EOpAssign);
- sequence->insert(sequence->begin(), assign);
+ TType elementType = type;
+ elementType.clearArrayness();
- TIntermBinary *indexDirectStruct = new TIntermBinary(EOpIndexDirectStruct);
- TIntermSymbol *symbol = new TIntermSymbol(0, name, type);
- indexDirectStruct->setLeft(symbol);
- TIntermConstantUnion *indexNode = constructIndexNode(fieldIndex);
- indexDirectStruct->setRight(indexNode);
- assign->setLeft(indexDirectStruct);
+ for (unsigned int i = 0; i < var.arraySize; ++i)
+ {
+ TIntermBinary *element = new TIntermBinary(EOpIndexDirect);
+ element->setLeft(new TIntermSymbol(0, name, type));
+ element->setRight(TIntermTyped::CreateIndexNode(i));
+ element->setType(elementType);
- const sh::ShaderVariable &field = var.fields[fieldIndex];
- TType fieldType = sh::ConvertShaderVariableTypeToTType(field.type);
- TIntermConstantUnion *zeroConst = constructConstUnionNode(fieldType);
- assign->setRight(zeroConst);
+ TIntermTyped *zero = TIntermTyped::CreateZero(elementType);
+ TIntermBinary *assignment = new TIntermBinary(EOpAssign, element, zero);
+
+ sequence->insert(sequence->begin(), assignment);
}
}
else
{
- TType type = sh::ConvertShaderVariableTypeToTType(var.type);
- TIntermBinary *assign = new TIntermBinary(EOpAssign);
- sequence->insert(sequence->begin(), assign);
TIntermSymbol *symbol = new TIntermSymbol(0, name, type);
- assign->setLeft(symbol);
- TIntermConstantUnion *zeroConst = constructConstUnionNode(type);
- assign->setRight(zeroConst);
- }
+ TIntermTyped *zero = TIntermTyped::CreateZero(type);
+ TIntermBinary *assign = new TIntermBinary(EOpAssign, symbol, zero);
+ sequence->insert(sequence->begin(), assign);
+ }
}
}