Skip to content

Commit 5531903

Browse files
committed
Implement depletion of sub alloc descriptor set
1 parent ede586f commit 5531903

File tree

3 files changed

+67
-64
lines changed

3 files changed

+67
-64
lines changed

include/nbl/video/alloc/SubAllocatedDescriptorSet.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -191,12 +191,17 @@ class SubAllocatedDescriptorSet : public core::IReferenceCounted
191191

192192
inline ~SubAllocatedDescriptorSet()
193193
{
194-
// TODO: should nullify/destroy/poll the event deferred handler to completion, then as we iterate through `m_allocatableRanges` assert that the allocators have no allocations/everything is free
194+
uint32_t remainingFrees;
195+
do {
196+
remainingFrees = cull_frees();
197+
} while (remainingFrees > 0);
198+
195199
for (uint32_t i = 0; i < m_allocatableRanges.size(); i++)
196200
{
197201
auto& range = m_allocatableRanges[i];
198202
if (range.reservedSize == 0)
199203
continue;
204+
assert(range.eventHandler->getTimelines().size() == 0);
200205
auto ptr = reinterpret_cast<const uint8_t*>(core::address_allocator_traits<AddressAllocator>::getReservedSpacePtr(*range.addressAllocator));
201206
range.addressAllocator = nullptr;
202207
range.reservedAllocator->deallocate(const_cast<uint8_t*>(ptr), range.reservedSize);

src/nbl/video/CVulkanLogicalDevice.cpp

Lines changed: 61 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -731,70 +731,72 @@ void CVulkanLogicalDevice::nullifyDescriptors_impl(const std::span<const IGPUDes
731731
{
732732
if (getEnabledFeatures().nullDescriptor)
733733
{
734-
core::vector<VkWriteDescriptorSet> vk_writeDescriptorSets(drops.size(),{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,nullptr});
735-
core::vector<VkWriteDescriptorSetAccelerationStructureKHR> vk_writeDescriptorSetAS(69u,{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,nullptr});
736-
737-
size_t maxSize = 0;
738-
for (auto i = 0; i < drops.size(); i++)
739-
{
740-
const auto& write = drops[i];
741-
maxSize = core::max(maxSize, write.count);
742-
}
743-
size_t descriptorSize;
744-
switch (asset::IDescriptor::GetTypeCategory(descriptorType))
745-
{
746-
case asset::IDescriptor::EC_BUFFER:
747-
descriptorSize = sizeof(VkDescriptorBufferInfo);
748-
break;
749-
case asset::IDescriptor::EC_IMAGE:
750-
descriptorSize = sizeof(VkDescriptorImageInfo);
751-
break;
752-
case asset::IDescriptor::EC_BUFFER_VIEW:
753-
descriptorSize = sizeof(VkBufferView);
754-
break;
755-
case asset::IDescriptor::EC_ACCELERATION_STRUCTURE:
756-
descriptorSize = sizeof(VkAccelerationStructureKHR);
757-
break;
758-
}
759-
760-
core::vector<uint8_t> nullDescriptors(maxSize * descriptorSize, 0u);
734+
return
735+
}
761736

737+
core::vector<VkWriteDescriptorSet> vk_writeDescriptorSets(drops.size(),{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET,nullptr});
738+
core::vector<VkWriteDescriptorSetAccelerationStructureKHR> vk_writeDescriptorSetAS(69u,{VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR,nullptr});
739+
740+
size_t maxSize = 0;
741+
for (auto i = 0; i < drops.size(); i++)
742+
{
743+
const auto& write = drops[i];
744+
maxSize = core::max(maxSize, write.count);
745+
}
746+
size_t descriptorSize;
747+
switch (asset::IDescriptor::GetTypeCategory(descriptorType))
748+
{
749+
case asset::IDescriptor::EC_BUFFER:
750+
descriptorSize = sizeof(VkDescriptorBufferInfo);
751+
break;
752+
case asset::IDescriptor::EC_IMAGE:
753+
descriptorSize = sizeof(VkDescriptorImageInfo);
754+
break;
755+
case asset::IDescriptor::EC_BUFFER_VIEW:
756+
descriptorSize = sizeof(VkBufferView);
757+
break;
758+
case asset::IDescriptor::EC_ACCELERATION_STRUCTURE:
759+
descriptorSize = sizeof(VkAccelerationStructureKHR);
760+
break;
761+
}
762+
763+
core::vector<uint8_t> nullDescriptors(maxSize * descriptorSize, 0u);
764+
765+
{
766+
auto outWrite = vk_writeDescriptorSets.data();
767+
auto outWriteAS = vk_writeDescriptorSetAS.data();
768+
769+
for (auto i=0; i<drops.size(); i++)
762770
{
763-
auto outWrite = vk_writeDescriptorSets.data();
764-
auto outWriteAS = vk_writeDescriptorSetAS.data();
765-
766-
for (auto i=0; i<drops.size(); i++)
771+
const auto& write = drops[i];
772+
773+
outWrite->dstSet = static_cast<const CVulkanDescriptorSet*>(write.dstSet)->getInternalObject();
774+
outWrite->dstBinding = write.binding;
775+
outWrite->dstArrayElement = write.arrayElement;
776+
outWrite->descriptorType = getVkDescriptorTypeFromDescriptorType(descriptorType);
777+
outWrite->descriptorCount = write.count;
778+
switch (asset::IDescriptor::GetTypeCategory(descriptorType))
767779
{
768-
const auto& write = drops[i];
769-
770-
outWrite->dstSet = static_cast<const CVulkanDescriptorSet*>(write.dstSet)->getInternalObject();
771-
outWrite->dstBinding = write.binding;
772-
outWrite->dstArrayElement = write.arrayElement;
773-
outWrite->descriptorType = getVkDescriptorTypeFromDescriptorType(descriptorType);
774-
outWrite->descriptorCount = write.count;
775-
switch (asset::IDescriptor::GetTypeCategory(descriptorType))
776-
{
777-
case asset::IDescriptor::EC_BUFFER:
778-
outWrite->pBufferInfo = reinterpret_cast<VkDescriptorBufferInfo*>(nullDescriptors.data());
779-
break;
780-
case asset::IDescriptor::EC_IMAGE:
781-
outWrite->pImageInfo = reinterpret_cast<VkDescriptorImageInfo*>(nullDescriptors.data());
782-
break;
783-
case asset::IDescriptor::EC_BUFFER_VIEW:
784-
outWrite->pTexelBufferView = reinterpret_cast<VkBufferView*>(nullDescriptors.data());
785-
break;
786-
case asset::IDescriptor::EC_ACCELERATION_STRUCTURE:
787-
outWriteAS->accelerationStructureCount = write.count;
788-
outWriteAS->pAccelerationStructures = reinterpret_cast<VkAccelerationStructureKHR*>(nullDescriptors.data());
789-
break;
790-
default:
791-
assert(!"Invalid code path.");
792-
}
793-
outWrite++;
780+
case asset::IDescriptor::EC_BUFFER:
781+
outWrite->pBufferInfo = reinterpret_cast<VkDescriptorBufferInfo*>(nullDescriptors.data());
782+
break;
783+
case asset::IDescriptor::EC_IMAGE:
784+
outWrite->pImageInfo = reinterpret_cast<VkDescriptorImageInfo*>(nullDescriptors.data());
785+
break;
786+
case asset::IDescriptor::EC_BUFFER_VIEW:
787+
outWrite->pTexelBufferView = reinterpret_cast<VkBufferView*>(nullDescriptors.data());
788+
break;
789+
case asset::IDescriptor::EC_ACCELERATION_STRUCTURE:
790+
outWriteAS->accelerationStructureCount = write.count;
791+
outWriteAS->pAccelerationStructures = reinterpret_cast<VkAccelerationStructureKHR*>(nullDescriptors.data());
792+
break;
793+
default:
794+
assert(!"Invalid code path.");
794795
}
796+
outWrite++;
795797
}
796-
m_devf.vk.vkUpdateDescriptorSets(m_vkdev,vk_writeDescriptorSets.size(),vk_writeDescriptorSets.data(),0,nullptr);
797-
}
798+
}
799+
m_devf.vk.vkUpdateDescriptorSets(m_vkdev,vk_writeDescriptorSets.size(),vk_writeDescriptorSets.data(),0,nullptr);
798800
}
799801

800802

src/nbl/video/IGPUDescriptorSet.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,10 +130,6 @@ void IGPUDescriptorSet::dropDescriptors(const IGPUDescriptorSet::SDropDescriptor
130130

131131
auto* dstDescriptors = drop.dstSet->getDescriptors(type, drop.binding);
132132
auto* dstSamplers = drop.dstSet->getMutableSamplers(drop.binding);
133-
assert(dstDescriptors);
134-
// Samplers are only used in the combined image sampler descriptors
135-
if (type == asset::IDescriptor::E_TYPE::ET_COMBINED_IMAGE_SAMPLER)
136-
assert(dstSamplers);
137133

138134
if (dstDescriptors)
139135
for (uint32_t i = 0; i < drop.count; i++)

0 commit comments

Comments
 (0)