Flutter Impeller
impeller::DescriptorPoolVK Class Reference

A per-frame descriptor pool. Descriptors from this pool don't need to be freed individually. Instead, the pool must be collected after all the descriptors allocated from it are done being used. More...

#include <descriptor_pool_vk.h>

Public Member Functions

 DescriptorPoolVK (std::weak_ptr< const ContextVK > context)
 
 DescriptorPoolVK (std::weak_ptr< const ContextVK > context, DescriptorCacheMap descriptor_sets, std::vector< vk::UniqueDescriptorPool > pools)
 
 ~DescriptorPoolVK ()
 
fml::StatusOr< vk::DescriptorSet > AllocateDescriptorSets (const vk::DescriptorSetLayout &layout, PipelineKey pipeline_key, const ContextVK &context_vk)
 

Friends

class DescriptorPoolRecyclerVK
 

Detailed Description

A per-frame descriptor pool. Descriptors from this pool don't need to be freed individually. Instead, the pool must be collected after all the descriptors allocated from it are done being used.

The pool or it's descriptors may not be accessed from multiple threads.

Encoders create pools as necessary as they have the same threading and lifecycle restrictions.

Definition at line 36 of file descriptor_pool_vk.h.

Constructor & Destructor Documentation

◆ DescriptorPoolVK() [1/2]

impeller::DescriptorPoolVK::DescriptorPoolVK ( std::weak_ptr< const ContextVK context)
explicit

Definition at line 29 of file descriptor_pool_vk.cc.

30  : context_(std::move(context)) {}

◆ DescriptorPoolVK() [2/2]

impeller::DescriptorPoolVK::DescriptorPoolVK ( std::weak_ptr< const ContextVK context,
DescriptorCacheMap  descriptor_sets,
std::vector< vk::UniqueDescriptorPool >  pools 
)

Definition at line 36 of file descriptor_pool_vk.cc.

39  : context_(std::move(context)),
40  descriptor_sets_(std::move(descriptor_sets)),
41  pools_(std::move(pools)) {}

◆ ~DescriptorPoolVK()

impeller::DescriptorPoolVK::~DescriptorPoolVK ( )

Definition at line 43 of file descriptor_pool_vk.cc.

43  {
44  if (pools_.empty()) {
45  return;
46  }
47 
48  auto const context = context_.lock();
49  if (!context) {
50  return;
51  }
52  auto const recycler = context->GetDescriptorPoolRecycler();
53  if (!recycler) {
54  return;
55  }
56 
57  recycler->Reclaim(std::move(descriptor_sets_), std::move(pools_));
58 }

Member Function Documentation

◆ AllocateDescriptorSets()

fml::StatusOr< vk::DescriptorSet > impeller::DescriptorPoolVK::AllocateDescriptorSets ( const vk::DescriptorSetLayout &  layout,
PipelineKey  pipeline_key,
const ContextVK context_vk 
)

Definition at line 60 of file descriptor_pool_vk.cc.

63  {
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;
70  }
71 
72  if (pools_.empty()) {
73  CreateNewPool(context_vk);
74  }
75 
76  vk::DescriptorSetAllocateInfo set_info;
77  set_info.setDescriptorPool(pools_.back().get());
78  set_info.setPSetLayouts(&layout);
79  set_info.setDescriptorSetCount(1);
80 
81  vk::DescriptorSet set;
82  auto result = context_vk.GetDevice().allocateDescriptorSets(&set_info, &set);
83  if (result == vk::Result::eErrorOutOfPoolMemory) {
84  // If the pool ran out of memory, we need to create a new pool.
85  CreateNewPool(context_vk);
86  set_info.setDescriptorPool(pools_.back().get());
87  result = context_vk.GetDevice().allocateDescriptorSets(&set_info, &set);
88  }
89  auto lookup_result =
90  descriptor_sets_.try_emplace(pipeline_key, DescriptorCache{});
91  lookup_result.first->second.used.push_back(set);
92 
93  if (result != vk::Result::eSuccess) {
94  VALIDATION_LOG << "Could not allocate descriptor sets: "
95  << vk::to_string(result);
96  return fml::Status(fml::StatusCode::kUnknown, "");
97  }
98  return set;
99 }
#define VALIDATION_LOG
Definition: validation.h:91

References impeller::ContextVK::GetDevice(), and VALIDATION_LOG.

Referenced by impeller::testing::TEST().

Friends And Related Function Documentation

◆ DescriptorPoolRecyclerVK

friend class DescriptorPoolRecyclerVK
friend

Definition at line 52 of file descriptor_pool_vk.h.


The documentation for this class was generated from the following files: