From e59dea21420519418233cd9f1dde9a98384264ad Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 8 Jan 2018 15:56:37 +0000 Subject: [PATCH] Add functions for adding declared constants --- renderdoc/driver/shaders/spirv/spirv_editor.cpp | 7 +++++++ renderdoc/driver/shaders/spirv/spirv_editor.h | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) 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 {