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);
}
}
}
// 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;
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());
}
}
+// 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) {
#include <sstream>
#include <stack>
#include <unordered_map>
+#include <map>
namespace spv {
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)
{
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;
// 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
// 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
}
"
- 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"
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
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