mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2026-06-29 13:14:14 -04:00
filter-graph: use pffft aligned alloc in all cases
Always use the pffft aligned alloc function. The fftw alloc function only aligns to 16 bytes and the AVX code uses stores that rely on an alignment of 32 bytes. The pffft alloc alignes to 64 bytes. Fixes #5320
This commit is contained in:
parent
10b08df3f5
commit
a389a553e3
5 changed files with 26 additions and 47 deletions
|
|
@ -12,9 +12,8 @@
|
|||
|
||||
#ifdef HAVE_FFTW
|
||||
#include <fftw3.h>
|
||||
#else
|
||||
#include "pffft.h"
|
||||
#endif
|
||||
#include "pffft.h"
|
||||
#include "audio-dsp-impl.h"
|
||||
|
||||
#include <immintrin.h>
|
||||
|
|
@ -386,14 +385,12 @@ static void fft_interleaved_avx2(float *data, uint32_t len, float scale)
|
|||
|
||||
void *dsp_fft_memalloc_avx2(void *obj, uint32_t size, bool real)
|
||||
{
|
||||
#ifdef HAVE_FFTW
|
||||
return fftwf_alloc_real(real ? size : SPA_ROUND_UP_N(size, FFT_BLOCK) * 2);
|
||||
#else
|
||||
if (real)
|
||||
return pffft_aligned_malloc(size * sizeof(float));
|
||||
else
|
||||
return pffft_aligned_malloc(size * 2 * sizeof(float));
|
||||
#endif
|
||||
uint32_t asize = real ? size : SPA_ROUND_UP_N(size, FFT_BLOCK) * 2;
|
||||
return pffft_aligned_malloc(asize * sizeof(float));
|
||||
}
|
||||
void dsp_fft_memfree_avx2(void *obj, void *data)
|
||||
{
|
||||
pffft_aligned_free(data);
|
||||
}
|
||||
|
||||
void dsp_fft_memclear_avx2(void *obj, void *data, uint32_t size, bool real)
|
||||
|
|
|
|||
|
|
@ -14,9 +14,8 @@
|
|||
|
||||
#ifdef HAVE_FFTW
|
||||
#include <fftw3.h>
|
||||
#else
|
||||
#include "pffft.h"
|
||||
#endif
|
||||
#include "pffft.h"
|
||||
#include "audio-dsp-impl.h"
|
||||
|
||||
void dsp_clear_c(void *obj, float * SPA_RESTRICT dst, uint32_t n_samples)
|
||||
|
|
@ -261,14 +260,14 @@ void *dsp_fft_new_c(void *obj, uint32_t size, bool real)
|
|||
float *rdata;
|
||||
fftwf_complex *cdata;
|
||||
|
||||
rdata = fftwf_alloc_real(size * 2);
|
||||
cdata = fftwf_alloc_complex(size + 1);
|
||||
rdata = spa_fga_dsp_fft_memalloc(obj, size * 2, true);
|
||||
cdata = spa_fga_dsp_fft_memalloc(obj, size + 1, false);
|
||||
|
||||
info->plan_r2c = fftwf_plan_dft_r2c_1d(size, rdata, cdata, FFTW_ESTIMATE);
|
||||
info->plan_c2r = fftwf_plan_dft_c2r_1d(size, cdata, rdata, FFTW_ESTIMATE);
|
||||
|
||||
fftwf_free(rdata);
|
||||
fftwf_free(cdata);
|
||||
spa_fga_dsp_fft_memfree(obj, rdata);
|
||||
spa_fga_dsp_fft_memfree(obj, cdata);
|
||||
}
|
||||
#else
|
||||
info->setup = pffft_new_setup(size, real ? PFFFT_REAL : PFFFT_COMPLEX);
|
||||
|
|
@ -290,35 +289,18 @@ void dsp_fft_free_c(void *obj, void *fft)
|
|||
|
||||
void *dsp_fft_memalloc_c(void *obj, uint32_t size, bool real)
|
||||
{
|
||||
#ifdef HAVE_FFTW
|
||||
if (real)
|
||||
return fftwf_alloc_real(size);
|
||||
else
|
||||
return fftwf_alloc_complex(size);
|
||||
#else
|
||||
if (real)
|
||||
return pffft_aligned_malloc(size * sizeof(float));
|
||||
else
|
||||
return pffft_aligned_malloc(size * 2 * sizeof(float));
|
||||
#endif
|
||||
uint32_t asize = real ? size : size * 2;
|
||||
return pffft_aligned_malloc(asize * sizeof(float));
|
||||
}
|
||||
|
||||
void dsp_fft_memfree_c(void *obj, void *data)
|
||||
{
|
||||
#ifdef HAVE_FFTW
|
||||
fftwf_free(data);
|
||||
#else
|
||||
pffft_aligned_free(data);
|
||||
#endif
|
||||
}
|
||||
|
||||
void dsp_fft_memclear_c(void *obj, void *data, uint32_t size, bool real)
|
||||
{
|
||||
#ifdef HAVE_FFTW
|
||||
spa_fga_dsp_clear(obj, data, real ? size : size * 2);
|
||||
#else
|
||||
spa_fga_dsp_clear(obj, data, real ? size : size * 2);
|
||||
#endif
|
||||
}
|
||||
|
||||
void dsp_fft_run_c(void *obj, void *fft, int direction,
|
||||
|
|
|
|||
|
|
@ -84,6 +84,7 @@ MAKE_MULT_FUNC(sse);
|
|||
MAKE_BIQUAD_RUN_FUNC(sse);
|
||||
MAKE_DELAY_FUNC(sse);
|
||||
MAKE_FFT_MEMALLOC_FUNC(sse);
|
||||
MAKE_FFT_MEMFREE_FUNC(sse);
|
||||
MAKE_FFT_MEMCLEAR_FUNC(sse);
|
||||
MAKE_FFT_RUN_FUNC(sse);
|
||||
MAKE_FFT_CMUL_FUNC(sse);
|
||||
|
|
@ -95,6 +96,7 @@ MAKE_SUM_FUNC(avx2);
|
|||
MAKE_LINEAR_FUNC(avx2);
|
||||
MAKE_MULT_FUNC(avx2);
|
||||
MAKE_FFT_MEMALLOC_FUNC(avx2);
|
||||
MAKE_FFT_MEMFREE_FUNC(avx2);
|
||||
MAKE_FFT_MEMCLEAR_FUNC(avx2);
|
||||
MAKE_FFT_RUN_FUNC(avx2);
|
||||
MAKE_FFT_CMUL_FUNC(avx2);
|
||||
|
|
|
|||
|
|
@ -14,9 +14,8 @@
|
|||
|
||||
#ifdef HAVE_FFTW
|
||||
#include <fftw3.h>
|
||||
#else
|
||||
#include "pffft.h"
|
||||
#endif
|
||||
#include "pffft.h"
|
||||
|
||||
#include "audio-dsp-impl.h"
|
||||
|
||||
|
|
@ -827,14 +826,13 @@ static void fft_interleaved_sse(float *data, uint32_t len, float scale)
|
|||
|
||||
void *dsp_fft_memalloc_sse(void *obj, uint32_t size, bool real)
|
||||
{
|
||||
#ifdef HAVE_FFTW
|
||||
return fftwf_alloc_real(real ? size : SPA_ROUND_UP_N(size, FFT_BLOCK) * 2);
|
||||
#else
|
||||
if (real)
|
||||
return pffft_aligned_malloc(size * sizeof(float));
|
||||
else
|
||||
return pffft_aligned_malloc(size * 2 * sizeof(float));
|
||||
#endif
|
||||
uint32_t asize = real ? size : SPA_ROUND_UP_N(size, FFT_BLOCK) * 2;
|
||||
return pffft_aligned_malloc(asize * sizeof(float));
|
||||
}
|
||||
|
||||
void dsp_fft_memfree_sse(void *obj, void *data)
|
||||
{
|
||||
pffft_aligned_free(data);
|
||||
}
|
||||
|
||||
void dsp_fft_memclear_sse(void *obj, void *data, uint32_t size, bool real)
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ static const struct dsp_info dsp_table[] =
|
|||
.funcs.fft_new = dsp_fft_new_c,
|
||||
.funcs.fft_free = dsp_fft_free_c,
|
||||
.funcs.fft_memalloc = dsp_fft_memalloc_avx2,
|
||||
.funcs.fft_memfree = dsp_fft_memfree_c,
|
||||
.funcs.fft_memfree = dsp_fft_memfree_avx2,
|
||||
.funcs.fft_memclear = dsp_fft_memclear_avx2,
|
||||
.funcs.fft_run = dsp_fft_run_avx2,
|
||||
.funcs.fft_cmul = dsp_fft_cmul_avx2,
|
||||
|
|
@ -55,7 +55,7 @@ static const struct dsp_info dsp_table[] =
|
|||
.funcs.fft_new = dsp_fft_new_c,
|
||||
.funcs.fft_free = dsp_fft_free_c,
|
||||
.funcs.fft_memalloc = dsp_fft_memalloc_sse,
|
||||
.funcs.fft_memfree = dsp_fft_memfree_c,
|
||||
.funcs.fft_memfree = dsp_fft_memfree_sse,
|
||||
.funcs.fft_memclear = dsp_fft_memclear_sse,
|
||||
.funcs.fft_run = dsp_fft_run_sse,
|
||||
.funcs.fft_cmul = dsp_fft_cmul_sse,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue