aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2024-01-03 13:16:09 -0800
committerChris Robinson <[email protected]>2024-01-03 13:16:09 -0800
commitf8604758bc7cc43efa52a305a578ee9cf474f0d6 (patch)
treedaba8befcbc45a7af52bb90a462aa7cb2daba1f5 /core
parent2dacf2ddcc60b21a7ac67d8a020082d8f36d39dd (diff)
Allocate effect slot property updates in clusters
Diffstat (limited to 'core')
-rw-r--r--core/context.cpp29
-rw-r--r--core/context.h7
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;