Blender V5.0
vk_descriptor_pools.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
10#include "vk_backend.hh"
11#include "vk_context.hh"
12#include "vk_device.hh"
13
14namespace blender::gpu {
15
17{
18 const VKDevice &device = VKBackend::get().device;
19 for (const VkDescriptorPool vk_descriptor_pool : recycled_pools_) {
20 vkDestroyDescriptorPool(device.vk_handle(), vk_descriptor_pool, nullptr);
21 }
22 recycled_pools_.clear();
23 if (vk_descriptor_pool_ != VK_NULL_HANDLE) {
24 vkDestroyDescriptorPool(device.vk_handle(), vk_descriptor_pool_, nullptr);
25 vk_descriptor_pool_ = VK_NULL_HANDLE;
26 }
27}
28
30{
31 ensure_pool(device);
32}
33
34void VKDescriptorPools::ensure_pool(const VKDevice &device)
35{
36 if (vk_descriptor_pool_ != VK_NULL_HANDLE) {
37 return;
38 }
39
40 std::scoped_lock lock(mutex_);
41 if (!recycled_pools_.is_empty()) {
42 vk_descriptor_pool_ = recycled_pools_.pop_last();
43 return;
44 }
45
46 Vector<VkDescriptorPoolSize> pool_sizes = {
47 {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, POOL_SIZE_STORAGE_BUFFER},
48 {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, POOL_SIZE_STORAGE_IMAGE},
49 {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, POOL_SIZE_COMBINED_IMAGE_SAMPLER},
50 {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, POOL_SIZE_UNIFORM_BUFFER},
51 {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, POOL_SIZE_UNIFORM_TEXEL_BUFFER},
52 {VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, POOL_SIZE_INPUT_ATTACHMENT}};
53 VkDescriptorPoolCreateInfo pool_info = {};
54 pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
55 pool_info.maxSets = POOL_SIZE_DESCRIPTOR_SETS;
56 pool_info.poolSizeCount = pool_sizes.size();
57 pool_info.pPoolSizes = pool_sizes.data();
58 vkCreateDescriptorPool(device.vk_handle(), &pool_info, nullptr, &vk_descriptor_pool_);
59}
60
61void VKDescriptorPools::discard_active_pool(VKContext &context)
62{
63 context.discard_pool.discard_descriptor_pool_for_reuse(vk_descriptor_pool_, this);
64 vk_descriptor_pool_ = VK_NULL_HANDLE;
65}
66
67void VKDescriptorPools::recycle(VkDescriptorPool vk_descriptor_pool)
68{
69 const VKDevice &device = VKBackend::get().device;
70 vkResetDescriptorPool(device.vk_handle(), vk_descriptor_pool, 0);
71 std::scoped_lock lock(mutex_);
72 recycled_pools_.append(vk_descriptor_pool);
73}
74
75VkDescriptorSet VKDescriptorPools::allocate(const VkDescriptorSetLayout descriptor_set_layout)
76{
77 BLI_assert(descriptor_set_layout != VK_NULL_HANDLE);
78 BLI_assert(vk_descriptor_pool_ != VK_NULL_HANDLE);
79 const VKDevice &device = VKBackend::get().device;
80
81 VkDescriptorSetAllocateInfo allocate_info = {};
82 allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
83 allocate_info.descriptorPool = vk_descriptor_pool_;
84 allocate_info.descriptorSetCount = 1;
85 allocate_info.pSetLayouts = &descriptor_set_layout;
86 VkDescriptorSet vk_descriptor_set = VK_NULL_HANDLE;
87 VkResult result = vkAllocateDescriptorSets(
88 device.vk_handle(), &allocate_info, &vk_descriptor_set);
89
90 if (ELEM(result, VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_FRAGMENTED_POOL)) {
91 {
92 VKContext &context = *VKContext::get();
93 discard_active_pool(context);
94 ensure_pool(device);
95 }
96 return allocate(descriptor_set_layout);
97 }
98
99 return vk_descriptor_set;
100}
101
102} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:46
#define ELEM(...)
volatile int lock
int64_t size() const
T pop_last()
bool is_empty() const
T * data()
static VKBackend & get()
Definition vk_backend.hh:91
static VKContext * get()
void recycle(VkDescriptorPool vk_descriptor_pool)
VkDescriptorSet allocate(const VkDescriptorSetLayout descriptor_set_layout)
void init(const VKDevice &vk_device)
VkDevice vk_handle() const
Definition vk_device.hh:311
int context(const bContext *C, const char *member, bContextDataResult *result)