Skip to content

Commit e2b7dde

Browse files
committed
Refactor.
1 parent dfe6646 commit e2b7dde

File tree

1 file changed

+81
-74
lines changed

1 file changed

+81
-74
lines changed

src/nbl/video/CVulkanLogicalDevice.h

Lines changed: 81 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -467,23 +467,13 @@ class CVulkanLogicalDevice final : public ILogicalDevice
467467

468468
void updateDescriptorSets_impl(uint32_t descriptorWriteCount, const IGPUDescriptorSet::SWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const IGPUDescriptorSet::SCopyDescriptorSet* pDescriptorCopies)
469469
{
470-
constexpr uint32_t MAX_DESCRIPTOR_ARRAY_COUNT = 256u;
471-
472470
core::vector<VkWriteDescriptorSet> vk_writeDescriptorSets(descriptorWriteCount);
473-
474-
uint32_t bufferInfoOffset = 0u;
475-
core::vector<VkDescriptorBufferInfo>vk_bufferInfos(descriptorWriteCount * MAX_DESCRIPTOR_ARRAY_COUNT);
476-
477-
uint32_t imageInfoOffset = 0u;
478-
core::vector<VkDescriptorImageInfo> vk_imageInfos(descriptorWriteCount * MAX_DESCRIPTOR_ARRAY_COUNT);
479-
480-
uint32_t bufferViewOffset = 0u;
481-
core::vector<VkBufferView> vk_bufferViews(descriptorWriteCount * MAX_DESCRIPTOR_ARRAY_COUNT);
482-
483471
core::vector<VkWriteDescriptorSetAccelerationStructureKHR> vk_writeDescriptorSetAS(descriptorWriteCount);
484472

485-
uint32_t accelerationStructuresOffset = 0u;
486-
core::vector<VkAccelerationStructureKHR> vk_accelerationStructures(descriptorWriteCount * MAX_DESCRIPTOR_ARRAY_COUNT);
473+
core::vector<VkDescriptorBufferInfo>vk_bufferInfos;
474+
core::vector<VkDescriptorImageInfo> vk_imageInfos;
475+
core::vector<VkBufferView> vk_bufferViews;
476+
core::vector<VkAccelerationStructureKHR> vk_accelerationStructures;
487477

488478
for (uint32_t i = 0u; i < descriptorWriteCount; ++i)
489479
{
@@ -502,7 +492,6 @@ class CVulkanLogicalDevice final : public ILogicalDevice
502492
vk_writeDescriptorSets[i].descriptorType = getVkDescriptorTypeFromDescriptorType(pDescriptorWrites[i].descriptorType);
503493
vk_writeDescriptorSets[i].descriptorCount = pDescriptorWrites[i].count;
504494

505-
assert(pDescriptorWrites[i].count <= MAX_DESCRIPTOR_ARRAY_COUNT);
506495
assert(pDescriptorWrites[i].info[0].desc);
507496

508497
switch (pDescriptorWrites[i].info->desc->getTypeCategory())
@@ -514,22 +503,9 @@ class CVulkanLogicalDevice final : public ILogicalDevice
514503
dummyInfo.offset = pDescriptorWrites[i].info[0].info.buffer.offset;
515504
dummyInfo.range = pDescriptorWrites[i].info[0].info.buffer.size;
516505

506+
vk_writeDescriptorSets[i].pBufferInfo = reinterpret_cast<VkDescriptorBufferInfo*>(vk_bufferInfos.size());
517507
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j)
518-
{
519-
if (pDescriptorWrites[i].info[j].info.buffer.size)
520-
{
521-
vk_bufferInfos[bufferInfoOffset + j].buffer = static_cast<const CVulkanBuffer*>(pDescriptorWrites[i].info[j].desc.get())->getInternalObject();
522-
vk_bufferInfos[bufferInfoOffset + j].offset = pDescriptorWrites[i].info[j].info.buffer.offset;
523-
vk_bufferInfos[bufferInfoOffset + j].range = pDescriptorWrites[i].info[j].info.buffer.size;
524-
}
525-
else
526-
{
527-
vk_bufferInfos[bufferInfoOffset + j] = dummyInfo;
528-
}
529-
}
530-
531-
vk_writeDescriptorSets[i].pBufferInfo = vk_bufferInfos.data() + bufferInfoOffset;
532-
bufferInfoOffset += pDescriptorWrites[i].count;
508+
vk_bufferInfos.push_back(dummyInfo);
533509
} break;
534510

535511
case asset::IDescriptor::EC_IMAGE:
@@ -542,74 +518,105 @@ class CVulkanLogicalDevice final : public ILogicalDevice
542518
dummyInfo.imageView = static_cast<const CVulkanImageView*>(pDescriptorWrites[i].info[0].desc.get())->getInternalObject();
543519
dummyInfo.imageLayout = static_cast<VkImageLayout>(pDescriptorWrites[i].info[0].info.image.imageLayout);
544520

521+
vk_writeDescriptorSets[i].pImageInfo = reinterpret_cast<VkDescriptorImageInfo*>(vk_imageInfos.size());
545522
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j)
546-
{
547-
const auto& descriptorWriteImageInfo = pDescriptorWrites[i].info[j].info.image;
548-
if (descriptorWriteImageInfo.imageLayout != asset::IImage::EL_UNDEFINED)
549-
{
550-
VkSampler vk_sampler = VK_NULL_HANDLE;
551-
if (descriptorWriteImageInfo.sampler && (descriptorWriteImageInfo.sampler->getAPIType() == EAT_VULKAN))
552-
vk_sampler = static_cast<const CVulkanSampler*>(descriptorWriteImageInfo.sampler.get())->getInternalObject();
553-
554-
VkImageView vk_imageView = static_cast<const CVulkanImageView*>(pDescriptorWrites[i].info[j].desc.get())->getInternalObject();
555-
556-
vk_imageInfos[imageInfoOffset + j].sampler = vk_sampler;
557-
vk_imageInfos[imageInfoOffset + j].imageView = vk_imageView;
558-
vk_imageInfos[imageInfoOffset + j].imageLayout = static_cast<VkImageLayout>(descriptorWriteImageInfo.imageLayout);
559-
}
560-
else
561-
{
562-
vk_imageInfos[imageInfoOffset + j] = dummyInfo;
563-
}
564-
}
565-
566-
vk_writeDescriptorSets[i].pImageInfo = vk_imageInfos.data() + imageInfoOffset;
567-
imageInfoOffset += pDescriptorWrites[i].count;
523+
vk_imageInfos.push_back(dummyInfo);
568524
} break;
569525

570526
case asset::IDescriptor::EC_BUFFER_VIEW:
571527
{
572528
VkBufferView dummyBufferView = static_cast<const CVulkanBufferView*>(pDescriptorWrites[i].info[0].desc.get())->getInternalObject();
573529

530+
vk_writeDescriptorSets[i].pTexelBufferView = reinterpret_cast<VkBufferView*>(vk_bufferViews.size());
531+
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j)
532+
vk_bufferViews.push_back(dummyBufferView);
533+
} break;
534+
535+
case asset::IDescriptor::EC_ACCELERATION_STRUCTURE:
536+
{
537+
auto& writeAS = vk_writeDescriptorSetAS[i];
538+
writeAS = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, nullptr };
539+
writeAS.accelerationStructureCount = pDescriptorWrites[i].count;
540+
541+
vk_writeDescriptorSets[i].pNext = &writeAS;
542+
543+
writeAS.pAccelerationStructures = reinterpret_cast<VkAccelerationStructureKHR*>(vk_accelerationStructures.size());
574544
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j)
545+
vk_accelerationStructures.push_back({});
546+
} break;
547+
548+
default:
549+
assert(!"Invalid code path.");
550+
}
551+
}
552+
553+
for (uint32_t i = 0u; i < descriptorWriteCount; ++i)
554+
{
555+
switch (pDescriptorWrites[i].info->desc->getTypeCategory())
556+
{
557+
case asset::IDescriptor::E_CATEGORY::EC_BUFFER:
558+
{
559+
vk_writeDescriptorSets[i].pBufferInfo = reinterpret_cast<size_t>(vk_writeDescriptorSets[i].pBufferInfo) + vk_bufferInfos.data();
560+
561+
const auto* infoSrc = pDescriptorWrites[i].info;
562+
auto* infoDst = const_cast<VkDescriptorBufferInfo*>(vk_writeDescriptorSets[i].pBufferInfo);
563+
for (uint32_t j = 0; j < pDescriptorWrites[i].count; ++j, ++infoSrc, ++infoDst)
575564
{
576-
if (pDescriptorWrites[i].info[j].info.buffer.size)
565+
if (infoSrc->info.buffer.size)
577566
{
578-
vk_bufferViews[bufferViewOffset + j] = static_cast<const CVulkanBufferView*>(pDescriptorWrites[i].info[j].desc.get())->getInternalObject();
567+
infoDst->buffer = static_cast<const CVulkanBuffer*>(infoSrc->desc.get())->getInternalObject();
568+
infoDst->offset = infoSrc->info.buffer.offset;
569+
infoDst->range = infoSrc->info.buffer.size;
579570
}
580-
else
571+
}
572+
} break;
573+
574+
case asset::IDescriptor::E_CATEGORY::EC_IMAGE:
575+
{
576+
vk_writeDescriptorSets[i].pImageInfo = reinterpret_cast<size_t>(vk_writeDescriptorSets[i].pImageInfo) + vk_imageInfos.data();
577+
578+
const auto* infoSrc = pDescriptorWrites[i].info;
579+
auto* infoDst = const_cast<VkDescriptorImageInfo*>(vk_writeDescriptorSets[i].pImageInfo);
580+
for (uint32_t j = 0; j < pDescriptorWrites[i].count; ++j, ++infoSrc, ++infoDst)
581+
{
582+
if (infoSrc->info.image.imageLayout != asset::IImage::E_LAYOUT::EL_UNDEFINED)
581583
{
582-
vk_bufferViews[bufferViewOffset + j] = dummyBufferView;
584+
VkSampler vk_sampler = VK_NULL_HANDLE;
585+
if (infoSrc->info.image.sampler && (infoSrc->info.image.sampler->getAPIType() == EAT_VULKAN))
586+
vk_sampler = static_cast<const CVulkanSampler*>(infoSrc->info.image.sampler.get())->getInternalObject();
587+
588+
infoDst->sampler = vk_sampler;
589+
infoDst->imageView = static_cast<const CVulkanImageView*>(infoSrc->desc.get())->getInternalObject();
590+
infoDst->imageLayout = static_cast<VkImageLayout>(infoSrc->info.image.imageLayout);
583591
}
584592
}
585-
586-
vk_writeDescriptorSets[i].pTexelBufferView = vk_bufferViews.data() + bufferViewOffset;
587-
bufferViewOffset += pDescriptorWrites[i].count;
588593
} break;
589594

590-
case asset::IDescriptor::EC_ACCELERATION_STRUCTURE:
595+
case asset::IDescriptor::E_CATEGORY::EC_BUFFER_VIEW:
591596
{
592-
// Get WriteAS
593-
auto& writeAS = vk_writeDescriptorSetAS[i];
594-
writeAS = { VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_ACCELERATION_STRUCTURE_KHR, nullptr };
595-
// Fill Write AS
596-
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j)
597+
vk_writeDescriptorSets[i].pTexelBufferView = reinterpret_cast<size_t>(vk_writeDescriptorSets[i].pTexelBufferView) + vk_bufferViews.data();
598+
599+
const auto* infoSrc = pDescriptorWrites[i].info;
600+
auto* infoDst = const_cast<VkBufferView*>(vk_writeDescriptorSets[i].pTexelBufferView);
601+
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j, ++infoSrc, ++infoDst)
597602
{
598-
VkAccelerationStructureKHR vk_accelerationStructure = static_cast<const CVulkanAccelerationStructure*>(pDescriptorWrites[i].info[j].desc.get())->getInternalObject();
599-
vk_accelerationStructures[j + accelerationStructuresOffset] = vk_accelerationStructure;
603+
if (infoSrc->info.buffer.size)
604+
*infoDst = static_cast<const CVulkanBufferView*>(infoSrc->desc.get())->getInternalObject();
600605
}
606+
} break;
601607

602-
writeAS.accelerationStructureCount = pDescriptorWrites[i].count;
603-
writeAS.pAccelerationStructures = &vk_accelerationStructures[accelerationStructuresOffset];
604-
605-
// Give Write AS to writeDescriptor.pNext
606-
vk_writeDescriptorSets[i].pNext = &writeAS;
608+
case asset::IDescriptor::E_CATEGORY::EC_ACCELERATION_STRUCTURE:
609+
{
610+
vk_writeDescriptorSetAS[i].pAccelerationStructures = reinterpret_cast<size_t>(vk_writeDescriptorSetAS[i].pAccelerationStructures) + vk_accelerationStructures.data();
607611

608-
accelerationStructuresOffset += pDescriptorWrites[i].count;
612+
const auto* infoSrc = pDescriptorWrites[i].info;
613+
auto* infoDst = const_cast<VkAccelerationStructureKHR*>(vk_writeDescriptorSetAS[i].pAccelerationStructures);
614+
for (uint32_t j = 0u; j < pDescriptorWrites[i].count; ++j, ++infoSrc, ++infoDst)
615+
*infoDst = static_cast<const CVulkanAccelerationStructure*>(infoSrc->desc.get())->getInternalObject();
609616
} break;
610617

611618
default:
612-
assert(!"Don't know what to do with this value!");
619+
assert(!"Invalid code path.");
613620
}
614621
}
615622

0 commit comments

Comments
 (0)