Blender V4.3
vk_descriptor_set_layouts.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2024 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10#include "vk_backend.hh"
11#include "vk_memory.hh"
12
13namespace blender::gpu {
15{
16 vk_descriptor_set_layout_create_info_ = {};
17 vk_descriptor_set_layout_create_info_.sType =
18 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19}
20
25
27 bool &r_created,
28 bool &r_needed)
29{
30 r_created = false;
31 r_needed = !info.bindings.is_empty();
32 if (r_needed == false) {
33 return VK_NULL_HANDLE;
34 }
35
36 std::scoped_lock mutex(mutex_);
37
38 VkDescriptorSetLayout *layout = vk_descriptor_set_layouts_.lookup_ptr(info);
39 if (layout) {
40 return *layout;
41 }
42
43 update_layout_bindings(info);
44
45 vk_descriptor_set_layout_create_info_.bindingCount = vk_descriptor_set_layout_bindings_.size();
46 vk_descriptor_set_layout_create_info_.pBindings = vk_descriptor_set_layout_bindings_.data();
47
48 const VKDevice &device = VKBackend::get().device;
49 VkDescriptorSetLayout vk_descriptor_set_layout = VK_NULL_HANDLE;
51 vkCreateDescriptorSetLayout(device.vk_handle(),
52 &vk_descriptor_set_layout_create_info_,
53 vk_allocation_callbacks,
54 &vk_descriptor_set_layout);
55 BLI_assert(vk_descriptor_set_layout != VK_NULL_HANDLE);
56
57 vk_descriptor_set_layout_create_info_.bindingCount = 0;
58 vk_descriptor_set_layout_create_info_.pBindings = nullptr;
59 vk_descriptor_set_layout_bindings_.clear();
60 vk_descriptor_set_layouts_.add(info, vk_descriptor_set_layout);
61 r_created = true;
62
63 return vk_descriptor_set_layout;
64}
65
66void VKDescriptorSetLayouts::update_layout_bindings(const VKDescriptorSetLayoutInfo &info)
67{
68 BLI_assert(vk_descriptor_set_layout_bindings_.is_empty());
69 vk_descriptor_set_layout_bindings_.reserve(info.bindings.size());
70
71 uint32_t index = 0;
72 for (const VkDescriptorType &vk_descriptor_type : info.bindings) {
73 VkDescriptorSetLayoutBinding binding = {};
74 binding.binding = index++;
75 binding.descriptorCount = 1;
76 binding.descriptorType = vk_descriptor_type;
77 binding.pImmutableSamplers = VK_NULL_HANDLE;
78 binding.stageFlags = info.vk_shader_stage_flags;
79 vk_descriptor_set_layout_bindings_.append(binding);
80 }
81}
82
84{
85 std::scoped_lock mutex(mutex_);
87 const VKDevice &device = VKBackend::get().device;
88 for (VkDescriptorSetLayout &vk_descriptor_set_layout : vk_descriptor_set_layouts_.values()) {
89 vkDestroyDescriptorSetLayout(
90 device.vk_handle(), vk_descriptor_set_layout, vk_allocation_callbacks);
91 }
92 vk_descriptor_set_layouts_.clear();
93}
94
95} // namespace blender::gpu
#define BLI_assert(a)
Definition BLI_assert.h:50
ThreadMutex mutex
int64_t size() const
void append(const T &value)
bool is_empty() const
void reserve(const int64_t min_capacity)
static VKBackend & get()
Definition vk_backend.hh:92
VkDescriptorSetLayout get_or_create(const VKDescriptorSetLayoutInfo &info, bool &r_created, bool &r_needed)
VkDevice vk_handle() const
Definition vk_device.hh:224
unsigned int uint32_t
Definition stdint.h:80
#define VK_ALLOCATION_CALLBACKS
Definition vk_memory.hh:58