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