@@ -86,7 +86,8 @@ void aligned_free (void* p)
8686namespace chowdsp ::fft::avx
8787{
8888struct FFT_Setup ;
89- FFT_Setup* fft_new_setup (int N, fft_transform_t transform);
89+ size_t fft_bytes_required (int N, fft_transform_t transform);
90+ FFT_Setup* fft_new_setup (int N, fft_transform_t transform, void * data);
9091void fft_destroy_setup (FFT_Setup* s);
9192void pffft_transform_internal (FFT_Setup* setup, const float * finput, float * foutput, void * scratch, fft_direction_t direction, int ordered);
9293void pffft_convolve_internal (FFT_Setup* setup, const float * a, const float * b, float * ab, float scaling);
@@ -228,27 +229,53 @@ bool check_is_pointer_sse_setup (void* ptr)
228229}
229230#endif
230231
231- void * fft_new_setup (int N, fft_transform_t transform, [[maybe_unused]] bool use_avx_if_available)
232+ size_t fft_bytes_required (int N, fft_transform_t transform, bool use_avx_if_available)
232233{
233234#if defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64)
234235#if CHOWDSP_FFT_COMPILER_SUPPORTS_AVX
235236 if (use_avx_if_available)
236237 {
237238 if (cpu_supports_avx ())
238239 {
239- auto * setup_ptr = avx::fft_new_setup (N, transform);
240+ return avx::fft_bytes_required (N, transform);
241+ }
242+ }
243+ return sse::fft_bytes_required (N, transform);
244+ #else
245+ return sse::fft_bytes_required (N, transform);
246+ #endif
247+ #elif defined(__ARM_NEON__) || defined(_M_ARM64)
248+ return neon::fft_bytes_required (N, transform);
249+ #endif
250+ }
251+
252+ void * fft_new_setup (int N, fft_transform_t transform, bool use_avx_if_available)
253+ {
254+ const auto fft_bytes = fft_bytes_required (N, transform, use_avx_if_available);
255+ return fft_new_setup_preallocated (N, transform, aligned_malloc (fft_bytes), use_avx_if_available);
256+ }
257+
258+ void * fft_new_setup_preallocated (int N, fft_transform_t transform, void * data, [[maybe_unused]] bool use_avx_if_available)
259+ {
260+ #if defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64)
261+ #if CHOWDSP_FFT_COMPILER_SUPPORTS_AVX
262+ if (use_avx_if_available)
263+ {
264+ if (cpu_supports_avx ())
265+ {
266+ auto * setup_ptr = avx::fft_new_setup (N, transform, data);
240267 if (setup_ptr != nullptr )
241268 return setup_ptr;
242269 }
243270 }
244- void * ptr = sse::fft_new_setup (N, transform);
271+ void * ptr = sse::fft_new_setup (N, transform, data );
245272 set_pointer_is_sse_setup (ptr);
246273 return ptr;
247274#else
248- return sse::fft_new_setup (N, transform);
275+ return sse::fft_new_setup (N, transform, data );
249276#endif
250277#elif defined(__ARM_NEON__) || defined(_M_ARM64)
251- return neon::fft_new_setup (N, transform);
278+ return neon::fft_new_setup (N, transform, data );
252279#endif
253280}
254281
0 commit comments