1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
// Copyright (C) 2020 Klaralvdalens Datakonsult AB (KDAB).
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
#include "rhiresourcemanagers_p.h"
QT_BEGIN_NAMESPACE
namespace Qt3DRender {
namespace Render {
namespace Rhi {
RHIResourceManagers::RHIResourceManagers()
: m_rhiBufferManager(new RHIBufferManager()),
m_rhiShaderManager(new RHIShaderManager()),
m_rhiTextureManager(new RHITextureManager()),
m_rhiRenderTargetManager(new RHIRenderTargetManager()),
m_rhiGraphicsPipelineManager(new RHIGraphicsPipelineManager()),
m_rhiComputePipelineManager(new RHIComputePipelineManager())
{
}
RHIResourceManagers::~RHIResourceManagers()
{
delete m_rhiTextureManager;
delete m_rhiShaderManager;
delete m_rhiBufferManager;
delete m_rhiRenderTargetManager;
delete m_rhiGraphicsPipelineManager;
delete m_rhiComputePipelineManager;
}
void RHIResourceManagers::releaseAllResources()
{
auto releaseAll = [](auto *manager) noexcept {
// Release all resources reference by a key
manager->releaseAllResources();
// Release remaining resources which were allocated manually but had no key
const auto handles = manager->activeHandles();
for (const auto &handle : handles) {
manager->release(handle);
}
};
releaseAll(m_rhiTextureManager);
releaseAll(m_rhiBufferManager);
qDeleteAll(m_rhiShaderManager->takeActiveResources());
releaseAll(m_rhiRenderTargetManager);
releaseAll(m_rhiGraphicsPipelineManager);
releaseAll(m_rhiComputePipelineManager);
}
int RHIGraphicsPipelineManager::getIdForAttributeVec(const std::vector<AttributeInfo> &attributesInfo)
{
auto it = std::find(m_attributesInfo.begin(),
m_attributesInfo.end(),
attributesInfo);
if (it == m_attributesInfo.end()) {
m_attributesInfo.emplace_back(attributesInfo);
return int(m_attributesInfo.size()) - 1;
}
return std::distance(m_attributesInfo.begin(), it);
}
int RHIGraphicsPipelineManager::getIdForRenderStates(const RenderStateSetPtr &stateSet)
{
if (!stateSet)
return -1;
const std::vector<StateVariant> &states = stateSet->states();
auto it = std::find(m_renderStates.begin(),
m_renderStates.end(),
states);
if (it == m_renderStates.end()) {
m_renderStates.emplace_back(states);
return int(m_renderStates.size()) - 1;
}
return std::distance(m_renderStates.begin(), it);
}
namespace {
template<typename Manager>
void erasePipelinesReferencingShader(Manager *manager, const Qt3DCore::QNodeId &shaderId)
{
const auto handles = manager->activeHandles(); // copy
for (const auto &handle : handles) {
const auto &key = handle->key();
if (key.shader == shaderId)
manager->releaseResource(key);
}
}
template<typename Manager>
void erasePipelinesReferencingRenderTargetId(Manager *manager, const Qt3DCore::QNodeId &renderTargetId)
{
const auto handles = manager->activeHandles(); // copy
for (const auto &handle : handles) {
const auto &key = handle->key();
if (key.renderTarget == renderTargetId)
manager->releaseResource(key);
}
}
} // anonymous
void RHIGraphicsPipelineManager::releasePipelinesReferencingShader(const Qt3DCore::QNodeId &shaderId)
{
erasePipelinesReferencingShader(this, shaderId);
}
void RHIGraphicsPipelineManager::releasePipelinesReferencingRenderTarget(const Qt3DCore::QNodeId &renderTargetId)
{
erasePipelinesReferencingRenderTargetId(this, renderTargetId);
}
void RHIComputePipelineManager::releasePipelinesReferencingShader(const Qt3DCore::QNodeId &shaderId)
{
erasePipelinesReferencingShader(this, shaderId);
}
} // Rhi
} // Render
} // Qt3DRender
QT_END_NAMESPACE
|