Spirv Editor add InsertOperation(op, offset) helper

void InsertOperation(const Operation &op, size_t offset);

Ensures Operation's are added correctly and RegisterOp() is called after addWords()
This make sure the idOffsets data is correct
This commit is contained in:
Jake Turner
2025-08-04 16:51:59 +01:00
parent 282074f9a4
commit d18fe8e124
2 changed files with 18 additions and 31 deletions
+17 -31
View File
@@ -211,6 +211,13 @@ void Editor::DecorateStorageBufferStruct(Id id)
}
}
void Editor::InsertOperation(const Operation &op, size_t offset)
{
op.insertInto(m_SPIRV, offset);
addWords(offset, op.size());
RegisterOp(Iter(m_SPIRV, offset));
}
void Editor::SetName(Id id, const rdcstr &name)
{
Operation op = OpName(id, name);
@@ -224,9 +231,7 @@ void Editor::SetName(Id id, const rdcstr &name)
break;
}
op.insertInto(m_SPIRV, it.offs());
RegisterOp(Iter(m_SPIRV, it.offs()));
addWords(it.offs(), op.size());
InsertOperation(op, it.offs());
}
void Editor::SetMemberName(Id id, uint32_t member, const rdcstr &name)
@@ -234,17 +239,13 @@ void Editor::SetMemberName(Id id, uint32_t member, const rdcstr &name)
Operation op = OpMemberName(id, member, name);
size_t offset = m_Sections[Section::DebugNames].endOffset;
op.insertInto(m_SPIRV, offset);
RegisterOp(Iter(m_SPIRV, offset));
addWords(offset, op.size());
InsertOperation(op, offset);
}
void Editor::AddDecoration(const Operation &op)
{
size_t offset = m_Sections[Section::Annotations].endOffset;
op.insertInto(m_SPIRV, offset);
RegisterOp(Iter(m_SPIRV, offset));
addWords(offset, op.size());
InsertOperation(op, offset);
}
void Editor::AddCapability(Capability cap)
@@ -255,9 +256,7 @@ void Editor::AddCapability(Capability cap)
// insert the operation at the very start
Operation op(Op::Capability, {(uint32_t)cap});
op.insertInto(m_SPIRV, FirstRealWord);
RegisterOp(Iter(m_SPIRV, FirstRealWord));
addWords(FirstRealWord, op.size());
InsertOperation(op, FirstRealWord);
}
bool Editor::HasCapability(Capability cap)
@@ -285,18 +284,13 @@ void Editor::AddExtension(const rdcstr &extension)
memcpy(&uintName[0], extension.c_str(), sz);
Operation op(Op::Extension, uintName);
op.insertInto(m_SPIRV, it.offs());
RegisterOp(it);
addWords(it.offs(), op.size());
InsertOperation(op, it.offs());
}
void Editor::AddExecutionMode(const Operation &mode)
{
size_t offset = m_Sections[Section::ExecutionMode].endOffset;
mode.insertInto(m_SPIRV, offset);
RegisterOp(Iter(m_SPIRV, offset));
addWords(offset, mode.size());
InsertOperation(mode, offset);
}
Id Editor::HasExtInst(const char *setname)
@@ -336,9 +330,7 @@ Id Editor::ImportExtInst(const char *setname)
uintName.insert(0, ret.value());
Operation op(Op::ExtInstImport, uintName);
op.insertInto(m_SPIRV, it.offs());
RegisterOp(it);
addWords(it.offs(), op.size());
InsertOperation(op, it.offs());
extSets[ret] = setname;
@@ -350,9 +342,7 @@ Id Editor::AddType(const Operation &op)
size_t offset = m_Sections[Section::Types].endOffset;
Id id = Id::fromWord(op[1]);
op.insertInto(m_SPIRV, offset);
RegisterOp(Iter(m_SPIRV, offset));
addWords(offset, op.size());
InsertOperation(op, offset);
return id;
}
@@ -361,9 +351,7 @@ Id Editor::AddVariable(const Operation &op)
size_t offset = m_Sections[Section::Variables].endOffset;
Id id = Id::fromWord(op[2]);
op.insertInto(m_SPIRV, offset);
RegisterOp(Iter(m_SPIRV, offset));
addWords(offset, op.size());
InsertOperation(op, offset);
return id;
}
@@ -372,9 +360,7 @@ Id Editor::AddConstant(const Operation &op)
size_t offset = m_Sections[Section::Constants].endOffset;
Id id = Id::fromWord(op[2]);
op.insertInto(m_SPIRV, offset);
RegisterOp(Iter(m_SPIRV, offset));
addWords(offset, op.size());
InsertOperation(op, offset);
return id;
}
@@ -272,6 +272,7 @@ private:
using Processor::Parse;
inline void addWords(size_t offs, size_t num) { addWords(offs, (int32_t)num); }
void addWords(size_t offs, int32_t num);
void InsertOperation(const Operation &op, size_t offset);
Operation MakeDeclaration(const Scalar &s);
Operation MakeDeclaration(const Vector &v);