24 .texture_bindings = 256u,
25 .storage_bindings = 32,
26 .subpass_bindings = 4u
30 : context_(
std::move(context)) {}
32 void DescriptorPoolVK::Destroy() {
38 std::vector<vk::UniqueDescriptorPool> pools)
39 : context_(
std::move(context)),
40 descriptor_sets_(
std::move(descriptor_sets)),
41 pools_(
std::move(pools)) {}
48 auto const context = context_.lock();
52 auto const recycler = context->GetDescriptorPoolRecycler();
57 recycler->Reclaim(std::move(descriptor_sets_), std::move(pools_));
61 const vk::DescriptorSetLayout& layout,
64 DescriptorCacheMap::iterator existing = descriptor_sets_.find(pipeline_key);
65 if (existing != descriptor_sets_.end() && !existing->second.unused.empty()) {
66 auto descriptor_set = existing->second.unused.back();
67 existing->second.unused.pop_back();
68 existing->second.used.push_back(descriptor_set);
69 return descriptor_set;
73 CreateNewPool(context_vk);
76 vk::DescriptorSetAllocateInfo set_info;
77 set_info.setDescriptorPool(pools_.back().get());
78 set_info.setPSetLayouts(&layout);
79 set_info.setDescriptorSetCount(1);
81 vk::DescriptorSet set;
82 auto result = context_vk.
GetDevice().allocateDescriptorSets(&set_info, &set);
83 if (result == vk::Result::eErrorOutOfPoolMemory) {
85 CreateNewPool(context_vk);
86 set_info.setDescriptorPool(pools_.back().get());
87 result = context_vk.
GetDevice().allocateDescriptorSets(&set_info, &set);
91 lookup_result.first->second.used.push_back(set);
93 if (result != vk::Result::eSuccess) {
95 << vk::to_string(result);
96 return fml::Status(fml::StatusCode::kUnknown,
"");
101 fml::Status DescriptorPoolVK::CreateNewPool(
const ContextVK& context_vk) {
104 return fml::Status(fml::StatusCode::kUnknown,
105 "Failed to create descriptor pool");
107 pools_.emplace_back(std::move(new_pool));
108 return fml::Status();
113 std::vector<vk::UniqueDescriptorPool> pools) {
115 auto strong_context = context_.lock();
116 if (!strong_context) {
120 for (
auto& [_, cache] : descriptor_sets) {
121 cache.unused.insert(cache.unused.end(), cache.used.begin(),
128 Lock recycled_lock(recycled_mutex_);
130 auto& back_entry = recycled_.back();
131 back_entry->Destroy();
132 recycled_.pop_back();
134 recycled_.push_back(std::make_shared<DescriptorPoolVK>(
135 context_, std::move(descriptor_sets), std::move(pools)));
143 vk::UniqueDescriptorPool DescriptorPoolRecyclerVK::Create() {
144 auto strong_context = context_.lock();
145 if (!strong_context) {
150 std::vector<vk::DescriptorPoolSize> pools = {
151 vk::DescriptorPoolSize{vk::DescriptorType::eCombinedImageSampler,
153 vk::DescriptorPoolSize{vk::DescriptorType::eUniformBuffer,
155 vk::DescriptorPoolSize{vk::DescriptorType::eStorageBuffer,
157 vk::DescriptorPoolSize{vk::DescriptorType::eInputAttachment,
159 vk::DescriptorPoolCreateInfo pool_info;
164 pool_info.setPoolSizes(pools);
165 auto [result, pool] =
166 strong_context->GetDevice().createDescriptorPoolUnique(pool_info);
167 if (result != vk::Result::eSuccess) {
170 return std::move(pool);
173 std::shared_ptr<DescriptorPoolVK>
176 Lock recycled_lock(recycled_mutex_);
177 if (!recycled_.empty()) {
178 auto result = recycled_.back();
179 recycled_.pop_back();
183 return std::make_shared<DescriptorPoolVK>(context_);
const vk::Device & GetDevice() const
std::shared_ptr< DescriptorPoolRecyclerVK > GetDescriptorPoolRecycler() const
std::shared_ptr< DescriptorPoolVK > GetDescriptorPool()
void Reclaim(DescriptorCacheMap descriptor_sets, std::vector< vk::UniqueDescriptorPool > pools)
vk::UniqueDescriptorPool Get()
Gets a descriptor pool.
static constexpr size_t kMaxRecycledPools
The maximum number of descriptor pools this recycler will hold onto.
DescriptorPoolVK(std::weak_ptr< const ContextVK > context)
fml::StatusOr< vk::DescriptorSet > AllocateDescriptorSets(const vk::DescriptorSetLayout &layout, PipelineKey pipeline_key, const ContextVK &context_vk)
std::unordered_map< PipelineKey, DescriptorCache > DescriptorCacheMap
static constexpr const DescriptorPoolSize kDefaultBindingSize
Descriptor pools are always allocated with the following sizes.
Used and un-used descriptor sets.