[d3d10] Create type reflection objects on demand

See previous commits for details. Fixes #1507.
This commit is contained in:
Philip Rebohle 2020-03-12 21:02:26 +01:00
parent 3d81b3eb82
commit 33b0d4c991
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 14 additions and 10 deletions

View File

@ -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<D3D10ShaderReflectionType>(pMemberType) }).first;
}
return nullptr;
return entry->second.get();
}

View File

@ -37,8 +37,11 @@ namespace dxvk {
private:
ID3D11ShaderReflectionType* m_d3d11;
std::vector<D3D10ShaderReflectionType> m_members;
ID3D11ShaderReflectionType* m_d3d11;
std::unordered_map<
ID3D11ShaderReflectionType*,
std::unique_ptr<D3D10ShaderReflectionType>> m_members;
ID3D10ShaderReflectionType* FindMemberType(
ID3D11ShaderReflectionType* pMemberType);