From bcb0c91599e99b10f8eb3b8955e23cb694d1e612 Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 2 Apr 2020 15:35:21 +0200 Subject: [PATCH] Fix the alignment problem --- src/sfizz/effects/impl/ResonantArrayAVX.cpp | 13 ++++++------- src/sfizz/effects/impl/ResonantArrayAVX.h | 5 ++--- src/sfizz/effects/impl/ResonantArraySSE.cpp | 9 ++++----- src/sfizz/effects/impl/ResonantArraySSE.h | 5 ++--- 4 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/sfizz/effects/impl/ResonantArrayAVX.cpp b/src/sfizz/effects/impl/ResonantArrayAVX.cpp index a427375c..40ac0df3 100644 --- a/src/sfizz/effects/impl/ResonantArrayAVX.cpp +++ b/src/sfizz/effects/impl/ResonantArrayAVX.cpp @@ -5,7 +5,6 @@ // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz #include "ResonantArrayAVX.h" -#include "ResonantStringAVX.h" #include "Config.h" #include @@ -30,9 +29,9 @@ void ResonantArrayAVX::setup( const float feedbacks[], const float gains[]) { const unsigned numStringPacks = (numStrings + avxVectorSize - 1) / avxVectorSize; - ResonantStringAVX* stringPacks = new ResonantStringAVX[numStringPacks]; + _stringPacks.resize(numStringPacks); + ResonantStringAVX* stringPacks = _stringPacks.data(); - _stringPacks.reset(stringPacks); _numStrings = numStrings; for (unsigned p = 0; p < numStringPacks; ++p) { @@ -65,18 +64,18 @@ void ResonantArrayAVX::setSamplesPerBlock(unsigned samplesPerBlock) void ResonantArrayAVX::clear() { - ResonantStringAVX* stringPacks = _stringPacks.get(); + ResonantStringAVX* stringPacks = _stringPacks.data(); const unsigned numStringPacks = (_numStrings + avxVectorSize - 1) / avxVectorSize; for (unsigned p = 0; p < numStringPacks; ++p) { - ResonantStringAVX& rs = stringPacks[p]; + ResonantStringAVX& rs = reinterpret_cast(stringPacks[p]); rs.clear(); } } void ResonantArrayAVX::process(const float *inPtr, float *outPtr, unsigned numFrames) { - ResonantStringAVX* stringPacks = _stringPacks.get(); + ResonantStringAVX* stringPacks = _stringPacks.data(); const unsigned numStringPacks = (_numStrings + avxVectorSize - 1) / avxVectorSize; // receive 8 resonator outputs per pack @@ -84,7 +83,7 @@ void ResonantArrayAVX::process(const float *inPtr, float *outPtr, unsigned numFr std::memset(outputs8, 0, numFrames * sizeof(__m256)); for (unsigned p = 0; p < numStringPacks; ++p) { - ResonantStringAVX& rs = stringPacks[p]; + ResonantStringAVX& rs = reinterpret_cast(stringPacks[p]); for (unsigned i = 0; i < numFrames; ++i) outputs8[i] = _mm256_add_ps( outputs8[i], rs.process(_mm256_broadcast_ss(&inPtr[i]))); diff --git a/src/sfizz/effects/impl/ResonantArrayAVX.h b/src/sfizz/effects/impl/ResonantArrayAVX.h index 93dca2e2..a35b3346 100644 --- a/src/sfizz/effects/impl/ResonantArrayAVX.h +++ b/src/sfizz/effects/impl/ResonantArrayAVX.h @@ -6,6 +6,7 @@ #pragma once #include "ResonantArray.h" +#include "ResonantStringAVX.h" #include "Buffer.h" #include "SIMDConfig.h" @@ -13,8 +14,6 @@ namespace sfz { namespace fx { -class ResonantStringAVX; - class ResonantArrayAVX final : public ResonantArray { public: ResonantArrayAVX(); @@ -32,7 +31,7 @@ public: void process(const float *inPtr, float *outPtr, unsigned numFrames) override; private: - std::unique_ptr _stringPacks; + Buffer _stringPacks; unsigned _numStrings = 0; Buffer _workBuffer; }; diff --git a/src/sfizz/effects/impl/ResonantArraySSE.cpp b/src/sfizz/effects/impl/ResonantArraySSE.cpp index 7480a877..b72f989c 100644 --- a/src/sfizz/effects/impl/ResonantArraySSE.cpp +++ b/src/sfizz/effects/impl/ResonantArraySSE.cpp @@ -5,7 +5,6 @@ // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz #include "ResonantArraySSE.h" -#include "ResonantStringSSE.h" #include "Config.h" #include @@ -30,9 +29,9 @@ void ResonantArraySSE::setup( const float feedbacks[], const float gains[]) { const unsigned numStringPacks = (numStrings + sseVectorSize - 1) / sseVectorSize; - ResonantStringSSE* stringPacks = new ResonantStringSSE[numStringPacks]; + _stringPacks.resize(numStringPacks); + ResonantStringSSE* stringPacks = _stringPacks.data(); - _stringPacks.reset(stringPacks); _numStrings = numStrings; for (unsigned p = 0; p < numStringPacks; ++p) { @@ -65,7 +64,7 @@ void ResonantArraySSE::setSamplesPerBlock(unsigned samplesPerBlock) void ResonantArraySSE::clear() { - ResonantStringSSE* stringPacks = _stringPacks.get(); + ResonantStringSSE* stringPacks = _stringPacks.data(); const unsigned numStringPacks = (_numStrings + sseVectorSize - 1) / sseVectorSize; for (unsigned p = 0; p < numStringPacks; ++p) { @@ -76,7 +75,7 @@ void ResonantArraySSE::clear() void ResonantArraySSE::process(const float *inPtr, float *outPtr, unsigned numFrames) { - ResonantStringSSE* stringPacks = _stringPacks.get(); + ResonantStringSSE* stringPacks = _stringPacks.data(); const unsigned numStringPacks = (_numStrings + sseVectorSize - 1) / sseVectorSize; // receive 4 resonator outputs per pack diff --git a/src/sfizz/effects/impl/ResonantArraySSE.h b/src/sfizz/effects/impl/ResonantArraySSE.h index 36a67579..f5082f4b 100644 --- a/src/sfizz/effects/impl/ResonantArraySSE.h +++ b/src/sfizz/effects/impl/ResonantArraySSE.h @@ -6,6 +6,7 @@ #pragma once #include "ResonantArray.h" +#include "ResonantStringSSE.h" #include "Buffer.h" #include "SIMDConfig.h" @@ -13,8 +14,6 @@ namespace sfz { namespace fx { -class ResonantStringSSE; - class ResonantArraySSE final : public ResonantArray { public: ResonantArraySSE(); @@ -32,7 +31,7 @@ public: void process(const float *inPtr, float *outPtr, unsigned numFrames) override; private: - std::unique_ptr _stringPacks; + Buffer _stringPacks; unsigned _numStrings = 0; Buffer _workBuffer; };