Emit debug info for buffer references

Using OpExtInstWithForwardRefs, the debug type information for buffer
reference types can be emitted alongside the OpFowardPointer opcode.
This commit is contained in:
Arcady Goldmints-Orlov 2024-03-11 18:53:37 -04:00 committed by arcady-lunarg
parent 996c5d3123
commit 81f7045aa0
3 changed files with 188 additions and 146 deletions

View file

@ -182,6 +182,10 @@ Id Builder::makeForwardPointer(StorageClass storageClass)
constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
module.mapInstruction(type);
if (emitNonSemanticShaderDebugInfo) {
const Id debugResultId = makeForwardPointerDebugType(storageClass);
debugId[type->getResultId()] = debugResultId;
}
return type->getResultId();
}
@ -204,6 +208,15 @@ Id Builder::makePointerFromForwardPointer(StorageClass storageClass, Id forwardP
constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
module.mapInstruction(type);
// If we are emitting nonsemantic debuginfo, we need to patch the debug pointer type
// that was emitted alongside the forward pointer, now that we have a pointee debug
// type for it to point to.
if (emitNonSemanticShaderDebugInfo) {
Instruction *debugForwardPointer = module.getInstruction(debugId[forwardPointerType]);
assert(debugId[pointee]);
debugForwardPointer->setIdOperand(2, debugId[pointee]);
}
return type->getResultId();
}
@ -1045,6 +1058,29 @@ Id Builder::makePointerDebugType(StorageClass storageClass, Id const baseType)
return type->getResultId();
}
// Emit a OpExtInstWithForwardRefs nonsemantic instruction for a pointer debug type
// where we don't have the pointee yet. Since we don't have the pointee yet, it just
// points to itself and we rely on patching it later.
Id Builder::makeForwardPointerDebugType(StorageClass storageClass)
{
const Id scID = makeUintConstant(storageClass);
this->addExtension(spv::E_SPV_KHR_relaxed_extended_instruction);
Instruction *type = new Instruction(getUniqueId(), makeVoidType(), OpExtInstWithForwardRefs);
type->addIdOperand(nonSemanticShaderDebugInfo);
type->addImmediateOperand(NonSemanticShaderDebugInfo100DebugTypePointer);
type->addIdOperand(type->getResultId());
type->addIdOperand(scID);
type->addIdOperand(makeUintConstant(0));
groupedDebugTypes[NonSemanticShaderDebugInfo100DebugTypePointer].push_back(type);
constantsTypesGlobals.push_back(std::unique_ptr<Instruction>(type));
module.mapInstruction(type);
return type->getResultId();
}
Id Builder::makeDebugSource(const Id fileName) {
if (debugSourceId.find(fileName) != debugSourceId.end())
return debugSourceId[fileName];

View file

@ -235,6 +235,7 @@ public:
Id makeCompositeDebugType(std::vector<Id> const& memberTypes, char const*const name,
NonSemanticShaderDebugInfo100DebugCompositeType const tag, bool const isOpaqueType = false);
Id makePointerDebugType(StorageClass storageClass, Id const baseType);
Id makeForwardPointerDebugType(StorageClass storageClass);
Id makeDebugSource(const Id fileName);
Id makeDebugCompilationUnit();
Id createDebugGlobalVariable(Id const type, char const*const name, Id const variable);

View file

@ -1,17 +1,18 @@
spv.debuginfo.bufferref.glsl.frag
// Module Version 10000
// Generated by (magic number): 8000b
// Id's are bound by 142
// Id's are bound by 146
Capability Shader
Capability PhysicalStorageBufferAddressesEXT
Extension "SPV_KHR_non_semantic_info"
Extension "SPV_KHR_physical_storage_buffer"
Extension "SPV_KHR_relaxed_extended_instruction"
Extension "SPV_KHR_storage_buffer_storage_class"
1: ExtInstImport "NonSemantic.Shader.DebugInfo.100"
3: ExtInstImport "GLSL.std.450"
MemoryModel PhysicalStorageBuffer64EXT GLSL450
EntryPoint Fragment 14 "main" 76 131
EntryPoint Fragment 14 "main" 82 135
ExecutionMode 14 OriginUpperLeft
2: String "spv.debuginfo.bufferref.glsl.frag"
8: String "uint"
@ -52,46 +53,47 @@ void main() {
out_fragColor = vec4(vertex_pos0, 1.0);
}
"
31: String "Mesh"
34: String "float"
40: String "data"
44: String "MeshVertexPositions"
50: String "meshData"
63: String "PerPass_meshes"
69: String "perPass_meshes"
71: String "int"
78: String "tri_idx0"
94: String "vertex_pos0"
133: String "out_fragColor"
33: String "positions"
37: String "Mesh"
40: String "float"
46: String "data"
49: String "MeshVertexPositions"
55: String "meshData"
69: String "PerPass_meshes"
75: String "perPass_meshes"
77: String "int"
84: String "tri_idx0"
100: String "vertex_pos0"
137: String "out_fragColor"
SourceExtension "GL_EXT_buffer_reference"
Name 14 "main"
Name 29 "Mesh"
MemberName 29(Mesh) 0 "positions"
Name 38 "MeshVertexPositions"
MemberName 38(MeshVertexPositions) 0 "data"
Name 48 "meshData"
Name 54 "Mesh"
MemberName 54(Mesh) 0 "positions"
Name 58 "PerPass_meshes"
MemberName 58(PerPass_meshes) 0 "data"
Name 67 "perPass_meshes"
Name 76 "tri_idx0"
Name 92 "vertex_pos0"
Name 131 "out_fragColor"
Decorate 36 ArrayStride 4
MemberDecorate 38(MeshVertexPositions) 0 Offset 0
Decorate 38(MeshVertexPositions) Block
MemberDecorate 54(Mesh) 0 Offset 0
Decorate 56 ArrayStride 8
MemberDecorate 58(PerPass_meshes) 0 NonWritable
MemberDecorate 58(PerPass_meshes) 0 Offset 0
Decorate 58(PerPass_meshes) Block
Decorate 67(perPass_meshes) DescriptorSet 0
Decorate 67(perPass_meshes) Binding 0
Decorate 76(tri_idx0) Flat
Decorate 76(tri_idx0) Location 0
Decorate 131(out_fragColor) Location 0
Decorate 48(meshData) DecorationAliasedPointerEXT
Name 31 "Mesh"
MemberName 31(Mesh) 0 "positions"
Name 44 "MeshVertexPositions"
MemberName 44(MeshVertexPositions) 0 "data"
Name 53 "meshData"
Name 59 "Mesh"
MemberName 59(Mesh) 0 "positions"
Name 64 "PerPass_meshes"
MemberName 64(PerPass_meshes) 0 "data"
Name 73 "perPass_meshes"
Name 82 "tri_idx0"
Name 98 "vertex_pos0"
Name 135 "out_fragColor"
Decorate 42 ArrayStride 4
MemberDecorate 44(MeshVertexPositions) 0 Offset 0
Decorate 44(MeshVertexPositions) Block
MemberDecorate 59(Mesh) 0 Offset 0
Decorate 62 ArrayStride 8
MemberDecorate 64(PerPass_meshes) 0 NonWritable
MemberDecorate 64(PerPass_meshes) 0 Offset 0
Decorate 64(PerPass_meshes) Block
Decorate 73(perPass_meshes) DescriptorSet 0
Decorate 73(perPass_meshes) Binding 0
Decorate 82(tri_idx0) Flat
Decorate 82(tri_idx0) Location 0
Decorate 135(out_fragColor) Location 0
Decorate 53(meshData) DecorationAliasedPointerEXT
4: TypeVoid
5: TypeFunction 4
7: TypeInt 32 0
@ -109,116 +111,119 @@ void main() {
21: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 1(DebugCompilationUnit) 22 23 18 24
17: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 20(DebugFunction) 16 6 18 20 12 21 16 13 20
TypeForwardPointer 28 PhysicalStorageBufferEXT
29(Mesh): TypeStruct 28
32: 7(int) Constant 21
30: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 31 22 18 32 12 21 31 12 13
33: TypeFloat 32
35: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 34 10 13 12
36: TypeRuntimeArray 33(float)
37: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 5(DebugTypeArray) 35 12
38(MeshVertexPositions): TypeStruct 36
41: 7(int) Constant 5
42: 7(int) Constant 9
39: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 40 37 18 41 42 12 12 13
43: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 44 22 18 32 12 21 44 12 13 39
28: TypePointer PhysicalStorageBufferEXT 38(MeshVertexPositions)
45: TypePointer Function 29(Mesh)
46: 7(int) Constant 7
47: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 30 46 12
49: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 26(DebugLocalVariable) 50 30 18 32 12 17 23
52: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 31(DebugExpression)
54(Mesh): TypeStruct 28(ptr)
55: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 31 22 18 32 12 21 31 12 13
56: TypeRuntimeArray 54(Mesh)
57: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 5(DebugTypeArray) 55 12
58(PerPass_meshes): TypeStruct 56
60: 7(int) Constant 13
61: 7(int) Constant 8
59: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 40 57 18 60 61 12 12 13
62: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 63 22 18 32 12 21 63 12 13 59
64: TypePointer StorageBuffer 58(PerPass_meshes)
65: 7(int) Constant 12
66: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 62 65 12
67(perPass_meshes): 64(ptr) Variable StorageBuffer
68: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 69 62 18 32 12 21 69 67(perPass_meshes) 61
70: TypeInt 32 1
72: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 71 10 23 12
73: 70(int) Constant 0
74: TypePointer Input 7(int)
75: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 9 22 12
76(tri_idx0): 74(ptr) Variable Input
77: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 78 9 18 32 12 21 78 76(tri_idx0) 61
80: TypePointer StorageBuffer 54(Mesh)
81: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 55 65 12
85: TypePointer Function 28(ptr)
86: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 0(DebugInfoNone)
88: TypeVector 33(float) 3
89: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 6(DebugTypeVector) 35 13
90: TypePointer Function 88(fvec3)
91: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 89 46 12
95: 7(int) Constant 23
93: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 26(DebugLocalVariable) 94 89 18 95 12 17 23
102: TypePointer PhysicalStorageBufferEXT 33(float)
103: 7(int) Constant 5349
104: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 35 103 12
109: 7(int) Constant 24
118: 7(int) Constant 25
127: TypeVector 33(float) 4
128: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 6(DebugTypeVector) 35 23
129: TypePointer Output 127(fvec4)
130: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 128 13 12
131(out_fragColor): 129(ptr) Variable Output
134: 7(int) Constant 27
132: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 133 128 18 134 12 21 133 131(out_fragColor) 61
137: 33(float) Constant 1065353216
29: 7(int) Constant 5349
30: 4 ExtInstWithForwardRefs 1(NonSemantic.Shader.DebugInfo.100) 3 48 29 12
31(Mesh): TypeStruct 28
34: 7(int) Constant 9
35: 7(int) Constant 23
32: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 33 30 18 34 35 12 12 13
38: 7(int) Constant 21
36: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 37 22 18 38 12 21 37 12 13 32
39: TypeFloat 32
41: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 40 10 13 12
42: TypeRuntimeArray 39(float)
43: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 5(DebugTypeArray) 41 12
44(MeshVertexPositions): TypeStruct 42
47: 7(int) Constant 5
45: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 46 43 18 47 34 12 12 13
48: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 49 22 18 38 12 21 49 12 13 45
28: TypePointer PhysicalStorageBufferEXT 44(MeshVertexPositions)
50: TypePointer Function 31(Mesh)
51: 7(int) Constant 7
52: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 36 51 12
54: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 26(DebugLocalVariable) 55 36 18 38 12 17 23
57: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 31(DebugExpression)
59(Mesh): TypeStruct 28(ptr)
60: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 33 30 18 34 35 12 12 13
61: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 37 22 18 38 12 21 37 12 13 60
62: TypeRuntimeArray 59(Mesh)
63: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 5(DebugTypeArray) 61 12
64(PerPass_meshes): TypeStruct 62
66: 7(int) Constant 13
67: 7(int) Constant 8
65: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 46 63 18 66 67 12 12 13
68: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 69 22 18 38 12 21 69 12 13 65
70: TypePointer StorageBuffer 64(PerPass_meshes)
71: 7(int) Constant 12
72: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 68 71 12
73(perPass_meshes): 70(ptr) Variable StorageBuffer
74: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 75 68 18 38 12 21 75 73(perPass_meshes) 67
76: TypeInt 32 1
78: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 77 10 23 12
79: 76(int) Constant 0
80: TypePointer Input 7(int)
81: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 9 22 12
82(tri_idx0): 80(ptr) Variable Input
83: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 84 9 18 38 12 21 84 82(tri_idx0) 67
86: TypePointer StorageBuffer 59(Mesh)
87: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 61 71 12
91: TypePointer Function 28(ptr)
92: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 30 51 12
94: TypeVector 39(float) 3
95: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 6(DebugTypeVector) 41 13
96: TypePointer Function 94(fvec3)
97: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 95 51 12
99: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 26(DebugLocalVariable) 100 95 18 35 12 17 23
107: TypePointer PhysicalStorageBufferEXT 39(float)
108: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 41 29 12
113: 7(int) Constant 24
122: 7(int) Constant 25
131: TypeVector 39(float) 4
132: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 6(DebugTypeVector) 41 23
133: TypePointer Output 131(fvec4)
134: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 3(DebugTypePointer) 132 13 12
135(out_fragColor): 133(ptr) Variable Output
138: 7(int) Constant 27
136: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 137 132 18 138 12 21 137 135(out_fragColor) 67
141: 39(float) Constant 1065353216
14(main): 4 Function None 5
15: Label
48(meshData): 45(ptr) Variable Function
92(vertex_pos0): 90(ptr) Variable Function
53(meshData): 50(ptr) Variable Function
98(vertex_pos0): 96(ptr) Variable Function
26: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 23(DebugScope) 17
27: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 20 20 12 12
25: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 101(DebugFunctionDefinition) 17 14(main)
53: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 32 32 12 12
51: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 28(DebugDeclare) 49 48(meshData) 52
79: 7(int) Load 76(tri_idx0)
82: 80(ptr) AccessChain 67(perPass_meshes) 73 79
83: 54(Mesh) Load 82
84: 28(ptr) CompositeExtract 83 0
87: 85(ptr) AccessChain 48(meshData) 73
Store 87 84
97: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 95 95 12 12
96: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 28(DebugDeclare) 93 92(vertex_pos0) 52
98: 85(ptr) AccessChain 48(meshData) 73
99: 28(ptr) Load 98
100: 7(int) Load 76(tri_idx0)
101: 7(int) IMul 13 100
105: 102(ptr) AccessChain 99 73 101
106: 33(float) Load 105 Aligned 4
108: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 109 109 12 12
107: 85(ptr) AccessChain 48(meshData) 73
110: 28(ptr) Load 107
111: 7(int) Load 76(tri_idx0)
112: 7(int) IMul 13 111
113: 7(int) IAdd 112 22
114: 102(ptr) AccessChain 110 73 113
115: 33(float) Load 114 Aligned 4
117: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 118 118 12 12
116: 85(ptr) AccessChain 48(meshData) 73
119: 28(ptr) Load 116
120: 7(int) Load 76(tri_idx0)
121: 7(int) IMul 13 120
122: 7(int) IAdd 121 24
123: 102(ptr) AccessChain 119 73 122
124: 33(float) Load 123 Aligned 4
125: 88(fvec3) CompositeConstruct 106 115 124
126: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 95 95 12 12
Store 92(vertex_pos0) 125
136: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 134 134 12 12
135: 88(fvec3) Load 92(vertex_pos0)
138: 33(float) CompositeExtract 135 0
139: 33(float) CompositeExtract 135 1
140: 33(float) CompositeExtract 135 2
141: 127(fvec4) CompositeConstruct 138 139 140 137
Store 131(out_fragColor) 141
58: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 38 38 12 12
56: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 28(DebugDeclare) 54 53(meshData) 57
85: 7(int) Load 82(tri_idx0)
88: 86(ptr) AccessChain 73(perPass_meshes) 79 85
89: 59(Mesh) Load 88
90: 28(ptr) CompositeExtract 89 0
93: 91(ptr) AccessChain 53(meshData) 79
Store 93 90
102: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 35 35 12 12
101: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 28(DebugDeclare) 99 98(vertex_pos0) 57
103: 91(ptr) AccessChain 53(meshData) 79
104: 28(ptr) Load 103
105: 7(int) Load 82(tri_idx0)
106: 7(int) IMul 13 105
109: 107(ptr) AccessChain 104 79 106
110: 39(float) Load 109 Aligned 4
112: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 113 113 12 12
111: 91(ptr) AccessChain 53(meshData) 79
114: 28(ptr) Load 111
115: 7(int) Load 82(tri_idx0)
116: 7(int) IMul 13 115
117: 7(int) IAdd 116 22
118: 107(ptr) AccessChain 114 79 117
119: 39(float) Load 118 Aligned 4
121: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 122 122 12 12
120: 91(ptr) AccessChain 53(meshData) 79
123: 28(ptr) Load 120
124: 7(int) Load 82(tri_idx0)
125: 7(int) IMul 13 124
126: 7(int) IAdd 125 24
127: 107(ptr) AccessChain 123 79 126
128: 39(float) Load 127 Aligned 4
129: 94(fvec3) CompositeConstruct 110 119 128
130: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 35 35 12 12
Store 98(vertex_pos0) 129
140: 4 ExtInst 1(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 18 138 138 12 12
139: 94(fvec3) Load 98(vertex_pos0)
142: 39(float) CompositeExtract 139 0
143: 39(float) CompositeExtract 139 1
144: 39(float) CompositeExtract 139 2
145: 131(fvec4) CompositeConstruct 142 143 144 141
Store 135(out_fragColor) 145
Return
FunctionEnd