Apply HRTF mixer coefficients with stepping using SSE
This commit is contained in:
@@ -6,6 +6,22 @@
|
||||
#include "alu.h"
|
||||
|
||||
|
||||
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat (*RESTRICT CoeffStep)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
{
|
||||
ALuint c;
|
||||
for(c = 0;c < HRIR_LENGTH;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];
|
||||
}
|
||||
}
|
||||
|
||||
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
|
||||
+1
-9
@@ -107,15 +107,7 @@ void MERGE4(MixDirect_Hrtf_,SAMPLER,_,SUFFIX)(
|
||||
Values[Offset&HRIR_MASK][1] = 0.0f;
|
||||
Offset++;
|
||||
|
||||
for(c = 0;c < HRIR_LENGTH;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];
|
||||
}
|
||||
|
||||
ApplyCoeffsStep(Offset, Values, Coeffs, CoeffStep, left, right);
|
||||
DryBuffer[OutPos][FrontLeft] += Values[Offset&HRIR_MASK][0];
|
||||
DryBuffer[OutPos][FrontRight] += Values[Offset&HRIR_MASK][1];
|
||||
|
||||
|
||||
@@ -10,6 +10,22 @@
|
||||
#include "alu.h"
|
||||
|
||||
|
||||
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat (*RESTRICT CoeffStep)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
{
|
||||
ALuint c;
|
||||
for(c = 0;c < HRIR_LENGTH;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];
|
||||
}
|
||||
}
|
||||
|
||||
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
|
||||
+35
-5
@@ -10,18 +10,48 @@
|
||||
#include "alu.h"
|
||||
|
||||
|
||||
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
static __inline void ApplyCoeffsStep(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat (*RESTRICT CoeffStep)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
{
|
||||
const __m128 lrlr = { left, right, left, right };
|
||||
__m128 vals = { 0.0f, 0.0f, 0.0f, 0.0f };
|
||||
__m128 coeffs, coeffstep;
|
||||
ALuint c;
|
||||
for(c = 0;c < HRIR_LENGTH;c += 2)
|
||||
{
|
||||
const ALuint o0 = (Offset++)&HRIR_MASK;
|
||||
const ALuint o1 = (Offset++)&HRIR_MASK;
|
||||
__m128 coeffs = _mm_load_ps(&Coeffs[c][0]);
|
||||
__m128 vals = { 0.0f, 0.0f, 0.0f, 0.0f };
|
||||
|
||||
coeffs = _mm_load_ps(&Coeffs[c][0]);
|
||||
vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]);
|
||||
vals = _mm_loadh_pi(vals, (__m64*)&Values[o1][0]);
|
||||
|
||||
vals = _mm_add_ps(vals, _mm_mul_ps(coeffs, lrlr));
|
||||
_mm_storel_pi((__m64*)&Values[o0][0], vals);
|
||||
_mm_storeh_pi((__m64*)&Values[o1][0], vals);
|
||||
|
||||
coeffstep = _mm_load_ps(&CoeffStep[c][0]);
|
||||
coeffs = _mm_add_ps(coeffs, coeffstep);
|
||||
_mm_store_ps(&Coeffs[c][0], coeffs);
|
||||
}
|
||||
}
|
||||
|
||||
static __inline void ApplyCoeffs(ALuint Offset, ALfloat (*RESTRICT Values)[2],
|
||||
ALfloat (*RESTRICT Coeffs)[2],
|
||||
ALfloat left, ALfloat right)
|
||||
{
|
||||
const __m128 lrlr = { left, right, left, right };
|
||||
__m128 vals = { 0.0f, 0.0f, 0.0f, 0.0f };
|
||||
__m128 coeffs;
|
||||
ALuint c;
|
||||
for(c = 0;c < HRIR_LENGTH;c += 2)
|
||||
{
|
||||
const ALuint o0 = (Offset++)&HRIR_MASK;
|
||||
const ALuint o1 = (Offset++)&HRIR_MASK;
|
||||
|
||||
coeffs = _mm_load_ps(&Coeffs[c][0]);
|
||||
vals = _mm_loadl_pi(vals, (__m64*)&Values[o0][0]);
|
||||
vals = _mm_loadh_pi(vals, (__m64*)&Values[o1][0]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user