@@ -539,9 +539,12 @@ core::smart_refctd_ptr<IGPUDescriptorSetLayout> CVulkanLogicalDevice::createDesc
539
539
{
540
540
std::vector<VkSampler> vk_samplers;
541
541
std::vector<VkDescriptorSetLayoutBinding> vk_dsLayoutBindings;
542
+ std::vector<VkDescriptorBindingFlags> vk_bindingFlags;
542
543
vk_samplers.reserve (maxSamplersCount); // Reserve to avoid resizing and pointer change while iterating
543
544
vk_dsLayoutBindings.reserve (bindings.size ());
545
+ vk_bindingFlags.reserve (bindings.size ());
544
546
547
+ bool updateAfterBindFound = false ;
545
548
for (const auto & binding : bindings)
546
549
{
547
550
auto & vkDescSetLayoutBinding = vk_dsLayoutBindings.emplace_back ();
@@ -560,13 +563,22 @@ core::smart_refctd_ptr<IGPUDescriptorSetLayout> CVulkanLogicalDevice::createDesc
560
563
vk_samplers.push_back (static_cast <const CVulkanSampler*>(binding.immutableSamplers [i].get ())->getInternalObject ());
561
564
vkDescSetLayoutBinding.pImmutableSamplers = vk_samplers.data ()+samplerOffset;
562
565
}
566
+
567
+ if (binding.createFlags .hasFlags (IGPUDescriptorSetLayout::SBinding::E_CREATE_FLAGS::ECF_UPDATE_AFTER_BIND_BIT))
568
+ updateAfterBindFound = true ;
569
+ vk_bindingFlags.emplace_back () = getVkDescriptorBindingFlagsFrom (binding.createFlags );
563
570
}
564
571
565
- VkDescriptorSetLayoutCreateInfo vk_createInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO };
566
- vk_createInfo.pNext = nullptr ; // pNext of interest: VkDescriptorSetLayoutBindingFlagsCreateInfo
567
- vk_createInfo.flags = 0 ; // Todo(achal): I would need to create a IDescriptorSetLayout::SCreationParams for this
568
- vk_createInfo.bindingCount = vk_dsLayoutBindings.size ();
572
+ VkDescriptorSetLayoutBindingFlagsCreateInfo vk_bindingFlagsInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO, nullptr };
573
+ VkDescriptorSetLayoutCreateInfo vk_createInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, &vk_bindingFlagsInfo };
574
+ // Todo(achal): I would need to create a IDescriptorSetLayout::SCreationParams for this
575
+ // Answer: We don't actually support any extensions/features that would necessitate exposing any other flag than update_after_bind
576
+ vk_createInfo.flags = 0 ;
577
+ if (updateAfterBindFound)
578
+ vk_createInfo.flags |= VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT;
579
+ vk_createInfo.bindingCount = vk_bindingFlagsInfo.bindingCount = vk_dsLayoutBindings.size ();
569
580
vk_createInfo.pBindings = vk_dsLayoutBindings.data ();
581
+ vk_bindingFlagsInfo.pBindingFlags = vk_bindingFlags.data ();
570
582
571
583
VkDescriptorSetLayout vk_dsLayout;
572
584
if (m_devf.vk .vkCreateDescriptorSetLayout (m_vkdev,&vk_createInfo,nullptr ,&vk_dsLayout)==VK_SUCCESS)
0 commit comments