From ec88bbed21683ffaf7b95dde9e537784ed985d3f Mon Sep 17 00:00:00 2001 From: Jake Turner Date: Sun, 15 Dec 2024 13:01:33 +0000 Subject: [PATCH] DXIL Disassembly custom handling for DXOp::QuadOp QuadReadAcrossX QuadReadAcrossY QuadReadAcrossDiagonal --- renderdoc/driver/shaders/dxil/dxil_bytecode.h | 11 ++++++++ .../driver/shaders/dxil/dxil_disassemble.cpp | 25 +++++++++++++++++++ .../driver/shaders/dxil/dxil_stringise.cpp | 12 +++++++++ 3 files changed, 48 insertions(+) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.h b/renderdoc/driver/shaders/dxil/dxil_bytecode.h index 07c81ae46..c833b5ce3 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.h +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.h @@ -618,6 +618,16 @@ enum class AtomicBinOpCode : uint32_t Invalid // Must be last. }; +enum class QuadOpKind : uint32_t +{ + ReadAcrossX = 0, // returns the value from the other lane in the quad in the + // horizontal direction + ReadAcrossY = 1, // returns the value from the other lane in the quad in the + // vertical direction + ReadAcrossDiagonal = 2, // returns the value from the lane across the quad in + // horizontal and vertical direction +}; + enum class BarrierMode : uint32_t { Invalid = 0, @@ -1763,6 +1773,7 @@ void SanitiseName(rdcstr &name); DECLARE_REFLECTION_ENUM(DXIL::Attribute); DECLARE_STRINGISE_TYPE(DXIL::InstructionFlags); DECLARE_STRINGISE_TYPE(DXIL::AtomicBinOpCode); +DECLARE_STRINGISE_TYPE(DXIL::QuadOpKind); DECLARE_STRINGISE_TYPE(DXIL::Operation); DECLARE_STRINGISE_TYPE(DXIL::DXOp); DECLARE_STRINGISE_TYPE(DXIL::Type::TypeKind); diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index 8d4b927b0..f6b67b4ba 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -4100,6 +4100,31 @@ void Program::MakeRDDisassemblyString(const DXBC::Reflection *reflection) } break; } + case DXOp::QuadOp: + { + // QuadOp(value,op) + QuadOpKind quadOpKind; + if(getival(inst.args[2], quadOpKind)) + { + // QuadReadAcrossDiagonal + // QuadReadAcrossX + // QuadReadAcrossY + if(quadOpKind == QuadOpKind::ReadAcrossX) + lineStr += "QuadReadAcrossX"; + else if(quadOpKind == QuadOpKind::ReadAcrossY) + lineStr += "QuadReadAcrossY"; + else if(quadOpKind == QuadOpKind::ReadAcrossDiagonal) + lineStr += "QuadReadAcrossDiagonal"; + lineStr += "("; + lineStr += GetArgId(inst, 1); + lineStr += ")"; + } + else + { + showDxFuncName = true; + } + break; + } case DXOp::Dot2: case DXOp::Dot3: case DXOp::Dot4: diff --git a/renderdoc/driver/shaders/dxil/dxil_stringise.cpp b/renderdoc/driver/shaders/dxil/dxil_stringise.cpp index 3591a8304..05311fd47 100644 --- a/renderdoc/driver/shaders/dxil/dxil_stringise.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_stringise.cpp @@ -127,6 +127,18 @@ rdcstr DoStringise(const DXIL::AtomicBinOpCode &el) END_ENUM_STRINGISE(); } +template <> +rdcstr DoStringise(const DXIL::QuadOpKind &el) +{ + BEGIN_ENUM_STRINGISE(DXIL::QuadOpKind) + { + STRINGISE_ENUM_CLASS(ReadAcrossX) + STRINGISE_ENUM_CLASS(ReadAcrossY) + STRINGISE_ENUM_CLASS(ReadAcrossDiagonal) + } + END_ENUM_STRINGISE(); +}; + template <> rdcstr DoStringise(const DXIL::Operation &el) {