From 0504953b3501f8307c94db525608a75bf7b226c1 Mon Sep 17 00:00:00 2001 From: Arcady Goldmints-Orlov Date: Thu, 12 Oct 2023 13:42:32 -0400 Subject: [PATCH] spirv: don't emit invalid debuginfo for buffer references Currently no debug info is emitted for buffer reference types, which resulted in the SPIR-V backend code asserting when trying to emit the debug info for struct member that had such a type. Instead, the code now skips such struct members. Full debug info for buffer references may require forward references in the debug info instructions, which is currently prohibited by the spec. --- SPIRV/SpvBuilder.cpp | 5 +- .../spv.debuginfo.bufferref.glsl.frag.out | 186 ++++++++++++++++++ Test/spv.debuginfo.bufferref.glsl.frag | 28 +++ gtests/Spv.FromFile.cpp | 1 + 4 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 Test/baseResults/spv.debuginfo.bufferref.glsl.frag.out create mode 100644 Test/spv.debuginfo.bufferref.glsl.frag diff --git a/SPIRV/SpvBuilder.cpp b/SPIRV/SpvBuilder.cpp index 49244bb39..d42f72881 100644 --- a/SPIRV/SpvBuilder.cpp +++ b/SPIRV/SpvBuilder.cpp @@ -1029,7 +1029,10 @@ Id Builder::makeCompositeDebugType(std::vector const& memberTypes, char cons for(auto const memberType : memberTypes) { assert(debugTypeLocs.find(memberType) != debugTypeLocs.end()); - memberDebugTypes.emplace_back(makeMemberDebugType(memberType, debugTypeLocs[memberType])); + // There _should_ be debug types for all the member types but currently buffer references + // do not have member debug info generated. + if (debugId[memberType]) + memberDebugTypes.emplace_back(makeMemberDebugType(memberType, debugTypeLocs[memberType])); // TODO: Need to rethink this method of passing location information. // debugTypeLocs.erase(memberType); diff --git a/Test/baseResults/spv.debuginfo.bufferref.glsl.frag.out b/Test/baseResults/spv.debuginfo.bufferref.glsl.frag.out new file mode 100644 index 000000000..f52e001a9 --- /dev/null +++ b/Test/baseResults/spv.debuginfo.bufferref.glsl.frag.out @@ -0,0 +1,186 @@ +spv.debuginfo.bufferref.glsl.frag +// Module Version 10000 +// Generated by (magic number): 8000b +// Id's are bound by 131 + + Capability Shader + Capability PhysicalStorageBufferAddressesEXT + Extension "SPV_KHR_non_semantic_info" + Extension "SPV_KHR_physical_storage_buffer" + Extension "SPV_KHR_storage_buffer_storage_class" + 2: ExtInstImport "NonSemantic.Shader.DebugInfo.100" + 3: ExtInstImport "GLSL.std.450" + MemoryModel PhysicalStorageBuffer64EXT GLSL450 + EntryPoint Fragment 14 "main" 69 122 + ExecutionMode 14 OriginUpperLeft + 1: String "" + 8: String "uint" + 15: String "main" + 18: String "// OpModuleProcessed auto-map-locations +// OpModuleProcessed auto-map-bindings +// OpModuleProcessed client vulkan100 +// OpModuleProcessed target-env vulkan1.0 +// OpModuleProcessed keep-uncalled +// OpModuleProcessed entry-point main +#line 1 +" + 31: String "Mesh" + 33: String "float" + 39: String "data" + 43: String "MeshVertexPositions" + 47: String "meshData" + 59: String "PerPass_meshes" + 63: String "perPass_meshes" + 65: String "int" + 71: String "tri_idx0" + 86: String "vertex_pos0" + 124: String "out_fragColor" + SourceExtension "GL_EXT_buffer_reference" + Name 14 "main" + Name 29 "Mesh" + MemberName 29(Mesh) 0 "positions" + Name 37 "MeshVertexPositions" + MemberName 37(MeshVertexPositions) 0 "data" + Name 45 "meshData" + Name 50 "Mesh" + MemberName 50(Mesh) 0 "positions" + Name 54 "PerPass_meshes" + MemberName 54(PerPass_meshes) 0 "data" + Name 61 "perPass_meshes" + Name 69 "tri_idx0" + Name 84 "vertex_pos0" + Name 122 "out_fragColor" + Decorate 35 ArrayStride 4 + MemberDecorate 37(MeshVertexPositions) 0 Offset 0 + Decorate 37(MeshVertexPositions) Block + MemberDecorate 50(Mesh) 0 Offset 0 + Decorate 52 ArrayStride 8 + MemberDecorate 54(PerPass_meshes) 0 NonWritable + MemberDecorate 54(PerPass_meshes) 0 Offset 0 + Decorate 54(PerPass_meshes) Block + Decorate 61(perPass_meshes) DescriptorSet 0 + Decorate 61(perPass_meshes) Binding 0 + Decorate 69(tri_idx0) Flat + Decorate 69(tri_idx0) Location 0 + Decorate 122(out_fragColor) Location 0 + Decorate 45(meshData) DecorationAliasedPointerEXT + 4: TypeVoid + 5: TypeFunction 4 + 7: TypeInt 32 0 + 10: 7(int) Constant 32 + 11: 7(int) Constant 6 + 12: 7(int) Constant 0 + 9: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 8 10 11 12 + 13: 7(int) Constant 3 + 6: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 8(DebugTypeFunction) 13 4 + 17: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 35(DebugSource) 1 18 + 20: 7(int) Constant 1 + 21: 7(int) Constant 4 + 22: 7(int) Constant 2 + 19: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 1(DebugCompilationUnit) 20 21 17 22 + 16: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 20(DebugFunction) 15 6 17 12 12 19 15 13 12 + 27: 7(int) Constant 21 + TypeForwardPointer 28 PhysicalStorageBufferEXT + 29(Mesh): TypeStruct 28 + 30: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 31 20 17 27 12 19 31 12 13 + 32: TypeFloat 32 + 34: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 33 10 13 12 + 35: TypeRuntimeArray 32(float) + 36: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 5(DebugTypeArray) 34 12 +37(MeshVertexPositions): TypeStruct 35 + 40: 7(int) Constant 5 + 41: 7(int) Constant 9 + 38: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 39 36 17 40 41 12 12 13 + 42: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 43 20 17 27 12 19 43 12 13 38 + 28: TypePointer PhysicalStorageBufferEXT 37(MeshVertexPositions) + 44: TypePointer Function 29(Mesh) + 46: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 26(DebugLocalVariable) 47 30 17 27 12 16 21 + 49: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 31(DebugExpression) + 50(Mesh): TypeStruct 28(ptr) + 51: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 31 20 17 27 12 19 31 12 13 + 52: TypeRuntimeArray 50(Mesh) + 53: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 5(DebugTypeArray) 51 12 +54(PerPass_meshes): TypeStruct 52 + 56: 7(int) Constant 13 + 57: 7(int) Constant 8 + 55: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 11(DebugTypeMember) 39 53 17 56 57 12 12 13 + 58: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 10(DebugTypeComposite) 59 20 17 27 12 19 59 12 13 55 + 60: TypePointer StorageBuffer 54(PerPass_meshes) +61(perPass_meshes): 60(ptr) Variable StorageBuffer + 62: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 63 58 17 27 12 19 63 61(perPass_meshes) 57 + 64: TypeInt 32 1 + 66: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 2(DebugTypeBasic) 65 10 21 12 + 67: 64(int) Constant 0 + 68: TypePointer Input 7(int) + 69(tri_idx0): 68(ptr) Variable Input + 70: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 71 9 17 27 12 19 71 69(tri_idx0) 57 + 73: TypePointer StorageBuffer 50(Mesh) + 77: TypePointer Function 28(ptr) + 80: 7(int) Constant 23 + 81: TypeVector 32(float) 3 + 82: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 6(DebugTypeVector) 34 13 + 83: TypePointer Function 81(fvec3) + 85: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 26(DebugLocalVariable) 86 82 17 80 12 16 21 + 89: 7(int) Constant 25 + 95: TypePointer PhysicalStorageBufferEXT 32(float) + 99: 7(int) Constant 24 + 118: 7(int) Constant 27 + 119: TypeVector 32(float) 4 + 120: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 6(DebugTypeVector) 34 21 + 121: TypePointer Output 119(fvec4) +122(out_fragColor): 121(ptr) Variable Output + 123: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 18(DebugGlobalVariable) 124 120 17 118 12 19 124 122(out_fragColor) 57 + 126: 32(float) Constant 1065353216 + Line 1 20 11 + 14(main): 4 Function None 5 + 23: Label + 45(meshData): 44(ptr) Variable Function + 84(vertex_pos0): 83(ptr) Variable Function + 24: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 101(DebugFunctionDefinition) 16 14(main) + 25: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 23(DebugScope) 16 + 26: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 27 27 12 12 + 48: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 28(DebugDeclare) 46 45(meshData) 49 + 72: 7(int) Load 69(tri_idx0) + 74: 73(ptr) AccessChain 61(perPass_meshes) 67 72 + 75: 50(Mesh) Load 74 + 76: 28(ptr) CompositeExtract 75 0 + 78: 77(ptr) AccessChain 45(meshData) 67 + Store 78 76 + 79: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 80 80 12 12 + 87: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 28(DebugDeclare) 85 84(vertex_pos0) 49 + 88: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 89 89 12 12 + 90: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 80 80 12 12 + 91: 77(ptr) AccessChain 45(meshData) 67 + 92: 28(ptr) Load 91 + 93: 7(int) Load 69(tri_idx0) + 94: 7(int) IMul 13 93 + 96: 95(ptr) AccessChain 92 67 94 + 97: 32(float) Load 96 Aligned 4 + 98: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 99 99 12 12 + 100: 77(ptr) AccessChain 45(meshData) 67 + 101: 28(ptr) Load 100 + 102: 7(int) Load 69(tri_idx0) + 103: 7(int) IMul 13 102 + 104: 7(int) IAdd 103 20 + 105: 95(ptr) AccessChain 101 67 104 + 106: 32(float) Load 105 Aligned 4 + 107: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 89 89 12 12 + 108: 77(ptr) AccessChain 45(meshData) 67 + 109: 28(ptr) Load 108 + 110: 7(int) Load 69(tri_idx0) + 111: 7(int) IMul 13 110 + 112: 7(int) IAdd 111 22 + 113: 95(ptr) AccessChain 109 67 112 + 114: 32(float) Load 113 Aligned 4 + 115: 81(fvec3) CompositeConstruct 97 106 114 + 116: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 80 80 12 12 + Store 84(vertex_pos0) 115 + 117: 4 ExtInst 2(NonSemantic.Shader.DebugInfo.100) 103(DebugLine) 17 118 118 12 12 + 125: 81(fvec3) Load 84(vertex_pos0) + 127: 32(float) CompositeExtract 125 0 + 128: 32(float) CompositeExtract 125 1 + 129: 32(float) CompositeExtract 125 2 + 130: 119(fvec4) CompositeConstruct 127 128 129 126 + Store 122(out_fragColor) 130 + Return + FunctionEnd diff --git a/Test/spv.debuginfo.bufferref.glsl.frag b/Test/spv.debuginfo.bufferref.glsl.frag new file mode 100644 index 000000000..c2002fa2c --- /dev/null +++ b/Test/spv.debuginfo.bufferref.glsl.frag @@ -0,0 +1,28 @@ +#version 450 core +#extension GL_EXT_buffer_reference : enable + +layout(buffer_reference, std430) buffer MeshVertexPositions { + float data[]; +}; + +struct Mesh { + MeshVertexPositions positions; +}; + +layout(set = 0, binding = 0) readonly buffer PerPass_meshes { + Mesh data[]; +} perPass_meshes; + +layout(location = 0) out vec4 out_fragColor; + +layout(location = 0) in flat uint tri_idx0; + +void main() { + Mesh meshData = perPass_meshes.data[tri_idx0]; + + vec3 vertex_pos0 = vec3(meshData.positions.data[3 * tri_idx0], + meshData.positions.data[3 * tri_idx0 + 1], + meshData.positions.data[3 * tri_idx0 + 2]); + + out_fragColor = vec4(vertex_pos0, 1.0); +} diff --git a/gtests/Spv.FromFile.cpp b/gtests/Spv.FromFile.cpp index 80eff330e..90fb2fc66 100644 --- a/gtests/Spv.FromFile.cpp +++ b/gtests/Spv.FromFile.cpp @@ -931,6 +931,7 @@ INSTANTIATE_TEST_SUITE_P( "spv.debuginfo.glsl.geom", "spv.debuginfo.glsl.tesc", "spv.debuginfo.glsl.tese", + "spv.debuginfo.bufferref.glsl.frag", "spv.debuginfo.const_params.glsl.comp", "spv.debuginfo.scalar_types.glsl.frag", })),