nested2.b[3].a: offset 96, type 1406, size 1, index 16, binding -1, stages 1
nested2.c.a: offset 112, type 1406, size 1, index 16, binding -1, stages 1
nested2.d.a: offset 144, type 1406, size 1, index 16, binding -1, stages 1
+t.v.position: offset 0, type 1406, size 1, index 17, binding -1, stages 1
+t.v[0].position: offset 0, type 1406, size 3, index 17, binding -1, stages 1
+t.v[1].position: offset 24, type 1406, size 3, index 17, binding -1, stages 1
+t.v[2].position: offset 48, type 1406, size 3, index 17, binding -1, stages 1
+t.v[0].normal: offset 12, type 1406, size 3, index 17, binding -1, stages 1
+t.v[1].normal: offset 36, type 1406, size 3, index 17, binding -1, stages 1
+t.v[2].normal: offset 60, type 1406, size 3, index 17, binding -1, stages 1
+t[0].v[0].position: offset 0, type 1406, size 3, index 17, binding -1, stages 1
+t[0].v[0].normal: offset 12, type 1406, size 3, index 17, binding -1, stages 1
+t[0].v[1].position: offset 24, type 1406, size 3, index 17, binding -1, stages 1
+t[0].v[1].normal: offset 36, type 1406, size 3, index 17, binding -1, stages 1
+t[0].v[2].position: offset 48, type 1406, size 3, index 17, binding -1, stages 1
+t[0].v[2].normal: offset 60, type 1406, size 3, index 17, binding -1, stages 1
+t[1].v[0].position: offset 72, type 1406, size 3, index 17, binding -1, stages 1
+t[1].v[0].normal: offset 84, type 1406, size 3, index 17, binding -1, stages 1
+t[1].v[1].position: offset 96, type 1406, size 3, index 17, binding -1, stages 1
+t[1].v[1].normal: offset 108, type 1406, size 3, index 17, binding -1, stages 1
+t[1].v[2].position: offset 120, type 1406, size 3, index 17, binding -1, stages 1
+t[1].v[2].normal: offset 132, type 1406, size 3, index 17, binding -1, stages 1
+t[2].v[0].position: offset 144, type 1406, size 3, index 17, binding -1, stages 1
+t[2].v[0].normal: offset 156, type 1406, size 3, index 17, binding -1, stages 1
+t[2].v[1].position: offset 168, type 1406, size 3, index 17, binding -1, stages 1
+t[2].v[1].normal: offset 180, type 1406, size 3, index 17, binding -1, stages 1
+t[2].v[2].position: offset 192, type 1406, size 3, index 17, binding -1, stages 1
+t[2].v[2].normal: offset 204, type 1406, size 3, index 17, binding -1, stages 1
+t[3].v[0].position: offset 216, type 1406, size 3, index 17, binding -1, stages 1
+t[3].v[0].normal: offset 228, type 1406, size 3, index 17, binding -1, stages 1
+t[3].v[1].position: offset 240, type 1406, size 3, index 17, binding -1, stages 1
+t[3].v[1].normal: offset 252, type 1406, size 3, index 17, binding -1, stages 1
+t[3].v[2].position: offset 264, type 1406, size 3, index 17, binding -1, stages 1
+t[3].v[2].normal: offset 276, type 1406, size 3, index 17, binding -1, stages 1
+t[4].v[0].position: offset 288, type 1406, size 3, index 17, binding -1, stages 1
+t[4].v[0].normal: offset 300, type 1406, size 3, index 17, binding -1, stages 1
+t[4].v[1].position: offset 312, type 1406, size 3, index 17, binding -1, stages 1
+t[4].v[1].normal: offset 324, type 1406, size 3, index 17, binding -1, stages 1
+t[4].v[2].position: offset 336, type 1406, size 3, index 17, binding -1, stages 1
+t[4].v[2].normal: offset 348, type 1406, size 3, index 17, binding -1, stages 1
anonMember1: offset 0, type 8b51, size 1, index 0, binding -1, stages 1
uf1: offset -1, type 1406, size 1, index -1, binding -1, stages 1
uf2: offset -1, type 1406, size 1, index -1, binding -1, stages 1
buf3: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
buf4: offset -1, type ffffffff, size 4, index -1, binding -1, stages 0
nested2: offset -1, type ffffffff, size 208, index -1, binding -1, stages 0
+VertexCollection: offset -1, type ffffffff, size 360, index -1, binding -1, stages 0
Vertex attribute reflection:
attributeFloat: offset 0, type 1406, size 0, index 0, binding -1, stages 0
void blowUpActiveAggregate(const TType& baseType, const TString& baseName, const TList<TIntermBinary*>& derefs,
TList<TIntermBinary*>::const_iterator deref, int offset, int blockIndex, int arraySize)
{
+ // when strictArraySuffix is enabled, we closely follow the rules from ARB_program_interface_query.
+ // Broadly:
+ // * arrays-of-structs always have a [x] suffix.
+ // * with array-of-struct variables in the root of a buffer block, only ever return [0].
+ // * otherwise, array suffixes are added whenever we iterate, even if that means expanding out an array.
+ const bool strictArraySuffix = (reflection.options & EShReflectionStrictArraySuffix);
+
+ // is this variable inside a buffer block. This flag is set back to false after we iterate inside the first array element.
+ bool blockParent = (baseType.getBasicType() == EbtBlock && baseType.getQualifier().storage == EvqBuffer);
+
// process the part of the dereference chain that was explicit in the shader
TString name = baseName;
const TType* terminalType = &baseType;
// Visit all the indices of this array, and for each one add on the remaining dereferencing
for (int i = 0; i < std::max(visitNode->getLeft()->getType().getOuterArraySize(), 1); ++i) {
TString newBaseName = name;
- if (baseType.getBasicType() != EbtBlock)
+ if (strictArraySuffix && blockParent)
+ newBaseName.append(TString("[0]"));
+ else if (strictArraySuffix || baseType.getBasicType() != EbtBlock)
newBaseName.append(TString("[") + String(i) + "]");
TList<TIntermBinary*>::const_iterator nextDeref = deref;
++nextDeref;
}
case EOpIndexDirect:
index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
- if (baseType.getBasicType() != EbtBlock) {
+ if (strictArraySuffix && blockParent) {
+ name.append(TString("[0]"));
+ } else if (strictArraySuffix || baseType.getBasicType() != EbtBlock) {
name.append(TString("[") + String(index) + "]");
if (offset >= 0)
offset += getArrayStride(baseType, visitNode->getLeft()->getType()) * index;
}
+ blockParent = false;
break;
case EOpIndexDirectStruct:
index = visitNode->getRight()->getAsConstantUnion()->getConstArray()[0].getIConst();
if (offset >= 0)
stride = getArrayStride(baseType, *terminalType);
- for (int i = 0; i < std::max(terminalType->getOuterArraySize(), 1); ++i) {
+ int arrayIterateSize = std::max(terminalType->getOuterArraySize(), 1);
+
+ // for top-level arrays in blocks, only expand [0] to avoid explosion of items
+ if (strictArraySuffix && blockParent)
+ arrayIterateSize = 1;
+
+ for (int i = 0; i < arrayIterateSize; ++i) {
TString newBaseName = name;
newBaseName.append(TString("[") + String(i) + "]");
TType derefType(*terminalType, 0);