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();