From 62d3cd5f4341056b6a25c5e5d0a5b47ada368147 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Wed, 17 Apr 2024 07:33:19 +0100 Subject: [PATCH] Ground work for RenderDoc specific DXIL disassembly view Currently not exposed to the UI and code uses the existing DXC compatibile DXIL disassembly Add bool parameter to DXBC::GetDisassembly() Add bool parameter to DXIL::GetDisassembly() Add void DXIL::MakeDXCDisassemblyString() Add void DXIL::MakeRDDisassemblyString() --- renderdoc/driver/d3d11/d3d11_replay.cpp | 2 +- renderdoc/driver/d3d11/d3d11_shaderdebug.cpp | 6 ++--- renderdoc/driver/d3d12/d3d12_overlay.cpp | 2 +- renderdoc/driver/d3d12/d3d12_replay.cpp | 4 ++-- renderdoc/driver/d3d12/d3d12_shaderdebug.cpp | 6 ++--- .../driver/shaders/dxbc/dxbc_container.cpp | 7 +++--- .../driver/shaders/dxbc/dxbc_container.h | 3 ++- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 11 ++++----- .../driver/shaders/dxil/dxil_disassemble.cpp | 23 ++++++++++++++++++- 9 files changed, 42 insertions(+), 22 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_replay.cpp b/renderdoc/driver/d3d11/d3d11_replay.cpp index 753c88042..c8725a9d8 100644 --- a/renderdoc/driver/d3d11/d3d11_replay.cpp +++ b/renderdoc/driver/d3d11/d3d11_replay.cpp @@ -339,7 +339,7 @@ rdcstr D3D11Replay::DisassembleShader(ResourceId pipeline, const ShaderReflectio DXBC::DXBCContainer *dxbc = it->second->GetDXBC(); if(target == DXBCDisassemblyTarget || target.empty()) - return dxbc->GetDisassembly(); + return dxbc->GetDisassembly(true); return StringFormat::Fmt("; Invalid disassembly target %s", target.c_str()); } diff --git a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp index 685d5084b..b3a33ef58 100644 --- a/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp +++ b/renderdoc/driver/d3d11/d3d11_shaderdebug.cpp @@ -1466,7 +1466,7 @@ ShaderDebugTrace *D3D11Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui if(!dxbc) return new ShaderDebugTrace; - dxbc->GetDisassembly(); + dxbc->GetDisassembly(true); D3D11RenderState *rs = m_pImmediateContext->GetCurrentPipelineState(); @@ -1857,7 +1857,7 @@ ShaderDebugTrace *D3D11Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t if(!dxbc) return new ShaderDebugTrace; - dxbc->GetDisassembly(); + dxbc->GetDisassembly(true); DXBC::DXBCContainer *prevdxbc = NULL; @@ -2599,7 +2599,7 @@ ShaderDebugTrace *D3D11Replay::DebugThread(uint32_t eventId, if(!dxbc) return new ShaderDebugTrace; - dxbc->GetDisassembly(); + dxbc->GetDisassembly(true); D3D11RenderState *rs = m_pImmediateContext->GetCurrentPipelineState(); diff --git a/renderdoc/driver/d3d12/d3d12_overlay.cpp b/renderdoc/driver/d3d12/d3d12_overlay.cpp index 6d9ba5ce2..b1216f52c 100644 --- a/renderdoc/driver/d3d12/d3d12_overlay.cpp +++ b/renderdoc/driver/d3d12/d3d12_overlay.cpp @@ -972,7 +972,7 @@ void D3D12Replay::PatchQuadWritePS(D3D12_EXPANDED_PIPELINE_STATE_STREAM_DESC &pi if(!D3D12_Debug_OverlayDumpDirPath().empty()) FileIO::WriteAll(D3D12_Debug_OverlayDumpDirPath() + "/after_quadps.dxbc", patchedPs); - DXBC::DXBCContainer(patchedPs, rdcstr(), GraphicsAPI::D3D12, ~0U, ~0U).GetDisassembly(); + DXBC::DXBCContainer(patchedPs, rdcstr(), GraphicsAPI::D3D12, ~0U, ~0U).GetDisassembly(true); pipeDesc.PS.pShaderBytecode = patchedPs.data(); pipeDesc.PS.BytecodeLength = patchedPs.size(); diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 014eb19ae..333612974 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -524,7 +524,7 @@ rdcarray D3D12Replay::GetDisassemblyTargets(bool withPipeline) { rdcarray ret; - // DXBC is always first + // DXBC/DXIL is always first ret.push_back(DXBCDXILDisassemblyTarget); if(!m_ISAChecked && m_TexRender.BlendPipe) @@ -568,7 +568,7 @@ rdcstr D3D12Replay::DisassembleShader(ResourceId pipeline, const ShaderReflectio DXBC::DXBCContainer *dxbc = sh->GetDXBC(); if(target == DXBCDXILDisassemblyTarget || target.empty()) - return dxbc->GetDisassembly(); + return dxbc->GetDisassembly(true); if(target == LiveDriverDisassemblyTarget) { diff --git a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp index 90edc0fe7..762362243 100644 --- a/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp +++ b/renderdoc/driver/d3d12/d3d12_shaderdebug.cpp @@ -1519,7 +1519,7 @@ ShaderDebugTrace *D3D12Replay::DebugVertex(uint32_t eventId, uint32_t vertid, ui return new ShaderDebugTrace; } - dxbc->GetDisassembly(); + dxbc->GetDisassembly(true); const ActionDescription *action = m_pDevice->GetAction(eventId); @@ -1901,7 +1901,7 @@ ShaderDebugTrace *D3D12Replay::DebugPixel(uint32_t eventId, uint32_t x, uint32_t return new ShaderDebugTrace; } - dxbc->GetDisassembly(); + dxbc->GetDisassembly(true); // Fetch the previous stage's disassembly, to match outputs to PS inputs DXBCContainer *prevDxbc = NULL; @@ -2725,7 +2725,7 @@ ShaderDebugTrace *D3D12Replay::DebugThread(uint32_t eventId, return new ShaderDebugTrace; } - dxbc->GetDisassembly(); + dxbc->GetDisassembly(true); InterpretDebugger *interpreter = new InterpretDebugger; interpreter->eventId = eventId; diff --git a/renderdoc/driver/shaders/dxbc/dxbc_container.cpp b/renderdoc/driver/shaders/dxbc/dxbc_container.cpp index dcd1a07f6..df776e81c 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_container.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_container.cpp @@ -511,10 +511,11 @@ D3D_PRIMITIVE_TOPOLOGY DXBCContainer::GetOutputTopology(const void *ByteCode, si return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; } -const rdcstr &DXBCContainer::GetDisassembly() +const rdcstr &DXBCContainer::GetDisassembly(bool dxcStyle) { - if(m_Disassembly.empty()) + if(m_Disassembly.empty() || (dxcStyle != m_DXCStyle)) { + m_DXCStyle = dxcStyle; rdcstr globalFlagsString; const rdcstr commentString = m_DXBCByteCode ? "//" : ";"; @@ -609,7 +610,7 @@ const rdcstr &DXBCContainer::GetDisassembly() m_Disassembly += "\n\n"; #endif - m_Disassembly += m_DXILByteCode->GetDisassembly(); + m_Disassembly += m_DXILByteCode->GetDisassembly(dxcStyle); } } diff --git a/renderdoc/driver/shaders/dxbc/dxbc_container.h b/renderdoc/driver/shaders/dxbc/dxbc_container.h index bf9cf5d87..acc73ecc0 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_container.h +++ b/renderdoc/driver/shaders/dxbc/dxbc_container.h @@ -184,7 +184,7 @@ public: const Reflection *GetReflection() const { return m_Reflection; } D3D_PRIMITIVE_TOPOLOGY GetOutputTopology(); - const rdcstr &GetDisassembly(); + const rdcstr &GetDisassembly(bool dxcStyle); void FillTraceLineInfo(ShaderDebugTrace &trace) const; static void StripChunk(bytebuf &ByteCode, uint32_t fourcc); @@ -227,6 +227,7 @@ private: bytebuf m_ShaderBlob; rdcstr m_Disassembly; + bool m_DXCStyle = false; D3D_PRIMITIVE_TOPOLOGY m_OutputTopology = D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 9b64c2774..29d39dec5 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -1115,12 +1115,7 @@ public: uint32_t GetMajorVersion() const { return m_Major; } uint32_t GetMinorVersion() const { return m_Minor; } D3D_PRIMITIVE_TOPOLOGY GetOutputTopology(); - const rdcstr &GetDisassembly() - { - if(m_Disassembly.empty()) - MakeDisassemblyString(); - return m_Disassembly; - } + const rdcstr &GetDisassembly(bool dxcStyle); // IDebugInfo interface @@ -1138,7 +1133,8 @@ public: const Metadata *GetMetadataByName(const rdcstr &name) const; uint32_t GetDirectHeapAcessCount() const { return m_directHeapAccessCount; } protected: - void MakeDisassemblyString(); + void MakeDXCDisassemblyString(); + void MakeRDDisassemblyString(); void ParseConstant(ValueList &values, const LLVMBC::BlockOrRecord &constant); bool ParseDebugMetaRecord(MetadataList &metadata, const LLVMBC::BlockOrRecord &metaRecord, @@ -1200,6 +1196,7 @@ protected: rdcarray m_DebugLocations; bool m_Uselists = false; + bool m_DXCStyle = false; rdcstr m_Triple, m_Datalayout; diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 0b8437bad..5280780b8 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -72,7 +72,21 @@ rdcstr escapeStringIfNeeded(const rdcstr &name) return needsEscaping(name) ? escapeString(name) : name; } -void Program::MakeDisassemblyString() +const rdcstr &Program::GetDisassembly(bool dxcStyle) +{ + if(m_Disassembly.empty() || (dxcStyle != m_DXCStyle)) + { + m_DXCStyle = dxcStyle; + + if(dxcStyle) + MakeDXCDisassemblyString(); + else + MakeRDDisassemblyString(); + } + return m_Disassembly; +} + +void Program::MakeDXCDisassemblyString() { const char *shaderName[] = { "Pixel", "Vertex", "Geometry", "Hull", "Domain", @@ -1517,6 +1531,13 @@ void Program::MakeDisassemblyString() m_Disassembly += "\n"; } +void Program::MakeRDDisassemblyString() +{ + m_Disassembly.clear(); + + m_Disassembly += "\n"; +} + rdcstr Type::toString() const { if(!name.empty())