diff --git a/renderdoc/driver/shaders/spirv/spirv_processor.cpp b/renderdoc/driver/shaders/spirv/spirv_processor.cpp index d38d596c3..347b9e23f 100644 --- a/renderdoc/driver/shaders/spirv/spirv_processor.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_processor.cpp @@ -946,6 +946,16 @@ void Processor::PostParse() m_MemberDecorations.clear(); } +Iter Processor::GetID(Id id) +{ + size_t offs = idOffsets[id]; + + if(offs) + return Iter(m_SPIRV, offs); + + return Iter(); +} + ShaderVariable Processor::MakeNULL(const DataType &type, uint64_t value) { ShaderVariable v("", 0, 0, 0, 0); diff --git a/renderdoc/driver/shaders/spirv/spirv_processor.h b/renderdoc/driver/shaders/spirv/spirv_processor.h index 901351ced..18f48f87d 100644 --- a/renderdoc/driver/shaders/spirv/spirv_processor.h +++ b/renderdoc/driver/shaders/spirv/spirv_processor.h @@ -538,6 +538,8 @@ protected: // after parsing - e.g. to do any deferred post-processing virtual void PostParse(); + Iter GetID(Id id); + ShaderVariable MakeNULL(const DataType &type, uint64_t value); ShaderVariable EvaluateConstant(Id constID, const rdcarray &specInfo) const; diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp index 1d8f9d802..a87b397cd 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp @@ -446,6 +446,31 @@ void Reflector::RegisterOp(Iter it) { loopBlocks.insert(curBlock); } + else if(opdata.op == Op::ExtInst) + { + OpShaderDbg dbg(it); + + // we don't care about much debug info for just reflection. Only pay attention to source files, + // and potential names of global variables that might be missing. + if(dbg.set == knownExtSet[ExtSet_ShaderDbg]) + { + if(dbg.inst == ShaderDbg::CompilationUnit) + { + OpShaderDbg src(GetID(dbg.arg(2))); + sources.push_back({ + (SourceLanguage)EvaluateConstant(dbg.arg(3), {}).value.u32v[0], + strings[src.arg(0)], src.params.size() > 1 ? strings[src.arg(1)] : rdcstr(), + }); + } + else if(dbg.inst == ShaderDbg::GlobalVariable) + { + // copy the name string to the variable string only if it's empty. If it has a name already, + // we prefer that. If the variable is DebugInfoNone then we don't care about it's name. + if(strings[dbg.arg(7)].empty()) + strings[dbg.arg(7)] = strings[dbg.arg(0)]; + } + } + } } void Reflector::UnregisterOp(Iter it)