Fix interface block static use tracking.
The current code couldn't handle some uses of interface blocks,
such as blocks with instance names.
BUG=angle:466
Change-Id: I0a3746f277af0538cede30232532c6788412da1c
Reviewed-on: https://chromium-review.googlesource.com/213502
Reviewed-by: Zhenyao Mo <zmo@chromium.org>
Tested-by: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Nicolas Capens <capn@chromium.org>
diff --git a/src/compiler/translator/VariableInfo.cpp b/src/compiler/translator/VariableInfo.cpp
index b331581..9d0c4c8 100644
--- a/src/compiler/translator/VariableInfo.cpp
+++ b/src/compiler/translator/VariableInfo.cpp
@@ -128,7 +128,11 @@
{
var = FindVariable(symbolName, mVaryings);
}
- else if (symbol->getType() != EbtInterfaceBlock)
+ else if (symbol->getType().getBasicType() == EbtInterfaceBlock)
+ {
+ UNREACHABLE();
+ }
+ else
{
switch (symbol->getQualifier())
{
@@ -150,6 +154,7 @@
// Set static use on the parent interface block here
namedBlock->staticUse = true;
+
}
else
{
@@ -314,6 +319,7 @@
if (typedNode.getBasicType() == EbtInterfaceBlock)
{
visitInfoList(sequence, mInterfaceBlocks);
+ visitChildren = false;
}
else if (qualifier == EvqAttribute || qualifier == EvqVertexIn ||
qualifier == EvqFragmentOut || qualifier == EvqUniform ||
@@ -346,6 +352,30 @@
return visitChildren;
}
+bool CollectVariables::visitBinary(Visit, TIntermBinary *binaryNode)
+{
+ if (binaryNode->getOp() == EOpIndexDirectInterfaceBlock)
+ {
+ TIntermSymbol *symbol = binaryNode->getLeft()->getAsSymbolNode();
+ ASSERT(symbol);
+
+ TIntermConstantUnion *constantUnion = binaryNode->getRight()->getAsConstantUnion();
+ ASSERT(constantUnion);
+
+ const TInterfaceBlock *interfaceBlock = symbol->getType().getInterfaceBlock();
+ sh::InterfaceBlock *namedBlock = FindVariable(interfaceBlock->name(), mInterfaceBlocks);
+ ASSERT(namedBlock);
+ namedBlock->staticUse = true;
+
+ unsigned int fieldIndex = constantUnion->getUConst(0);
+ ASSERT(fieldIndex < namedBlock->fields.size());
+ namedBlock->fields[fieldIndex].staticUse = true;
+ return false;
+ }
+
+ return true;
+}
+
template <typename VarT>
void ExpandVariables(const std::vector<VarT> &compact,
std::vector<sh::ShaderVariable> *expanded)
diff --git a/src/compiler/translator/VariableInfo.h b/src/compiler/translator/VariableInfo.h
index d39bb21..b4b1886 100644
--- a/src/compiler/translator/VariableInfo.h
+++ b/src/compiler/translator/VariableInfo.h
@@ -24,6 +24,7 @@
virtual void visitSymbol(TIntermSymbol *symbol);
virtual bool visitAggregate(Visit, TIntermAggregate *node);
+ virtual bool visitBinary(Visit visit, TIntermBinary *binaryNode);
private:
template <typename VarT>