@@ -289,8 +289,9 @@ class IGPUBottomLevelAccelerationStructure : public asset::IBottomLevelAccelerat
289289 totalPrims += buildRangeInfo.primitiveCount ;
290290 return true ;
291291 }
292-
293- inline core::smart_refctd_ptr<const IReferenceCounted>* fillTracking (core::smart_refctd_ptr<const IReferenceCounted>* oit) const
292+
293+ template <typename ForwardIterator> // TODO: requires
294+ inline ForwardIterator fillTracking (ForwardIterator oit) const
294295 {
295296 *(oit++) = core::smart_refctd_ptr<const IReferenceCounted>(Base::scratch.buffer );
296297 if (Base::isUpdate)
@@ -486,7 +487,8 @@ class IGPUTopLevelAccelerationStructure : public asset::ITopLevelAccelerationStr
486487 return retval;
487488 }
488489
489- inline core::smart_refctd_ptr<const IReferenceCounted>* fillTracking (core::smart_refctd_ptr<const IReferenceCounted>* oit) const
490+ template <typename ForwardIterator> // TODO: requires
491+ inline ForwardIterator fillTracking (ForwardIterator oit) const
490492 {
491493 *(oit++) = core::smart_refctd_ptr<const IReferenceCounted>(Base::scratch.buffer );
492494 if (Base::isUpdate)
@@ -713,8 +715,8 @@ class IGPUTopLevelAccelerationStructure : public asset::ITopLevelAccelerationStr
713715 *(tracked++) = *(it++);
714716 }
715717 // Useful if TLAS got built externally as well
716- template <typename Iterator >
717- inline void insertTrackedBLASes (const Iterator begin, const Iterator end , const build_ver_t buildVer)
718+ template <typename ForwardIterator >
719+ inline void insertTrackedBLASes (ForwardIterator begin, const uint32_t count , const build_ver_t buildVer)
718720 {
719721 if (buildVer==0 )
720722 return ;
@@ -725,14 +727,19 @@ class IGPUTopLevelAccelerationStructure : public asset::ITopLevelAccelerationStr
725727 for (auto it=std::next (prev); it!=m_pendingBuilds.end ()&&it->ordinal >buildVer; prev=it++) {}
726728 auto inserted = m_pendingBuilds.emplace_after (prev);
727729 // now fill the contents
728- inserted->BLASes .insert (begin,end);
730+ inserted->BLASes .reserve (count);
731+ for (auto i=0u ; i<count; i++)
732+ {
733+ inserted->BLASes .insert (*begin);
734+ ++begin;
735+ }
729736 inserted->ordinal = buildVer;
730737 }
731- template <typename Iterator >
732- inline build_ver_t pushTrackedBLASes (const Iterator begin, const Iterator end )
738+ template <typename ForwardIterator >
739+ inline build_ver_t pushTrackedBLASes (const ForwardIterator begin, const uint32_t count )
733740 {
734741 const auto buildVer = registerNextBuildVer ();
735- insertTrackedBLASes<Iterator >(begin,end ,buildVer);
742+ insertTrackedBLASes<ForwardIterator >(begin,count ,buildVer);
736743 return buildVer;
737744 }
738745 // a little utility to make sure nothing from before this build version gets tracked
@@ -750,18 +757,9 @@ class IGPUTopLevelAccelerationStructure : public asset::ITopLevelAccelerationStr
750757 const uint32_t m_maxInstanceCount;
751758
752759 private:
753- struct DynamicUpCastingSpanIterator
754- {
755- inline bool operator !=(const DynamicUpCastingSpanIterator& other) const {return ptr!=other.ptr ;}
756-
757- inline DynamicUpCastingSpanIterator operator ++() {return {ptr++};}
758-
759- inline const IGPUBottomLevelAccelerationStructure* operator *() const {return dynamic_cast <const IGPUBottomLevelAccelerationStructure*>(ptr->get ());}
760-
761- std::span<const core::smart_refctd_ptr<const core::IReferenceCounted>>::iterator ptr;
762- };
763760 friend class ILogicalDevice ;
764761 friend class IQueue ;
762+
765763 inline const core::unordered_set<blas_smart_ptr_t >* getPendingBuildTrackedBLASes (const build_ver_t buildVer) const
766764 {
767765 const auto found = std::find_if (m_pendingBuilds.begin (),m_pendingBuilds.end (),[buildVer](const auto & item)->bool {return item.ordinal ==buildVer;});
0 commit comments