summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2013-11-10 05:52:22 -0800
committerChris Robinson <[email protected]>2013-11-10 05:52:22 -0800
commit25b9c3d0c15e959d544f5d0ac7ea507ea5f6d69f (patch)
tree7ad82f7947d40f3926377eb67b76d5183cf6d1b3
parent4386ee32ce24a19bcb0577322d5b12a9db7c69f2 (diff)
Apply HRTF coefficient stepping separately
-rw-r--r--Alc/mixer_c.c9
-rw-r--r--Alc/mixer_inc.c9
-rw-r--r--Alc/mixer_neon.c9
-rw-r--r--Alc/mixer_sse.c60
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);
}
}