diff options
author | Chris Robinson <[email protected]> | 2024-01-03 13:16:09 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2024-01-03 13:16:09 -0800 |
commit | f8604758bc7cc43efa52a305a578ee9cf474f0d6 (patch) | |
tree | daba8befcbc45a7af52bb90a462aa7cb2daba1f5 /core | |
parent | 2dacf2ddcc60b21a7ac67d8a020082d8f36d39dd (diff) |
Allocate effect slot property updates in clusters
Diffstat (limited to 'core')
-rw-r--r-- | core/context.cpp | 29 | ||||
-rw-r--r-- | core/context.h | 7 |
2 files changed, 25 insertions, 11 deletions
diff --git a/core/context.cpp b/core/context.cpp index cb00ae70..46f703a9 100644 --- a/core/context.cpp +++ b/core/context.cpp @@ -40,15 +40,6 @@ ContextBase::~ContextBase() } TRACE("Freed %zu context property object%s\n", count, (count==1)?"":"s"); - count = 0; - EffectSlotProps *eprops{mFreeEffectslotProps.exchange(nullptr, std::memory_order_acquire)}; - while(std::unique_ptr<EffectSlotProps> old{eprops}) - { - eprops = old->next.load(std::memory_order_relaxed); - ++count; - } - TRACE("Freed %zu AuxiliaryEffectSlot property object%s\n", count, (count==1)?"":"s"); - if(std::unique_ptr<EffectSlotArray> curarray{mActiveAuxSlots.exchange(nullptr, std::memory_order_relaxed)}) std::destroy_n(curarray->end(), curarray->size()); @@ -147,6 +138,26 @@ void ContextBase::allocVoices(size_t addcount) } +void ContextBase::allocEffectSlotProps() +{ + static constexpr size_t clustersize{std::tuple_size_v<EffectSlotPropsCluster::element_type>}; + + TRACE("Increasing allocated effect slot properties to %zu\n", + (mEffectSlotPropClusters.size()+1) * clustersize); + + auto clusterptr = std::make_unique<EffectSlotPropsCluster::element_type>(); + auto cluster = al::span{*clusterptr}; + for(size_t i{1};i < clustersize;++i) + cluster[i-1].next.store(std::addressof(cluster[i]), std::memory_order_relaxed); + auto *newcluster = mEffectSlotPropClusters.emplace_back(std::move(clusterptr)).get(); + + EffectSlotProps *oldhead{mFreeEffectSlotProps.load(std::memory_order_acquire)}; + do { + newcluster->back().next.store(oldhead, std::memory_order_relaxed); + } while(mFreeEffectSlotProps.compare_exchange_weak(oldhead, newcluster->data(), + std::memory_order_acq_rel, std::memory_order_acquire) == false); +} + EffectSlot *ContextBase::getEffectSlot() { for(auto& clusterptr : mEffectSlotClusters) diff --git a/core/context.h b/core/context.h index 6fc1ed5d..16d1b415 100644 --- a/core/context.h +++ b/core/context.h @@ -95,7 +95,7 @@ struct ContextBase { */ std::atomic<ContextProps*> mFreeContextProps{nullptr}; std::atomic<VoicePropsItem*> mFreeVoiceProps{nullptr}; - std::atomic<EffectSlotProps*> mFreeEffectslotProps{nullptr}; + std::atomic<EffectSlotProps*> mFreeEffectSlotProps{nullptr}; /* The voice change tail is the beginning of the "free" elements, up to and * *excluding* the current. If tail==current, there's no free elements and @@ -107,7 +107,7 @@ struct ContextBase { void allocVoiceChanges(); void allocVoiceProps(); - + void allocEffectSlotProps(); ContextParams mParams; @@ -157,6 +157,9 @@ struct ContextBase { using EffectSlotCluster = std::unique_ptr<std::array<EffectSlot,4>>; std::vector<EffectSlotCluster> mEffectSlotClusters; + using EffectSlotPropsCluster = std::unique_ptr<std::array<EffectSlotProps,4>>; + std::vector<EffectSlotPropsCluster> mEffectSlotPropClusters; + ContextBase(DeviceBase *device); ContextBase(const ContextBase&) = delete; |