Skip to content

Commit 31fee8d

Browse files
committed
RD DXIL Disassembly: decode "dx.op.bufferLoad" &"dx.op.rawBufferLoad"
Example Output %31 = call %dx.types.ResRet.i32 @dx.op.bufferLoad.i32(i32 68, %dx.types.Handle %bufOut_UAV_structbuf, i32 1, i32 0); Becomes _dx.types.ResRet.i32 _31 = bufOut[1];
1 parent 70c5fd9 commit 31fee8d

File tree

1 file changed

+72
-12
lines changed

1 file changed

+72
-12
lines changed

renderdoc/driver/shaders/dxil/dxil_disassemble.cpp

Lines changed: 72 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,13 @@ rdcstr escapeStringIfNeeded(const rdcstr &name)
7575
return needsEscaping(name) ? escapeString(name) : name;
7676
}
7777

78+
bool isUndef(const Value *v)
79+
{
80+
if(const Constant *c = cast<Constant>(v))
81+
return c->isUndef();
82+
return false;
83+
}
84+
7885
template <typename T>
7986
bool getival(const Value *v, T &out)
8087
{
@@ -2272,6 +2279,13 @@ static rdcstr MakeCBufferRegisterStr(uint32_t reg, DXIL::EntryPointInterface::CB
22722279
return ret;
22732280
}
22742281

2282+
struct ResourceHandle
2283+
{
2284+
rdcstr name;
2285+
ResourceClass resourceClass;
2286+
uint32_t resourceIndex;
2287+
};
2288+
22752289
void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
22762290
{
22772291
DXIL::dxcStyleFormatting = false;
@@ -2523,7 +2537,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
25232537
m_Disassembly += "{";
25242538
DisassemblyAddNewLine();
25252539

2526-
std::map<rdcstr, rdcpair<ResourceClass, uint32_t>> resHandles;
2540+
std::map<rdcstr, ResourceHandle> resHandles;
25272541

25282542
size_t curBlock = 0;
25292543

@@ -2570,7 +2584,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
25702584
{
25712585
showDxFuncName = false;
25722586
uint32_t dxopCode;
2573-
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
2587+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
25742588
RDCASSERTEQUAL(dxopCode, 4);
25752589
rdcstr name;
25762590
rdcstr rowStr;
@@ -2610,7 +2624,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
26102624
{
26112625
showDxFuncName = false;
26122626
uint32_t dxopCode;
2613-
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
2627+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
26142628
RDCASSERTEQUAL(dxopCode, 5);
26152629
rdcstr name;
26162630
rdcstr rowStr;
@@ -2651,7 +2665,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
26512665
{
26522666
showDxFuncName = false;
26532667
uint32_t dxopCode;
2654-
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
2668+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
26552669
RDCASSERTEQUAL(dxopCode, 57);
26562670
rdcstr handleStr = resultIdStr;
26572671
ResourceClass resClass;
@@ -2674,7 +2688,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
26742688
break;
26752689
default: resName = "INVALID RESOURCE CLASS"; break;
26762690
};
2677-
resHandles[handleStr] = make_rdcpair<ResourceClass, uint32_t>(resClass, resIndex);
2691+
resHandles[handleStr] = {resName, resClass, resIndex};
26782692
uint32_t index;
26792693
if(getival<uint32_t>(inst.args[3], index))
26802694
{
@@ -2715,7 +2729,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
27152729
{
27162730
showDxFuncName = false;
27172731
uint32_t dxopCode;
2718-
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
2732+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
27192733
RDCASSERTEQUAL(dxopCode, 59);
27202734
rdcstr handleStr = ArgToString(inst.args[1], false);
27212735
if(resHandles.count(handleStr) > 0)
@@ -2730,7 +2744,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
27302744
regIndex = regIndex / 16;
27312745
// uint32_t alignment = getival<uint32_t>(inst.args[3]);
27322746
}
2733-
uint32_t resourceIndex = resHandles[handleStr].second;
2747+
uint32_t resourceIndex = resHandles[handleStr].resourceIndex;
27342748
lineStr += MakeCBufferRegisterStr(regIndex, entryPoint.cbuffers[resourceIndex]);
27352749
}
27362750
}
@@ -2739,6 +2753,55 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
27392753
showDxFuncName = true;
27402754
}
27412755
}
2756+
else if(showDxFuncName && funcCallName.beginsWith("dx.op.bufferLoad"))
2757+
{
2758+
// handle, index, wot (unused)
2759+
showDxFuncName = false;
2760+
uint32_t dxopCode;
2761+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
2762+
RDCASSERTEQUAL(dxopCode, 68);
2763+
rdcstr handleStr = ArgToString(inst.args[1], false);
2764+
if(resHandles.count(handleStr) > 0)
2765+
{
2766+
lineStr += resHandles[handleStr].name;
2767+
lineStr += "[" + ArgToString(inst.args[2], false) + "]";
2768+
}
2769+
else
2770+
{
2771+
showDxFuncName = true;
2772+
}
2773+
}
2774+
else if(showDxFuncName && funcCallName.beginsWith("dx.op.rawBufferLoad"))
2775+
{
2776+
// handle, index, elementOffset, mask, alignment
2777+
showDxFuncName = false;
2778+
uint32_t dxopCode;
2779+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
2780+
RDCASSERTEQUAL(dxopCode, 139);
2781+
rdcstr handleStr = ArgToString(inst.args[1], false);
2782+
if(resHandles.count(handleStr) > 0)
2783+
{
2784+
lineStr += resHandles[handleStr].name;
2785+
lineStr += "[" + ArgToString(inst.args[2], false) + "]";
2786+
if(!isUndef(inst.args[3]))
2787+
{
2788+
uint32_t elementOffset;
2789+
if(getival<uint32_t>(inst.args[3], elementOffset))
2790+
{
2791+
if(elementOffset > 0)
2792+
lineStr += " + " + ToStr(elementOffset) + " bytes";
2793+
}
2794+
else
2795+
{
2796+
lineStr += " + " + ArgToString(inst.args[3], false) + " bytes";
2797+
}
2798+
}
2799+
}
2800+
else
2801+
{
2802+
showDxFuncName = true;
2803+
}
2804+
}
27422805
else if(funcCallName.beginsWith("llvm.dbg."))
27432806
{
27442807
}
@@ -2782,10 +2845,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
27822845
}
27832846
}
27842847
// Don't show "undef" parameters
2785-
bool isUndef = false;
2786-
if(const Constant *c = cast<Constant>(inst.args[a]))
2787-
isUndef = c->isUndef();
2788-
if(!isUndef)
2848+
if(!isUndef(inst.args[a]))
27892849
{
27902850
if(!first)
27912851
lineStr += ", ";
@@ -2997,7 +3057,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
29973057
// %3 = getelementptr [6 x float], [6 x float] addrspace(3)*
29983058
// @"\01?s_x@@3@$$A.1dim", i32 0, i32 %9
29993059

3000-
// RD: GroupShared float* _3 = s_x[0] + _9;
3060+
// RD: GroupShared float* _3 = s_x[_9];
30013061
fallbackOutput = false;
30023062

30033063
rdcstr addrspaceStr(typeStr.substr(start, end - start));

0 commit comments

Comments
 (0)