Added base support for runtime config
This commit is contained in:
parent
353dfa3973
commit
91435249c0
2 changed files with 84 additions and 0 deletions
51
src/sfizz/SIMDHelpers.cpp
Normal file
51
src/sfizz/SIMDHelpers.cpp
Normal 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)];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -41,6 +41,39 @@
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
|
||||||
namespace sfz {
|
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 {
|
namespace _internals {
|
||||||
template <class T>
|
template <class T>
|
||||||
inline void snippetRead(const T*& input, T*& outputLeft, T*& outputRight)
|
inline void snippetRead(const T*& input, T*& outputLeft, T*& outputRight)
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue