Skip to content

Commit d1150f2

Browse files
committed
RD DXIL Disassembly: decode "dx.op.textureLoad"
Example Output %TextureLoad = call %dx.types.ResRet.f32 @dx.op.textureLoad.f32(i32 66, %dx.types.Handle %texSSAO_texture_2d, i32 0, i32 %23, i32 %24, i32 undef, i32 undef, i32 undef, i32 undef) Becomes _dx.types.ResRet.f32 _TextureLoad = texSSAO.Load(_23, _24);
1 parent e6bf418 commit d1150f2

File tree

1 file changed

+104
-5
lines changed

1 file changed

+104
-5
lines changed

renderdoc/driver/shaders/dxil/dxil_disassemble.cpp

Lines changed: 104 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2283,7 +2283,14 @@ struct ResourceHandle
22832283
{
22842284
rdcstr name;
22852285
ResourceClass resourceClass;
2286-
uint32_t resourceIndex;
2286+
uint32_t resourceIndex = 0;
2287+
union
2288+
{
2289+
const DXIL::EntryPointInterface::UAV *uav;
2290+
const DXIL::EntryPointInterface::SRV *srv;
2291+
const DXIL::EntryPointInterface::CBuffer *cbuffer;
2292+
const DXIL::EntryPointInterface::Sampler *sampler;
2293+
};
22872294
};
22882295

22892296
void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
@@ -2676,19 +2683,39 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
26762683
{
26772684
if(hasResIndex)
26782685
{
2686+
ResourceHandle resHandle;
2687+
bool validRes = true;
26792688
switch(resClass)
26802689
{
2681-
case ResourceClass::SRV: resName = entryPoint.srvs[resIndex].name; break;
2682-
case ResourceClass::UAV: resName = entryPoint.uavs[resIndex].name; break;
2690+
case ResourceClass::SRV:
2691+
resName = entryPoint.srvs[resIndex].name;
2692+
resHandle.srv = &entryPoint.srvs[resIndex];
2693+
break;
2694+
case ResourceClass::UAV:
2695+
resName = entryPoint.uavs[resIndex].name;
2696+
resHandle.uav = &entryPoint.uavs[resIndex];
2697+
break;
26832698
case ResourceClass::CBuffer:
26842699
resName = entryPoint.cbuffers[resIndex].name;
2700+
resHandle.cbuffer = &entryPoint.cbuffers[resIndex];
26852701
break;
26862702
case ResourceClass::Sampler:
26872703
resName = entryPoint.samplers[resIndex].name;
2704+
resHandle.sampler = &entryPoint.samplers[resIndex];
2705+
break;
2706+
default:
2707+
validRes = false;
2708+
resName = "INVALID RESOURCE CLASS";
26882709
break;
2689-
default: resName = "INVALID RESOURCE CLASS"; break;
26902710
};
2691-
resHandles[handleStr] = {resName, resClass, resIndex};
2711+
2712+
if(validRes)
2713+
{
2714+
resHandle.name = resName;
2715+
resHandle.resourceClass = resClass;
2716+
resHandle.resourceIndex = resIndex;
2717+
resHandles[handleStr] = resHandle;
2718+
}
26922719
uint32_t index;
26932720
if(getival<uint32_t>(inst.args[3], index))
26942721
{
@@ -2879,6 +2906,78 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection)
28792906
showDxFuncName = true;
28802907
}
28812908
}
2909+
else if(showDxFuncName && funcCallName.beginsWith("dx.op.textureLoad"))
2910+
{
2911+
// srv,mipLevelOrSampleCount,coord0,coord1,coord2,offset0,offset1,offset2
2912+
showDxFuncName = false;
2913+
uint32_t dxopCode;
2914+
RDCASSERT(getival<uint32_t>(inst.args[0], dxopCode));
2915+
RDCASSERTEQUAL(dxopCode, 66);
2916+
rdcstr handleStr = ArgToString(inst.args[1], false);
2917+
if(resHandles.count(handleStr) > 0)
2918+
{
2919+
lineStr += resHandles[handleStr].name;
2920+
lineStr += ".Load(";
2921+
bool needComma = false;
2922+
const EntryPointInterface::SRV *texture = resHandles[handleStr].srv;
2923+
for(uint32_t a = 3; a < 6; ++a)
2924+
{
2925+
if(!isUndef(inst.args[a]))
2926+
{
2927+
if(needComma)
2928+
lineStr += ", ";
2929+
lineStr += ArgToString(inst.args[a], false);
2930+
needComma = true;
2931+
}
2932+
}
2933+
bool needText = true;
2934+
if(!isUndef(inst.args[2]))
2935+
{
2936+
rdcstr prefix;
2937+
bool showArg = true;
2938+
if(needText)
2939+
{
2940+
if(texture && texture->sampleCount > 1)
2941+
{
2942+
prefix = "SampleIndex = ";
2943+
}
2944+
else
2945+
{
2946+
prefix = "MipSlice = ";
2947+
uint32_t mipSlice;
2948+
if(getival<uint32_t>(inst.args[2], mipSlice))
2949+
showArg = mipSlice > 0;
2950+
}
2951+
}
2952+
if(showArg)
2953+
{
2954+
needText = false;
2955+
lineStr += ", ";
2956+
lineStr += prefix;
2957+
lineStr += ArgToString(inst.args[2], false);
2958+
}
2959+
}
2960+
needText = true;
2961+
for(uint32_t a = 6; a < 9; ++a)
2962+
{
2963+
if(!isUndef(inst.args[a]))
2964+
{
2965+
lineStr += ", ";
2966+
if(needText)
2967+
{
2968+
lineStr += "Offset = ";
2969+
needText = false;
2970+
}
2971+
lineStr += ArgToString(inst.args[a], false);
2972+
}
2973+
}
2974+
lineStr += ")";
2975+
}
2976+
else
2977+
{
2978+
showDxFuncName = true;
2979+
}
2980+
}
28822981
else if(funcCallName.beginsWith("llvm.dbg."))
28832982
{
28842983
}

0 commit comments

Comments
 (0)