@@ -21,8 +21,6 @@ class IGPUDescriptorSetLayout;
21
21
22
22
class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendObject
23
23
{
24
- friend class IGPUDescriptorSet ;
25
-
26
24
public:
27
25
enum E_CREATE_FLAGS : uint32_t
28
26
{
@@ -61,14 +59,15 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
61
59
}
62
60
63
61
bool createDescriptorSets (uint32_t count, const IGPUDescriptorSetLayout* const * layouts, core::smart_refctd_ptr<IGPUDescriptorSet>* output);
64
-
65
- // TODO(achal): Remove.
66
- bool freeDescriptorSets (const uint32_t descriptorSetCount, IGPUDescriptorSet* const * const descriptorSets);
62
+
63
+ bool reset ();
67
64
68
65
inline uint32_t getCapacity () const { return m_maxSets; }
69
66
70
67
protected:
71
- explicit IDescriptorPool (core::smart_refctd_ptr<const ILogicalDevice>&& dev, const IDescriptorPool::E_CREATE_FLAGS flags, uint32_t _maxSets, const uint32_t poolSizeCount, const IDescriptorPool::SDescriptorPoolSize* poolSizes) : IBackendObject(std::move(dev)), m_maxSets(_maxSets), m_flags(flags)
68
+ explicit IDescriptorPool (core::smart_refctd_ptr<const ILogicalDevice>&& dev, const IDescriptorPool::E_CREATE_FLAGS flags, uint32_t _maxSets,
69
+ const uint32_t poolSizeCount, const IDescriptorPool::SDescriptorPoolSize* poolSizes)
70
+ : IBackendObject(std::move(dev)), m_maxSets(_maxSets), m_flags(flags), m_version(0u )
72
71
{
73
72
std::fill_n (m_maxDescriptorCount, static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT), 0u );
74
73
@@ -79,7 +78,7 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
79
78
m_descriptorAllocators[i] = std::make_unique<allocator_state_t >(m_maxDescriptorCount[i], m_flags & ECF_FREE_DESCRIPTOR_SET_BIT);
80
79
81
80
// For (possibly) mutable samplers.
82
- m_descriptorAllocators[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)] = std::make_unique<allocator_state_t >(m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT )], m_flags & ECF_FREE_DESCRIPTOR_SET_BIT);
81
+ m_descriptorAllocators[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)] = std::make_unique<allocator_state_t >(m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER )], m_flags & ECF_FREE_DESCRIPTOR_SET_BIT);
83
82
84
83
// Initialize the storages.
85
84
m_textureStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUImageView>>[]>(m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER)]);
@@ -93,19 +92,65 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
93
92
virtual ~IDescriptorPool () {}
94
93
95
94
virtual bool createDescriptorSets_impl (uint32_t count, const IGPUDescriptorSetLayout* const * layouts, SDescriptorOffsets* const offsets, core::smart_refctd_ptr<IGPUDescriptorSet>* output) = 0;
96
- virtual bool freeDescriptorSets_impl (const uint32_t descriptorSetCount, IGPUDescriptorSet* const * const descriptorSets) = 0;
95
+
96
+ virtual bool reset_impl () = 0;
97
97
98
98
uint32_t m_maxSets;
99
99
100
100
private:
101
+ inline core::smart_refctd_ptr<asset::IDescriptor>* getDescriptorStorage (const asset::IDescriptor::E_TYPE type) const
102
+ {
103
+ core::smart_refctd_ptr<asset::IDescriptor>* baseAddress;
104
+ switch (type)
105
+ {
106
+ case asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER:
107
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_textureStorage.get ());
108
+ break ;
109
+ case asset::IDescriptor::E_TYPE::ET_STORAGE_IMAGE:
110
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_storageImageStorage.get ());
111
+ break ;
112
+ case asset::IDescriptor::E_TYPE::ET_UNIFORM_TEXEL_BUFFER:
113
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UTB_STBStorage.get ());
114
+ break ;
115
+ case asset::IDescriptor::E_TYPE::ET_STORAGE_TEXEL_BUFFER:
116
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UTB_STBStorage.get ()) + m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_TEXEL_BUFFER)];
117
+ break ;
118
+ case asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER:
119
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ());
120
+ break ;
121
+ case asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER:
122
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ()) + m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)];
123
+ break ;
124
+ case asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER_DYNAMIC:
125
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ()) + (m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)] + m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER)]);
126
+ break ;
127
+ case asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER_DYNAMIC:
128
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ()) + (m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)] + m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER)] + m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER_DYNAMIC)]);
129
+ break ;
130
+ case asset::IDescriptor::E_TYPE::ET_INPUT_ATTACHMENT:
131
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_storageImageStorage.get ()) + m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_IMAGE)];
132
+ break ;
133
+ case asset::IDescriptor::E_TYPE::ET_ACCELERATION_STRUCTURE:
134
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_accelerationStructureStorage.get ());
135
+ break ;
136
+ default :
137
+ assert (!" Invalid code path." );
138
+ return nullptr ;
139
+ }
140
+
141
+ return baseAddress;
142
+ }
143
+
144
+ inline core::smart_refctd_ptr<IGPUSampler>* getMutableSamplerStorage () const
145
+ {
146
+ return reinterpret_cast <core::smart_refctd_ptr<IGPUSampler>*>(m_mutableSamplerStorage.get ());
147
+ }
148
+
149
+ friend class IGPUDescriptorSet ;
101
150
// Returns the offset into the pool's descriptor storage. These offsets will be combined
102
151
// later with base memory addresses to get the actual memory address where we put the core::smart_refctd_ptr<const IDescriptor>.
103
152
SDescriptorOffsets allocateDescriptorOffsets (const IGPUDescriptorSetLayout* layout);
104
153
105
- const IDescriptorPool::E_CREATE_FLAGS m_flags;
106
-
107
- uint32_t m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)];
108
-
109
154
struct allocator_state_t
110
155
{
111
156
allocator_state_t (const uint32_t maxDescriptorCount, const bool allowsFreeing)
@@ -145,6 +190,22 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
145
190
generalAllocator.free_addr (allocatedOffset, count);
146
191
}
147
192
193
+ inline void reset (const bool allowsFreeing)
194
+ {
195
+ if (!allowsFreeing)
196
+ linearAllocator.reset ();
197
+ else
198
+ generalAllocator.reset ();
199
+ }
200
+
201
+ inline uint32_t getAllocatedDescriptorCount (const bool allowsFreeing) const
202
+ {
203
+ if (!allowsFreeing)
204
+ return linearAllocator.get_allocated_size ();
205
+ else
206
+ return generalAllocator.get_allocated_size ();
207
+ }
208
+
148
209
union
149
210
{
150
211
core::LinearAddressAllocator<uint32_t > linearAllocator;
@@ -154,6 +215,10 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
154
215
};
155
216
std::unique_ptr<allocator_state_t > m_descriptorAllocators[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT) + 1 ];
156
217
218
+ const IDescriptorPool::E_CREATE_FLAGS m_flags;
219
+ uint32_t m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)];
220
+ std::atomic_uint32_t m_version;
221
+
157
222
std::unique_ptr<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUImageView>>[]> m_textureStorage;
158
223
std::unique_ptr<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUSampler>>[]> m_mutableSamplerStorage;
159
224
std::unique_ptr<core::StorageTrivializer<core::smart_refctd_ptr<IGPUImageView>>[]> m_storageImageStorage; // storage image | input attachment
0 commit comments