Skip to content

Commit

Permalink
RD DXIL Disassembly: decode "dx.op.bufferLoad" &"dx.op.rawBufferLoad"
Browse files Browse the repository at this point in the history
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];
  • Loading branch information
Zorro666 committed May 1, 2024
1 parent 70c5fd9 commit 30cf541
Showing 1 changed file with 79 additions and 12 deletions.
91 changes: 79 additions & 12 deletions renderdoc/driver/shaders/dxil/dxil_disassemble.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,13 @@ rdcstr escapeStringIfNeeded(const rdcstr &name)
return needsEscaping(name) ? escapeString(name) : name;
}

bool isUndef(const Value *v)
{
if(const Constant *c = cast<Constant>(v))
return c->isUndef();
return false;
}

template <typename T>
bool getival(const Value *v, T &out)
{
Expand Down Expand Up @@ -2272,6 +2279,13 @@ static rdcstr MakeCBufferRegisterStr(uint32_t reg, DXIL::EntryPointInterface::CB
return ret;
}

struct ResourceHandle
{
rdcstr name;
ResourceClass resourceClass;
uint32_t resourceIndex;
};

void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
{
DXIL::dxcStyleFormatting = false;
Expand Down Expand Up @@ -2523,7 +2537,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
m_Disassembly += "{";
DisassemblyAddNewLine();

std::map<rdcstr, rdcpair<ResourceClass, uint32_t>> resHandles;
std::map<rdcstr, ResourceHandle> resHandles;

size_t curBlock = 0;

Expand Down Expand Up @@ -2570,7 +2584,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
{
showDxFuncName = false;
uint32_t dxopCode;
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
RDCASSERTEQUAL(dxopCode, 4);
rdcstr name;
rdcstr rowStr;
Expand Down Expand Up @@ -2610,7 +2624,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
{
showDxFuncName = false;
uint32_t dxopCode;
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
RDCASSERTEQUAL(dxopCode, 5);
rdcstr name;
rdcstr rowStr;
Expand Down Expand Up @@ -2651,7 +2665,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
{
showDxFuncName = false;
uint32_t dxopCode;
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
RDCASSERTEQUAL(dxopCode, 57);
rdcstr handleStr = resultIdStr;
ResourceClass resClass;
Expand All @@ -2674,7 +2688,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
break;
default: resName = "INVALID RESOURCE CLASS"; break;
};
resHandles[handleStr] = make_rdcpair<ResourceClass, uint32_t>(resClass, resIndex);
resHandles[handleStr] = {resName, resClass, resIndex};
uint32_t index;
if(getival<uint32_t>(inst.args[3], index))
{
Expand Down Expand Up @@ -2715,7 +2729,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
{
showDxFuncName = false;
uint32_t dxopCode;
RDCASSERTEQUAL(getival<uint32_t>(inst.args[0], dxopCode), true);
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
RDCASSERTEQUAL(dxopCode, 59);
rdcstr handleStr = ArgToString(inst.args[1], false);
if(resHandles.count(handleStr) > 0)
Expand All @@ -2730,7 +2744,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
regIndex = regIndex / 16;
// uint32_t alignment = getival<uint32_t>(inst.args[3]);
}
uint32_t resourceIndex = resHandles[handleStr].second;
uint32_t resourceIndex = resHandles[handleStr].resourceIndex;
lineStr += MakeCBufferRegisterStr(regIndex, entryPoint.cbuffers[resourceIndex]);
}
}
Expand All @@ -2739,6 +2753,62 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
showDxFuncName = true;
}
}
else if(showDxFuncName && funcCallName.beginsWith("dx.op.bufferLoad"))
{
// handle, index, wot (unused)
showDxFuncName = false;
uint32_t dxopCode;
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
RDCASSERTEQUAL(dxopCode, 68);
rdcstr handleStr = ArgToString(inst.args[1], false);
if(resHandles.count(handleStr) > 0)
{
lineStr += resHandles[handleStr].name;
lineStr += "[" + ArgToString(inst.args[2], false) + "]";
}
else
{
showDxFuncName = true;
}
}
else if(showDxFuncName && funcCallName.beginsWith("dx.op.rawBufferLoad"))
{
// handle, index, elementOffset, mask, alignment
showDxFuncName = false;
uint32_t dxopCode;
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
RDCASSERTEQUAL(dxopCode, 139);
rdcstr handleStr = ArgToString(inst.args[1], false);
if(resHandles.count(handleStr) > 0)
{
lineStr += resHandles[handleStr].name;
if(!isUndef(inst.args[2]))
{
lineStr += "[" + ArgToString(inst.args[2], false) + "]";
if(!isUndef(inst.args[3]))
{
uint32_t elementOffset;
if(getival<uint32_t>(inst.args[3], elementOffset))
{
if(elementOffset > 0)
lineStr += " + " + ToStr(elementOffset) + " bytes";
}
else
{
lineStr += " + " + ArgToString(inst.args[3], false) + " bytes";
}
}
}
else
{
lineStr += "[" + ArgToString(inst.args[3], false) + "]";
}
}
else
{
showDxFuncName = true;
}
}
else if(funcCallName.beginsWith("llvm.dbg."))
{
}
Expand Down Expand Up @@ -2782,10 +2852,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
}
}
// Don't show "undef" parameters
bool isUndef = false;
if(const Constant *c = cast<Constant>(inst.args[a]))
isUndef = c->isUndef();
if(!isUndef)
if(!isUndef(inst.args[a]))
{
if(!first)
lineStr += ", ";
Expand Down Expand Up @@ -2997,7 +3064,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
// %3 = getelementptr [6 x float], [6 x float] addrspace(3)*
// @"\01?s_x@@3@$$A.1dim", i32 0, i32 %9

// RD: GroupShared float* _3 = s_x[0] + _9;
// RD: GroupShared float* _3 = s_x[_9];
fallbackOutput = false;

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

0 comments on commit 30cf541

Please sign in to comment.