@@ -467,23 +467,13 @@ class CVulkanLogicalDevice final : public ILogicalDevice
467
467
468
468
void updateDescriptorSets_impl (uint32_t descriptorWriteCount, const IGPUDescriptorSet::SWriteDescriptorSet* pDescriptorWrites, uint32_t descriptorCopyCount, const IGPUDescriptorSet::SCopyDescriptorSet* pDescriptorCopies)
469
469
{
470
- constexpr uint32_t MAX_DESCRIPTOR_ARRAY_COUNT = 256u ;
471
-
472
470
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
-
483
471
core::vector<VkWriteDescriptorSetAccelerationStructureKHR> vk_writeDescriptorSetAS (descriptorWriteCount);
484
472
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;
487
477
488
478
for (uint32_t i = 0u ; i < descriptorWriteCount; ++i)
489
479
{
@@ -502,7 +492,6 @@ class CVulkanLogicalDevice final : public ILogicalDevice
502
492
vk_writeDescriptorSets[i].descriptorType = getVkDescriptorTypeFromDescriptorType (pDescriptorWrites[i].descriptorType );
503
493
vk_writeDescriptorSets[i].descriptorCount = pDescriptorWrites[i].count ;
504
494
505
- assert (pDescriptorWrites[i].count <= MAX_DESCRIPTOR_ARRAY_COUNT);
506
495
assert (pDescriptorWrites[i].info [0 ].desc );
507
496
508
497
switch (pDescriptorWrites[i].info ->desc ->getTypeCategory ())
@@ -514,22 +503,9 @@ class CVulkanLogicalDevice final : public ILogicalDevice
514
503
dummyInfo.offset = pDescriptorWrites[i].info [0 ].info .buffer .offset ;
515
504
dummyInfo.range = pDescriptorWrites[i].info [0 ].info .buffer .size ;
516
505
506
+ vk_writeDescriptorSets[i].pBufferInfo = reinterpret_cast <VkDescriptorBufferInfo*>(vk_bufferInfos.size ());
517
507
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);
533
509
} break ;
534
510
535
511
case asset::IDescriptor::EC_IMAGE:
@@ -542,74 +518,105 @@ class CVulkanLogicalDevice final : public ILogicalDevice
542
518
dummyInfo.imageView = static_cast <const CVulkanImageView*>(pDescriptorWrites[i].info [0 ].desc .get ())->getInternalObject ();
543
519
dummyInfo.imageLayout = static_cast <VkImageLayout>(pDescriptorWrites[i].info [0 ].info .image .imageLayout );
544
520
521
+ vk_writeDescriptorSets[i].pImageInfo = reinterpret_cast <VkDescriptorImageInfo*>(vk_imageInfos.size ());
545
522
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);
568
524
} break ;
569
525
570
526
case asset::IDescriptor::EC_BUFFER_VIEW:
571
527
{
572
528
VkBufferView dummyBufferView = static_cast <const CVulkanBufferView*>(pDescriptorWrites[i].info [0 ].desc .get ())->getInternalObject ();
573
529
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 ());
574
544
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)
575
564
{
576
- if (pDescriptorWrites[i]. info [j]. info .buffer .size )
565
+ if (infoSrc-> info .buffer .size )
577
566
{
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 ;
579
570
}
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)
581
583
{
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 );
583
591
}
584
592
}
585
-
586
- vk_writeDescriptorSets[i].pTexelBufferView = vk_bufferViews.data () + bufferViewOffset;
587
- bufferViewOffset += pDescriptorWrites[i].count ;
588
593
} break ;
589
594
590
- case asset::IDescriptor::EC_ACCELERATION_STRUCTURE :
595
+ case asset::IDescriptor::E_CATEGORY::EC_BUFFER_VIEW :
591
596
{
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 )
597
602
{
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 () ;
600
605
}
606
+ } break ;
601
607
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 ();
607
611
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 ();
609
616
} break ;
610
617
611
618
default :
612
- assert (!" Don't know what to do with this value! " );
619
+ assert (!" Invalid code path. " );
613
620
}
614
621
}
615
622
0 commit comments