From ccbb5166100d033cbad60a771c846bf82b57f5e9 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 13 Nov 2025 13:05:24 +1300 Subject: [PATCH] Simplify DXIL Disassembler/Debugger SSA ID name strings and aliases Store SSA ID name strings in a container which is shared between the disassembler and the debugger. The SSA ID name strings are guaranteed to be unique by appending the SSA ID value. Do not use resource names for SSA ID names, only show resource names when a DXIL handle is created i.e. DXOp::CreateHandle, DXOp::CreateHandleFromBinding & DXOp::CreateHandleFromHeap This means the debugger now has a unique name for each ShaderVariable generated. Revert the ShaderViewer consistency changes which were only required because the DXIL debugger did not generate unique names for ShaderVariables. --- qrenderdoc/Windows/ShaderViewer.cpp | 34 +- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 23 +- renderdoc/driver/shaders/dxil/dxil_debug.cpp | 48 +- .../driver/shaders/dxil/dxil_disassemble.cpp | 437 +++++++++--------- util/test/rdtest/testcase.py | 24 +- 5 files changed, 268 insertions(+), 298 deletions(-) diff --git a/qrenderdoc/Windows/ShaderViewer.cpp b/qrenderdoc/Windows/ShaderViewer.cpp index 8b2af76dd..495984e98 100644 --- a/qrenderdoc/Windows/ShaderViewer.cpp +++ b/qrenderdoc/Windows/ShaderViewer.cpp @@ -2789,24 +2789,17 @@ void ShaderViewer::applyBackwardsChange() if(v) { #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS - if(!(c.after.type == VarType::ReadOnlyResource || c.after.type == VarType::ReadWriteResource)) - { - if(!ShaderVariableEqual(c.after, *v)) - qCritical("ShaderVariableChange for '%s' after does not match existing entry", - c.before.name.c_str()); - } + if(!ShaderVariableEqual(c.after, *v)) + qCritical("ShaderVariableChange for '%s' after does not match existing entry", + c.before.name.c_str()); #endif // #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS *v = c.before; } else { #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS - if(!(c.after.type == VarType::ReadOnlyResource || c.after.type == VarType::ReadWriteResource)) - { - if(!(c.after == nullChange)) - qCritical("ShaderVariableChange for '%s' does not have NULL after", - c.before.name.c_str()); - } + if(!(c.after == nullChange)) + qCritical("ShaderVariableChange for '%s' does not have NULL after", c.before.name.c_str()); #endif // #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS m_Variables.insert(0, c.before); } @@ -2886,24 +2879,17 @@ void ShaderViewer::applyForwardsChange() if(v) { #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS - if(!(c.after.type == VarType::ReadOnlyResource || c.after.type == VarType::ReadWriteResource)) - { - if(!ShaderVariableEqual(c.before, *v)) - qCritical("ShaderVariableChange for '%s' before does not match existing entry", - c.after.name.c_str()); - } + if(!ShaderVariableEqual(c.before, *v)) + qCritical("ShaderVariableChange for '%s' before does not match existing entry", + c.after.name.c_str()); #endif // #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS *v = c.after; } else { #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS - if(!(c.after.type == VarType::ReadOnlyResource || c.after.type == VarType::ReadWriteResource)) - { - if(!(c.before == nullChange) && c.before.type != VarType::ReadOnlyResource) - qCritical("ShaderVariableChange for '%s' does not have NULL before", - c.after.name.c_str()); - } + if(!(c.before == nullChange)) + qCritical("ShaderVariableChange for '%s' does not have NULL before", c.after.name.c_str()); #endif // #if SHADER_VARIABLE_CHANGE_CONSISTENCY_CHECKS m_Variables.insert(0, c.after); } diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 97d3507f9..bed9cd97e 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -1617,9 +1617,9 @@ struct ResourceReference { ResourceReference(const rdcstr &handleStr, const EntryPointInterface::ResourceBase &resBase, uint32_t idx) - : handleID(handleStr), resourceBase(resBase), resourceIndex(idx){}; + : handleString(handleStr), resourceBase(resBase), resourceIndex(idx){}; - rdcstr handleID; + rdcstr handleString; EntryPointInterface::ResourceBase resourceBase; uint32_t resourceIndex; }; @@ -1727,12 +1727,12 @@ protected: void AssignMetaSlot(rdcarray &metaSlots, uint32_t &nextMetaSlot, DebugLocation &l); const ResourceReference *GetResourceReference(const DXILDebug::Id handleId) const; - rdcstr GetHandleAlias(const rdcstr &handleStr) const; static DXILDebug::Id GetResultSSAId(const DXIL::Instruction &inst); - void MakeResultId(const Instruction &inst, rdcstr &resultId) const; - rdcstr GetArgId(const Instruction &inst, uint32_t arg) const; - rdcstr GetArgId(const Value *v) const; - rdcstr GetArgumentName(const Value *v) const; + rdcstr GetInstResultName(const DXIL::Instruction *inst) const; + void GetSSAName(DXILDebug::Id id, rdcstr &name) const; + void SetSSAName(DXILDebug::Id id, const rdcstr &name, bool overwrite = false); + rdcstr GetArgString(const Instruction &inst, uint32_t arg) const; + rdcstr GetValueString(const Value *v) const; const Metadata *FindMetadata(uint32_t slot) const; rdcstr ArgToString(const Value *v, bool withTypes, const rdcstr &attrString = "") const; @@ -1805,10 +1805,9 @@ protected: rdcarray m_EntryPointInterfaces; std::map m_ResourceByIdHandles; - std::map m_SsaAliases; - std::map m_ResourceAnnotateCounts; rdcarray m_Locals; - mutable std::map m_ResultNames; + std::map m_SsaNames; + std::map m_SsaHandles; rdcarray m_ResourceReferences; rdcstr m_Disassembly; @@ -1849,10 +1848,6 @@ bool IsLLVMIntrinsicCall(const Instruction &inst); bool ShouldIgnoreSourceMapping(const Instruction &inst); bool isUndef(const Value *v); - -void SanitiseName(rdcstr &name); -rdcstr GetGlobalVarName(const GlobalVar *gv); - }; // namespace DXIL DECLARE_REFLECTION_ENUM(DXIL::Attribute); diff --git a/renderdoc/driver/shaders/dxil/dxil_debug.cpp b/renderdoc/driver/shaders/dxil/dxil_debug.cpp index 61c882440..ab5b6b97d 100644 --- a/renderdoc/driver/shaders/dxil/dxil_debug.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_debug.cpp @@ -1808,7 +1808,7 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) const Type *retType = inst.type; // Sensible defaults ShaderVariable result; - m_Program.MakeResultId(inst, result.name); + m_Program.GetSSAName(resultId, result.name); result.rows = 1; result.columns = 1; result.type = ConvertDXILTypeToVarType(retType); @@ -2399,24 +2399,24 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) // Default to unannotated handle ClearAnnotatedHandle(result); - rdcstr resName = m_Program.GetHandleAlias(result.name); result.type = resRefInfo.varType; - result.name = resName; result.SetDirectAccess(access); break; } case DXOp::AnnotateHandle: { // AnnotateHandle(res,props) - rdcstr baseResource = GetArgumentName(1); + rdcstr resultSSAName = result.name; + rdcstr baseResource; Id baseResourceId = GetSSAId(inst.args[1]); + m_Program.GetSSAName(baseResourceId, baseResource); ShaderVariable resource; RDCASSERT(GetShaderVariable(inst.args[1], opCode, dxOpCode, resource)); rdcstr resName; if(resource.IsDirectAccess()) { - resName = m_Program.GetHandleAlias(result.name); + resName = result.name; // Update m_DirectHeapAccessBindings for the annotated handle // to use the data from the source resource RDCASSERT(m_DirectHeapAccessBindings.count(baseResourceId) > 0); @@ -2425,12 +2425,10 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) } else { - resName = m_Program.GetHandleAlias(baseResource); + resName = baseResource; } - // Use the handle alias of the result SSA ID to match the disassembly - rdcstr handleAlias = m_Program.GetHandleAlias(result.name); result = resource; - result.name = handleAlias; + result.name = resultSSAName; // Parse the packed annotate handle properties // resKind : {compType, compCount} | {structStride} @@ -2508,7 +2506,7 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) { // CreateHandle(resourceClass,rangeId,index,nonUniformIndex // CreateHandleFromBinding(bind,index,nonUniformIndex) - rdcstr baseResource = result.name; + rdcstr resultSSAName = result.name; uint32_t resIndexArgId = ~0U; if(dxOpCode == DXOp::CreateHandle) resIndexArgId = 3; @@ -2567,7 +2565,6 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) DescriptorCategory category = isSRV ? DescriptorCategory::ReadOnlyResource : DescriptorCategory::ReadWriteResource; result.SetBindIndex(ShaderBindIndex(category, resRef->resourceIndex, arrayIndex)); - result.name = resRef->resourceBase.name + StringFormat::Fmt("[%u]", arrayIndex); result.type = isSRV ? VarType::ReadOnlyResource : VarType::ReadWriteResource; // Default to unannotated handle ClearAnnotatedHandle(result); @@ -2604,15 +2601,7 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) RDCASSERT(arrayIndex < result.members.size(), arrayIndex, result.members.size()); if(arrayIndex < result.members.size()) - { RDCASSERT(!result.members[arrayIndex].members.empty()); - if(!result.members[arrayIndex].members.empty()) - { - rdcstr name = - resRef->resourceBase.name + StringFormat::Fmt("[%u]", arrayIndex); - result.name = name; - } - } } } else @@ -2630,13 +2619,13 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) ShaderVariable cbufferVar; cbufferVar.members.resize(structSize / 16); cbufferVar.type = VarType::Struct; - cbufferVar.name = result.name; + cbufferVar.name = resultSSAName; for(size_t i = 0; i < cbufferVar.members.size(); ++i) { ShaderVariable &var = cbufferVar.members[i]; var.type = VarType::UInt; var.columns = 4; - var.name = StringFormat::Fmt("%s[%u]", result.name.c_str(), i); + var.name = StringFormat::Fmt("%s[%u]", resultSSAName.c_str(), i); var.rows = 1; // Initialise to 0xCC to aid determinism and show unset values memset(&var.value, 0XCC, sizeof(var.value)); @@ -2676,8 +2665,9 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) } else { - RDCERR("Unknown Base Resource %s", baseResource.c_str()); + RDCERR("Unknown Base Resource for %s", resultSSAName.c_str()); } + result.name = resultSSAName; break; } case DXOp::CBufferLoadLegacy: @@ -5253,7 +5243,6 @@ bool ThreadState::ExecuteInstruction(const rdcarray &workgroup) } case Operation::Alloca: { - result.name = DXBC::BasicDemangle(result.name); m_Memory.AllocateMemoryForType(inst.type, resultId, false, false, result); break; } @@ -6947,7 +6936,10 @@ void ThreadState::ConvertSampleGatherReturn(DXIL::DXOp dxOpCode, const DXIL::Ins rdcstr ThreadState::GetArgumentName(uint32_t i) const { - return m_Program.GetArgumentName(m_CurrentInstruction->args[i]); + rdcstr name; + DXILDebug::Id id = GetArgumentId(i); + m_Program.GetSSAName(id, name); + return name; } DXILDebug::Id ThreadState::GetArgumentId(uint32_t i) const @@ -7773,7 +7765,7 @@ Debugger::DebugInfo::~DebugInfo() rdcstr Debugger::GetResourceBaseName(const DXIL::Program *program, const DXIL::ResourceReference *resRef) { - rdcstr resName = program->GetHandleAlias(resRef->handleID); + rdcstr resName = resRef->resourceBase.name; // Special case for cbuffer arrays if((resRef->resourceBase.resClass == ResourceClass::CBuffer) && (resRef->resourceBase.regCount > 1)) { @@ -9204,7 +9196,8 @@ ShaderDebugTrace *Debugger::BeginDebug(DebugAPIWrapper *apiWrapper, uint32_t eve for(const DXIL::GlobalVar *gv : m_Program->m_GlobalVars) { GlobalVariable globalVar; - rdcstr n = DXIL::GetGlobalVarName(gv); + rdcstr n; + m_Program->GetSSAName(gv->ssaId, n); globalVar.var.name = n; globalVar.id = gv->ssaId; globalVar.gsm = (gv->type->addrSpace == DXIL::Type::PointerAddrSpace::GroupShared); @@ -9261,8 +9254,9 @@ ShaderDebugTrace *Debugger::BeginDebug(DebugAPIWrapper *apiWrapper, uint32_t eve ShaderVariable &var = constantVar.var; ConvertDXILTypeToShaderVariable(c->type, var); ConvertDXILConstantToShaderVariable(c, var); - var.name = m_Program->GetArgumentName(c); + var.name; Id id = c->ssaId; + m_Program->GetSSAName(id, var.name); RDCASSERTNOTEQUAL(id, DXILDebug::INVALID_ID); constantVar.id = id; if(var.type == VarType::GPUPointer) diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index fcf1ecd9a..041ba3aaf 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -215,16 +215,6 @@ bool FindSigParameter(const rdcarray &inputSig, return false; } -// Replace '.' -> '_' -void SanitiseName(rdcstr &name) -{ - for(size_t c = 0; c < name.size(); ++c) - { - if(name[c] == '.') - name[c] = '_'; - } -} - static const char *shaderNames[] = { "Pixel", "Vertex", "Geometry", "Hull", "Domain", "Compute", "Library", "RayGeneration", "Intersection", "AnyHit", @@ -1138,14 +1128,6 @@ static rdcstr GetResourceTypeName(const Type *type) return "UNHANDLED RESOURCE TYPE"; }; -rdcstr Program::GetHandleAlias(const rdcstr &handleStr) const -{ - auto it = m_SsaAliases.find(handleStr); - if(it != m_SsaAliases.end()) - return it->second; - return handleStr; -} - void Program::Parse(const DXBC::Reflection *reflection) { if(m_Parsed) @@ -1155,7 +1137,6 @@ void Program::Parse(const DXBC::Reflection *reflection) m_EntryPointInterfaces.clear(); FillEntryPointInterfaces(); - m_SsaAliases.clear(); ParseReferences(reflection); if(m_Type == DXBC::ShaderType::Compute || m_Type == DXBC::ShaderType::Amplification || @@ -1201,7 +1182,19 @@ void Program::SettleIDs() for(GlobalVar *g : m_GlobalVars) { if(g->ssaId == ~0U) + { g->ssaId = m_NextSSAId++; + rdcstr n = DXBC::BasicDemangle(g->name); + // Replace '.' -> '_' + for(size_t c = 0; c < n.size(); ++c) + { + if(n[c] == '.') + n[c] = '_'; + } + + n += StringFormat::Fmt("_%u", g->ssaId); + SetSSAName(g->ssaId, n); + } } // assign SSA ID for constants @@ -1216,7 +1209,11 @@ void Program::SettleIDs() { Constant *c = (Constant *)arg; if(c->ssaId == ~0U) + { c->ssaId = m_NextSSAId++; + rdcstr n = StringFormat::Fmt("_%u", c->ssaId); + SetSSAName(c->ssaId, n); + } } } } @@ -1241,6 +1238,8 @@ void Program::SettleIDs() if(arg->getName().isEmpty()) arg->slot = slot++; #endif + rdcstr n = GetInstResultName(arg); + SetSSAName(arg->slot, n); } for(Instruction *inst : func.instructions) { @@ -1253,6 +1252,8 @@ void Program::SettleIDs() if(inst->getName().isEmpty()) inst->slot = slot++; #endif + rdcstr n = GetInstResultName(inst); + SetSSAName(inst->slot, n); } if(inst->op == Operation::Call) { @@ -1724,7 +1725,12 @@ rdcstr Program::DisassembleGlobalVars(int &instructionLine) const { const GlobalVar &g = *m_GlobalVars[i]; - rdcstr n = !m_DXCStyle ? DXIL::GetGlobalVarName(&g) : g.name; + rdcstr n; + if(!m_DXCStyle) + GetSSAName(g.ssaId, n); + else + n = g.name; + ret += StringFormat::Fmt("@%s = ", escapeStringIfNeeded(n).c_str()); switch(g.flags & GlobalFlags::LinkageMask) { @@ -3350,8 +3356,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) resultTypeStr += " "; } rdcstr resultIdStr; - MakeResultId(inst, resultIdStr); DXILDebug::Id resultId = GetResultSSAId(inst); + GetSSAName(resultId, resultIdStr); bool showDxFuncName = false; rdcstr commentStr; @@ -3391,19 +3397,19 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } else { - name = GetArgId(inst, 1); + name = GetArgString(inst, 1); rowStr = "["; if(hasRowIdx) rowStr += ToStr(rowIdx); else - rowStr += GetArgId(inst, 2); + rowStr += GetArgString(inst, 2); rowStr += +"]"; } uint32_t componentIdx; if(getival(inst.args[3], componentIdx)) componentStr = StringFormat::Fmt("%c", swizzle[componentIdx & 0x3]); else - componentStr = GetArgId(inst, 3); + componentStr = GetArgString(inst, 3); lineStr += DXIL_FAKE_INPUT_STRUCT_NAME + "." + name + rowStr + "." + componentStr; break; @@ -3429,22 +3435,22 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } else { - name = GetArgId(inst, 1); + name = GetArgString(inst, 1); rowStr = "["; if(hasRowIdx) rowStr += ToStr(rowIdx); else - rowStr += GetArgId(inst, 2); + rowStr += GetArgString(inst, 2); rowStr += +"]"; } uint32_t componentIdx; if(getival(inst.args[3], componentIdx)) componentStr = StringFormat::Fmt("%c", swizzle[componentIdx & 0x3]); else - componentStr = GetArgId(inst, 3); + componentStr = GetArgString(inst, 3); lineStr += DXIL_FAKE_OUTPUT_STRUCT_NAME + "." + name + rowStr + "." + componentStr; - lineStr += " = " + GetArgId(inst, 4); + lineStr += " = " + GetArgString(inst, 4); break; } case DXOp::CreateHandle: @@ -3471,37 +3477,44 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } else { - commentStr += " index = " + GetArgId(inst, resIndexArgId); + commentStr += " index = " + GetArgString(inst, resIndexArgId); } lineStr = "InitialiseHandle("; - lineStr += GetHandleAlias(resultIdStr); + rdcstr handleRes = m_SsaHandles[resultId]; + RDCASSERT(!handleRes.empty()); + lineStr += handleRes; uint32_t value; if(getival(inst.args[nonUniformIndexArgId], value)) { if(value != 0) - lineStr += ", nonUniformIndex = true"; + commentStr += ", nonUniformIndex = true"; + } + else + { + commentStr += ", nonUniformIndex = " + GetArgString(inst, nonUniformIndexArgId); } lineStr += ")"; - resultIdStr.clear(); break; } case DXOp::CreateHandleFromHeap: { // CreateHandleFromHeap(index,samplerHeap,nonUniformIndex) - uint32_t samplerHeap; - resultIdStr = GetHandleAlias(resultIdStr); - if(getival(inst.args[2], samplerHeap)) + rdcstr handleRes = m_SsaHandles[resultId]; + if(!handleRes.empty()) { - lineStr += GetHandleAlias(resultIdStr); - + lineStr += handleRes; uint32_t value; if(getival(inst.args[3], value)) { if(value != 0) - commentStr += " nonUniformIndex = true"; + commentStr += ", nonUniformIndex = true"; + } + else + { + commentStr += ", nonUniformIndex = " + GetArgString(inst, 3); } } else @@ -3677,9 +3690,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += "("; lineStr += typeStr; lineStr += ")"; - rdcstr ssaStr = GetArgId(inst, 1); - lineStr += GetHandleAlias(ssaStr); - resultIdStr = GetHandleAlias(resultIdStr); + lineStr += GetArgString(inst, 1); } else { @@ -3698,10 +3709,9 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) // CBufferLoad(handle,byteOffset,alignment) // CBufferLoadLegacy(handle,regIndex) DXILDebug::Id handleId = GetSSAId(inst.args[1]); - const ResourceReference *resRef = GetResourceReference(handleId); - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); bool useFallback = true; + const ResourceReference *resRef = GetResourceReference(handleId); if(foundEntryPoint && resRef) { uint32_t regIndex; @@ -3767,7 +3777,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } else { - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); if(dxOpCode == DXOp::CBufferLoadLegacy) lineStr += " * 16"; } @@ -3781,13 +3791,12 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) // BufferLoad(srv,index,wot) // "wot" is a byte offset // RawBufferLoad(srv,index,elementOffset,mask,alignment) - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); if(!resName.isEmpty()) { if(!isUndef(inst.args[2])) { - lineStr += resName + ".Load(" + GetArgId(inst, 2); + lineStr += resName + ".Load(" + GetArgString(inst, 2); uint32_t elementOffset; if(getival(inst.args[3], elementOffset)) { @@ -3812,17 +3821,16 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { // BufferStore(uav,coord0,coord1,value0,value1,value2,value3,mask) // RawBufferStore(uav,index,elementOffset,value0,value1,value2,value3,mask,alignment) - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); if(!resName.isEmpty()) { if(!isUndef(inst.args[2])) { - lineStr += resName + ".Store(" + GetArgId(inst, 2); + lineStr += resName + ".Store(" + GetArgString(inst, 2); if(dxOpCode == DXOp::BufferStore) { if(!isUndef(inst.args[3])) - lineStr += ", byteOffset = " + GetArgId(inst, 3); + lineStr += ", byteOffset = " + GetArgString(inst, 3); } else { @@ -3842,7 +3850,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -3858,8 +3866,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { // TextureLoad(srv,mipLevelOrSampleCount,coord0,coord1,coord2,offset0,offset1,offset2) DXILDebug::Id handleId = GetSSAId(inst.args[1]); + rdcstr resName = GetArgString(inst, 1); const ResourceReference *resRef = GetResourceReference(handleId); - rdcstr handleStr = GetArgId(inst, 1); uint32_t sampleCount = 0; if(foundEntryPoint && resRef) { @@ -3871,7 +3879,6 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(texture) sampleCount = texture->sampleCount; } - rdcstr resName = GetHandleAlias(handleStr); if(!resName.isEmpty()) { lineStr += resName; @@ -3883,7 +3890,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -3911,7 +3918,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) needText = false; lineStr += ", "; lineStr += prefix; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); } } needText = true; @@ -3925,7 +3932,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += "Offset = "; needText = false; } - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); } } lineStr += ")"; @@ -3939,8 +3946,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) case DXOp::TextureStore: { // TextureStore(srv,coord0,coord1,coord2,value0,value1,value2,value3,mask) - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); if(!resName.isEmpty()) { lineStr += resName; @@ -3952,7 +3958,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -3966,7 +3972,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -3997,8 +4003,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) // SampleCmpLevel(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,compareValue,lod) // SampleCmpGrad(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,compareValue,ddx0,ddx1,ddx2,ddy0,ddy1,ddy2,clamp) // SampleCmpBias(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,compareValue,bias,clamp) - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); if(!resName.isEmpty()) { lineStr += resName; @@ -4011,16 +4016,14 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += "UNKNOWN DX FUNCTION"; // sampler is 2 - rdcstr samplerStr = GetArgId(inst, 2); - samplerStr = GetHandleAlias(samplerStr); - lineStr += samplerStr; + lineStr += GetArgString(inst, 2); for(uint32_t a = 3; a < 7; ++a) { if(!isUndef(inst.args[a])) { lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); } } bool needText = true; @@ -4034,7 +4037,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += "Offset = {"; needText = false; } - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); } } if(!needText) @@ -4072,7 +4075,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { lineStr += ", "; lineStr += paramNameStr; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); } } lineStr += ")"; @@ -4086,13 +4089,12 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) case DXOp::GetDimensions: { // GetDimensions(handle,mipLevel) - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); if(!resName.isEmpty()) { lineStr += resName; lineStr += ".GetDimensions("; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); lineStr += ")"; } else @@ -4104,13 +4106,12 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) case DXOp::Texture2DMSGetSamplePosition: { // Texture2DMSGetSamplePosition(srv,index) - rdcstr handleStr = GetArgId(inst, 1); - rdcstr resName = GetHandleAlias(handleStr); + rdcstr resName = GetArgString(inst, 1); if(!resName.isEmpty()) { lineStr += resName; lineStr += ".GetSamplePosition("; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); lineStr += ")"; } else @@ -4122,9 +4123,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) case DXOp::AtomicBinOp: { // AtomicBinOp(handle, atomicOp, offset0, offset1, offset2, newValue) - rdcstr handleStr = GetArgId(inst, 1); + rdcstr resName = GetArgString(inst, 1); AtomicBinOpCode atomicBinOpCode; - rdcstr resName = GetHandleAlias(handleStr); if(!resName.isEmpty() && getival(inst.args[2], atomicBinOpCode)) { lineStr += resName; @@ -4140,7 +4140,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -4148,7 +4148,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(!isUndef(inst.args[6])) { lineStr += ", "; - lineStr += GetArgId(inst, 6); + lineStr += GetArgString(inst, 6); } lineStr += ")"; } @@ -4170,7 +4170,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { lineStr += "WaveActive" + ToStr(waveOpCode); lineStr += "("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; } else @@ -4187,7 +4187,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { lineStr += "WaveActiveBit" + ToStr(waveBitOpCode); lineStr += "("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; } else @@ -4214,15 +4214,15 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += ToStr(waveMultiOpCode); lineStr += "("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ", {"; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); lineStr += ","; - lineStr += GetArgId(inst, 3); + lineStr += GetArgString(inst, 3); lineStr += ","; - lineStr += GetArgId(inst, 4); + lineStr += GetArgString(inst, 4); lineStr += ","; - lineStr += GetArgId(inst, 5); + lineStr += GetArgString(inst, 5); lineStr += "}"; lineStr += ")"; } @@ -4254,7 +4254,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -4288,7 +4288,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) else lineStr += StringFormat::Fmt("unpack_u8u%d", bitWidth); lineStr += "("; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); lineStr += ")"; } else @@ -4313,7 +4313,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) else if(quadOpKind == QuadOpKind::ReadAcrossDiagonal) lineStr += "QuadReadAcrossDiagonal"; lineStr += "("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; } else @@ -4330,7 +4330,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { lineStr += "Quad" + ToStr(quadVoteOpKind); lineStr += "("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; } else @@ -4365,7 +4365,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -4380,7 +4380,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { if(needComma) lineStr += ", "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); needComma = true; } } @@ -4449,8 +4449,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += ", "; lineStr += paramNameStr; - rdcstr ssaStr = GetArgId(inst, a); - lineStr += GetHandleAlias(ssaStr); + rdcstr ssaStr = GetArgString(inst, a); + lineStr += ssaStr; first = false; } } @@ -4594,14 +4594,14 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } lineStr += "("; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ")"; break; } case Operation::ExtractVal: { lineStr += "extractvalue "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); for(size_t n = 1; n < inst.args.size(); n++) lineStr += StringFormat::Fmt(", %llu", cast(inst.args[n])->literal); break; @@ -4662,7 +4662,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) bool first = true; for(const Value *s : inst.args) { - lineStr += GetArgId(s); + lineStr += GetValueString(s); if(first) { lineStr += opStr; @@ -4676,7 +4676,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { lineStr += "return"; if(!inst.args.empty()) - lineStr += " " + GetArgId(inst, 0); + lineStr += " " + GetArgString(inst, 0); break; } case Operation::Unreachable: lineStr += "unreachable"; break; @@ -4713,14 +4713,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) resultTypeStr += "* "; // arg[0] : ptr - if(cast(inst.args[0])) - { - lineStr += DXIL::GetGlobalVarName(cast(inst.args[0])); - } - else - { - lineStr += GetArgId(0); - } + rdcstr argName = GetArgString(inst, 0); + lineStr += argName; // arg[1] : index 0 bool first = true; if(inst.args.size() > 1) @@ -4729,7 +4723,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(!getival(inst.args[1], v) || (v > 0)) { lineStr += "["; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += "]"; first = false; } @@ -4743,7 +4737,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) else lineStr += " + "; - lineStr += GetArgId(inst, a); + lineStr += GetArgString(inst, a); if(first) { @@ -4761,7 +4755,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(!first) lineStr += ", "; - lineStr += GetArgId(s); + lineStr += GetValueString(s); first = false; } } @@ -4781,7 +4775,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(!first) lineStr += ", "; - lineStr += GetArgId(s); + lineStr += GetValueString(s); first = false; } if(inst.align > 0) @@ -4794,9 +4788,9 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(inst.opFlags() & InstructionFlags::Volatile) commentStr += "volatile "; lineStr = "*"; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += " = "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); if(inst.align > 0) commentStr += StringFormat::Fmt("align %u ", (1U << inst.align) >> 1); break; @@ -4842,9 +4836,9 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) default: break; } lineStr += "("; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += opStr; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; break; } @@ -4852,11 +4846,11 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { // ord: yields true if both operands are not a QNAN. lineStr += "!isqnan("; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ")"; lineStr += " && "; lineStr += "!isqnan("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; break; } @@ -4864,11 +4858,11 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { // uno: yields true if either operand is a QNAN. lineStr += "isqnan("; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ")"; lineStr += " || "; lineStr += "isqnan("; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; break; } @@ -4909,55 +4903,55 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) default: break; } lineStr += "("; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += opStr; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ")"; break; } case Operation::Select: { - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); lineStr += " ? "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += " : "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); break; } case Operation::ExtractElement: { lineStr += "extractelement "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ", "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); break; } case Operation::InsertElement: { lineStr += "insertelement "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ", "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ", "; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); break; } case Operation::ShuffleVector: { lineStr += "shufflevector "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ", "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += ", "; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); break; } case Operation::InsertValue: { lineStr += "insertvalue "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ", "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); for(size_t a = 2; a < inst.args.size(); a++) { lineStr += ", " + ToStr(cast(inst.args[a])->literal); @@ -4969,16 +4963,16 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(inst.args.size() > 1) { lineStr += "if ("; - lineStr += GetArgId(inst, 2); + lineStr += GetArgString(inst, 2); lineStr += ") goto "; - lineStr += StringFormat::Fmt("%s", GetArgId(inst, 0).c_str()); + lineStr += StringFormat::Fmt("%s", GetArgString(inst, 0).c_str()); lineStr += "; else goto "; - lineStr += StringFormat::Fmt("%s", GetArgId(inst, 1).c_str()); + lineStr += StringFormat::Fmt("%s", GetArgString(inst, 1).c_str()); } else { lineStr += "goto "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); } break; } @@ -4992,27 +4986,27 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) lineStr += " "; else lineStr += ", "; - rdcstr block = GetArgId(inst, a + 1); + rdcstr block = GetArgString(inst, a + 1); lineStr += "[ "; if(IsSSA(inst.args[a])) lineStr += StringFormat::Fmt("%s::", block.c_str()); - lineStr += StringFormat::Fmt("%s, %s ]", GetArgId(inst, a).c_str(), block.c_str()); + lineStr += StringFormat::Fmt("%s, %s ]", GetArgString(inst, a).c_str(), block.c_str()); } break; } case Operation::Switch: { lineStr += "switch "; - lineStr += GetArgId(inst, 0); + lineStr += GetArgString(inst, 0); lineStr += ", "; - lineStr += GetArgId(inst, 1); + lineStr += GetArgString(inst, 1); lineStr += " ["; lineStr += "\n"; m_DisassemblyInstructionLine++; for(uint32_t a = 2; a < inst.args.size(); a += 2) { - lineStr += StringFormat::Fmt(" %s, %s", GetArgId(inst, a).c_str(), - GetArgId(inst, a + 1).c_str()); + lineStr += StringFormat::Fmt(" %s, %s", GetArgString(inst, a).c_str(), + GetArgString(inst, a + 1).c_str()); lineStr += "\n"; m_DisassemblyInstructionLine++; } @@ -5050,7 +5044,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(!first) lineStr += ", "; - lineStr += GetArgId(s); + lineStr += GetValueString(s); first = false; } @@ -5117,7 +5111,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) if(!first) lineStr += ", "; - lineStr += GetArgId(s); + lineStr += GetValueString(s); first = false; } @@ -5322,8 +5316,8 @@ void Program::ParseReferences(const DXBC::Reflection *reflection) if(callFunc->family == FunctionFamily::DXOp) { rdcstr resultIdStr; - MakeResultId(inst, resultIdStr); DXILDebug::Id resultId = GetResultSSAId(inst); + GetSSAName(resultId, resultIdStr); DXOp dxOpCode = DXOp::NumOpCodes; RDCASSERT(getival(inst.args[0], dxOpCode)); @@ -5363,9 +5357,9 @@ void Program::ParseReferences(const DXBC::Reflection *reflection) } else { - resName = "ResourceClass:" + GetArgId(inst, 1); - resName += "[" + GetArgId(inst, 2) + "]"; - resName += "[" + GetArgId(inst, resIndexArgId) + "]"; + resName = "ResourceClass:" + GetArgString(inst, 1); + resName += "[" + GetArgString(inst, 2) + "]"; + resName += "[" + GetArgString(inst, resIndexArgId) + "]"; } } else @@ -5472,9 +5466,9 @@ void Program::ParseReferences(const DXBC::Reflection *reflection) } if(!resourceBase) { - resName = "ResourceClass:" + GetArgId(inst, 1); - resName += "[" + GetArgId(inst, 2) + "]"; - resName += "[" + GetArgId(inst, resIndexArgId) + "]"; + resName = "ResourceClass:" + GetArgString(inst, 1); + resName += "[" + GetArgString(inst, 2) + "]"; + resName += "[" + GetArgString(inst, resIndexArgId) + "]"; } } } @@ -5502,34 +5496,32 @@ void Program::ParseReferences(const DXBC::Reflection *reflection) else { if(resourceBase->regCount > 1) - resName += StringFormat::Fmt( - "[%s - %u]", GetArgId(inst, resIndexArgId).c_str(), resourceBase->regBase); + resName += + StringFormat::Fmt("[%s - %u]", GetArgString(inst, resIndexArgId).c_str(), + resourceBase->regBase); } } - if(!resName.isEmpty()) - m_SsaAliases[resultIdStr] = resName; + m_SsaHandles[resultId] = resName; break; } case DXOp::CreateHandleFromHeap: { // CreateHandleFromHeap(index,samplerHeap,nonUniformIndex) rdcstr resBaseName = "untyped_descriptor"; - uint32_t annotateHandleCount = m_ResourceAnnotateCounts[resBaseName]; - rdcstr resultAlias = "__" + resBaseName + "_" + ToStr(annotateHandleCount); - m_ResourceAnnotateCounts[resBaseName]++; - m_SsaAliases[resultIdStr] = resultAlias; + rdcstr resultAlias = "__" + resBaseName + "_" + ToStr(resultId); + SetSSAName(resultId, resultAlias, true); + rdcstr resName; uint32_t samplerHeap; if(getival(inst.args[2], samplerHeap)) { - rdcstr resName = - (samplerHeap == 0) ? "ResourceDescriptorHeap" : "SamplerDescriptorHeap"; + resName = (samplerHeap == 0) ? "ResourceDescriptorHeap" : "SamplerDescriptorHeap"; resName += "["; - resName += GetArgId(inst, 1); + resName += GetArgString(inst, 1); resName += "]"; - m_SsaAliases[resultAlias] = resName; } + m_SsaHandles[resultId] = resName; break; } case DXOp::AnnotateHandle: @@ -5540,7 +5532,7 @@ void Program::ParseReferences(const DXBC::Reflection *reflection) // and register it as resultIdStr DXILDebug::Id handleId = GetSSAId(inst.args[1]); const ResourceReference *pResRef = GetResourceReference(handleId); - rdcstr baseResource = GetArgId(inst, 1); + rdcstr baseResource = GetArgString(inst, 1); rdcstr resBaseName = "typed_descriptor"; if(pResRef) { @@ -5549,11 +5541,8 @@ void Program::ParseReferences(const DXBC::Reflection *reflection) m_ResourceByIdHandles[resultId] = m_ResourceReferences.size(); m_ResourceReferences.push_back(resRef); } - uint32_t annotateHandleCount = m_ResourceAnnotateCounts[resBaseName]; - rdcstr resName = "__" + resBaseName + "_" + ToStr(annotateHandleCount); - m_SsaAliases[resultIdStr] = resName; - m_ResourceAnnotateCounts[resBaseName]++; - + rdcstr resName = "__" + resBaseName + "_" + ToStr(resultId); + SetSSAName(resultId, resName, true); break; } default: break; @@ -6223,23 +6212,26 @@ rdcstr Constant::toString(bool dxcStyleFormatting, bool withType) const } // Formatting used by RD disassembly and the DXIL debugger -rdcstr Program::GetArgId(const Instruction &inst, uint32_t arg) const +rdcstr Program::GetArgString(const Instruction &inst, uint32_t arg) const { - return GetArgId(inst.args[arg]); + return GetValueString(inst.args[arg]); } -rdcstr Program::GetArgId(const Value *v) const +rdcstr Program::GetValueString(const Value *v) const { - rdcstr ret = ArgToString(v, false); - return ret; -} - -rdcstr Program::GetArgumentName(const DXIL::Value *v) const -{ - if(const DXIL::Constant *c = cast(v)) - return StringFormat::Fmt("%c%u", '_', c->ssaId); - - return GetArgId(v); + // Return constants as their value not SSA names + if(const Constant *c = cast(v)) + { + return ArgToString(v, false); + } + if(IsSSA(v)) + { + DXILDebug::Id ssaId = GetSSAId(v); + rdcstr name; + GetSSAName(ssaId, name); + return name; + } + return ArgToString(v, false); } DXILDebug::Id Program::GetResultSSAId(const DXIL::Instruction &inst) @@ -6247,26 +6239,50 @@ DXILDebug::Id Program::GetResultSSAId(const DXIL::Instruction &inst) return inst.slot; } -void Program::MakeResultId(const DXIL::Instruction &inst, rdcstr &resultId) const +rdcstr Program::GetInstResultName(const DXIL::Instruction *inst) const { - DXILDebug::Id id = inst.slot; + rdcstr n; + DXILDebug::Id id = inst->slot; + + if(!inst->getName().empty()) + n = StringFormat::Fmt("_%s", escapeStringIfNeeded(inst->getName()).c_str()); + if(id != ~0U) + n += StringFormat::Fmt("_%d", id); + return n; +} + +/* +rdcstr Program::GetArgumentName(const Instruction &inst, uint32_t arg) const +{ + DXILDebug::Id id = GetSSAId(inst.args[arg]); + rdcstr name; + GetSSAName(id, name); + return name; +} +*/ + +void Program::GetSSAName(DXILDebug::Id id, rdcstr &name) const +{ + if(id == ~0U) + return; + + auto it = m_SsaNames.find(id); + if(it != m_SsaNames.end()) { - auto it = m_ResultNames.find(id); - if(it != m_ResultNames.end()) - { - resultId = it->second; - return; - } + name = it->second; + return; } + RDCERR("Name for SSA Id %u not found", id); +} - if(!inst.getName().empty()) - resultId = StringFormat::Fmt("_%s", escapeStringIfNeeded(inst.getName()).c_str()); - else if(id != ~0U) - resultId = StringFormat::Fmt("_%s", ToStr(id).c_str()); +void Program::SetSSAName(DXILDebug::Id id, const rdcstr &name, bool overwrite) +{ + RDCASSERTNOTEQUAL(id, ~0U); + if(!overwrite) + RDCASSERTEQUAL(m_SsaNames.count(id), 0); - if(id != ~0U) - m_ResultNames[id] = resultId; + m_SsaNames[id] = name; } rdcpair Program::ParseDIExpressionMD(const Metadata *expressionMD) const @@ -6309,7 +6325,8 @@ SourceMappingInfo Program::ParseDbgOpValue(const DXIL::Instruction &inst) const // arg 0 is metadata containing the new value const Metadata *valueMD = cast(inst.args[0]); ret.dbgVarId = GetSSAId(valueMD->value); - ret.dbgVarName = GetArgumentName(valueMD->value); + ret.dbgVarName; + GetSSAName(ret.dbgVarId, ret.dbgVarName); // arg 1 is i64 byte offset in the source variable where the new value is written int64_t value = 0; @@ -6341,24 +6358,15 @@ SourceMappingInfo Program::ParseDbgOpDeclare(const DXIL::Instruction &inst) cons RDCASSERT(allocaInstMD); const DXIL::Value *value = allocaInstMD->value; if(const Instruction *varInst = cast(value)) - { ret.dbgVarId = Program::GetResultSSAId(*varInst); - MakeResultId(*varInst, ret.dbgVarName); - } else if(const GlobalVar *gv = cast(value)) - { ret.dbgVarId = gv->ssaId; - ret.dbgVarName = DXIL::GetGlobalVarName(gv); - } else if(const Constant *c = cast(value)) - { ret.dbgVarId = c->ssaId; - ret.dbgVarName = StringFormat::Fmt("%c%u", '_', c->ssaId); - } else - { RDCERR("Unhandled metadata value type %s", ToStr(value->kind()).c_str()); - } + + GetSSAName(ret.dbgVarId, ret.dbgVarName); // arg 1 is DILocalVariable metadata const Metadata *localVariableMD = cast(inst.args[1]); @@ -6375,13 +6383,4 @@ SourceMappingInfo Program::ParseDbgOpDeclare(const DXIL::Instruction &inst) cons return ret; } -rdcstr GetGlobalVarName(const GlobalVar *gv) -{ - rdcstr n = DXBC::BasicDemangle(gv->name); - DXIL::SanitiseName(n); - n += "_"; - n += ToStr(gv->ssaId); - return n; -} - }; // namespace DXIL diff --git a/util/test/rdtest/testcase.py b/util/test/rdtest/testcase.py index 863ab7803..d8b8dcccc 100644 --- a/util/test/rdtest/testcase.py +++ b/util/test/rdtest/testcase.py @@ -1101,15 +1101,13 @@ class TestCase: else: if c.after.name in variables: # Step Forwards: not-first appearance of a variable "before" must equal currently known value - if not (c.after.type == rd.VarType.ReadOnlyResource or c.after.type == rd.VarType.ReadWriteResource): - (res, difference) = analyse.shadervariable_equal(c.before, variables[c.after.name]) - if not res: - raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.after.name}' before does not match existing entry {difference}") + (res, difference) = analyse.shadervariable_equal(c.before, variables[c.after.name]) + if not res: + raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.after.name}' before does not match existing entry {difference}") else: # Step Forwards: first appearance of a variable must have "before" = {} - if not (c.after.type == rd.VarType.ReadOnlyResource or c.after.type == rd.VarType.ReadWriteResource): - if c.before != rd.ShaderVariable(): - raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.after.name}' does not have NULL before") + if c.before != rd.ShaderVariable(): + raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.after.name}' does not have NULL before") variables[c.after.name] = c.after # Validate c.after if not self.validate_shadervariable(c.after): @@ -1130,15 +1128,13 @@ class TestCase: else: if c.before.name in variables: # Step Backwards: not-first appearance of a variable "after" must equal currently known value - if not (c.after.type == rd.VarType.ReadOnlyResource or c.after.type == rd.VarType.ReadWriteResource): - (res, difference) = analyse.shadervariable_equal(c.after, variables[c.before.name]) - if not res: - raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.before.name}' after does not match existing entry {difference}") + (res, difference) = analyse.shadervariable_equal(c.after, variables[c.before.name]) + if not res: + raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.before.name}' after does not match existing entry {difference}") else: # Step Backwards: first appearance of a variable must have "after" = {} - if not (c.after.type == rd.VarType.ReadOnlyResource or c.after.type == rd.VarType.ReadWriteResource): - if c.after != rd.ShaderVariable(): - raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.before.name}' does not have NULL after") + if c.after != rd.ShaderVariable(): + raise TestFailureException(f"Step {i} ShaderVariableChange for '{c.before.name}' does not have NULL after") variables[c.before.name] = c.before # Validate c.before if not self.validate_shadervariable(c.before):