From 9c09f2879c31d0eac42811d9118d6caf32283f6f Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 16 Feb 2023 12:53:54 +0000 Subject: [PATCH] Improve dxc-only disassembly annotations --- .../driver/shaders/dxil/dxil_bytecode.cpp | 3 +- .../driver/shaders/dxil/dxil_disassemble.cpp | 65 ++++++++++++++----- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp index da3ac380c..1bcdb76d7 100644 --- a/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_bytecode.cpp @@ -2093,8 +2093,7 @@ Program::Program(const byte *bytes, size_t length) : alloc(32 * 1024) } else if(op.type == FunctionRecord::INST_SHUFFLEVEC) { - // DXIL claims to be scalarised so should this appear? - RDCWARN("Unexpected vector instruction shufflevector in DXIL"); + // DXIL claims to be scalarised but is not. Surprise surprise! Instruction *inst = values.nextValue(); diff --git a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp index b8fc3c840..83c6c5198 100644 --- a/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp +++ b/renderdoc/driver/shaders/dxil/dxil_disassemble.cpp @@ -298,8 +298,16 @@ void Program::MakeDisassemblyString() "GeometryIndex()", "RayQuery_CandidateInstanceContributionToHitGroupIndex(rayQueryHandle)", "RayQuery_CommittedInstanceContributionToHitGroupIndex(rayQueryHandle)", - "CreateHandleFromHeap(index,nonUniformIndex)", - "AnnotateHandle(res,resourceClass,resourceKind,props)" + "AnnotateHandle(res,props)", + "CreateHandleFromBinding(bind,index,nonUniformIndex)", + "CreateHandleFromHeap(index,samplerHeap,nonUniformIndex)", + "Unpack4x8(unpackMode,pk)", + "Pack4x8(packMode,x,y,z,w)", + "IsHelperLane()", + "QuadVote(cond,op)", + "TextureGatherRaw(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1)", + "SampleCmpLevel(srv,sampler,coord0,coord1,coord2,coord3,offset0,offset1,offset2,compareValue,lod)", + "TextureStoreSample(srv,coord0,coord1,coord2,value0,value1,value2,value3,mask,sampleIdx)" }; // clang-format on @@ -1261,8 +1269,13 @@ void Program::MakeDisassemblyString() packedProps[1] = packed[1]->getU32(); bool uav = (packedProps[0] & (1 << 12)) != 0; + bool rov = (packedProps[0] & (1 << 13)) != 0; + bool globallyCoherent = (packedProps[0] & (1 << 14)) != 0; + bool sampelCmpOrCounter = (packedProps[0] & (1 << 15)) != 0; ResourceKind resKind = (ResourceKind)(packedProps[0] & 0xFF); ResourceClass resClass; + if(sampelCmpOrCounter && resKind == ResourceKind::Sampler) + resKind = ResourceKind::SamplerComparison; if(resKind == ResourceKind::Sampler || resKind == ResourceKind::SamplerComparison) resClass = ResourceClass::Sampler; else if(resKind == ResourceKind::CBuffer) @@ -1277,22 +1290,23 @@ void Program::MakeDisassemblyString() bool srv = (resClass == ResourceClass::SRV); ComponentType compType = ComponentType(packedProps[1] & 0xFF); - bool singleComp = (packedProps[1] & 0xFF00) == 1; + uint8_t compCount = (packedProps[1] & 0xFF00) >> 8; + + uint8_t feedbackType = packedProps[1] & 0xFF; uint32_t structStride = packedProps[1]; - bool rov = (packedProps[0] & (1 << 13)) != 0; - bool globallyCoherent = (packedProps[0] & (1 << 14)) != 0; - switch(resKind) { case ResourceKind::Unknown: m_Disassembly += "Unknown"; break; case ResourceKind::Texture1D: case ResourceKind::Texture2D: + case ResourceKind::Texture2DMS: case ResourceKind::Texture3D: case ResourceKind::TextureCube: case ResourceKind::Texture1DArray: case ResourceKind::Texture2DArray: + case ResourceKind::Texture2DMSArray: case ResourceKind::TextureCubeArray: case ResourceKind::TypedBuffer: if(globallyCoherent) @@ -1305,16 +1319,16 @@ void Program::MakeDisassemblyString() { case ResourceKind::Texture1D: m_Disassembly += "Texture1D"; break; case ResourceKind::Texture2D: m_Disassembly += "Texture2D"; break; + case ResourceKind::Texture2DMS: m_Disassembly += "Texture2DMS"; break; case ResourceKind::Texture3D: m_Disassembly += "Texture3D"; break; case ResourceKind::TextureCube: m_Disassembly += "TextureCube"; break; case ResourceKind::Texture1DArray: m_Disassembly += "Texture1DArray"; break; case ResourceKind::Texture2DArray: m_Disassembly += "Texture2DArray"; break; + case ResourceKind::Texture2DMSArray: m_Disassembly += "Texture2DMSArray"; break; case ResourceKind::TextureCubeArray: m_Disassembly += "TextureCubeArray"; break; case ResourceKind::TypedBuffer: m_Disassembly += "TypedBuffer"; break; default: break; } - m_Disassembly += StringFormat::Fmt("<%s%s>", ToStr(compType).c_str(), - !srv && !singleComp ? "[vec]" : ""); break; case ResourceKind::RTAccelerationStructure: m_Disassembly += "RTAccelerationStructure"; @@ -1327,7 +1341,10 @@ void Program::MakeDisassemblyString() if(globallyCoherent) m_Disassembly += "globallycoherent "; m_Disassembly += srv ? "StructuredBuffer" : "RWStructuredBuffer"; - m_Disassembly += StringFormat::Fmt("", structStride); + m_Disassembly += StringFormat::Fmt("", ToStr(compType).c_str()); - break; - case ResourceKind::Texture2DMSArray: - m_Disassembly += StringFormat::Fmt("Texture2DMSArray<%>", ToStr(compType).c_str()); - break; case ResourceKind::CBuffer: RDCASSERT(resClass == ResourceClass::CBuffer); m_Disassembly += "CBuffer"; @@ -1364,6 +1375,30 @@ void Program::MakeDisassemblyString() m_Disassembly += "SamplerComparisonState"; break; } + + if(resKind == ResourceKind::FeedbackTexture2D || + resKind == ResourceKind::FeedbackTexture2DArray) + { + if(feedbackType == 0) + m_Disassembly += ""; + else if(feedbackType == 1) + m_Disassembly += ""; + else + m_Disassembly += ""; + } + else if(resKind == ResourceKind::Texture1D || resKind == ResourceKind::Texture2D || + resKind == ResourceKind::Texture3D || resKind == ResourceKind::TextureCube || + resKind == ResourceKind::Texture1DArray || + resKind == ResourceKind::Texture2DArray || + resKind == ResourceKind::TextureCubeArray || + resKind == ResourceKind::TypedBuffer || resKind == ResourceKind::Texture2DMS || + resKind == ResourceKind::Texture2DMSArray) + { + m_Disassembly += "<"; + if(compCount > 1) + m_Disassembly += StringFormat::Fmt("%dx", compCount); + m_Disassembly += StringFormat::Fmt("%s>", ToStr(compType).c_str()); + } } } }