@@ -26,28 +26,38 @@ void CVulkanDescriptorPool::setObjectDebugName(const char* label) const
26
26
vkSetDebugUtilsObjectNameEXT (vulkanDevice->getInternalObject (), &nameInfo);
27
27
}
28
28
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 )
30
30
{
31
- if (layout->getAPIType () != EAT_VULKAN)
32
- return nullptr ;
33
-
34
31
VkDescriptorSetAllocateInfo vk_allocateInfo = { VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO };
35
32
vk_allocateInfo.pNext = nullptr ; // pNext must be NULL or a pointer to a valid instance of VkDescriptorSetVariableDescriptorCountAllocateInfo
36
33
37
34
vk_allocateInfo.descriptorPool = m_descriptorPool;
38
- vk_allocateInfo.descriptorSetCount = 1u ;
35
+ vk_allocateInfo.descriptorSetCount = count ;
39
36
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
+ }
42
45
43
- VkDescriptorSet vk_descriptorSet;
46
+ vk_allocateInfo.pSetLayouts = vk_dsLayouts.data ();
47
+
48
+ core::vector<VkDescriptorSet> vk_descriptorSets (count);
44
49
45
50
const auto * vulkanDevice = static_cast <const CVulkanLogicalDevice*>(getOriginDevice ());
46
51
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
+ }
49
59
50
- return nullptr ;
60
+ return false ;
51
61
}
52
62
53
63
bool CVulkanDescriptorPool::freeDescriptorSets_impl (const uint32_t descriptorSetCount, IGPUDescriptorSet* const * const descriptorSets)
0 commit comments