From 33b0d4c9915983b6a2bb068c50f5274708061655 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Thu, 12 Mar 2020 21:02:26 +0100 Subject: [PATCH] [d3d10] Create type reflection objects on demand See previous commits for details. Fixes #1507. --- src/d3d10/d3d10_reflection.cpp | 17 +++++++++-------- src/d3d10/d3d10_reflection.h | 7 +++++-- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/d3d10/d3d10_reflection.cpp b/src/d3d10/d3d10_reflection.cpp index 0d3432dc..d49dea90 100644 --- a/src/d3d10/d3d10_reflection.cpp +++ b/src/d3d10/d3d10_reflection.cpp @@ -5,11 +5,7 @@ namespace dxvk { D3D10ShaderReflectionType::D3D10ShaderReflectionType( ID3D11ShaderReflectionType* d3d11) : m_d3d11(d3d11) { - D3D11_SHADER_TYPE_DESC d3d11Desc; - m_d3d11->GetDesc(&d3d11Desc); - for (uint32_t i = 0; i < d3d11Desc.Members; i++) - m_members.emplace_back(m_d3d11->GetMemberTypeByIndex(i)); } @@ -57,12 +53,17 @@ namespace dxvk { ID3D10ShaderReflectionType* D3D10ShaderReflectionType::FindMemberType( ID3D11ShaderReflectionType* pMemberType) { - for (size_t i = 0; i < m_members.size(); i++) { - if (m_members[i].GetD3D11Iface() == pMemberType) - return &m_members[i]; + if (!pMemberType) + return nullptr; + + auto entry = m_members.find(pMemberType); + + if (entry == m_members.end()) { + entry = m_members.insert({ pMemberType, + std::make_unique(pMemberType) }).first; } - return nullptr; + return entry->second.get(); } diff --git a/src/d3d10/d3d10_reflection.h b/src/d3d10/d3d10_reflection.h index 14bc0efd..b25a92ce 100644 --- a/src/d3d10/d3d10_reflection.h +++ b/src/d3d10/d3d10_reflection.h @@ -37,8 +37,11 @@ namespace dxvk { private: - ID3D11ShaderReflectionType* m_d3d11; - std::vector m_members; + ID3D11ShaderReflectionType* m_d3d11; + + std::unordered_map< + ID3D11ShaderReflectionType*, + std::unique_ptr> m_members; ID3D10ShaderReflectionType* FindMemberType( ID3D11ShaderReflectionType* pMemberType);