From 9db805a1cd872dc213f9d03325efdbbfdea7970a Mon Sep 17 00:00:00 2001 From: Alex Smith Date: Sat, 29 Dec 2018 12:03:02 +0000 Subject: [PATCH] Add OpName before OpModuleProcessed The SPIR-V spec requires OpName comes before any OpModuleProcessed. Fixes a SPIR-V validation error on the generated PostVS shader if the original shader has any OpModuleProcessed. --- renderdoc/driver/shaders/spirv/spirv_editor.cpp | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_editor.cpp b/renderdoc/driver/shaders/spirv/spirv_editor.cpp index 33a046df9..9677e5c75 100644 --- a/renderdoc/driver/shaders/spirv/spirv_editor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_editor.cpp @@ -314,11 +314,18 @@ void SPIRVEditor::SetName(uint32_t id, const char *name) SPIRVOperation op(spv::OpName, uintName); - size_t offset = sections[SPIRVSection::Debug].endOffset; + SPIRVIterator it; - spirv.insert(spirv.begin() + offset, op.begin(), op.end()); - RegisterOp(SPIRVIterator(spirv, offset)); - addWords(offset, op.size()); + // OpName must be before OpModuleProcessed. + for(it = Begin(SPIRVSection::Debug); it < End(SPIRVSection::Debug); ++it) + { + if(it.opcode() == spv::OpModuleProcessed) + break; + } + + spirv.insert(spirv.begin() + it.offs(), op.begin(), op.end()); + RegisterOp(SPIRVIterator(spirv, it.offs())); + addWords(it.offs(), op.size()); } void SPIRVEditor::AddDecoration(const SPIRVOperation &op)