Create separate OpSource for each included file
authorGreg Fischer <greg@lunarg.com>
Thu, 6 Dec 2018 18:13:15 +0000 (11:13 -0700)
committerGreg Fischer <greg@lunarg.com>
Fri, 28 Dec 2018 19:06:43 +0000 (12:06 -0700)
SPIRV/GlslangToSpv.cpp
SPIRV/SpvBuilder.cpp
SPIRV/SpvBuilder.h
Test/baseResults/hlsl.pp.line3.frag.out
glslang/MachineIndependent/localintermediate.h
glslang/MachineIndependent/preprocessor/Pp.cpp

index 0cc059045e08ae4fe417ae310157a40865f64e68..6dc25ab1e5be01f86c6c15802c3ef56c0c0aff0a 100644 (file)
@@ -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()) {
index f6ccc303f6581ae1b8b366557107ef48ac3110b7..9ba3158eae969354c8e1953c749c7a81d8bed2b1 100755 (executable)
@@ -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) {
index 6276b683640cfb616bfe6c1fd1c8004420af16e9..3af6ace362fe317390da7f80fda53c658dbd157a 100755 (executable)
@@ -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
index de77c1d34bfe91989a8d7d09196acdf976f0352b..33e5d55aacee3b0bf0f536d6501ab7ec404995fa 100644 (file)
@@ -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
index 62ce4d4af938053846c1aea2eff7c0eaffdd1a81..eb8fe0b16ab5792176a3d3c7f8881ffcb6c459b0 100755 (executable)
@@ -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;
 
index 3fe3417043e9e87a00e532cebdf3ed7d909c5102..3441948cf8fbefb5ae5112fc0d77291bbd73ff30 100755 (executable)
@@ -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 {