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>
|
||||
|
||||
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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue