7 assert(
m_bindings.count(binding) == 0 &&
"Binding already in use");
8 VkDescriptorSetLayoutBinding layoutBinding{};
9 layoutBinding.binding = binding;
10 layoutBinding.descriptorType = descriptorType;
11 layoutBinding.descriptorCount = count;
12 layoutBinding.stageFlags = stageFlags;
19 std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings{};
20 setLayoutBindings.reserve(bindings.size());
21for (
auto kv : bindings) {
22 setLayoutBindings.push_back(kv.second);
25 VkDescriptorSetLayoutCreateInfo descriptorSetLayoutInfo{};
26 descriptorSetLayoutInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
27 descriptorSetLayoutInfo.bindingCount =
static_cast<uint32_t
>(setLayoutBindings.size());
28 descriptorSetLayoutInfo.pBindings = setLayoutBindings.data();
30 if (vkCreateDescriptorSetLayout(
32 &descriptorSetLayoutInfo,
35 throw std::runtime_error(
"failed to create descriptor set layout!");
41 m_poolSizes.push_back({descriptorType, count});
58 VkDescriptorPoolCreateInfo descriptorPoolInfo{};
59 descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
60 descriptorPoolInfo.poolSizeCount =
static_cast<uint32_t
>(poolSizes.size());
61 descriptorPoolInfo.pPoolSizes = poolSizes.data();
62 descriptorPoolInfo.maxSets = maxSets;
63 descriptorPoolInfo.flags = poolFlags;
67 throw std::runtime_error(
"failed to create descriptor pool!");
73 VkDescriptorSetAllocateInfo allocInfo{};
74 allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
75 allocInfo.descriptorPool = m_descriptorPool;
76 allocInfo.pSetLayouts = &descriptorSetLayout;
77 allocInfo.descriptorSetCount = 1;
81 return vkAllocateDescriptorSets(m_device.device(), &allocInfo, &descriptor) == VK_SUCCESS;
86 assert(setLayout.bindings.count(binding) == 1 &&
"Layout does not contain specified binding");
88 const auto &bindingDescription = m_setLayout.m_bindings[binding];
90 assert(bindingDescription.descriptorCount == 1 &&
"Binding single descriptor info, but binding expects multiple");
92 VkWriteDescriptorSet write{};
93 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
94 write.descriptorType = bindingDescription.descriptorType;
95 write.dstBinding = binding;
96 write.pBufferInfo = bufferInfo;
97 write.descriptorCount = 1;
99 m_writes.push_back(write);
105 assert(setLayout.bindings.count(binding) == 1 &&
"Layout does not contain specified binding");
107 const VkDescriptorSetLayoutBinding &bindingDescription = m_setLayout.m_bindings[binding];
109 assert(bindingDescription.descriptorCount == 1 &&
"Binding single descriptor info, but binding expects multiple");
111 VkWriteDescriptorSet write{};
112 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
113 write.descriptorType = bindingDescription.descriptorType;
114 write.dstBinding = binding;
115 write.pImageInfo = imageInfo;
116 write.descriptorCount = 1;
118 m_writes.push_back(write);
124 if (!m_pool.allocateDescriptor(m_setLayout.getDescriptorSetLayout(), set)) {
133 for (
auto &write : m_writes) {
136 vkUpdateDescriptorSets(m_pool.m_device.device(),
static_cast<unsigned int>(m_writes.size()), m_writes.data(), 0,
nullptr);
This file contains the Descriptors class.
Builder & setPoolFlags(VkDescriptorPoolCreateFlags flags)
Builder & addPoolSize(VkDescriptorType descriptorType, uint32_t count)
Builder & setMaxSets(uint32_t count)
VkDescriptorPool m_descriptorPool
DescriptorPool(Device &device, uint32_t maxSets, VkDescriptorPoolCreateFlags poolFlags, const std::vector< VkDescriptorPoolSize > &poolSizes)
bool allocateDescriptor(VkDescriptorSetLayout descriptorSetLayout, VkDescriptorSet &descriptor) const
std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > m_bindings
Builder & addBinding(uint32_t binding, VkDescriptorType descriptorType, VkShaderStageFlags stageFlags, uint32_t count=1)
std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > m_bindings
DescriptorSetLayout(Device &device, const std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > &bindings)
VkDescriptorSetLayout m_descriptorSetLayout
Class for descriptor writer.
DescriptorWriter & writeImage(uint32_t binding, const VkDescriptorImageInfo *imageInfo)
DescriptorWriter & writeBuffer(uint32_t binding, const VkDescriptorBufferInfo *bufferInfo)
void overwrite(const VkDescriptorSet &set)
bool build(VkDescriptorSet &set)