Added base support for runtime config

This commit is contained in:
Paul Ferrand 2020-05-30 15:05:18 +02:00 committed by Jean Pierre Cimalando
parent 353dfa3973
commit 91435249c0
2 changed files with 84 additions and 0 deletions

51
src/sfizz/SIMDHelpers.cpp Normal file
View file

@ -0,0 +1,51 @@
#include "SIMDHelpers.h"
#include <array>
namespace sfz{
static std::array<bool, static_cast<unsigned>(sfz::SIMDOps::_sentinel)> simdStatus;
static bool simdStatusInitialized = false;
static void resetSIMDStatus()
{
simdStatus[static_cast<unsigned>(SIMDOps::writeInterleaved)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::readInterleaved)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::fill)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::gain)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::divide)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::mathfuns)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::loopingSFZIndex)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::saturatingSFZIndex)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::linearRamp)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::multiplicativeRamp)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::add)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::subtract)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::multiplyAdd)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::copy)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::pan)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::cumsum)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::diff)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::sfzInterpolationCast)] = true;
simdStatus[static_cast<unsigned>(SIMDOps::mean)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::meanSquared)] = false;
simdStatus[static_cast<unsigned>(SIMDOps::upsampling)] = true;
simdStatusInitialized = true;
}
static void setSIMDOpStatus(SIMDOps op, bool status)
{
if (!simdStatusInitialized)
resetSIMDStatus();
simdStatus[static_cast<unsigned>(op)] = status;
}
static bool getSIMDOpStatus(SIMDOps op)
{
if (!simdStatusInitialized)
resetSIMDStatus();
return simdStatus[static_cast<unsigned>(op)];
}
}

View file

@ -41,6 +41,39 @@
#include <cmath>
namespace sfz {
// NOTE: The goal is to collapse all checks on release, and compute the sentinels for the span versions
// https://godbolt.org/z/43dveW shows this should work
enum class SIMDOps {
writeInterleaved,
readInterleaved,
fill,
gain,
divide,
mathfuns,
loopingSFZIndex,
saturatingSFZIndex,
linearRamp,
multiplicativeRamp,
add,
subtract,
multiplyAdd,
copy,
pan,
cumsum,
diff,
sfzInterpolationCast,
mean,
meanSquared,
upsampling,
_sentinel //
};
// Enable or disable SIMD accelerators at runtime
static void setSIMDOpStatus(SIMDOps op, bool status);
static bool getSIMDOpStatus(SIMDOps op);
namespace _internals {
template <class T>
inline void snippetRead(const T*& input, T*& outputLeft, T*& outputRight)