diff options
author | Chris Robinson <[email protected]> | 2013-11-10 05:52:22 -0800 |
---|---|---|
committer | Chris Robinson <[email protected]> | 2013-11-10 05:52:22 -0800 |
commit | 25b9c3d0c15e959d544f5d0ac7ea507ea5f6d69f (patch) | |
tree | 7ad82f7947d40f3926377eb67b76d5183cf6d1b3 | |
parent | 4386ee32ce24a19bcb0577322d5b12a9db7c69f2 (diff) |
Apply HRTF coefficient stepping separately
-rw-r--r-- | Alc/mixer_c.c | 9 | ||||
-rw-r--r-- | Alc/mixer_inc.c | 9 | ||||
-rw-r--r-- | Alc/mixer_neon.c | 9 | ||||
-rw-r--r-- | Alc/mixer_sse.c | 60 |
4 files changed, 15 insertions, 72 deletions
diff --git a/Alc/mixer_c.c b/Alc/mixer_c.c index 34309b12..36d8bf5a 100644 --- a/Alc/mixer_c.c +++ b/Alc/mixer_c.c @@ -46,18 +46,13 @@ DECL_TEMPLATE(cubic32) #undef DECL_TEMPLATE -static inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*restrict Values)[2], - const ALuint IrSize, +static inline void ApplyCoeffsStep(const ALuint IrSize, ALfloat (*restrict Coeffs)[2], - const ALfloat (*restrict CoeffStep)[2], - ALfloat left, ALfloat right) + const ALfloat (*restrict CoeffStep)[2]) { ALuint c; for(c = 0;c < IrSize;c++) { - const ALuint off = (Offset+c)&HRIR_MASK; - Values[off][0] += Coeffs[c][0] * left; - Values[off][1] += Coeffs[c][1] * right; Coeffs[c][0] += CoeffStep[c][0]; Coeffs[c][1] += CoeffStep[c][1]; } diff --git a/Alc/mixer_inc.c b/Alc/mixer_inc.c index 6cffba66..17be5cde 100644 --- a/Alc/mixer_inc.c +++ b/Alc/mixer_inc.c @@ -18,11 +18,9 @@ #define MixDirect_Hrtf MERGE2(MixDirect_Hrtf_,SUFFIX) -static inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*restrict Values)[2], - const ALuint irSize, +static inline void ApplyCoeffsStep(const ALuint irSize, ALfloat (*restrict Coeffs)[2], - const ALfloat (*restrict CoeffStep)[2], - ALfloat left, ALfloat right); + const ALfloat (*restrict CoeffStep)[2]); static inline void ApplyCoeffs(ALuint Offset, ALfloat (*restrict Values)[2], const ALuint irSize, ALfloat (*restrict Coeffs)[2], @@ -92,9 +90,10 @@ void MixDirect_Hrtf(const DirectParams *params, const ALfloat *restrict data, AL Values[(Offset+IrSize)&HRIR_MASK][1] = 0.0f; Offset++; - ApplyCoeffsStep(Offset, Values, IrSize, Coeffs, CoeffStep, left, right); + ApplyCoeffs(Offset, Values, IrSize, Coeffs, left, right); DryBuffer[FrontLeft][OutPos] += Values[Offset&HRIR_MASK][0]; DryBuffer[FrontRight][OutPos] += Values[Offset&HRIR_MASK][1]; + ApplyCoeffsStep(IrSize, Coeffs, CoeffStep); OutPos++; Counter--; diff --git a/Alc/mixer_neon.c b/Alc/mixer_neon.c index 4b80be5e..571221be 100644 --- a/Alc/mixer_neon.c +++ b/Alc/mixer_neon.c @@ -10,18 +10,13 @@ #include "alu.h" -static inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*restrict Values)[2], - const ALuint IrSize, +static inline void ApplyCoeffsStep(const ALuint IrSize, ALfloat (*restrict Coeffs)[2], - const ALfloat (*restrict CoeffStep)[2], - ALfloat left, ALfloat right) + const ALfloat (*restrict CoeffStep)[2]) { ALuint c; for(c = 0;c < IrSize;c++) { - const ALuint off = (Offset+c)&HRIR_MASK; - Values[off][0] += Coeffs[c][0] * left; - Values[off][1] += Coeffs[c][1] * right; Coeffs[c][0] += CoeffStep[c][0]; Coeffs[c][1] += CoeffStep[c][1]; } diff --git a/Alc/mixer_sse.c b/Alc/mixer_sse.c index 56a4bdae..719ebd23 100644 --- a/Alc/mixer_sse.c +++ b/Alc/mixer_sse.c @@ -21,65 +21,19 @@ #include "mixer_defs.h" -static inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*restrict Values)[2], - const ALuint IrSize, +static inline void ApplyCoeffsStep(const ALuint IrSize, ALfloat (*restrict Coeffs)[2], - const ALfloat (*restrict CoeffStep)[2], - ALfloat left, ALfloat right) + const ALfloat (*restrict CoeffStep)[2]) { - const __m128 lrlr = { left, right, left, right }; - __m128 coeffs, deltas, imp0, imp1; - __m128 vals = _mm_setzero_ps(); + __m128 coeffs, deltas; ALuint i; - if((Offset&1)) + for(i = 0;i < IrSize;i += 2) { - const ALuint o0 = Offset&HRIR_MASK; - const ALuint o1 = (Offset+IrSize-1)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[0][0]); - deltas = _mm_load_ps(&CoeffStep[0][0]); - vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]); - imp0 = _mm_mul_ps(lrlr, coeffs); + coeffs = _mm_load_ps(&Coeffs[i][0]); + deltas = _mm_load_ps(&CoeffStep[i][0]); coeffs = _mm_add_ps(coeffs, deltas); - vals = _mm_add_ps(imp0, vals); - _mm_store_ps(&Coeffs[0][0], coeffs); - _mm_storel_pi((__m64*)&Values[o0][0], vals); - for(i = 1;i < IrSize-1;i += 2) - { - const ALuint o2 = (Offset+i)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[i+1][0]); - deltas = _mm_load_ps(&CoeffStep[i+1][0]); - vals = _mm_load_ps(&Values[o2][0]); - imp1 = _mm_mul_ps(lrlr, coeffs); - coeffs = _mm_add_ps(coeffs, deltas); - imp0 = _mm_shuffle_ps(imp0, imp1, _MM_SHUFFLE(1, 0, 3, 2)); - vals = _mm_add_ps(imp0, vals); - _mm_store_ps(&Coeffs[i+1][0], coeffs); - _mm_store_ps(&Values[o2][0], vals); - imp0 = imp1; - } - vals = _mm_loadl_pi(vals, (__m64*)&Values[o1][0]); - imp0 = _mm_movehl_ps(imp0, imp0); - vals = _mm_add_ps(imp0, vals); - _mm_storel_pi((__m64*)&Values[o1][0], vals); - } - else - { - for(i = 0;i < IrSize;i += 2) - { - const ALuint o = (Offset + i)&HRIR_MASK; - - coeffs = _mm_load_ps(&Coeffs[i][0]); - deltas = _mm_load_ps(&CoeffStep[i][0]); - vals = _mm_load_ps(&Values[o][0]); - imp0 = _mm_mul_ps(lrlr, coeffs); - coeffs = _mm_add_ps(coeffs, deltas); - vals = _mm_add_ps(imp0, vals); - _mm_store_ps(&Coeffs[i][0], coeffs); - _mm_store_ps(&Values[o][0], vals); - } + _mm_store_ps(&Coeffs[i][0], coeffs); } } |