From 4d103229088cbbef179704e0a03b31db0a020fe1 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Fri, 26 Apr 2024 09:09:39 +0100 Subject: [PATCH] RD DXIL Disassembly: decode "dx.op.createHandle" to show resource name --- .../driver/shaders/dxil/dxil_disassemble.cpp | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 580c8aaaf..523876cff 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -2410,6 +2410,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) m_Disassembly += "{"; DisassemblyAddNewLine(); + std::map handleNames; + size_t curBlock = 0; // if the first block has a name, use it @@ -2431,11 +2433,13 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += inst.type->toString(); lineStr += " "; } + rdcstr resultIdStr; if(!inst.getName().empty()) - lineStr += StringFormat::Fmt("%c%s = ", DXIL::dxilIdentifier, - escapeStringIfNeeded(inst.getName()).c_str()); + resultIdStr = escapeStringIfNeeded(inst.getName()); else if(inst.slot != ~0U) - lineStr += StringFormat::Fmt("%c%u = ", DXIL::dxilIdentifier, inst.slot); + resultIdStr = ToStr(inst.slot); + + lineStr += StringFormat::Fmt("%c%s = ", DXIL::dxilIdentifier, resultIdStr.c_str()); bool showDxFuncName = false; rdcstr commentStr; @@ -2476,6 +2480,30 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += swizzle[componentIdx & 0x3]; lineStr += " = " + ArgToString(inst.args[4], false); } + else if(showDxFuncName && funcCallName.beginsWith("dx.op.createHandle")) + { + showDxFuncName = false; + ResourceClass resClass = getival(inst.args[1]); + uint32_t resIndex = getival(inst.args[2]); + uint32_t resLowerBound = getival(inst.args[3]); + bool nonUniformIndex = (getival(inst.args[4]) == 1); + rdcstr resName = ""; + switch(resClass) + { + case ResourceClass::SRV: resName = entryPoint.srvs[resIndex].name; break; + case ResourceClass::UAV: resName = entryPoint.uavs[resIndex].name; break; + case ResourceClass::CBuffer: resName = entryPoint.cbuffers[resIndex].name; break; + case ResourceClass::Sampler: resName = entryPoint.samplers[resIndex].name; break; + default: resName = "INVALID RESOURCE CLASS"; break; + }; + handleNames[resultIdStr] = resName; + lineStr += resName; + lineStr += ";"; + if(resLowerBound != resIndex) + commentStr += " lowerBound = " + ToStr(resLowerBound); + if(nonUniformIndex) + commentStr += " nonUniformIndex = " + ToStr(nonUniformIndex); + } else if(funcCallName.beginsWith("llvm.dbg.")) { }