SPV: Fix missing 'Member' operand to OpArrayLength.

This commit is contained in:
John Kessenich 2015-09-21 21:50:29 -06:00
parent 142d7780a4
commit ee21fc9081
5 changed files with 18 additions and 4 deletions

View File

@ -741,11 +741,12 @@ bool TGlslangToSpvTraverser::visitUnary(glslang::TVisit /* visit */, glslang::TI
// Normal .length() would have been constant folded by the front-end. // Normal .length() would have been constant folded by the front-end.
// So, this has to be block.lastMember.length(). // 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()); assert(node->getOperand()->getType().isRuntimeSizedArray());
glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft(); glslang::TIntermTyped* block = node->getOperand()->getAsBinaryNode()->getLeft();
block->traverse(this); 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.clearAccessChain();
builder.setAccessChainRValue(length); builder.setAccessChainRValue(length);

View File

@ -890,6 +890,16 @@ Id Builder::createAccessChain(StorageClass storageClass, Id base, std::vector<Id
return chain->getResultId(); 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) Id Builder::createCompositeExtract(Id composite, Id typeId, unsigned index)
{ {
Instruction* extract = new Instruction(getUniqueId(), typeId, OpCompositeExtract); Instruction* extract = new Instruction(getUniqueId(), typeId, OpCompositeExtract);

View File

@ -225,6 +225,9 @@ public:
// Create an OpAccessChain instruction // Create an OpAccessChain instruction
Id createAccessChain(StorageClass, Id base, std::vector<Id>& offsets); Id createAccessChain(StorageClass, Id base, std::vector<Id>& offsets);
// Create an OpArrayLength instruction
Id createArrayLength(Id base, unsigned int member);
// Create an OpCompositeExtract instruction // Create an OpCompositeExtract instruction
Id createCompositeExtract(Id composite, Id typeId, unsigned index); Id createCompositeExtract(Id composite, Id typeId, unsigned index);
Id createCompositeExtract(Id composite, Id typeId, std::vector<unsigned>& indexes); Id createCompositeExtract(Id composite, Id typeId, std::vector<unsigned>& indexes);

View File

@ -113,7 +113,7 @@ Linked compute stage:
58: 23(fvec4) CompositeConstruct 57 57 57 57 58: 23(fvec4) CompositeConstruct 57 57 57 57
59: 30(ptr) AccessChain 51(outnames) 27 56 59: 30(ptr) AccessChain 51(outnames) 27 56
Store 59 58 Store 59 58
60: 16(int) ArrayLength 15(outbname) 60: 16(int) ArrayLength 15(outbname) 3
62: 61(ptr) AccessChain 51(outnames) 17 62: 61(ptr) AccessChain 51(outnames) 17
Store 62 60 Store 62 60
Return Return

View File

@ -2,5 +2,5 @@
// For the version, it uses the latest git tag followed by the number of commits. // 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). // 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" #define GLSLANG_DATE "21-Sep-2015"