Id typeId = getTypeId(resultId);
assert(isPointerType(typeId));
- return module.getInstruction(typeId)->getImmediateOperand(1);
+ return module.getInstruction(typeId)->getIdOperand(1);
}
Op Builder::getMostBasicTypeClass(Id typeId) const
return instr->getImmediateOperand(1);
case OpTypeArray:
{
- Id lengthId = instr->getImmediateOperand(1);
+ Id lengthId = instr->getIdOperand(1);
return module.getInstruction(lengthId)->getImmediateOperand(0);
}
case OpTypeStruct:
void Builder::createControlBarrier(Scope execution, Scope memory, MemorySemanticsMask semantics)
{
Instruction* op = new Instruction(OpControlBarrier);
- op->addImmediateOperand(makeUintConstant(execution));
- op->addImmediateOperand(makeUintConstant(memory));
- op->addImmediateOperand(makeUintConstant(semantics));
+ op->addIdOperand(makeUintConstant(execution));
+ op->addIdOperand(makeUintConstant(memory));
+ op->addIdOperand(makeUintConstant(semantics));
buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
}
void Builder::createMemoryBarrier(unsigned executionScope, unsigned memorySemantics)
{
Instruction* op = new Instruction(OpMemoryBarrier);
- op->addImmediateOperand(makeUintConstant(executionScope));
- op->addImmediateOperand(makeUintConstant(memorySemantics));
+ op->addIdOperand(makeUintConstant(executionScope));
+ op->addIdOperand(makeUintConstant(memorySemantics));
buildPoint->addInstruction(std::unique_ptr<Instruction>(op));
}
int numRows = getTypeNumRows(resultTypeId);
Instruction* instr = module.getInstruction(componentTypeId);
- Id bitCount = instr->getIdOperand(0);
+ unsigned bitCount = instr->getImmediateOperand(0);
// Optimize matrix constructed from a bigger matrix
if (isMatrix(sources[0]) && getNumColumns(sources[0]) >= numCols && getNumRows(sources[0]) >= numRows) {
namespace spv {
-// Called for each instruction in a block.
+// Called for each instruction that resides in a block.
void Builder::postProcess(Instruction& inst)
{
// Add capabilities based simply on the opcode.
switch (inst.getOpCode()) {
case OpExtInst:
- switch (inst.getIdOperand(1)) {
+ switch (inst.getImmediateOperand(1)) {
case GLSLstd450InterpolateAtCentroid:
case GLSLstd450InterpolateAtSample:
case GLSLstd450InterpolateAtOffset:
Instruction(Id resultId, Id typeId, Op opCode) : resultId(resultId), typeId(typeId), opCode(opCode), block(nullptr) { }
explicit Instruction(Op opCode) : resultId(NoResult), typeId(NoType), opCode(opCode), block(nullptr) { }
virtual ~Instruction() {}
- void addIdOperand(Id id) { operands.push_back(id); }
- void addImmediateOperand(unsigned int immediate) { operands.push_back(immediate); }
+ void addIdOperand(Id id) {
+ operands.push_back(id);
+ idOperand.push_back(true);
+ }
+ void addImmediateOperand(unsigned int immediate) {
+ operands.push_back(immediate);
+ idOperand.push_back(false);
+ }
void addStringOperand(const char* str)
{
unsigned int word;
addImmediateOperand(word);
}
}
+ bool isIdOperand(int op) { return idOperand[op]; }
void setBlock(Block* b) { block = b; }
Block* getBlock() const { return block; }
Op getOpCode() const { return opCode; }
- int getNumOperands() const { return (int)operands.size(); }
+ int getNumOperands() const
+ {
+ assert(operands.size() == idOperand.size());
+ return (int)operands.size();
+ }
Id getResultId() const { return resultId; }
Id getTypeId() const { return typeId; }
- Id getIdOperand(int op) const { return operands[op]; }
- unsigned int getImmediateOperand(int op) const { return operands[op]; }
+ Id getIdOperand(int op) const {
+ assert(idOperand[op]);
+ return operands[op];
+ }
+ unsigned int getImmediateOperand(int op) const {
+ assert(!idOperand[op]);
+ return operands[op];
+ }
// Write out the binary form.
void dump(std::vector<unsigned int>& out) const
Id resultId;
Id typeId;
Op opCode;
- std::vector<Id> operands;
+ std::vector<Id> operands; // operands, both <id> and immediates (both are unsigned int)
+ std::vector<bool> idOperand; // true for operands that are <id>, false for immediates
Block* block;
};