From dd5590f8e5d46313e3716a3e8a1914f4ab663fad Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 11 Sep 2017 10:46:40 +0100 Subject: [PATCH] Fetch dispatch thread dimension always even if we don't disassemble * We need the dispatch thread dimension to be valid when creating the shader reflection data, which may happen before we've disassembled the bytecode. * We do a minimal pass just to skip to that opcode and extract the dims. --- .../driver/shaders/dxbc/dxbc_disassemble.cpp | 41 +++++++++++++++++++ .../driver/shaders/dxbc/dxbc_inspect.cpp | 6 +++ renderdoc/driver/shaders/dxbc/dxbc_inspect.h | 1 + 3 files changed, 48 insertions(+) diff --git a/renderdoc/driver/shaders/dxbc/dxbc_disassemble.cpp b/renderdoc/driver/shaders/dxbc/dxbc_disassemble.cpp index efd17d1bc..8c4645085 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_disassemble.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_disassemble.cpp @@ -294,6 +294,47 @@ void DXBCFile::FetchTypeVersion() m_Version.Minor = VersionToken::MinorVersion.Get(cur[0]); } +void DXBCFile::FetchThreadDim() +{ + if(m_HexDump.empty()) + return; + + uint32_t *begin = &m_HexDump.front(); + uint32_t *cur = begin; + uint32_t *end = &m_HexDump.back(); + + // skip header dword above + cur++; + + // skip length dword + cur++; + + while(cur < end) + { + uint32_t OpcodeToken0 = cur[0]; + + OpcodeType op = Opcode::Type.Get(OpcodeToken0); + + if(op == OPCODE_DCL_THREAD_GROUP) + { + DispatchThreadsDimension[0] = cur[1]; + DispatchThreadsDimension[1] = cur[2]; + DispatchThreadsDimension[2] = cur[3]; + break; + } + + if(op == OPCODE_CUSTOMDATA) + { + // length in opcode token is 0, full length is in second dword + cur += cur[1]; + } + else + { + cur += Opcode::Length.Get(OpcodeToken0); + } + } +} + void DXBCFile::DisassembleHexDump() { if(m_Disassembled) diff --git a/renderdoc/driver/shaders/dxbc/dxbc_inspect.cpp b/renderdoc/driver/shaders/dxbc/dxbc_inspect.cpp index 97a472afb..f068b5d13 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_inspect.cpp +++ b/renderdoc/driver/shaders/dxbc/dxbc_inspect.cpp @@ -847,6 +847,12 @@ DXBCFile::DXBCFile(const void *ByteCode, size_t ByteCodeLength) m_GuessedResources = true; } + // make sure to fetch the dispatch threads dimension from disassembly + if(!m_Disassembled && m_Type == D3D11_ShaderType_Compute) + { + FetchThreadDim(); + } + for(uint32_t chunkIdx = 0; chunkIdx < header->numChunks; chunkIdx++) { uint32_t *fourcc = (uint32_t *)(data + chunkOffsets[chunkIdx]); diff --git a/renderdoc/driver/shaders/dxbc/dxbc_inspect.h b/renderdoc/driver/shaders/dxbc/dxbc_inspect.h index 74218029f..c621d7540 100644 --- a/renderdoc/driver/shaders/dxbc/dxbc_inspect.h +++ b/renderdoc/driver/shaders/dxbc/dxbc_inspect.h @@ -405,6 +405,7 @@ private: DXBCFile(const DXBCFile &o); DXBCFile &operator=(const DXBCFile &o); + void FetchThreadDim(); void FetchTypeVersion(); void DisassembleHexDump(); void MakeDisassemblyString();