Skip to content

Commit 2ff2940

Browse files
committed
createDescriptorSet in terms of createDescriptorSets.
1 parent f132807 commit 2ff2940

File tree

4 files changed

+46
-28
lines changed

4 files changed

+46
-28
lines changed

include/nbl/video/IDescriptorPool.h

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,20 +50,19 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
5050
uint32_t data[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT) + 1];
5151
};
5252

53-
inline void createDescriptorSets(uint32_t count, const IGPUDescriptorSetLayout* const* layouts, core::smart_refctd_ptr<IGPUDescriptorSet>* output)
53+
inline core::smart_refctd_ptr<IGPUDescriptorSet> createDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>&& layout)
5454
{
55-
for (uint32_t i = 0u; i < count; ++i)
56-
{
57-
auto layout = core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(layouts[i]);
58-
output[i++] = createDescriptorSet(std::move(layout));
59-
}
55+
core::smart_refctd_ptr<IGPUDescriptorSet> set;
56+
const bool result = createDescriptorSets(1, &layout.get(), &set);
57+
if (result)
58+
return set;
59+
else
60+
return nullptr;
6061
}
6162

62-
// Returns the offset into the pool's descriptor storage. These offsets will be combined
63-
// later with base memory addresses to get the actual memory address where we put the core::smart_refctd_ptr<const IDescriptor>.
64-
SDescriptorOffsets allocateDescriptorOffsets(const IGPUDescriptorSetLayout* layout);
63+
bool createDescriptorSets(uint32_t count, const IGPUDescriptorSetLayout* const* layouts, core::smart_refctd_ptr<IGPUDescriptorSet>* output);
6564

66-
core::smart_refctd_ptr<IGPUDescriptorSet> createDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>&& layout);
65+
// TODO(achal): Remove.
6766
bool freeDescriptorSets(const uint32_t descriptorSetCount, IGPUDescriptorSet* const* const descriptorSets);
6867

6968
inline uint32_t getCapacity() const { return m_maxSets; }
@@ -114,12 +113,16 @@ class NBL_API IDescriptorPool : public core::IReferenceCounted, public IBackendO
114113

115114
virtual ~IDescriptorPool() {}
116115

117-
virtual core::smart_refctd_ptr<IGPUDescriptorSet> createDescriptorSet_impl(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>&& layout, SDescriptorOffsets&& offsets) = 0;
116+
virtual bool createDescriptorSets_impl(uint32_t count, const IGPUDescriptorSetLayout* const* layouts, SDescriptorOffsets* const offsets, core::smart_refctd_ptr<IGPUDescriptorSet>* output) = 0;
118117
virtual bool freeDescriptorSets_impl(const uint32_t descriptorSetCount, IGPUDescriptorSet* const* const descriptorSets) = 0;
119118

120119
uint32_t m_maxSets;
121120

122121
private:
122+
// Returns the offset into the pool's descriptor storage. These offsets will be combined
123+
// later with base memory addresses to get the actual memory address where we put the core::smart_refctd_ptr<const IDescriptor>.
124+
SDescriptorOffsets allocateDescriptorOffsets(const IGPUDescriptorSetLayout* layout);
125+
123126
const IDescriptorPool::E_CREATE_FLAGS m_flags;
124127
uint32_t m_maxDescriptorCount[static_cast<uint32_t>(asset::IDescriptor::E_TYPE::ET_COUNT)];
125128
union

src/nbl/video/CVulkanDescriptorPool.cpp

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,38 @@ void CVulkanDescriptorPool::setObjectDebugName(const char* label) const
2626
vkSetDebugUtilsObjectNameEXT(vulkanDevice->getInternalObject(), &nameInfo);
2727
}
2828

29-
core::smart_refctd_ptr<IGPUDescriptorSet> CVulkanDescriptorPool::createDescriptorSet_impl(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>&& layout, SDescriptorOffsets&& offsets)
29+
bool CVulkanDescriptorPool::createDescriptorSets_impl(uint32_t count, const IGPUDescriptorSetLayout* const* layouts, SDescriptorOffsets* const offsets, core::smart_refctd_ptr<IGPUDescriptorSet>* output)
3030
{
31-
if (layout->getAPIType() != EAT_VULKAN)
32-
return nullptr;
33-
3431
VkDescriptorSetAllocateInfo vk_allocateInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO };
3532
vk_allocateInfo.pNext = nullptr; // pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfo
3633

3734
vk_allocateInfo.descriptorPool = m_descriptorPool;
38-
vk_allocateInfo.descriptorSetCount = 1u;
35+
vk_allocateInfo.descriptorSetCount = count;
3936

40-
VkDescriptorSetLayout vk_dsLayout = IBackendObject::device_compatibility_cast<const CVulkanDescriptorSetLayout*>(layout.get(), getOriginDevice())->getInternalObject();
41-
vk_allocateInfo.pSetLayouts = &vk_dsLayout;
37+
core::vector<VkDescriptorSetLayout> vk_dsLayouts(count);
38+
for (uint32_t i = 0; i < count; ++i)
39+
{
40+
if (layouts[i]->getAPIType() != EAT_VULKAN)
41+
return false;
42+
43+
vk_dsLayouts[i] = IBackendObject::device_compatibility_cast<const CVulkanDescriptorSetLayout*>(layouts[i], getOriginDevice())->getInternalObject();
44+
}
4245

43-
VkDescriptorSet vk_descriptorSet;
46+
vk_allocateInfo.pSetLayouts = vk_dsLayouts.data();
47+
48+
core::vector<VkDescriptorSet> vk_descriptorSets(count);
4449

4550
const auto* vulkanDevice = static_cast<const CVulkanLogicalDevice*>(getOriginDevice());
4651
auto* vk = vulkanDevice->getFunctionTable();
47-
if (vk->vk.vkAllocateDescriptorSets(vulkanDevice->getInternalObject(), &vk_allocateInfo, &vk_descriptorSet) == VK_SUCCESS)
48-
return core::make_smart_refctd_ptr<CVulkanDescriptorSet>(std::move(layout), core::smart_refctd_ptr<IDescriptorPool>(this), std::move(offsets), vk_descriptorSet);
52+
if (vk->vk.vkAllocateDescriptorSets(vulkanDevice->getInternalObject(), &vk_allocateInfo, vk_descriptorSets.data()) == VK_SUCCESS)
53+
{
54+
for (uint32_t i = 0; i < count; ++i)
55+
output[i] = core::make_smart_refctd_ptr<CVulkanDescriptorSet>(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>(layouts[i]), core::smart_refctd_ptr<IDescriptorPool>(this), std::move(offsets[i]), vk_descriptorSets[i]);
56+
57+
return true;
58+
}
4959

50-
return nullptr;
60+
return false;
5161
}
5262

5363
bool CVulkanDescriptorPool::freeDescriptorSets_impl(const uint32_t descriptorSetCount, IGPUDescriptorSet* const* const descriptorSets)

src/nbl/video/CVulkanDescriptorPool.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ class CVulkanDescriptorPool : public IDescriptorPool
2323
void setObjectDebugName(const char* label) const override;
2424

2525
private:
26-
core::smart_refctd_ptr<IGPUDescriptorSet> createDescriptorSet_impl(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>&& layout, SDescriptorOffsets&& offsets) override;
26+
bool createDescriptorSets_impl(uint32_t count, const IGPUDescriptorSetLayout* const* layouts, SDescriptorOffsets *const offsets, core::smart_refctd_ptr<IGPUDescriptorSet>* output) override;
2727
bool freeDescriptorSets_impl(const uint32_t descriptorSetCount, IGPUDescriptorSet* const* const descriptorSets) final override;
2828

2929
VkDescriptorPool m_descriptorPool;

src/nbl/video/IDescriptorPool.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@
44
namespace nbl::video
55
{
66

7-
core::smart_refctd_ptr<IGPUDescriptorSet> IDescriptorPool::createDescriptorSet(core::smart_refctd_ptr<const IGPUDescriptorSetLayout>&& layout)
7+
bool IDescriptorPool::createDescriptorSets(uint32_t count, const IGPUDescriptorSetLayout* const* layouts, core::smart_refctd_ptr<IGPUDescriptorSet>* output)
88
{
9-
if (!isCompatibleDevicewise(layout.get()))
10-
return nullptr;
9+
core::vector<SDescriptorOffsets> descriptorOffsets(count);
1110

12-
auto offsets = allocateDescriptorOffsets(layout.get());
11+
for (uint32_t i = 0u; i < count; ++i)
12+
{
13+
if (!isCompatibleDevicewise(layouts[i]))
14+
return false;
15+
16+
descriptorOffsets[i] = allocateDescriptorOffsets(layouts[i]);
17+
}
1318

14-
return createDescriptorSet_impl(std::move(layout), std::move(offsets));
19+
return createDescriptorSets_impl(count, layouts, descriptorOffsets.data(), output);
1520
}
1621

1722
IDescriptorPool::SDescriptorOffsets IDescriptorPool::allocateDescriptorOffsets(const IGPUDescriptorSetLayout* layout)

0 commit comments

Comments
 (0)