Skip to content

Commit 26d2d81

Browse files
committed
actually pass descriptor binding flags to Vulkan
1 parent 7009be2 commit 26d2d81

File tree

4 files changed

+31
-8
lines changed

4 files changed

+31
-8
lines changed

include/nbl/asset/IDescriptorSetLayout.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ class IDescriptorSetLayout : public virtual core::IReferenceCounted // TODO: tr
4646
enum class E_CREATE_FLAGS : uint8_t
4747
{
4848
ECF_NONE = 0,
49-
ECF_UPDATE_AFTER_BIND_BIT = 1u << 1,
50-
ECF_UPDATE_UNUSED_WHILE_PENDING_BIT = 1u << 2,
51-
ECF_PARTIALLY_BOUND_BIT = 1u << 3,
52-
ECF_VARIABLE_DESCRIPTOR_COUNT_BIT = 1u << 4
49+
ECF_UPDATE_AFTER_BIND_BIT = 1u << 0,
50+
ECF_UPDATE_UNUSED_WHILE_PENDING_BIT = 1u << 1,
51+
ECF_PARTIALLY_BOUND_BIT = 1u << 2,
52+
ECF_VARIABLE_DESCRIPTOR_COUNT_BIT = 1u << 3
5353
};
5454

5555
uint32_t binding;

include/nbl/video/CVulkanCommon.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1027,6 +1027,16 @@ inline constexpr VkDescriptorType getVkDescriptorTypeFromDescriptorType(const as
10271027
}
10281028
}
10291029

1030+
inline VkDescriptorBindingFlagBits getVkDescriptorBindingFlagsFrom(const core::bitflag<IGPUDescriptorSetLayout::SBinding::E_CREATE_FLAGS> flags)
1031+
{
1032+
// Wait for C++23
1033+
//static_assert(std::to_underlying(IGPUDescriptorSetLayout::SBinding::E_CREATE_FLAGS::ECF_UPDATE_AFTER_BIND_BIT)==VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT);
1034+
//static_assert(IGPUDescriptorSetLayout::SBinding::E_CREATE_FLAGS::ECF_UPDATE_AFTER_BIND_BIT==VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT);
1035+
//static_assert(IGPUDescriptorSetLayout::SBinding::E_CREATE_FLAGS::ECF_UPDATE_AFTER_BIND_BIT==VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT);
1036+
//static_assert(IGPUDescriptorSetLayout::SBinding::E_CREATE_FLAGS::ECF_UPDATE_AFTER_BIND_BIT==VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT);
1037+
return static_cast<VkDescriptorBindingFlagBits>(flags.value);
1038+
}
1039+
10301040
inline IPhysicalDevice::E_DRIVER_ID getDriverIdFromVkDriverId(const VkDriverId in)
10311041
{
10321042
if(in == VK_DRIVER_ID_AMD_PROPRIETARY) return IPhysicalDevice::E_DRIVER_ID::EDI_AMD_PROPRIETARY;

include/nbl/video/ILogicalDevice.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,7 @@ class NBL_API2 ILogicalDevice : public core::IReferenceCounted, public IDeviceMe
631631
{
632632
if (layout)
633633
{
634+
// TODO: when creating the layouts, cache if they have any update after bindingings, and patch `createInfo.flags` with that here
634635
const auto setCount = setCounts ? *(setCountsIt):1u;
635636
createInfo.maxSets += setCount;
636637
for (uint32_t t=0; t<static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT); ++t)

src/nbl/video/CVulkanLogicalDevice.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -539,9 +539,12 @@ core::smart_refctd_ptr<IGPUDescriptorSetLayout> CVulkanLogicalDevice::createDesc
539539
{
540540
std::vector<VkSampler> vk_samplers;
541541
std::vector<VkDescriptorSetLayoutBinding> vk_dsLayoutBindings;
542+
std::vector<VkDescriptorBindingFlags> vk_bindingFlags;
542543
vk_samplers.reserve(maxSamplersCount); // Reserve to avoid resizing and pointer change while iterating
543544
vk_dsLayoutBindings.reserve(bindings.size());
545+
vk_bindingFlags.reserve(bindings.size());
544546

547+
bool updateAfterBindFound = false;
545548
for (const auto& binding : bindings)
546549
{
547550
auto& vkDescSetLayoutBinding = vk_dsLayoutBindings.emplace_back();
@@ -560,13 +563,22 @@ core::smart_refctd_ptr<IGPUDescriptorSetLayout> CVulkanLogicalDevice::createDesc
560563
vk_samplers.push_back(static_cast<const CVulkanSampler*>(binding.immutableSamplers[i].get())->getInternalObject());
561564
vkDescSetLayoutBinding.pImmutableSamplers = vk_samplers.data()+samplerOffset;
562565
}
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);
563570
}
564571

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();
569580
vk_createInfo.pBindings = vk_dsLayoutBindings.data();
581+
vk_bindingFlagsInfo.pBindingFlags = vk_bindingFlags.data();
570582

571583
VkDescriptorSetLayout vk_dsLayout;
572584
if (m_devf.vk.vkCreateDescriptorSetLayout(m_vkdev,&vk_createInfo,nullptr,&vk_dsLayout)==VK_SUCCESS)

0 commit comments

Comments
 (0)