summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArun Raghavan <git@arunraghavan.net>2015-10-15 12:51:03 +0530
committerArun Raghavan <git@arunraghavan.net>2015-10-15 16:18:47 +0530
commit98454ed26512886b897fee0544fac40a0b694912 (patch)
treeda3705e2a37e30f97e4447fb54d93cc5a654e12f
parentf6941fbf6a8d395645fdc0bbfc51b6431189f490 (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.ac51
-rw-r--r--webrtc/common_audio/Makefile.am65
-rw-r--r--webrtc/modules/audio_processing/Makefile.am39
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