Blender V4.3
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
10#include "vk_backend.hh"
11#include "vk_device.hh"
12#include "vk_memory.hh"
13
14namespace blender::gpu {
16
18{
20 const VKDevice &device = VKBackend::get().device;
21 for (const VkDescriptorPool vk_descriptor_pool : pools_) {
22 vkDestroyDescriptorPool(device.vk_handle(), vk_descriptor_pool, vk_allocation_callbacks);
23 }
24}
25
27{
28 BLI_assert(pools_.is_empty());
29 add_new_pool(device);
30}
31
33{
34 const VKDevice &device = VKBackend::get().device;
35 for (const VkDescriptorPool vk_descriptor_pool : pools_) {
36 vkResetDescriptorPool(device.vk_handle(), vk_descriptor_pool, 0);
37 }
38
39 active_pool_index_ = 0;
40}
41
42void VKDescriptorPools::add_new_pool(const VKDevice &device)
43{
45 Vector<VkDescriptorPoolSize> pool_sizes = {
46 {VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, POOL_SIZE_STORAGE_BUFFER},
47 {VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, POOL_SIZE_STORAGE_IMAGE},
48 {VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, POOL_SIZE_COMBINED_IMAGE_SAMPLER},
49 {VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, POOL_SIZE_UNIFORM_BUFFER},
50 {VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER, POOL_SIZE_UNIFORM_TEXEL_BUFFER},
51 };
52 VkDescriptorPoolCreateInfo pool_info = {};
53 pool_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
54 pool_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
55 pool_info.maxSets = POOL_SIZE_DESCRIPTOR_SETS;
56 pool_info.poolSizeCount = pool_sizes.size();
57 pool_info.pPoolSizes = pool_sizes.data();
58 VkDescriptorPool descriptor_pool = VK_NULL_HANDLE;
59 VkResult result = vkCreateDescriptorPool(
60 device.vk_handle(), &pool_info, vk_allocation_callbacks, &descriptor_pool);
61 UNUSED_VARS(result);
62 pools_.append(descriptor_pool);
63}
64
65VkDescriptorPool VKDescriptorPools::active_pool_get()
66{
67 BLI_assert(!pools_.is_empty());
68 return pools_[active_pool_index_];
69}
70
71void VKDescriptorPools::activate_next_pool()
72{
73 BLI_assert(!is_last_pool_active());
74 active_pool_index_ += 1;
75}
76
77void VKDescriptorPools::activate_last_pool()
78{
79 active_pool_index_ = pools_.size() - 1;
80}
81
82bool VKDescriptorPools::is_last_pool_active()
83{
84 return active_pool_index_ == pools_.size() - 1;
85}
86
87VkDescriptorSet VKDescriptorPools::allocate(const VkDescriptorSetLayout descriptor_set_layout)
88{
89 BLI_assert(descriptor_set_layout != VK_NULL_HANDLE);
90 const VKDevice &device = VKBackend::get().device;
91
92 VkDescriptorSetAllocateInfo allocate_info = {};
93 VkDescriptorPool pool = active_pool_get();
94 allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
95 allocate_info.descriptorPool = pool;
96 allocate_info.descriptorSetCount = 1;
97 allocate_info.pSetLayouts = &descriptor_set_layout;
98 VkDescriptorSet vk_descriptor_set = VK_NULL_HANDLE;
99 VkResult result = vkAllocateDescriptorSets(
100 device.vk_handle(), &allocate_info, &vk_descriptor_set);
101
102 if (ELEM(result, VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_FRAGMENTED_POOL)) {
103 if (is_last_pool_active()) {
104 add_new_pool(device);
105 activate_last_pool();
106 }
107 else {
108 activate_next_pool();
109 }
110 return allocate(descriptor_set_layout);
111 }
112
113 return vk_descriptor_set;
114}
115
116} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:50
#define UNUSED_VARS(...)
#define ELEM(...)
int64_t size() const
void append(const T &value)
bool is_empty() const
static VKBackend & get()
Definition vk_backend.hh:92
VkDescriptorSet allocate(const VkDescriptorSetLayout descriptor_set_layout)
void init(const VKDevice &vk_device)
VkDevice vk_handle() const
Definition vk_device.hh:224
#define VK_ALLOCATION_CALLBACKS
Definition vk_memory.hh:58