diff options
author | Arun Raghavan <git@arunraghavan.net> | 2015-10-15 12:51:03 +0530 |
---|---|---|
committer | Arun Raghavan <git@arunraghavan.net> | 2015-10-15 16:18:47 +0530 |
commit | 98454ed26512886b897fee0544fac40a0b694912 (patch) | |
tree | da3705e2a37e30f97e4447fb54d93cc5a654e12f | |
parent | f6941fbf6a8d395645fdc0bbfc51b6431189f490 (diff) |
build: Add architecture checks for x86 and ARM
On x86, SSE optimisations are always compiled in, and used based on
runtime checks.
On ARM, we try to autodetect NEON support (with an option of runtime
detection). This has not been build-tested on ARM yet.
This leaves MIPS to be done.
-rw-r--r-- | configure.ac | 51 | ||||
-rw-r--r-- | webrtc/common_audio/Makefile.am | 65 | ||||
-rw-r--r-- | webrtc/modules/audio_processing/Makefile.am | 39 |
3 files changed, 113 insertions, 42 deletions
diff --git a/configure.ac b/configure.ac index 6e2fdc2..e386a59 100644 --- a/configure.ac +++ b/configure.ac @@ -7,10 +7,14 @@ AC_SUBST(LIBWEBRTC_AUDIO_PROCESSING_VERSION_INFO, [0:0:0]) AM_SILENT_RULES([yes]) +# Set up the host_* variables +AC_CANONICAL_HOST + AC_PROG_CC AC_PROG_CXX AC_PROG_LIBTOOL AC_PROG_INSTALL +AM_PROG_AS AC_LANG_C AC_LANG_CPLUSPLUS @@ -53,8 +57,51 @@ AS_CASE(["${host}"], ) AC_SUBST(PLATFORM_CFLAGS) -COMMON_CFLAGS="-DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} -DNDEBUG -I\$(top_srcdir)" -COMMON_CXXFLAGS="-std=c++11 -DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} -DNDEBUG -I\$(top_srcdir)" +AS_CASE(["${host_cpu}"], + [i?86|x86_64], + [ + HAVE_X86=1 + ], + [armv7*|armv8*], + [ + HAVE_ARM=1 + HAVE_ARMV7=1 + ], + [arm*], + [ + HAVE_ARM=1 + ] + # FIXME: Add MIPS support, see webrtc/BUILD.gn for defines +) +AM_CONDITIONAL(HAVE_X86, [test "x${HAVE_X86}" = "x1"]) +AM_CONDITIONAL(HAVE_ARM, [test "x${HAVE_ARM}" = "x1"]) +AM_CONDITIONAL(HAVE_ARMV7, [test "x${HAVE_ARMV7}" = "x1"]) + +# Borrowed from pulseaudio's configure.ac +AC_ARG_ENABLE([neon], + AS_HELP_STRING([--enable-neon], [Enable NEON optimisations on ARM CPUs that support it (yes|no|auto|runtime)])) + +AS_IF([test "x$enable_neon" != "xno"], + AS_IF([test "x$enable_neon" != "xruntime"], + [ + save_CFLAGS="$CFLAGS"; CFLAGS="-mfpu=neon $CFLAGS" + AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM([[#include <arm_neon.h>]], [])], + [ + HAVE_NEON=1 + ARCH_CFLAGS="-mfpu=neon" + ]) + CFLAGS="$save_CFLAGS" + ], + [ + HAVE_NEON=1 + ARCH_CFLAGS="-mfpu=neon -DWEBRTC_DETECT_NEON" + ]) +) +AM_CONDITIONAL([HAVE_NEON], [test "x$HAVE_NEON" = "x1"]) + +COMMON_CFLAGS="-DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} ${ARCH_CFLAGS} -DNDEBUG -I\$(top_srcdir)" +COMMON_CXXFLAGS="-std=c++11 -DWEBRTC_AUDIO_PROCESSING_ONLY_BUILD ${PLATFORM_CFLAGS} ${OS_CFLAGS} ${ARCH_CFLAGS} -DNDEBUG -I\$(top_srcdir)" AC_SUBST([COMMON_CFLAGS]) AC_SUBST([COMMON_CXXFLAGS]) diff --git a/webrtc/common_audio/Makefile.am b/webrtc/common_audio/Makefile.am index 709bf71..9b0bac9 100644 --- a/webrtc/common_audio/Makefile.am +++ b/webrtc/common_audio/Makefile.am @@ -11,7 +11,6 @@ libcommon_audio_la_SOURCES = resampler/include/push_resampler.h \ resampler/push_sinc_resampler.cc \ resampler/resampler.cc \ resampler/sinc_resampler.cc \ - resampler/sinc_resampler_sse.cc \ resampler/sinusoidal_linear_chirp_source.cc \ signal_processing/include/real_fft.h \ signal_processing/include/signal_processing_library.h \ @@ -78,8 +77,6 @@ libcommon_audio_la_SOURCES = resampler/include/push_resampler.h \ fft4g.h \ fir_filter.cc \ fir_filter.h \ - fir_filter_sse.cc \ - fir_filter_sse.h \ lapped_transform.cc \ lapped_transform.h \ real_fourier.cc \ @@ -98,28 +95,46 @@ libcommon_audio_la_SOURCES = resampler/include/push_resampler.h \ window_generator.h \ window_generator.cc +if HAVE_X86 +libcommon_audio_la_SOURCES += \ + resampler/sinc_resampler_sse.cc \ + fir_filter_sse.cc \ + fir_filter_sse.h +endif + +if HAVE_ARM +libcommon_audio_la_SOURCES += \ + signal_processing/complex_bit_reverse_arm.S \ + signal_processing/spl_sqrt_floor_arm.S +endif + +if HAVE_ARMV7 +libcommon_audio_la_SOURCES += \ + signal_processing/filter_ar_fast_q12_armv7.S +endif + +if HAVE_NEON +libcommon_audio_la_SOURCES += \ + resampler/sinc_resampler_neon.cc \ + signal_processing/cross_correlation_neon.c \ + signal_processing/downsample_fast_neon.c \ + signal_processing/min_max_operations_neon.c \ + fir_filter_neon.cc \ + fir_filter_neon.h +endif + libcommon_audio_la_CFLAGS = $(AM_CFLAGS) $(COMMON_CFLAGS) libcommon_audio_la_CXXFLAGS = $(AM_CXXFLAGS) $(COMMON_CXXFLAGS) -EXTRA_DIST = BUILD.gn - -# FIXME: -# x86 - resampler/sinc_resampler_sse.cc -# fir_filter_sse.cc -# ARM - signal_processing/complex_bit_reverse_arm.S -# signal_processing/spl_sqrt_floor_arm.S -# ARM7 - signal_processing/filter_ar_fast_q12_armv7.S -# NEON - resampler/sinc_resampler_neon.cc \ -# signal_processing/cross_correlation_neon.c -# signal_processing/downsample_fast_neon.c -# signal_processing/min_max_operations_neon.c -# fir_filter_neon.c -# MIPS - signal_processing/complex_bit_reverse_mips.c -# signal_processing/complex_fft_mips.c -# signal_processing/cross_correlation_mips.c -# signal_processing/downsample_fast_mips.c -# signal_processing/filter_ar_fast_q12_mips.c -# signal_processing/min_max_operations_mips.c -# signal_processing/resample_by_2_mips.c -# signal_processing/spl_sqrt_floor_mips.c -# signal_processing/vector_scaling_operations_mips.c +# FIXME: The MIPS optimisations need to be hooked up once we have the +# autotools conditionals in place +EXTRA_DIST = BUILD.gn \ + signal_processing/complex_bit_reverse_mips.c \ + signal_processing/complex_fft_mips.c \ + signal_processing/cross_correlation_mips.c \ + signal_processing/downsample_fast_mips.c \ + signal_processing/filter_ar_fast_q12_mips.c \ + signal_processing/min_max_operations_mips.c \ + signal_processing/resample_by_2_mips.c \ + signal_processing/spl_sqrt_floor_mips.c \ + signal_processing/vector_scaling_operations_mips.c diff --git a/webrtc/modules/audio_processing/Makefile.am b/webrtc/modules/audio_processing/Makefile.am index f9b4ac7..48defd7 100644 --- a/webrtc/modules/audio_processing/Makefile.am +++ b/webrtc/modules/audio_processing/Makefile.am @@ -6,10 +6,8 @@ libwebrtc_audio_processing_la_SOURCES = include/audio_processing.h \ aec/aec_core.c \ aec/aec_core.h \ aec/aec_core_internal.h \ - aec/aec_core_sse2.c \ aec/aec_rdft.c \ aec/aec_rdft.h \ - aec/aec_rdft_sse2.c \ aec/aec_resampler.c \ aec/aec_resampler.h \ aec/echo_cancellation.c \ @@ -130,6 +128,10 @@ libwebrtc_audio_processing_la_SOURCES += \ ns/nsx_core.c \ ns/nsx_core.h \ ns/nsx_core_c.c +if HAVE_NEON +libwebrtc_audio_processing_la_SOURCES += \ + ns/nsx_core_neon.c +endif else COMMON_CFLAGS += -DWEBRTC_NS_FLOAT=1 COMMON_CXXFLAGS += -DWEBRTC_NS_FLOAT=1 @@ -142,6 +144,19 @@ libwebrtc_audio_processing_la_SOURCES += \ ns/windows_private.h endif +if HAVE_X86 +libwebrtc_audio_processing_la_SOURCES += \ + aec/aec_core_sse2.c \ + aec/aec_rdft_sse2.c +endif + +if HAVE_NEON +libwebrtc_audio_processing_la_SOURCES += \ + aec/aec_core_neon.c \ + aec/aec_rdft_neon.c \ + aecm/aecm_core_neon.c +endif + libwebrtc_audio_processing_la_CFLAGS = $(AM_CFLAGS) $(COMMON_CFLAGS) libwebrtc_audio_processing_la_CXXFLAGS = $(AM_CXXFLAGS) $(COMMON_CXXFLAGS) @@ -152,16 +167,10 @@ libwebrtc_audio_processing_la_LIBADD = $(top_builddir)/webrtc/libwebrtc.la \ $(top_builddir)/webrtc/modules/audio_coding/libaudio_coding.la libwebrtc_audio_processing_la_LDFLAGS = $(AM_LDFLAGS) -version-info $(LIBWEBRTC_AUDIO_PROCESSING_VERSION_INFO) -EXTRA_DIST = BUILD.gn - -# FIXME: -# x86: aec/aec_core_sse2.c -# aec/aec_rdft_sse2.c -# NEON: aec/aec_core_neon.c -# aec/aec_rdft_neon.c -# aecm/aecm_core_neon.c -# ns/nsx_core_neon.c -# MIPS: aec/aec_core_mips.c -# aec/aec_rdft_neon.c -# aecm/aecm_core_mips.c -# ns/nsx_core_mips.c +# FIXME: The MIPS optimisations need to be hooked up once we have the +# autotools conditionals in place +EXTRA_DIST = BUILD.gn \ + aec/aec_core_mips.c \ + aec/aec_rdft_neon.c \ + aecm/aecm_core_mips.c \ + ns/nsx_core_mips.c |