Manages the lifecycle of a single |vk::CommandPool|.
More...
#include <command_pool_vk.h>
Manages the lifecycle of a single |vk::CommandPool|.
A |vk::CommandPool| is expensive to create and reset. This class manages the lifecycle of a single |vk::CommandPool| by returning to the origin (|CommandPoolRecyclerVK|) when it is destroyed to be reused.
- Warning
- This class is not thread-safe.
- See also
- |CommandPoolRecyclerVK|
Definition at line 32 of file command_pool_vk.h.
◆ ~CommandPoolVK()
| impeller::CommandPoolVK::~CommandPoolVK |
( |
| ) |
|
Definition at line 72 of file command_pool_vk.cc.
77 std::shared_ptr<DeviceHolderVK> device_holder = device_holder_.lock();
80 for (
auto& buffer : collected_buffers_) {
83 for (
auto& buffer : unused_command_buffers_) {
89 auto const context = context_.lock();
93 auto const recycler =
context->GetCommandPoolRecycler();
99 size_t unused_count = unused_command_buffers_.size();
100 for (
auto i = 0u; i < unused_command_buffers_.size(); i++) {
101 collected_buffers_.push_back(std::move(unused_command_buffers_[i]));
103 unused_command_buffers_.clear();
105 auto reset_pool_when_dropped = BackgroundCommandPoolVK(
106 std::move(pool_), std::move(collected_buffers_), unused_count, recycler);
108 UniqueResourceVKT<BackgroundCommandPoolVK> pool(
109 context->GetResourceManager(), std::move(reset_pool_when_dropped));
std::shared_ptr< ContextGLES > context
References context.
◆ CommandPoolVK()
| impeller::CommandPoolVK::CommandPoolVK |
( |
vk::UniqueCommandPool |
pool, |
|
|
std::vector< vk::UniqueCommandBuffer > && |
buffers, |
|
|
std::weak_ptr< ContextVK > |
context, |
|
|
std::weak_ptr< DeviceHolderVK > |
device_holder |
|
) |
| |
|
inline |
Creates a resource that manages the life of a command pool.
- Parameters
-
| [in] | pool | The command pool to manage. |
| [in] | buffers | Zero or more command buffers in an initial state. |
| [in] | recycler | The context that will be notified on destruction. |
Definition at line 41 of file command_pool_vk.h.
45 : pool_(std::move(pool)),
46 unused_command_buffers_(std::move(buffers)),
48 device_holder_(std::move(device_holder)) {}
◆ CollectCommandBuffer()
| void impeller::CommandPoolVK::CollectCommandBuffer |
( |
vk::UniqueCommandBuffer && |
buffer | ) |
|
Collects the given |vk::CommandBuffer| to be retained.
- Parameters
-
| [in] | buffer | The |vk::CommandBuffer| to collect. |
- See also
- |GarbageCollectBuffersIfAble|
Definition at line 141 of file command_pool_vk.cc.
142 Lock lock(pool_mutex_);
149 collected_buffers_.push_back(std::move(buffer));
◆ CreateCommandBuffer()
| vk::UniqueCommandBuffer impeller::CommandPoolVK::CreateCommandBuffer |
( |
| ) |
|
Creates and returns a new |vk::CommandBuffer|.
- Returns
- Always returns a new |vk::CommandBuffer|, but if for any reason a valid command buffer could not be created, it will be a
{} default instance (i.e. while being torn down).
Definition at line 113 of file command_pool_vk.cc.
114 auto const context = context_.lock();
119 Lock lock(pool_mutex_);
123 if (!unused_command_buffers_.empty()) {
124 vk::UniqueCommandBuffer buffer = std::move(unused_command_buffers_.back());
125 unused_command_buffers_.pop_back();
129 auto const device =
context->GetDevice();
130 vk::CommandBufferAllocateInfo info;
131 info.setCommandPool(pool_.get());
132 info.setCommandBufferCount(1u);
133 info.setLevel(vk::CommandBufferLevel::ePrimary);
134 auto [result, buffers] = device.allocateCommandBuffersUnique(info);
135 if (result != vk::Result::eSuccess) {
138 return std::move(buffers[0]);
References context.
The documentation for this class was generated from the following files: