From eee1efcf4f1ece0375e5d89b1e75ff1465a679e1 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 15 Oct 2019 15:07:42 +0100 Subject: [PATCH] Handle naming forward pointer types better in SPIR-V disassembly --- renderdoc/driver/shaders/spirv/spirv_disassemble.cpp | 10 +++++++++- renderdoc/driver/shaders/spirv/spirv_reflect.cpp | 12 ++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index d1c756499..53cc238d7 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -323,8 +323,16 @@ std::string Reflector::Disassemble(const std::string &entryPoint) const case Op::TypeSampler: case Op::TypeSampledImage: case Op::TypeFunction: - case Op::TypeRuntimeArray: + case Op::TypeRuntimeArray: continue; + + case Op::TypeForwardPointer: + { + OpTypeForwardPointer decoded(it); + + ret += ToStr(decoded.storageClass) + " " + declName(decoded.pointerType, Id()) + ";\n"; + continue; + } // structs we print out case Op::TypeStruct: diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp index accff3033..e488e7e41 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp @@ -534,10 +534,6 @@ void Reflector::PostParse() { type.name = StringFormat::Fmt("struct%u", type.id); } - else if(type.type == DataType::PointerType) - { - type.name = StringFormat::Fmt("%s*", dataTypes[type.InnerType()].name.c_str()); - } else if(type.type == DataType::ArrayType) { // prefer the name @@ -615,6 +611,14 @@ void Reflector::PostParse() } } + // do default names for pointer types in a second pass, because they can point forward at structs + // with higher IDs + for(auto it = dataTypes.begin(); it != dataTypes.end(); ++it) + { + if(it->second.type == DataType::PointerType && it->second.name.empty()) + it->second.name = StringFormat::Fmt("%s*", dataTypes[it->second.InnerType()].name.c_str()); + } + for(const MemberName &mem : memberNames) dataTypes[mem.id].children[mem.member].name = mem.name;