// Normal .length() would have been constant folded by the front-end.
// So, this has to be block.lastMember.length().
- // SPV wants "block" as the operand, go get it.
+ // SPV wants "block" and member number as the operands, go get them.
assert(node->getOperand()->getType().isRuntimeSizedArray());
glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft();
block->traverse(this);
- spv::Id length = builder.createUnaryOp(spv::OpArrayLength, builder.makeIntType(32), builder.accessChainGetLValue());
+ unsigned int member = node->getOperand()->getAsBinaryNode()->getRight()->getAsConstantUnion()->getConstArray()[0].getUConst();
+ spv::Id length = builder.createArrayLength(builder.accessChainGetLValue(), member);
builder.clearAccessChain();
builder.setAccessChainRValue(length);
return chain->getResultId();
}
+Id Builder::createArrayLength(Id base, unsigned int member)
+{
+ Instruction* length = new Instruction(getUniqueId(), makeIntType(32), OpArrayLength);
+ length->addIdOperand(base);
+ length->addImmediateOperand(member);
+ buildPoint->addInstruction(length);
+
+ return length->getResultId();
+}
+
Id Builder::createCompositeExtract(Id composite, Id typeId, unsigned index)
{
Instruction* extract = new Instruction(getUniqueId(), typeId, OpCompositeExtract);
// Create an OpAccessChain instruction
Id createAccessChain(StorageClass, Id base, std::vector<Id>& offsets);
+ // Create an OpArrayLength instruction
+ Id createArrayLength(Id base, unsigned int member);
+
// Create an OpCompositeExtract instruction
Id createCompositeExtract(Id composite, Id typeId, unsigned index);
Id createCompositeExtract(Id composite, Id typeId, std::vector<unsigned>& indexes);
58: 23(fvec4) CompositeConstruct 57 57 57 57\r
59: 30(ptr) AccessChain 51(outnames) 27 56\r
Store 59 58\r
- 60: 16(int) ArrayLength 15(outbname)\r
+ 60: 16(int) ArrayLength 15(outbname) 3\r
62: 61(ptr) AccessChain 51(outnames) 17\r
Store 62 60\r
Return\r
// For the version, it uses the latest git tag followed by the number of commits.
// For the date, it uses the current date (when then script is run).
-#define GLSLANG_REVISION "3.0.774"
+#define GLSLANG_REVISION "3.0.775"
#define GLSLANG_DATE "21-Sep-2015"