@@ -30,10 +30,11 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
30
30
ECF_HOST_ONLY_BIT_VALVE = 0x04
31
31
};
32
32
33
- struct SDescriptorPoolSize
33
+ struct SCreateInfo
34
34
{
35
- asset::IDescriptor::E_TYPE type;
36
- uint32_t count;
35
+ core::bitflag<E_CREATE_FLAGS> flags = ECF_NONE;
36
+ uint32_t maxSets = 0 ;
37
+ uint32_t maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)] = { 0 };
37
38
};
38
39
39
40
struct SDescriptorOffsets
@@ -62,31 +63,25 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
62
63
63
64
bool reset ();
64
65
65
- inline uint32_t getCapacity () const { return m_maxSets ; }
66
+ inline uint32_t getCapacity () const { return m_creationParameters. maxSets ; }
66
67
67
68
protected:
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 )
69
+ explicit IDescriptorPool (core::smart_refctd_ptr<const ILogicalDevice>&& dev, SCreateInfo&& createInfo)
70
+ : IBackendObject(std::move(dev)), m_creationParameters(std::move(createInfo)), m_version(0u )
71
71
{
72
- std::fill_n (m_maxDescriptorCount, static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT), 0u );
73
-
74
- for (auto i = 0 ; i < poolSizeCount; ++i)
75
- m_maxDescriptorCount[static_cast <uint32_t >(poolSizes[i].type )] += poolSizes[i].count ;
76
-
77
72
for (auto i = 0 ; i < static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT); ++i)
78
- m_descriptorAllocators[i] = std::make_unique<allocator_state_t >(m_maxDescriptorCount [i], m_flags & ECF_FREE_DESCRIPTOR_SET_BIT);
73
+ m_descriptorAllocators[i] = std::make_unique<allocator_state_t >(m_creationParameters. maxDescriptorCount [i], m_creationParameters. flags . hasFlags ( ECF_FREE_DESCRIPTOR_SET_BIT) );
79
74
80
75
// For (possibly) mutable samplers.
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);
76
+ m_descriptorAllocators[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)] = std::make_unique<allocator_state_t >(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER)], m_creationParameters. flags . hasFlags ( ECF_FREE_DESCRIPTOR_SET_BIT) );
82
77
83
78
// Initialize the storages.
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)]);
85
- m_mutableSamplerStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUSampler>>[]>(m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER)]);
86
- m_storageImageStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUImageView>>[]>(m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_IMAGE)] + m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_INPUT_ATTACHMENT)]);
87
- m_UBO_SSBOStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUBuffer>>[]>(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)] + m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER_DYNAMIC)]);
88
- m_UTB_STBStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUBufferView>>[]>(m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_TEXEL_BUFFER)] + m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER_DYNAMIC)]);
89
- m_accelerationStructureStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUAccelerationStructure>>[]>(m_maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_ACCELERATION_STRUCTURE)]);
79
+ m_textureStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUImageView>>[]>(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER)]);
80
+ m_mutableSamplerStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUSampler>>[]>(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER)]);
81
+ m_storageImageStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUImageView>>[]>(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_IMAGE)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_INPUT_ATTACHMENT)]);
82
+ m_UBO_SSBOStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUBuffer>>[]>(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER_DYNAMIC)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER_DYNAMIC)]);
83
+ m_UTB_STBStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUBufferView>>[]>(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_TEXEL_BUFFER)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER_DYNAMIC)]);
84
+ m_accelerationStructureStorage = std::make_unique<core::StorageTrivializer<core::smart_refctd_ptr<IGPUAccelerationStructure>>[]>(m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_ACCELERATION_STRUCTURE)]);
90
85
}
91
86
92
87
virtual ~IDescriptorPool () {}
@@ -95,8 +90,6 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
95
90
96
91
virtual bool reset_impl () = 0;
97
92
98
- uint32_t m_maxSets;
99
-
100
93
private:
101
94
inline core::smart_refctd_ptr<asset::IDescriptor>* getDescriptorStorage (const asset::IDescriptor::E_TYPE type) const
102
95
{
@@ -113,22 +106,22 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
113
106
baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UTB_STBStorage.get ());
114
107
break ;
115
108
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)];
109
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UTB_STBStorage.get ()) + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_TEXEL_BUFFER)];
117
110
break ;
118
111
case asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER:
119
112
baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ());
120
113
break ;
121
114
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)];
115
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ()) + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)];
123
116
break ;
124
117
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)]);
118
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ()) + (m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER)]);
126
119
break ;
127
120
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)]);
121
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_UBO_SSBOStorage.get ()) + (m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_BUFFER)] + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_UNIFORM_BUFFER_DYNAMIC)]);
129
122
break ;
130
123
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)];
124
+ baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_storageImageStorage.get ()) + m_creationParameters. maxDescriptorCount [static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_STORAGE_IMAGE)];
132
125
break ;
133
126
case asset::IDescriptor::E_TYPE::ET_ACCELERATION_STRUCTURE:
134
127
baseAddress = reinterpret_cast <core::smart_refctd_ptr<asset::IDescriptor>*>(m_accelerationStructureStorage.get ());
@@ -215,8 +208,7 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
215
208
};
216
209
std::unique_ptr<allocator_state_t > m_descriptorAllocators[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT) + 1 ];
217
210
218
- const IDescriptorPool::E_CREATE_FLAGS m_flags;
219
- uint32_t m_maxDescriptorCount[static_cast <uint32_t >(asset::IDescriptor::E_TYPE::ET_COUNT)];
211
+ const SCreateInfo m_creationParameters;
220
212
std::atomic_uint32_t m_version;
221
213
222
214
std::unique_ptr<core::StorageTrivializer<core::smart_refctd_ptr<video::IGPUImageView>>[]> m_textureStorage;
0 commit comments