From fcb688124f527a88ab157cd90bfbd078ef5a625c Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Thu, 10 Apr 2025 07:40:45 +0100 Subject: [PATCH] Specific DXIL disassembly handling for WaveMultiPrefixOp After int _WaveMultiPrefixOp12 = WaveMultiPrefixSum(_WaveGetLaneIndex, {_92,_93,_94,_95}); // Unsigned int _WaveMultiPrefixOp10 = WaveMultiPrefixBitAnd(_127, {_117,_118,_119,_120}); // Signed int _WaveMultiPrefixOp9 = WaveMultiPrefixBitOr(_WaveGetLaneIndex, {_117,_118,_119,_120}); // Signed int _WaveMultiPrefixOp = WaveMultiPrefixBitXor(_WaveGetLaneIndex, {_117,_118,_119,_120}); // Signed int _WaveMultiPrefixOp11 = WaveMultiPrefixProduct(_WaveGetLaneIndex, {_92,_93,_94,_95}); // Unsigned Before int _WaveMultiPrefixOp12 = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _92, /*mask1*/ _93, /*mask2*/ _94, /*mask3*/ _95, /*op*/ 0, /*sop*/ 1); int _WaveMultiPrefixOp10 = WaveMultiPrefixOp(/*value*/ _127, /*mask0*/ _117, /*mask1*/ _118, /*mask2*/ _119, /*mask3*/ _120, /*op*/ 1, /*sop*/ 0); int _WaveMultiPrefixOp9 = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _117, /*mask1*/ _118, /*mask2*/ _119, /*mask3*/ _120, /*op*/ 2, /*sop*/ 0); int _WaveMultiPrefixOp = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _117, /*mask1*/ _118, /*mask2*/ _119, /*mask3*/ _120, /*op*/ 3, /*sop*/ 0); int _WaveMultiPrefixOp11 = WaveMultiPrefixOp(/*value*/ _WaveGetLaneIndex, /*mask0*/ _92, /*mask1*/ _93, /*mask2*/ _94, /*mask3*/ _95, /*op*/ 4, /*sop*/ 1); --- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 1 + .../driver/shaders/dxil/dxil_disassemble.cpp | 36 +++++++++++++++++++ .../driver/shaders/dxil/dxil_stringise.cpp | 14 ++++++++ 3 files changed, 51 insertions(+) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 981b75885..c85ab6ad2 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -1852,6 +1852,7 @@ DECLARE_STRINGISE_TYPE(DXIL::InstructionFlags); DECLARE_STRINGISE_TYPE(DXIL::AtomicBinOpCode); DECLARE_STRINGISE_TYPE(DXIL::WaveOpCode); DECLARE_STRINGISE_TYPE(DXIL::WaveBitOpCode); +DECLARE_STRINGISE_TYPE(DXIL::WaveMultiPrefixOpCode); DECLARE_STRINGISE_TYPE(DXIL::SignedOpKind); DECLARE_STRINGISE_TYPE(DXIL::QuadOpKind); DECLARE_STRINGISE_TYPE(DXIL::PackMode); diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 2f24eb323..288d39ef9 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -4198,6 +4198,42 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } break; } + case DXOp::WaveMultiPrefixOp: + { + // WaveMultiPrefixOp(value,mask0,mask1,mask2,mask3,op,sop) + SignedOpKind sop; + if(getival(inst.args[7], sop)) + commentStr += ToStr(sop); + + WaveMultiPrefixOpCode waveMultiOpCode; + if(getival(inst.args[6], waveMultiOpCode)) + { + lineStr += "WaveMultiPrefix"; + if((waveMultiOpCode == WaveMultiPrefixOpCode::And) || + (waveMultiOpCode == WaveMultiPrefixOpCode::Or) || + (waveMultiOpCode == WaveMultiPrefixOpCode::Xor)) + lineStr += "Bit"; + + lineStr += ToStr(waveMultiOpCode); + lineStr += "("; + lineStr += GetArgId(inst, 1); + lineStr += ", {"; + lineStr += GetArgId(inst, 2); + lineStr += ","; + lineStr += GetArgId(inst, 3); + lineStr += ","; + lineStr += GetArgId(inst, 4); + lineStr += ","; + lineStr += GetArgId(inst, 5); + lineStr += "}"; + lineStr += ")"; + } + else + { + showDxFuncName = true; + } + break; + } case DXOp::Pack4x8: { // Pack4x8(packMode,x,y,z,w) diff --git a/renderdoc/driver/shaders/dxil/dxil_stringise.cpp b/renderdoc/driver/shaders/dxil/dxil_stringise.cpp index 7d4f0953f..0968d68d9 100644 --- a/renderdoc/driver/shaders/dxil/dxil_stringise.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_stringise.cpp @@ -864,3 +864,17 @@ rdcstr DoStringise(const DXIL::WaveBitOpCode &el) } END_ENUM_STRINGISE(); } + +template <> +rdcstr DoStringise(const DXIL::WaveMultiPrefixOpCode &el) +{ + BEGIN_ENUM_STRINGISE(DXIL::WaveMultiPrefixOpCode) + { + STRINGISE_ENUM_CLASS(Sum) + STRINGISE_ENUM_CLASS(And) + STRINGISE_ENUM_CLASS(Or) + STRINGISE_ENUM_CLASS(Xor) + STRINGISE_ENUM_CLASS(Product) + } + END_ENUM_STRINGISE(); +}