@@ -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+
7885template <typename T>
7986bool 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+
22752289void 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