From 3ee0ddca1a614af1f199b74fbdb0915095ef8c8a Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 25 May 2020 19:29:16 +0100 Subject: [PATCH] Use OpLine information for SPIR-V debugging --- renderdoc/driver/shaders/spirv/spirv_debug.h | 4 ++ .../shaders/spirv/spirv_debug_setup.cpp | 41 +++++++++++++++---- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_debug.h b/renderdoc/driver/shaders/spirv/spirv_debug.h index 2b7687ee0..dd916f7c3 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug.h +++ b/renderdoc/driver/shaders/spirv/spirv_debug.h @@ -343,6 +343,10 @@ private: SparseIdMap idDeathOffset; + SparseIdMap m_Files; + LineColumnInfo m_CurLineCol; + std::map m_LineColInfo; + SparseIdMap labelInstruction; // the live mutable global variables, to initialise a stack frame's live list diff --git a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp index b1f2d1d71..f06a8c4e8 100644 --- a/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_debug_setup.cpp @@ -962,11 +962,15 @@ ShaderDebugTrace *Debugger::BeginDebug(DebugAPIWrapper *apiWrapper, const Shader ret->lineInfo.resize(instructionOffsets.size()); for(size_t i = 0; i < instructionOffsets.size(); i++) { - auto it = instructionLines.find(instructionOffsets[i]); - if(it != instructionLines.end()) - ret->lineInfo[i].disassemblyLine = it->second; - else - ret->lineInfo[i].disassemblyLine = 0; + ret->lineInfo[i] = m_LineColInfo[instructionOffsets[i]]; + + { + auto it = instructionLines.find(instructionOffsets[i]); + if(it != instructionLines.end()) + ret->lineInfo[i].disassemblyLine = it->second; + else + ret->lineInfo[i].disassemblyLine = 0; + } } ret->constantBlocks = global.constantBlocks; @@ -2193,10 +2197,33 @@ void Debugger::RegisterOp(Iter it) } } - if(opdata.op == Op::Line || opdata.op == Op::NoLine) + if(opdata.op == Op::Source) { - // ignore OpLine/OpNoLine + OpSource source(it); + + if(!source.source.empty()) + { + m_Files[source.file] = m_Files.size(); + } } + else if(opdata.op == Op::Line) + { + OpLine line(it); + + m_CurLineCol.lineStart = line.line; + m_CurLineCol.lineEnd = line.line; + m_CurLineCol.colStart = line.column; + m_CurLineCol.fileIndex = (int32_t)m_Files[line.file]; + } + else if(opdata.op == Op::NoLine) + { + m_CurLineCol = LineColumnInfo(); + } + else + { + m_LineColInfo[it.offs()] = m_CurLineCol; + } + if(opdata.op == Op::String) { OpString string(it);