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):