15 vk_descriptor_set_layout_create_info_ = {};
16 vk_descriptor_set_layout_create_info_.sType =
17 VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
31 if (r_needed ==
false) {
32 return VK_NULL_HANDLE;
35 std::scoped_lock
mutex(mutex_);
37 VkDescriptorSetLayout *layout = vk_descriptor_set_layouts_.lookup_ptr(info);
42 update_layout_bindings(info);
46 vk_descriptor_set_layout_create_info_.bindingCount = vk_descriptor_set_layout_bindings_.size();
47 vk_descriptor_set_layout_create_info_.pBindings = vk_descriptor_set_layout_bindings_.data();
48 if (use_descriptor_buffer) {
49 vk_descriptor_set_layout_create_info_.flags =
50 VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT;
53 VkDescriptorSetLayout vk_descriptor_set_layout = VK_NULL_HANDLE;
54 vkCreateDescriptorSetLayout(device.
vk_handle(),
55 &vk_descriptor_set_layout_create_info_,
57 &vk_descriptor_set_layout);
58 BLI_assert(vk_descriptor_set_layout != VK_NULL_HANDLE);
60 vk_descriptor_set_layout_create_info_.bindingCount = 0;
61 vk_descriptor_set_layout_create_info_.pBindings =
nullptr;
62 vk_descriptor_set_layout_bindings_.clear();
63 vk_descriptor_set_layouts_.add(info, vk_descriptor_set_layout);
66 if (use_descriptor_buffer) {
67 descriptor_buffer_layouts_.add(
68 vk_descriptor_set_layout,
69 create_descriptor_buffer_layout(device, info, vk_descriptor_set_layout));
72 return vk_descriptor_set_layout;
81 for (
const VkDescriptorType &vk_descriptor_type : info.
bindings) {
82 VkDescriptorSetLayoutBinding binding = {};
83 binding.binding = index++;
84 binding.descriptorCount = 1;
85 binding.descriptorType = vk_descriptor_type;
86 binding.pImmutableSamplers = VK_NULL_HANDLE;
87 binding.stageFlags = vk_descriptor_type == VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT ?
88 VkShaderStageFlags(VK_SHADER_STAGE_FRAGMENT_BIT) :
89 info.vk_shader_stage_flags;
90 vk_descriptor_set_layout_bindings_.
append(binding);
96 std::scoped_lock
mutex(mutex_);
98 for (VkDescriptorSetLayout &vk_descriptor_set_layout : vk_descriptor_set_layouts_.values()) {
99 vkDestroyDescriptorSetLayout(device.
vk_handle(), vk_descriptor_set_layout,
nullptr);
101 vk_descriptor_set_layouts_.clear();
104static void align_size(VkDeviceSize &r_size, VkDeviceSize alignment)
107 r_size = (r_size + alignment - 1) & ~(alignment - 1);
110VKDescriptorBufferLayout VKDescriptorSetLayouts::create_descriptor_buffer_layout(
111 const VKDevice &device,
112 const VKDescriptorSetLayoutInfo &info,
113 VkDescriptorSetLayout vk_descriptor_set_layout)
const
115 const VkPhysicalDeviceDescriptorBufferPropertiesEXT &properties =
117 VKDescriptorBufferLayout
result = {};
119 device.functions.vkGetDescriptorSetLayoutSize(
120 device.vk_handle(), vk_descriptor_set_layout, &
result.size);
123 result.binding_offsets.resize(info.bindings.size());
124 for (uint32_t binding :
IndexRange(info.bindings.size())) {
125 device.functions.vkGetDescriptorSetLayoutBindingOffset(
126 device.vk_handle(), vk_descriptor_set_layout, binding, &
result.binding_offsets[binding]);
void append(const T &value)
void reserve(const int64_t min_capacity)
virtual ~VKDescriptorSetLayouts()
VkDescriptorSetLayout get_or_create(const VKDescriptorSetLayoutInfo &info, bool &r_created, bool &r_needed)
VkDevice vk_handle() const
const VKExtensions & extensions_get() const
const VkPhysicalDeviceDescriptorBufferPropertiesEXT & physical_device_descriptor_buffer_properties_get() const
static void align_size(VkDeviceSize &r_size, VkDeviceSize alignment)