diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.cpp b/renderdoc/driver/shaders/spirv/spirv_editor.cpp index 0ee4d593b..d39ed4e8c 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_editor.cpp @@ -269,6 +269,13 @@ void SPIRVEditor::AddVariable(const SPIRVOperation &op) addWords(typeVarSection.endOffset, op.size()); } +void SPIRVEditor::AddConstant(const SPIRVOperation &op) +{ + idOffsets[op[2]] = typeVarSection.endOffset; + spirv.insert(spirv.begin() + typeVarSection.endOffset, op.begin(), op.end()); + addWords(typeVarSection.endOffset, op.size()); +} + void SPIRVEditor::AddFunction(const SPIRVOperation *ops, size_t count) { idOffsets[ops[0][2]] = spirv.size(); diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.h b/renderdoc/driver/shaders/spirv/spirv_editor.h index 5321c52e4..8c078fc31 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.h +++ b/renderdoc/driver/shaders/spirv/spirv_editor.h @@ -319,6 +319,7 @@ public: void AddDecoration(const SPIRVOperation &op); void AddType(const SPIRVOperation &op); void AddVariable(const SPIRVOperation &op); + void AddConstant(const SPIRVOperation &op); void AddFunction(const SPIRVOperation *ops, size_t count); SPIRVIterator GetID(SPIRVId id); @@ -340,6 +341,22 @@ public: SPIRVId DeclareStructType(std::vector members); + // helper for AddConstant + template + SPIRVId AddConstantImmediate(T t) + { + SPIRVId typeId = DeclareType(scalar()); + SPIRVId retId = MakeId(); + std::vector words = {typeId, retId}; + + words.insert(words.end(), sizeof(T) / 4, 0U); + + memcpy(&words[2], &t, sizeof(T)); + + AddConstant(SPIRVOperation(spv::OpConstant, words)); + return retId; + } + // simple properties that are public. struct {