From d445bb2867a56b5e053c7b5fb5a7b007294e2043 Mon Sep 17 00:00:00 2001 From: Greg Fischer <greg@lunarg.com> Date: Thu, 6 Dec 2018 11:13:15 -0700 Subject: [PATCH] Create separate OpSource for each included file --- SPIRV/GlslangToSpv.cpp | 4 + SPIRV/SpvBuilder.cpp | 37 ++-- SPIRV/SpvBuilder.h | 28 +++- Test/baseResults/hlsl.pp.line3.frag.out | 158 +++++++++--------- .../MachineIndependent/localintermediate.h | 5 + .../MachineIndependent/preprocessor/Pp.cpp | 1 + 6 files changed, 130 insertions(+), 103 deletions(-) diff --git a/SPIRV/GlslangToSpv.cpp b/SPIRV/GlslangToSpv.cpp index 0cc059045..6dc25ab1e 100644 --- a/SPIRV/GlslangToSpv.cpp +++ b/SPIRV/GlslangToSpv.cpp @@ -1297,6 +1297,10 @@ TGlslangToSpvTraverser::TGlslangToSpvTraverser(unsigned int spvVersion, const gl text.append("#line 1\n"); text.append(glslangIntermediate->getSourceText()); builder.setSourceText(text); + // Pass name and text for all included files + const std::map<std::string, std::string>& include_txt = glslangIntermediate->getIncludeText(); + for (auto iItr = include_txt.begin(); iItr != include_txt.end(); ++iItr) + builder.addInclude(iItr->first, iItr->second); } stdBuiltins = builder.import("GLSL.std.450"); if (glslangIntermediate->usingVulkanMemoryModel()) { diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp index f6ccc303f..9ba3158ea 100755 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -114,20 +114,8 @@ void Builder::setLine(int lineNum, const char* filename) currentLine = lineNum; currentFile = filename; if (emitOpLines) { - // If filename previously seen, use its id, else create a string - // and put it in the map. - auto sItr = stringIds.find(filename); - if (sItr != stringIds.end()) { - addLine(sItr->second, currentLine, 0); - } else { - Instruction* fileString = - new Instruction(getUniqueId(), NoType, OpString); - fileString->addStringOperand(filename); - spv::Id stringId = fileString->getResultId(); - strings.push_back(std::unique_ptr<Instruction>(fileString)); - addLine(stringId, currentLine, 0); - stringIds[filename] = stringId; - } + spv::Id strId = getStringId(filename); + addLine(strId, currentLine, 0); } } } @@ -2843,7 +2831,8 @@ void Builder::createConditionalBranch(Id condition, Block* thenBlock, Block* els // OpSource // [OpSourceContinued] // ... -void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const +void Builder::dumpSourceInstructions(const spv::Id fileId, const std::string& text, + std::vector<unsigned int>& out) const { const int maxWordCount = 0xFFFF; const int opSourceWordCount = 4; @@ -2855,14 +2844,14 @@ void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const sourceInst.addImmediateOperand(source); sourceInst.addImmediateOperand(sourceVersion); // File operand - if (sourceFileStringId != NoResult) { - sourceInst.addIdOperand(sourceFileStringId); + if (fileId != NoResult) { + sourceInst.addIdOperand(fileId); // Source operand - if (sourceText.size() > 0) { + if (text.size() > 0) { int nextByte = 0; std::string subString; - while ((int)sourceText.size() - nextByte > 0) { - subString = sourceText.substr(nextByte, nonNullBytesPerInstruction); + while ((int)text.size() - nextByte > 0) { + subString = text.substr(nextByte, nonNullBytesPerInstruction); if (nextByte == 0) { // OpSource sourceInst.addStringOperand(subString.c_str()); @@ -2882,6 +2871,14 @@ void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const } } +// Dump an OpSource[Continued] sequence for the source and every include file +void Builder::dumpSourceInstructions(std::vector<unsigned int>& out) const +{ + dumpSourceInstructions(sourceFileStringId, sourceText, out); + for (auto iItr = includeFiles.begin(); iItr != includeFiles.end(); ++iItr) + dumpSourceInstructions(iItr->first, *iItr->second, out); +} + void Builder::dumpInstructions(std::vector<unsigned int>& out, const std::vector<std::unique_ptr<Instruction> >& instructions) const { for (int i = 0; i < (int)instructions.size(); ++i) { diff --git a/SPIRV/SpvBuilder.h b/SPIRV/SpvBuilder.h index 6276b6836..3af6ace36 100755 --- a/SPIRV/SpvBuilder.h +++ b/SPIRV/SpvBuilder.h @@ -57,6 +57,7 @@ #include <sstream> #include <stack> #include <unordered_map> +#include <map> namespace spv { @@ -74,20 +75,33 @@ public: source = lang; sourceVersion = version; } - void setSourceFile(const std::string& file) + spv::Id getStringId(const std::string& str) { - Instruction* fileString = new Instruction(getUniqueId(), NoType, OpString); - const char* file_c_str = file.c_str(); + auto sItr = stringIds.find(str); + if (sItr != stringIds.end()) + return sItr->second; + spv::Id strId = getUniqueId(); + Instruction* fileString = new Instruction(strId, NoType, OpString); + const char* file_c_str = str.c_str(); fileString->addStringOperand(file_c_str); - sourceFileStringId = fileString->getResultId(); strings.push_back(std::unique_ptr<Instruction>(fileString)); - stringIds[file_c_str] = sourceFileStringId; + stringIds[file_c_str] = strId; + return strId; + } + void setSourceFile(const std::string& file) + { + sourceFileStringId = getStringId(file); } void setSourceText(const std::string& text) { sourceText = text; } void addSourceExtension(const char* ext) { sourceExtensions.push_back(ext); } void addModuleProcessed(const std::string& p) { moduleProcesses.push_back(p.c_str()); } void setEmitOpLines() { emitOpLines = true; } void addExtension(const char* ext) { extensions.insert(ext); } + void addInclude(const std::string& name, const std::string& text) + { + spv::Id incId = getStringId(name); + includeFiles[incId] = &text; + } Id import(const char*); void setMemoryModel(spv::AddressingModel addr, spv::MemoryModel mem) { @@ -658,6 +672,7 @@ public: void createAndSetNoPredecessorBlock(const char*); void createSelectionMerge(Block* mergeBlock, unsigned int control); void dumpSourceInstructions(std::vector<unsigned int>&) const; + void dumpSourceInstructions(const spv::Id fileId, const std::string& text, std::vector<unsigned int>&) const; void dumpInstructions(std::vector<unsigned int>&, const std::vector<std::unique_ptr<Instruction> >&) const; void dumpModuleProcesses(std::vector<unsigned int>&) const; @@ -708,6 +723,9 @@ public: // map from strings to their string ids std::unordered_map<std::string, spv::Id> stringIds; + // map from include file name ids to their contents + std::map<spv::Id, const std::string*> includeFiles; + // The stream for outputting warnings and errors. SpvBuildLogger* logger; }; // end Builder class diff --git a/Test/baseResults/hlsl.pp.line3.frag.out b/Test/baseResults/hlsl.pp.line3.frag.out index de77c1d34..33e5d55aa 100644 --- a/Test/baseResults/hlsl.pp.line3.frag.out +++ b/Test/baseResults/hlsl.pp.line3.frag.out @@ -4,12 +4,12 @@ hlsl.pp.line3.frag // Id's are bound by 78 Capability Shader - 2: ExtInstImport "GLSL.std.450" + 3: ExtInstImport "GLSL.std.450" MemoryModel Logical GLSL450 - EntryPoint Fragment 5 "MainPs" 69 73 - ExecutionMode 5 OriginUpperLeft + EntryPoint Fragment 6 "MainPs" 69 73 + ExecutionMode 6 OriginUpperLeft 1: String "hlsl.pp.line3.frag" - 31: String "./i1.h" + 2: String "./i1.h" Source HLSL 500 1 "// OpModuleProcessed entry-point MainPs // OpModuleProcessed client vulkan100 // OpModuleProcessed target-env vulkan1.0 @@ -50,18 +50,20 @@ PS_OUTPUT MainPs ( PS_INPUT i ) } " - Name 5 "MainPs" - Name 9 "PS_INPUT" - MemberName 9(PS_INPUT) 0 "vTextureCoords" - Name 12 "PS_OUTPUT" - MemberName 12(PS_OUTPUT) 0 "vColor" - Name 15 "@MainPs(struct-PS_INPUT-vf21;" - Name 14 "i" - Name 18 "PerViewConstantBuffer_t" - MemberName 18(PerViewConstantBuffer_t) 0 "g_nDataIdx" - MemberName 18(PerViewConstantBuffer_t) 1 "g_nDataIdx2" - MemberName 18(PerViewConstantBuffer_t) 2 "g_B" - Name 20 "" + Source HLSL 500 2 " u = g_nDataIdx; +" + Name 6 "MainPs" + Name 10 "PS_INPUT" + MemberName 10(PS_INPUT) 0 "vTextureCoords" + Name 13 "PS_OUTPUT" + MemberName 13(PS_OUTPUT) 0 "vColor" + Name 16 "@MainPs(struct-PS_INPUT-vf21;" + Name 15 "i" + Name 19 "PerViewConstantBuffer_t" + MemberName 19(PerViewConstantBuffer_t) 0 "g_nDataIdx" + MemberName 19(PerViewConstantBuffer_t) 1 "g_nDataIdx2" + MemberName 19(PerViewConstantBuffer_t) 2 "g_B" + Name 21 "" Name 33 "u" Name 42 "ps_output" Name 47 "g_tColor" @@ -70,40 +72,40 @@ PS_OUTPUT MainPs ( PS_INPUT i ) Name 69 "i.vTextureCoords" Name 73 "@entryPointOutput.vColor" Name 74 "param" - MemberDecorate 18(PerViewConstantBuffer_t) 0 Offset 0 - MemberDecorate 18(PerViewConstantBuffer_t) 1 Offset 4 - MemberDecorate 18(PerViewConstantBuffer_t) 2 Offset 8 - Decorate 18(PerViewConstantBuffer_t) Block + MemberDecorate 19(PerViewConstantBuffer_t) 0 Offset 0 + MemberDecorate 19(PerViewConstantBuffer_t) 1 Offset 4 + MemberDecorate 19(PerViewConstantBuffer_t) 2 Offset 8 + Decorate 19(PerViewConstantBuffer_t) Block Decorate 47(g_tColor) DescriptorSet 0 Decorate 47(g_tColor) Binding 0 Decorate 54(g_sAniso) DescriptorSet 0 Decorate 54(g_sAniso) Binding 0 Decorate 69(i.vTextureCoords) Location 0 Decorate 73(@entryPointOutput.vColor) Location 0 - 3: TypeVoid - 4: TypeFunction 3 - 7: TypeFloat 32 - 8: TypeVector 7(float) 2 - 9(PS_INPUT): TypeStruct 8(fvec2) - 10: TypePointer Function 9(PS_INPUT) - 11: TypeVector 7(float) 4 - 12(PS_OUTPUT): TypeStruct 11(fvec4) - 13: TypeFunction 12(PS_OUTPUT) 10(ptr) - 17: TypeInt 32 0 -18(PerViewConstantBuffer_t): TypeStruct 17(int) 17(int) 17(int) - 19: TypePointer PushConstant 18(PerViewConstantBuffer_t) - 20: 19(ptr) Variable PushConstant - 21: TypeInt 32 1 - 22: 21(int) Constant 2 - 23: TypePointer PushConstant 17(int) - 26: TypeBool - 27: 17(int) Constant 0 - 32: TypePointer Function 17(int) - 34: 21(int) Constant 0 - 38: 21(int) Constant 1 - 41: TypePointer Function 12(PS_OUTPUT) - 43: TypeImage 7(float) 2D sampled format:Unknown - 44: 17(int) Constant 128 + 4: TypeVoid + 5: TypeFunction 4 + 8: TypeFloat 32 + 9: TypeVector 8(float) 2 + 10(PS_INPUT): TypeStruct 9(fvec2) + 11: TypePointer Function 10(PS_INPUT) + 12: TypeVector 8(float) 4 + 13(PS_OUTPUT): TypeStruct 12(fvec4) + 14: TypeFunction 13(PS_OUTPUT) 11(ptr) + 18: TypeInt 32 0 +19(PerViewConstantBuffer_t): TypeStruct 18(int) 18(int) 18(int) + 20: TypePointer PushConstant 19(PerViewConstantBuffer_t) + 21: 20(ptr) Variable PushConstant + 22: TypeInt 32 1 + 23: 22(int) Constant 2 + 24: TypePointer PushConstant 18(int) + 27: TypeBool + 28: 18(int) Constant 0 + 32: TypePointer Function 18(int) + 34: 22(int) Constant 0 + 38: 22(int) Constant 1 + 41: TypePointer Function 13(PS_OUTPUT) + 43: TypeImage 8(float) 2D sampled format:Unknown + 44: 18(int) Constant 128 45: TypeArray 43 44 46: TypePointer UniformConstant 45 47(g_tColor): 46(ptr) Variable UniformConstant @@ -112,63 +114,63 @@ PS_OUTPUT MainPs ( PS_INPUT i ) 53: TypePointer UniformConstant 52 54(g_sAniso): 53(ptr) Variable UniformConstant 56: TypeSampledImage 43 - 58: TypePointer Function 8(fvec2) - 62: TypePointer Function 11(fvec4) - 68: TypePointer Input 8(fvec2) + 58: TypePointer Function 9(fvec2) + 62: TypePointer Function 12(fvec4) + 68: TypePointer Input 9(fvec2) 69(i.vTextureCoords): 68(ptr) Variable Input - 72: TypePointer Output 11(fvec4) + 72: TypePointer Output 12(fvec4) 73(@entryPointOutput.vColor): 72(ptr) Variable Output - 5(MainPs): 3 Function None 4 - 6: Label - 67(i): 10(ptr) Variable Function - 74(param): 10(ptr) Variable Function + 6(MainPs): 4 Function None 5 + 7: Label + 67(i): 11(ptr) Variable Function + 74(param): 11(ptr) Variable Function Line 1 23 0 - 70: 8(fvec2) Load 69(i.vTextureCoords) + 70: 9(fvec2) Load 69(i.vTextureCoords) 71: 58(ptr) AccessChain 67(i) 34 Store 71 70 - 75: 9(PS_INPUT) Load 67(i) + 75:10(PS_INPUT) Load 67(i) Store 74(param) 75 - 76:12(PS_OUTPUT) FunctionCall 15(@MainPs(struct-PS_INPUT-vf21;) 74(param) - 77: 11(fvec4) CompositeExtract 76 0 + 76:13(PS_OUTPUT) FunctionCall 16(@MainPs(struct-PS_INPUT-vf21;) 74(param) + 77: 12(fvec4) CompositeExtract 76 0 Store 73(@entryPointOutput.vColor) 77 Return FunctionEnd -15(@MainPs(struct-PS_INPUT-vf21;):12(PS_OUTPUT) Function None 13 - 14(i): 10(ptr) FunctionParameter - 16: Label +16(@MainPs(struct-PS_INPUT-vf21;):13(PS_OUTPUT) Function None 14 + 15(i): 11(ptr) FunctionParameter + 17: Label 33(u): 32(ptr) Variable Function 42(ps_output): 41(ptr) Variable Function Line 1 27 0 - 24: 23(ptr) AccessChain 20 22 - 25: 17(int) Load 24 - 28: 26(bool) INotEqual 25 27 - SelectionMerge 30 None - BranchConditional 28 29 37 - 29: Label - Line 31 1 0 - 35: 23(ptr) AccessChain 20 34 - 36: 17(int) Load 35 + 25: 24(ptr) AccessChain 21 23 + 26: 18(int) Load 25 + 29: 27(bool) INotEqual 26 28 + SelectionMerge 31 None + BranchConditional 29 30 37 + 30: Label + Line 2 1 0 + 35: 24(ptr) AccessChain 21 34 + 36: 18(int) Load 35 Store 33(u) 36 - Branch 30 + Branch 31 37: Label Line 1 30 0 - 39: 23(ptr) AccessChain 20 38 - 40: 17(int) Load 39 + 39: 24(ptr) AccessChain 21 38 + 40: 18(int) Load 39 Store 33(u) 40 - Branch 30 - 30: Label + Branch 31 + 31: Label Line 1 31 0 - 48: 17(int) Load 33(u) + 48: 18(int) Load 33(u) 50: 49(ptr) AccessChain 47(g_tColor) 48 51: 43 Load 50 55: 52 Load 54(g_sAniso) 57: 56 SampledImage 51 55 - 59: 58(ptr) AccessChain 14(i) 34 - 60: 8(fvec2) Load 59 - 61: 11(fvec4) ImageSampleImplicitLod 57 60 + 59: 58(ptr) AccessChain 15(i) 34 + 60: 9(fvec2) Load 59 + 61: 12(fvec4) ImageSampleImplicitLod 57 60 63: 62(ptr) AccessChain 42(ps_output) 34 Store 63 61 Line 1 32 0 - 64:12(PS_OUTPUT) Load 42(ps_output) + 64:13(PS_OUTPUT) Load 42(ps_output) ReturnValue 64 FunctionEnd diff --git a/glslang/MachineIndependent/localintermediate.h b/glslang/MachineIndependent/localintermediate.h index 62ce4d4af..eb8fe0b16 100755 --- a/glslang/MachineIndependent/localintermediate.h +++ b/glslang/MachineIndependent/localintermediate.h @@ -668,6 +668,8 @@ public: const std::string& getSourceFile() const { return sourceFile; } void addSourceText(const char* text) { sourceText = sourceText + text; } const std::string& getSourceText() const { return sourceText; } + const std::map<std::string, std::string>& getIncludeText() const { return includeText; } + void addIncludeText(const char* name, const char* text, size_t len) { includeText[name].assign(text,len); } void addProcesses(const std::vector<std::string>& p) { for (int i = 0; i < (int)p.size(); ++i) @@ -815,6 +817,9 @@ protected: std::string sourceFile; std::string sourceText; + // Included text. First string is a name, second is the included text + std::map<std::string, std::string> includeText; + // for OpModuleProcessed, or equivalent TProcesses processes; diff --git a/glslang/MachineIndependent/preprocessor/Pp.cpp b/glslang/MachineIndependent/preprocessor/Pp.cpp index 3fe341704..3441948cf 100755 --- a/glslang/MachineIndependent/preprocessor/Pp.cpp +++ b/glslang/MachineIndependent/preprocessor/Pp.cpp @@ -653,6 +653,7 @@ int TPpContext::CPPinclude(TPpToken* ppToken) epilogue << (res->headerData[res->headerLength - 1] == '\n'? "" : "\n") << "#line " << directiveLoc.line + forNextLine << " " << directiveLoc.getStringNameOrNum() << "\n"; pushInput(new TokenizableIncludeFile(directiveLoc, prologue.str(), res, epilogue.str(), this)); + parseContext.intermediate.addIncludeText(res->headerName.c_str(), res->headerData, res->headerLength); // There's no "current" location anymore. parseContext.setCurrentColumn(0); } else { -- GitLab