From b9fd432d119eec23febb1e793ec30cc0bc8efa4a Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 5 Mar 2024 11:38:19 +0000 Subject: [PATCH] Report and handle source-level entry point name from exported name * The compiler could compile an entry point "foo" into an export "bar". We use the exported name in most places as that's guaranteed to be unique by the API and used for cross-referencing, but when recompiling we pass the original source name as in the debug info. --- qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp | 2 +- renderdoc/api/replay/shader_types.h | 7 +++++++ renderdoc/driver/gl/gl_shader_refl.cpp | 2 +- renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp | 4 ++-- renderdoc/driver/shaders/spirv/spirv_reflect.cpp | 7 +++++++ renderdoc/driver/shaders/spirv/spirv_reflect.h | 1 + renderdoc/replay/renderdoc_serialise.inl | 4 ++-- 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp index 95f7844d2..895779c8a 100644 --- a/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp +++ b/qrenderdoc/Windows/PipelineState/PipelineStateViewer.cpp @@ -1026,7 +1026,7 @@ IShaderViewer *PipelineStateViewer::EditOriginalShaderSource(ResourceId id, files.push_back(make_rdcpair(s.filename, s.contents)); } - return EditShader(id, shaderDetails->stage, shaderDetails->entryPoint, + return EditShader(id, shaderDetails->stage, shaderDetails->debugInfo.entrySourceName, shaderDetails->debugInfo.compileFlags, shaderDetails->debugInfo.compiler, shaderDetails->debugInfo.encoding, files); } diff --git a/renderdoc/api/replay/shader_types.h b/renderdoc/api/replay/shader_types.h index 4d05bc3c0..5a644d020 100644 --- a/renderdoc/api/replay/shader_types.h +++ b/renderdoc/api/replay/shader_types.h @@ -1440,6 +1440,13 @@ The first entry in the list is always the file where the entry point is. )"); rdcarray files; + DOCUMENT(R"(The name of the entry point in the source code, not necessarily the same as the +entry point name exported to the API. + +:type: str +)"); + rdcstr entrySourceName; + DOCUMENT(R"(The source location of the first executable line or the entry point. .. note:: diff --git a/renderdoc/driver/gl/gl_shader_refl.cpp b/renderdoc/driver/gl/gl_shader_refl.cpp index f8f31c660..2ef7cbf5a 100644 --- a/renderdoc/driver/gl/gl_shader_refl.cpp +++ b/renderdoc/driver/gl/gl_shader_refl.cpp @@ -1228,7 +1228,7 @@ void MakeShaderReflection(GLenum shadType, GLuint sepProg, ShaderReflection &ref const FixedFunctionVertexOutputs &outputUsage) { refl.stage = MakeShaderStage(shadType); - refl.entryPoint = "main"; + refl.debugInfo.entrySourceName = refl.entryPoint = "main"; refl.encoding = ShaderEncoding::GLSL; refl.debugInfo.compiler = KnownShaderTool::Unknown; refl.debugInfo.encoding = ShaderEncoding::GLSL; diff --git a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp index c572fbbf6..f86afafd0 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_reflect.cpp @@ -285,11 +285,11 @@ void MakeShaderReflection(DXBC::DXBCContainer *dxbc, ShaderReflection *refl, break; } - refl->entryPoint = "main"; + refl->debugInfo.entrySourceName = refl->entryPoint = "main"; if(dxbc->GetDebugInfo()) { - refl->entryPoint = dxbc->GetDebugInfo()->GetEntryFunction(); + refl->debugInfo.entrySourceName = refl->entryPoint = dxbc->GetDebugInfo()->GetEntryFunction(); refl->debugInfo.encoding = ShaderEncoding::HLSL; diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp index cabbaea8d..19b2bda92 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.cpp @@ -684,6 +684,8 @@ void Reflector::RegisterOp(Iter it) { LineColumnInfo &info = debugFuncToLocation[dbg.result]; + debugFuncName[dbg.result] = strings[dbg.arg(0)]; + // check this source file exists - we won't have registered it if there was no source code auto srcit = debugSources.find(dbg.arg(2)); if(srcit != debugSources.end()) @@ -1029,10 +1031,15 @@ void Reflector::MakeReflection(const GraphicsAPI sourceAPI, const ShaderStage st reflection.debugInfo.compileFlags.flags.push_back( {"@spirver", StringFormat::Fmt("spirv%d.%d", m_MajorVersion, m_MinorVersion)}); + reflection.debugInfo.entrySourceName = entryPoint; + { auto it = funcToDebugFunc.find(entry->id); if(it != funcToDebugFunc.end()) { + rdcstr debugEntryName = debugFuncName[it->second]; + if(!debugEntryName.empty()) + reflection.debugInfo.entrySourceName = debugEntryName; reflection.debugInfo.entryLocation = debugFuncToLocation[it->second]; if(debugFuncToCmdLine.find(it->second) != debugFuncToCmdLine.end()) reflection.debugInfo.compileFlags.flags = {{"@cmdline", debugFuncToCmdLine[it->second]}}; diff --git a/renderdoc/driver/shaders/spirv/spirv_reflect.h b/renderdoc/driver/shaders/spirv/spirv_reflect.h index b1d2c8d4f..55f1a8eb9 100644 --- a/renderdoc/driver/shaders/spirv/spirv_reflect.h +++ b/renderdoc/driver/shaders/spirv/spirv_reflect.h @@ -140,6 +140,7 @@ private: SparseIdMap debugFuncToBaseFile; SparseIdMap debugFuncToCmdLine; SparseIdMap debugFuncToLocation; + SparseIdMap debugFuncName; SparseIdMap funcToDebugFunc; Id curBlock; diff --git a/renderdoc/replay/renderdoc_serialise.inl b/renderdoc/replay/renderdoc_serialise.inl index 1a3ca2459..460a04aa5 100644 --- a/renderdoc/replay/renderdoc_serialise.inl +++ b/renderdoc/replay/renderdoc_serialise.inl @@ -275,7 +275,7 @@ void DoSerialise(SerialiserType &ser, ShaderDebugInfo &el) SERIALISE_MEMBER(sourceDebugInformation); SERIALISE_MEMBER(debugStatus); - SIZE_CHECK(112); + SIZE_CHECK(136); } template @@ -310,7 +310,7 @@ void DoSerialise(SerialiserType &ser, ShaderReflection &el) SERIALISE_MEMBER(taskPayload); - SIZE_CHECK(456); + SIZE_CHECK(480); } template