From d71496aabcc27bfc12966d94ac9a95d98db0cfd4 Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 2 May 2024 10:03:32 +0100 Subject: [PATCH] RD DXIL Disassembly: decode "dx.op.sample*" Example Output %25 = call %dx.types.ResRet.f32 @dx.op.sample.f32(i32 60, %dx.types.Handle %texDiffuse_texture_2d, %dx.types.Handle %defaultSampler_sampler, float %16, float %17, float undef, float undef, i32 0, i32 0, i32 undef, float undef) Becomes _dx.types.ResRet.f32 _25 = texDiffuse.Sample(defaultSampler, _16, _17, Offset = {0, 0}); --- .../driver/shaders/dxil/dxil_disassemble.cpp | 106 +++++++++++++++++- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index dc56155a1..e6d306854 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -2761,6 +2761,106 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) showDxFuncName = true; } } + else if(showDxFuncName && funcCallName.beginsWith("dx.op.sample") && + !funcCallName.beginsWith("dx.op.sampleIndex")) + { + // Sample(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,clamp) + // SampleBias(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,bias,clamp) + // SampleLevel(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,LOD) + // SampleGrad(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,ddx0,ddx1,ddx2,ddy0,ddy1,ddy2,clamp) + // SampleCmp(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,compareValue,clamp) + // SampleCmpLevelZero(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,compareValue) + // 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) + showDxFuncName = false; + rdcstr handleStr = ArgToString(inst.args[1], false); + if(resHandles.count(handleStr) > 0) + { + uint32_t dxopCode; + RDCASSERT(getival(inst.args[0], dxopCode)); + lineStr += resHandles[handleStr].name; + lineStr += "."; + rdcstr dxFuncSig = funcNameSigs[dxopCode]; + int paramStart = dxFuncSig.find('(') + 1; + if(paramStart > 0) + lineStr += dxFuncSig.substr(0, paramStart); + else + lineStr += "UNKNOWN DX FUNCTION"; + + // sampler is 2 + rdcstr samplerStr = ArgToString(inst.args[2], false); + if(resHandles.count(samplerStr) > 0) + samplerStr = resHandles[samplerStr].name; + lineStr += samplerStr; + + for(uint32_t a = 3; a < 7; ++a) + { + if(!isUndef(inst.args[a])) + { + lineStr += ", "; + lineStr += ArgToString(inst.args[a], false); + } + } + bool needText = true; + for(uint32_t a = 7; a < 10; ++a) + { + if(!isUndef(inst.args[a])) + { + lineStr += ", "; + if(needText) + { + lineStr += "Offset = {"; + needText = false; + } + lineStr += ArgToString(inst.args[a], false); + } + } + if(!needText) + lineStr += "}"; + + int paramStrCount = (int)dxFuncSig.size(); + for(size_t a = 1; a < 10; ++a) + { + if(paramStart < paramStrCount) + { + int paramEnd = dxFuncSig.find(',', paramStart); + if(paramEnd == -1) + paramEnd = paramStrCount; + paramStart = paramEnd + 1; + } + } + for(uint32_t a = 10; a < inst.args.size(); ++a) + { + rdcstr paramNameStr; + if(paramStart < paramStrCount) + { + int paramEnd = dxFuncSig.find(',', paramStart); + if(paramEnd == -1) + paramEnd = paramStrCount - 1; + if(paramEnd > paramStart) + { + rdcstr dxParamName = dxFuncSig.substr(paramStart, paramEnd - paramStart); + paramStart = paramEnd + 1; + paramNameStr = "/*"; + paramNameStr += dxParamName; + paramNameStr += "*/ "; + } + } + if(!isUndef(inst.args[a])) + { + lineStr += ", "; + lineStr += paramNameStr; + lineStr += ArgToString(inst.args[a], false); + } + } + lineStr += ")"; + } + else + { + showDxFuncName = true; + } + } else if(funcCallName.beginsWith("llvm.dbg.")) { } @@ -2796,7 +2896,7 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) { int paramEnd = dxFuncSig.find(',', paramStart); if(paramEnd == -1) - paramEnd = paramStrCount; + paramEnd = paramStrCount - 1; if(paramEnd > paramStart) { rdcstr dxParamName = dxFuncSig.substr(paramStart, paramEnd - paramStart); @@ -3054,8 +3154,8 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) rdcstr ptrStr = ArgToString(inst.args[0], false); // Try to de-mangle the pointer name // @"\01?shared_pos@@3PAY0BC@$$CAMA.1dim" -> shared_pos - // Take the string between first alphabetical character and last alphanumeric - // character or "_" + // Take the string between first alphabetical character and last + // alphanumeric character or "_" start = 0; int strEnd = (int)ptrStr.size(); while(start < strEnd)