From 84a85e9e63ea687544375fbed3100051249a033b Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Tue, 12 Mar 2024 02:03:22 -0400 Subject: [PATCH 1/8] Fix meson AVX2 fixed-point --- silk/meson.build | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/silk/meson.build b/silk/meson.build index 80a59b05..35d95578 100644 --- a/silk/meson.build +++ b/silk/meson.build @@ -44,9 +44,7 @@ foreach intr_name : ['sse4_1', 'avx2', 'neon_intr'] endif intr_sources = get_variable('silk_sources_' + intr_name) - if opt_fixed_point - intr_sources += get_variable('silk_sources_fixed_' + intr_name) - else + if not opt_fixed_point intr_sources += get_variable('silk_sources_float_' + intr_name) endif -- 2.44.0 From 556c2d446b396cff11987ac1b74ed7bbf0297d78 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Wed, 13 Mar 2024 15:11:08 -0400 Subject: [PATCH 3/8] Adding MSVC AVX2 support for meson build Extracted from this MR from Marcus Asteborg: https://gitlab.xiph.org/xiph/opus/-/merge_requests/82/ --- meson.build | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/meson.build b/meson.build index 8624f0c3..2bb85d6f 100644 --- a/meson.build +++ b/meson.build @@ -490,10 +490,10 @@ if not opt_intrinsics.disabled() elif host_cpu_family in ['x86', 'x86_64'] # XXX: allow external override/specification of the flags x86_intrinsics = [ - [ 'SSE', 'xmmintrin.h', '__m128', '_mm_setzero_ps()', ['-msse'] ], - [ 'SSE2', 'emmintrin.h', '__m128i', '_mm_setzero_si128()', ['-msse2'] ], - [ 'SSE4.1', 'smmintrin.h', '__m128i', '_mm_setzero_si128(); mtest = _mm_cmpeq_epi64(mtest, mtest)', ['-msse4.1'] ], - [ 'AVX2', 'immintrin.h', '__m256i', '_mm256_abs_epi32(_mm256_setzero_si256())', ['-mavx', '-mfma', '-mavx2'] ], + [ 'SSE', 'xmmintrin.h', '__m128', '_mm_setzero_ps()', ['-msse'], [] ], + [ 'SSE2', 'emmintrin.h', '__m128i', '_mm_setzero_si128()', ['-msse2'], [] ], + [ 'SSE4.1', 'smmintrin.h', '__m128i', '_mm_setzero_si128(); mtest = _mm_cmpeq_epi64(mtest, mtest)', ['-msse4.1'], [] ], + [ 'AVX2', 'immintrin.h', '__m256i', '_mm256_abs_epi32(_mm256_setzero_si256())', ['-mavx', '-mfma', '-mavx2'], ['/arch:AVX2'] ], ] foreach intrin : x86_intrinsics @@ -504,9 +504,11 @@ if not opt_intrinsics.disabled() return *((unsigned char *) &mtest) != 0; }'''.format(intrin[1],intrin[2],intrin[3]) intrin_name = intrin[0] - # Intrinsics arguments are not available with MSVC-like compilers - intrin_args = cc.get_argument_syntax() == 'msvc' ? [] : intrin[4] - if cc.links(intrin_check, name : 'compiler supports @0@ intrinsics'.format(intrin_name)) + intrin_args = cc.get_argument_syntax() == 'msvc' ? intrin[5] : intrin[4] + if cc.get_argument_syntax() == 'msvc' and intrin_args.length() == 0 and cc.links(intrin_check, name : 'compiler supports @0@ intrinsics'.format(intrin_name)) + may_have_intrin = true + presume_intrin = opus_can_presume_simd + elif cc.get_argument_syntax() != 'msvc' and cc.links(intrin_check, name : 'compiler supports @0@ intrinsics'.format(intrin_name)) may_have_intrin = true presume_intrin = opus_can_presume_simd elif intrin_args.length() > 0 -- 2.44.0 From e7d4e82bc065747d94829d93cc9d8a9d1eab7951 Mon Sep 17 00:00:00 2001 From: "Timothy B. Terriberry" Date: Thu, 14 Mar 2024 08:00:53 -0700 Subject: [PATCH 4/8] Fix _mm_loadu_si32 detection for vendored Clang. Apple uses different __clang_major__ version numbers than upstream, so our test did not work. This caused compilation failures with, e.g., XCode 10.1, which reports __clang_major__ as 10 despite being forked from upstream's 7.0 branch. Fixes #2369 Signed-off-by: Jean-Marc Valin --- celt/x86/x86cpu.h | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/celt/x86/x86cpu.h b/celt/x86/x86cpu.h index 8ae9be8d..1e5b6a4c 100644 --- a/celt/x86/x86cpu.h +++ b/celt/x86/x86cpu.h @@ -68,8 +68,22 @@ int opus_select_arch(void); Use this to work around those restrictions (which should hopefully all get optimized to a single MOVD instruction). GCC implemented _mm_loadu_si32() since GCC 11; HOWEVER, there is a bug! - https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99754 */ -# if !defined(_MSC_VER) && !OPUS_GNUC_PREREQ(11,3) && !(defined(__clang__) && (__clang_major__ >= 8)) + https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99754 + LLVM implemented _mm_loadu_si32() since Clang 8.0, however the + __clang_major__ version number macro is unreliable, as vendors + (specifically, Apple) will use different numbering schemes than upstream. + Clang's advice is "use feature detection", but they do not provide feature + detection support for specific SIMD functions. + We follow the approach from the SIMDe project and instead detect unrelated + features that should be available in the version we want (see + ).*/ +# if defined(__clang__) +# if __has_warning("-Wextra-semi-stmt") || \ + __has_builtin(__builtin_rotateleft32) +# define OPUS_CLANG_8 (1) +# endif +# endif +# if !defined(_MSC_VER) && !OPUS_GNUC_PREREQ(11,3) && !defined(OPUS_CLANG_8) # include # include -- 2.44.0 From ca901e65aab8d4b5b85d2cb2649819c24e0b1602 Mon Sep 17 00:00:00 2001 From: Xavier Claessens Date: Tue, 20 Jun 2023 08:18:00 -0400 Subject: [PATCH 5/8] meson: Use pkgconfig generator It is much less error prone because Meson can detect dependencies automatically. As bonus Meson will also generate the opus-uninstalled.pc file. Signed-off-by: Jean-Marc Valin --- meson.build | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/meson.build b/meson.build index 2bb85d6f..5638dd1d 100644 --- a/meson.build +++ b/meson.build @@ -662,29 +662,11 @@ if not opt_tests.disabled() subdir('tests') endif -# pkg-config files (not using pkg module so we can use the existing .pc.in file) -pkgconf = configuration_data() - -pkgconf.set('prefix', join_paths(get_option('prefix'))) -pkgconf.set('exec_prefix', '${prefix}') -pkgconf.set('libdir', '${prefix}/@0@'.format(get_option('libdir'))) -pkgconf.set('includedir', '${prefix}/@0@'.format(get_option('includedir'))) -pkgconf.set('VERSION', opus_version) -pkgconf.set('PC_BUILD', pc_build) -pkgconf.set('LIBM', libm.found() ? '-lm' : '') - -pkg_install_dir = '@0@/pkgconfig'.format(get_option('libdir')) - -configure_file(input : 'opus.pc.in', - output : 'opus.pc', - configuration : pkgconf, - install_dir : pkg_install_dir) - -# The uninstalled one has hardcoded libtool + static lib stuff, skip it for now -#configure_file(input : 'opus-uninstalled.pc.in', -# output : 'opus-uninstalled.pc', -# configuration : pkgconf, -# install : false) +pkg = import('pkgconfig') +pkg.generate(opus_lib, + description: 'Opus IETF audio codec (floating-point build)', + subdirs: 'opus', +) doxygen = find_program('doxygen', required: get_option('docs')) if doxygen.found() -- 2.44.0 From 12239ced101ffee481781a2eb3b8c88bea523085 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Thu, 14 Mar 2024 15:17:33 -0400 Subject: [PATCH 6/8] renaming DNN options in meson --- dnn/meson.build | 6 +++--- meson.build | 20 ++++++++++++++++---- meson_options.txt | 8 ++++---- tests/meson.build | 4 ++++ 5 files changed, 28 insertions(+), 12 deletions(-) diff --git a/dnn/meson.build b/dnn/meson.build index 737d4a02..7b324016 100644 --- a/dnn/meson.build +++ b/dnn/meson.build @@ -1,12 +1,12 @@ dnn_sources = sources['DEEP_PLC_SOURCES'] dred_sources = sources['DRED_SOURCES'] -if opt_enable_dred +if opt_dred.enabled() dnn_sources += dred_sources endif osce_sources = sources['OSCE_SOURCES'] -if opt_enable_osce +if opt_osce.enabled() dnn_sources += osce_sources endif @@ -51,7 +51,7 @@ if host_machine.system() == 'windows' endif -if opt_enable_deep_plc +if opt_deep_plc.enabled() dnn_lib = static_library('opus-dnn', dnn_sources, c_args: dnn_c_args, diff --git a/meson.build b/meson.build index 5638dd1d..d040ddfd 100644 --- a/meson.build +++ b/meson.build @@ -146,9 +146,6 @@ opts = [ [ 'fixed-point-debug', 'FIXED_DEBUG' ], [ 'custom-modes', 'CUSTOM_MODES' ], [ 'float-approx', 'FLOAT_APPROX' ], - [ 'enable-deep-plc', 'ENABLE_DEEP_PLC' ], - [ 'enable-dred', 'ENABLE_DRED' ], - [ 'enable-osce', 'ENABLE_OSCE' ], [ 'assertions', 'ENABLE_ASSERTIONS' ], [ 'hardening', 'ENABLE_HARDENING' ], [ 'fuzzing', 'FUZZING' ], @@ -164,6 +161,21 @@ foreach opt : opts set_variable('opt_' + opt[0].underscorify(), opt_foo) endforeach +feat = [ + [ 'deep-plc', 'ENABLE_DEEP_PLC' ], + [ 'dred', 'ENABLE_DRED' ], + [ 'osce', 'ENABLE_OSCE' ], +] + +foreach opt : feat + # we assume these are all boolean options + opt_foo = get_option(opt[0]) + if opt_foo.enabled() + opus_conf.set(opt[1], 1) + endif + set_variable('opt_' + opt[0].underscorify(), opt_foo) +endforeach + opt_asm = get_option('asm') opt_rtcd = get_option('rtcd') opt_intrinsics = get_option('intrinsics') @@ -175,7 +187,7 @@ if disable_float_api opus_conf.set('DISABLE_FLOAT_API', 1) endif -if not get_option('enable-dnn-debug-float') +if not get_option('dnn-debug-float').enabled() opus_conf.set('DISABLE_DEBUG_FLOAT', 1) endif diff --git a/meson_options.txt b/meson_options.txt index 46099276..a2981d0b 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -7,10 +7,10 @@ option('rtcd', type : 'feature', value : 'auto', description : 'Run-time CPU cap option('asm', type : 'feature', value : 'auto', description : 'Assembly optimizations for ARM (fixed-point)') option('intrinsics', type : 'feature', value : 'auto', description : 'Intrinsics optimizations for ARM NEON or x86') -option('enable-deep-plc', type : 'boolean', value : false, description : 'Enable Deep Packet Loss Concealment (PLC)') -option('enable-dred', type : 'boolean', value : false, description : 'Enable Deep Redundancy (DRED)') -option('enable-osce', type : 'boolean', value : false, description : 'Enable Opus Speech Coding Enhancement (OSCE)') -option('enable-dnn-debug-float', type : 'boolean', value : false, description : 'Compute DNN using float weights') +option('deep-plc', type : 'feature', value : 'disabled', description : 'Enable Deep Packet Loss Concealment (PLC)') +option('dred', type : 'feature', value : 'disabled', description : 'Enable Deep Redundancy (DRED)') +option('osce', type : 'feature', value : 'disabled', description : 'Enable Opus Speech Coding Enhancement (OSCE)') +option('dnn-debug-float', type : 'feature', value : 'disabled', description : 'Compute DNN using float weights') option('custom-modes', type : 'boolean', value : false, description : 'Enable non-Opus modes, e.g. 44.1 kHz & 2^n frames') option('extra-programs', type : 'feature', value : 'auto', description : 'Extra programs (demo and tests)') diff --git a/tests/meson.build b/tests/meson.build index 1c1ddf07..1a4040b5 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -8,6 +8,10 @@ opus_tests = [ ['test_opus_projection'], ] +if opt_dred.enabled() + opus_tests += [['test_opus_dred', [], 60 * 20]] +endif + foreach t : opus_tests test_name = t.get(0) extra_srcs = t.get(1, []) -- 2.44.0