2
3
4
5
9#include "..\..\..\assets\Shaders\src\Header\ShaderCommon.h"
16 VkDescriptorType descriptorType ,
22 m_PoolSizes.push_back({ descriptorType, count });
30 VkDescriptorPoolCreateFlags flags
46
47
48 return std::make_shared<VulkanDescriptorPool>(vulkanState, m_MaxSets, m_PoolFlags, m_PoolSizes);
54 VkDescriptorPoolCreateFlags poolFlags ,
55 const std::vector<VkDescriptorPoolSize>& poolSizes
62
63
64 VkDescriptorPoolCreateInfo descriptorPoolInfo{};
65 descriptorPoolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
66 descriptorPoolInfo.poolSizeCount =
static_cast<uint32_t>(poolSizes.size());
67 descriptorPoolInfo.pPoolSizes = poolSizes.data();
68 descriptorPoolInfo.maxSets = maxSets;
69 descriptorPoolInfo.flags = poolFlags;
72
73
74 VK_CHECK(vkCreateDescriptorPool(vulkanState.m_Device, &descriptorPoolInfo,
nullptr, &m_DescriptorPool));
75 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_DESCRIPTOR_POOL,
reinterpret_cast<uint64_t>(m_DescriptorPool), vulkanState.m_Device,
"SpicesEngineDescriptorPool")
83
84
85 vkDestroyDescriptorPool(m_VulkanState.m_Device, m_DescriptorPool,
nullptr);
93
94
95 vkResetDescriptorPool(m_VulkanState.m_Device, m_DescriptorPool, 0);
103
104
105 vkDestroyDescriptorSetLayout(m_VulkanState.m_Device, m_Layout,
nullptr);
109 const std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding>& bindings,
110 const std::string& caption
116
117
118 std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings{};
119 std::vector<VkDescriptorBindingFlags> setBindingFlags{};
121 for (
auto& kv : bindings)
123 setLayoutBindings.push_back(kv.second);
125 switch (kv.second.descriptorType)
127 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
128 setBindingFlags.push_back(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT);
131 setBindingFlags.push_back(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT);
137
138
139 VkDescriptorSetLayoutBindingFlagsCreateInfo bindingFlags{};
140 bindingFlags.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
141 bindingFlags.pNext =
nullptr;
142 bindingFlags.pBindingFlags = setBindingFlags.data();
143 bindingFlags.bindingCount =
static_cast<uint32_t>(setBindingFlags.size());
146
147
148 VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo{};
149 descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
150 descriptorSetLayoutCreateInfo.bindingCount =
static_cast<uint32_t>(setLayoutBindings.size());
151 descriptorSetLayoutCreateInfo.pBindings = setLayoutBindings.data();
152 descriptorSetLayoutCreateInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
153 descriptorSetLayoutCreateInfo.pNext = &bindingFlags;
156
157
158 VK_CHECK(vkCreateDescriptorSetLayout(m_VulkanState.m_Device, &descriptorSetLayoutCreateInfo,
nullptr, &m_Layout))
159 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
reinterpret_cast<uint64_t>(m_Layout), m_VulkanState.m_Device,
"DescriptorSetLayout" + caption)
163 const std::unordered_map<uint32_t, VkDescriptorSetLayoutBinding>& bindings ,
164 const std::string& caption
170
171
172 std::vector<VkDescriptorSetLayoutBinding> setLayoutBindings{};
173 std::vector<VkDescriptorBindingFlags> setBindingFlags{};
175 for (
auto& kv : bindings)
177 setLayoutBindings.push_back(kv.second);
179 switch (kv.second.descriptorType)
181 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
182 setBindingFlags.push_back(VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT | VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT | VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT);
185 SPICES_CORE_ERROR(
"BindLess only support COMBINED_IMAGE_SAMPLER type binding")
191
192
193 VkDescriptorSetLayoutBindingFlagsCreateInfo bindingFlags{};
194 bindingFlags.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO;
195 bindingFlags.pNext =
nullptr;
196 bindingFlags.pBindingFlags = setBindingFlags.data();
197 bindingFlags.bindingCount =
static_cast<uint32_t>(setBindingFlags.size());
200
201
202 VkDescriptorSetLayoutCreateInfo descriptorSetLayoutCreateInfo{};
203 descriptorSetLayoutCreateInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
204 descriptorSetLayoutCreateInfo.bindingCount =
static_cast<uint32_t>(setLayoutBindings.size());
205 descriptorSetLayoutCreateInfo.pBindings = setLayoutBindings.data();
206 descriptorSetLayoutCreateInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
207 descriptorSetLayoutCreateInfo.pNext = &bindingFlags;
210
211
212 VK_CHECK(vkCreateDescriptorSetLayout(m_VulkanState.m_Device, &descriptorSetLayoutCreateInfo,
nullptr, &m_Layout))
213 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT,
reinterpret_cast<uint64_t>(m_Layout), m_VulkanState.m_Device,
"DescriptorSetLayout" + caption)
221
222
223 vkFreeDescriptorSets(m_VulkanState.m_Device, m_Pool->GetPool(), 1, &m_DescriptorSet);
228 VkDescriptorType descriptorType ,
229 VkShaderStageFlags stageFlags ,
236
237
238 VkDescriptorSetLayoutBinding layoutBinding{};
239 layoutBinding.binding = binding;
240 layoutBinding.descriptorType = descriptorType;
241 layoutBinding.descriptorCount = count;
242 layoutBinding.stageFlags = stageFlags;
244 m_Bindings[binding] = layoutBinding;
252
253
254 m_Layout.BuildDescriptorSetLayout(m_Bindings, creatorName);
257
258
259 VkDescriptorSetAllocateInfo allocInfo{};
260 allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
261 allocInfo.descriptorPool = m_Pool->GetPool();
262 allocInfo.pSetLayouts = &m_Layout.Get();
263 allocInfo.descriptorSetCount = 1;
266
267
268 VK_CHECK(vkAllocateDescriptorSets(m_VulkanState.m_Device, &allocInfo, &m_DescriptorSet))
269 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_DESCRIPTOR_SET,
reinterpret_cast<uint64_t>(m_DescriptorSet), m_VulkanState.m_Device,
"DescriptorSet" + creatorName)
277
278
279 m_Layout.BuildBindLessTextureDescriptorSetLayout(m_Bindings, creatorName);
282
283
284 constexpr uint32_t maxBinding = SpicesShader::BINDLESS_TEXTURE_MAXNUM;
285 VkDescriptorSetVariableDescriptorCountAllocateInfo countInfo{};
286 countInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO;
287 countInfo.descriptorSetCount = 1;
288 countInfo.pDescriptorCounts = &maxBinding;
291
292
293 VkDescriptorSetAllocateInfo allocInfo{};
294 allocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
295 allocInfo.descriptorPool = m_Pool->GetPool();
296 allocInfo.pSetLayouts = &m_Layout.Get();
297 allocInfo.descriptorSetCount = 1;
298 allocInfo.pNext = &countInfo;
301
302
303 VK_CHECK(vkAllocateDescriptorSets(m_VulkanState.m_Device, &allocInfo, &m_DescriptorSet))
304 DEBUGUTILS_SETOBJECTNAME(VK_OBJECT_TYPE_DESCRIPTOR_SET,
reinterpret_cast<uint64_t>(m_DescriptorSet), m_VulkanState.m_Device,
"DescriptorSet" + creatorName)
308 ImageInfo& imageInfo ,
309 BufferInfo& bufferInfo ,
310 const VkAccelerationStructureKHR& accel
315 for(
auto& pair : m_Bindings)
318
319
320 VkWriteDescriptorSet write{};
321 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
322 write.dstBinding = pair.first;
323 write.dstSet = m_DescriptorSet;
324 write.descriptorType = pair.second.descriptorType;
326 switch(write.descriptorType)
328 case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
329 case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
330 case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
331 write.pImageInfo = imageInfo[pair.first].data();
332 write.descriptorCount =
static_cast<uint32_t>(imageInfo[pair.first].size());
334 case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
335 case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
336 write.pBufferInfo = &bufferInfo[pair.first];
337 write.descriptorCount = 1;
339 case VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR:
340 VkWriteDescriptorSetAccelerationStructureKHR descASInfo {};
341 descASInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR;
342 descASInfo.accelerationStructureCount = 1;
343 descASInfo.pAccelerationStructures = &accel;
345 write.pNext = &descASInfo;
346 write.descriptorCount = 1;
351
352
353 vkUpdateDescriptorSets(m_VulkanState.m_Device, 1, &write, 0,
nullptr);
361 for (
auto& pair : m_Bindings)
364
365
366 VkWriteDescriptorSet write {};
367 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
368 write.dstBinding = pair.first;
369 write.dstSet = m_DescriptorSet;
370 write.descriptorType = pair.second.descriptorType;
371 write.pBufferInfo = &bufferInfo[pair.first];
372 write.descriptorCount = 1;
375
376
377 vkUpdateDescriptorSets(m_VulkanState.m_Device, 1, &write, 0,
nullptr);
385 for (
auto& pair : m_Bindings)
388
389
390 VkWriteDescriptorSet write {};
391 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
392 write.dstBinding = pair.first;
393 write.dstSet = m_DescriptorSet;
394 write.descriptorType = pair.second.descriptorType;
395 write.pImageInfo = imageInfo[pair.first].data();
396 write.descriptorCount =
static_cast<uint32_t>(imageInfo[pair.first].size());
399
400
401 vkUpdateDescriptorSets(m_VulkanState.m_Device, 1, &write, 0,
nullptr);
409 VkDescriptorType type = m_Bindings.find(binding)->second.descriptorType;
411 assert(type == VK_DESCRIPTOR_TYPE_STORAGE_BUFFER || type == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER);
414
415
416 VkWriteDescriptorSet write{};
417 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
418 write.dstBinding = binding;
419 write.dstSet = m_DescriptorSet;
420 write.descriptorType = type;
421 write.pBufferInfo = buffer->GetBufferInfo();
422 write.descriptorCount = 1;
425
426
427 vkUpdateDescriptorSets(m_VulkanState.m_Device, 1, &write, 0,
nullptr);
434 VkDescriptorType type = m_Bindings.find(binding)->second.descriptorType;
436 assert(type == VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR);
439
440
441 VkWriteDescriptorSetAccelerationStructureKHR descASInfo {};
442 descASInfo.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR;
443 descASInfo.accelerationStructureCount = 1;
444 descASInfo.pAccelerationStructures = &accel;
447
448
449 VkWriteDescriptorSet write{};
450 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
451 write.dstBinding = binding;
452 write.dstSet = m_DescriptorSet;
453 write.descriptorType = type;
454 write.pNext = &descASInfo;
455 write.descriptorCount = 1;
458
459
460 vkUpdateDescriptorSets(m_VulkanState.m_Device, 1, &write, 0,
nullptr);
467 for (
auto& pair : m_Bindings)
470
471
472 VkWriteDescriptorSet write {};
473 write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
474 write.dstBinding = pair.first;
475 write.dstSet = m_DescriptorSet;
476 write.descriptorType = pair.second.descriptorType;
477 write.pImageInfo = imageInfo[pair.first].data();
478 write.descriptorCount =
static_cast<uint32_t>(imageInfo[pair.first].size());
479 write.dstArrayElement = 10;
482
483
484 vkUpdateDescriptorSets(m_VulkanState.m_Device, 1, &write, 0,
nullptr);
#define SPICES_PROFILE_ZONE
#define VK_CHECK(expr)
Vulkan Check macro. Verify Vulkan API Effectiveness.
This Class is a Wrapper of VulkanBuffer.
Builder & SetPoolFlags(VkDescriptorPoolCreateFlags flags)
Add a type identify to VkDescriptorPool.
Builder & AddPoolSize(VkDescriptorType descriptorType, uint32_t count)
Add a size of specific descriptor type.
std::shared_ptr< VulkanDescriptorPool > Build(VulkanState &vulkanState) const
Build a shared pointer of VulkanDescriptorPool.
uint32_t m_MaxSets
The max descriptor set nums that this pool can assign.
VulkanDescriptorPool::Builder Class. This class is defines how to build a VulkanDescriptorPool.
VulkanDescriptorPool(VulkanState &vulkanState, uint32_t maxSets, VkDescriptorPoolCreateFlags poolFlags, const std::vector< VkDescriptorPoolSize > &poolSizes)
Constructor Function.
virtual ~VulkanDescriptorPool() override
Destructor Function.
void ResetPool() const
Reset this pool.
VulkanDescriptorPool Class. This class is the wrapper of VkDescriptorPool.
void BuildDescriptorSetLayout(const std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > &bindings, const std::string &caption="")
Build a VkDescriptorSetLayout with bindings.
virtual ~VulkanDescriptorSetLayout() override
Destructor Function.
void BuildBindLessTextureDescriptorSetLayout(const std::unordered_map< uint32_t, VkDescriptorSetLayoutBinding > &bindings, const std::string &caption="")
Build a bindLess texture VkDescriptorSetLayout with bindings.
This Class is a Wrapper of VkDescriptorSetLayout. Usually used as a member variable in VulkanDescript...
void BuildBindLessTextureDescriptorSet(const std::string &creatorName)
Build this bind less.
void UpdateBindLessTextureDescriptorSet(ImageInfo &imageInfo) const
Update this bind less descriptor set.
virtual ~VulkanDescriptorSet() override
Destructor Function.
void UpdateDescriptorSet(ImageInfo &imageInfo, BufferInfo &bufferInfo, const VkAccelerationStructureKHR &accel=VK_NULL_HANDLE) const
Update this descriptor set.
void AddBinding(uint32_t binding, VkDescriptorType descriptorType, VkShaderStageFlags stageFlags, uint32_t count=1)
Add a binding to this descriptor set.
void UpdateDescriptorSet(uint32_t binding, const VkAccelerationStructureKHR &accel) const
Update this descriptor set.
void UpdateDescriptorSet(BufferInfo &bufferInfo) const
Update this descriptor set.
void UpdateDescriptorSet(uint32_t binding, std::shared_ptr< VulkanBuffer > buffer) const
Update this descriptor set.
void BuildDescriptorSet(const std::string &creatorName)
Build this.
This Class is a wrapper of VkDescriptorSet.
VulkanObject(VulkanState &vulkanState)
Constructor Function. Init member variables.
VulkanObject Class. This class defines the basic behaves of VulkanObject. When we create an new Vulka...
This struct contains all Vulkan object in used global.