From d2b4bde2e7fdec237d82304135ca8fed02512749 Mon Sep 17 00:00:00 2001 From: Michael Platings Date: Tue, 30 Jan 2024 12:37:59 +0000 Subject: [PATCH] Type-safe ifuncs Previously ifunc implementations were cast to void* which meant there was no compile-time checking that the prototype and implementation matched. This had led to a slight discrepancy in intrinsiccv_split, now fixed. --- intrinsiccv/include/dispatch.h | 83 +++++++------------ intrinsiccv/include/intrinsiccv.h | 2 +- intrinsiccv/src/analysis/min_max_api.cpp | 24 ++---- intrinsiccv/src/arithmetics/absdiff_api.cpp | 15 ++-- .../add_abs_with_threshold_api.cpp | 21 ++--- intrinsiccv/src/arithmetics/add_api.cpp | 17 ++-- intrinsiccv/src/arithmetics/multiply_api.cpp | 17 ++-- intrinsiccv/src/arithmetics/scale_api.cpp | 11 +-- intrinsiccv/src/arithmetics/sub_api.cpp | 17 ++-- intrinsiccv/src/arithmetics/threshold_api.cpp | 17 ++-- intrinsiccv/src/arithmetics/transpose_api.cpp | 8 +- .../src/conversions/gray_to_rgb_api.cpp | 18 ++-- intrinsiccv/src/conversions/merge_api.cpp | 12 +-- .../src/conversions/rgb_to_rgb_api.cpp | 18 ++-- intrinsiccv/src/conversions/split_api.cpp | 14 ++-- .../src/conversions/yuv_to_rgb_api.cpp | 14 +--- intrinsiccv/src/filters/gaussian_blur_api.cpp | 36 +++----- intrinsiccv/src/filters/sobel_api.cpp | 17 ++-- intrinsiccv/src/morphology/morphology_api.cpp | 19 ++--- intrinsiccv/src/resize/resize_api.cpp | 19 ++--- 20 files changed, 135 insertions(+), 264 deletions(-) diff --git a/intrinsiccv/include/dispatch.h b/intrinsiccv/include/dispatch.h index d033f52fb..1947b0c3d 100644 --- a/intrinsiccv/include/dispatch.h +++ b/intrinsiccv/include/dispatch.h @@ -12,7 +12,6 @@ namespace intrinsiccv { -using IFuncImplType = void *; using HwCapTy = uint64_t; struct HwCaps final { @@ -36,74 +35,48 @@ static inline bool hwcaps_has_sme2(HwCaps hwcaps) { return hwcaps.hwcap2 & (1UL << kSMEBit); } -struct IFuncImpls final { - IFuncImplType neon_impl{nullptr}; -#ifdef INTRINSICCV_HAVE_SVE2 - IFuncImplType sve2_impl{nullptr}; -#endif -#ifdef INTRINSICCV_HAVE_SME2 - IFuncImplType sme2_impl{nullptr}; -#endif -}; - -#define INTRINSICCV_ADD_NEON_IMPL(func) \ - do { \ - impls.neon_impl = reinterpret_cast(&(func)); \ - } while (false) - #if INTRINSICCV_ALWAYS_ENABLE_SVE2 -#define INTRINSICCV_ADD_SVE2_IMPL_IF(func) INTRINSICCV_ADD_SVE2_IMPL(func) +#define INTRINSICCV_SVE2_IMPL_IF(func) func #else -#define INTRINSICCV_ADD_SVE2_IMPL_IF(func) +#define INTRINSICCV_SVE2_IMPL_IF(func) nullptr #endif #ifdef INTRINSICCV_HAVE_SVE2 -#define INTRINSICCV_ADD_SVE2_IMPL(func) \ - do { \ - impls.sve2_impl = reinterpret_cast(&(func)); \ - } while (false) -#else -#define INTRINSICCV_ADD_SVE2_IMPL(func) ((void)0) -#endif +#define INTRINSICCV_SVE2_RESOLVE_IFUNC(sve2_impl) \ + if (sve2_impl && hwcaps_has_sve2(hwcaps)) { \ + return sve2_impl; \ + } -#ifdef INTRINSICCV_HAVE_SME2 -#define INTRINSICCV_ADD_SME2_IMPL(func) \ - do { \ - impls.sme2_impl = reinterpret_cast(&(func)); \ - } while (false) #else -#define INTRINSICCV_ADD_SME2_IMPL(func) ((void)0) +#define INTRINSICCV_SVE2_RESOLVE_IFUNC(sve2_impl) #endif -static inline IFuncImplType default_ifunc_resolver( - [[maybe_unused]] const HwCaps hwcaps, const IFuncImpls impls) { #ifdef INTRINSICCV_HAVE_SME2 - if (impls.sme2_impl && hwcaps_has_sme2(hwcaps)) { - return impls.sme2_impl; - } -#endif - -#ifdef INTRINSICCV_HAVE_SVE2 - if (impls.sve2_impl && hwcaps_has_sve2(hwcaps)) { - return impls.sve2_impl; +#define INTRINSICCV_SME2_RESOLVE_IFUNC(sme2_impl) \ + if (sme2_impl && hwcaps_has_sme2(hwcaps)) { \ + return sme2_impl; \ } +#else +#define INTRINSICCV_SME2_RESOLVE_IFUNC(sme2_impl) #endif - return impls.neon_impl; -} - // Creates a multiversioned C API with an ifunc resolver for it -#define INTRINSICCV_MULTIVERSION_C_API(api_name, impls_builder, retty, ...) \ - extern "C" INTRINSICCV_IFUNC_RESOLVER IFuncImplType \ - api_name##_ifunc_resolver(HwCapTy, __ifunc_arg_t *arg); \ - \ - extern "C" IFuncImplType api_name##_ifunc_resolver(HwCapTy hwcap, \ - __ifunc_arg_t *arg) { \ - IFuncImpls impls = impls_builder(); \ - return default_ifunc_resolver(make_hwcaps(hwcap, arg), impls); \ - } \ - \ - extern "C" retty api_name(__VA_ARGS__) \ +#define INTRINSICCV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, \ + sme2_impl, return_type, ...) \ + typedef return_type (*api_name##_function_type)(__VA_ARGS__); \ + \ + extern "C" INTRINSICCV_IFUNC_RESOLVER api_name##_function_type \ + api_name##_ifunc_resolver(HwCapTy, __ifunc_arg_t *arg); \ + \ + extern "C" api_name##_function_type api_name##_ifunc_resolver( \ + HwCapTy hwcap, __ifunc_arg_t *arg) { \ + [[maybe_unused]] HwCaps hwcaps = make_hwcaps(hwcap, arg); \ + INTRINSICCV_SME2_RESOLVE_IFUNC(sme2_impl); \ + INTRINSICCV_SVE2_RESOLVE_IFUNC(sve2_impl); \ + return neon_impl; \ + } \ + \ + extern "C" return_type api_name(__VA_ARGS__) \ INTRINSICCV_ATTR_IFUNC(#api_name "_ifunc_resolver") } // namespace intrinsiccv diff --git a/intrinsiccv/include/intrinsiccv.h b/intrinsiccv/include/intrinsiccv.h index 76865c6dd..1fcb3ec98 100644 --- a/intrinsiccv/include/intrinsiccv.h +++ b/intrinsiccv/include/intrinsiccv.h @@ -642,7 +642,7 @@ void intrinsiccv_gaussian_blur_5x5_u8( /// @param element_size Size of one element in bytes. /// void intrinsiccv_split(const void *src_data, size_t src_stride, void **dst_data, - size_t *dst_strides, size_t width, size_t height, + const size_t *dst_strides, size_t width, size_t height, size_t channels, size_t element_size); void intrinsiccv_transpose(const void *src, size_t src_stride, void *dst, diff --git a/intrinsiccv/src/analysis/min_max_api.cpp b/intrinsiccv/src/analysis/min_max_api.cpp index c34c735b7..f96938aa5 100644 --- a/intrinsiccv/src/analysis/min_max_api.cpp +++ b/intrinsiccv/src/analysis/min_max_api.cpp @@ -25,14 +25,9 @@ namespace sve2 {} // namespace sve2 namespace sme2 {} // namespace sme2 #define INTRINSICCV_DEFINE_MINMAX_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::min_max); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, size_t, size_t, type *, \ - type *) + INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::min_max, \ + nullptr, nullptr, void, const type *, size_t, \ + size_t, size_t, type *, type *) INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_u8, uint8_t); INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_s8, int8_t); @@ -40,15 +35,10 @@ INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_u16, uint16_t); INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_s16, int16_t); INTRINSICCV_DEFINE_MINMAX_API(intrinsiccv_min_max_s32, int32_t); -#define INTRINSICCV_DEFINE_MINMAXLOC_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::min_max_loc); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, size_t, size_t, \ - size_t *, size_t *) +#define INTRINSICCV_DEFINE_MINMAXLOC_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::min_max_loc, \ + nullptr, nullptr, void, const type *, size_t, \ + size_t, size_t, size_t *, size_t *) INTRINSICCV_DEFINE_MINMAXLOC_API(intrinsiccv_min_max_loc_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/absdiff_api.cpp b/intrinsiccv/src/arithmetics/absdiff_api.cpp index d0e66ac81..117281d07 100644 --- a/intrinsiccv/src/arithmetics/absdiff_api.cpp +++ b/intrinsiccv/src/arithmetics/absdiff_api.cpp @@ -36,16 +36,11 @@ void saturating_absdiff(const T *src_a, size_t src_a_stride, const T *src_b, } // namespace sme2 #define INTRINSICCV_DEFINE_C_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::saturating_absdiff); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_absdiff); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::saturating_absdiff); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, const type *, size_t, \ - type *, size_t, size_t, size_t) + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_absdiff, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_absdiff), \ + intrinsiccv::sme2::saturating_absdiff, void, const type *, size_t, \ + const type *, size_t, type *, size_t, size_t, size_t) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_absdiff_u8, uint8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_absdiff_s8, int8_t); diff --git a/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp b/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp index 61c74a727..dab855588 100644 --- a/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp +++ b/intrinsiccv/src/arithmetics/add_abs_with_threshold_api.cpp @@ -35,20 +35,13 @@ void add_abs_with_threshold(const T *src_a, size_t src_a_stride, const T *src_b, } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL( \ - intrinsiccv::neon::add_abs_with_threshold); \ - INTRINSICCV_ADD_SVE2_IMPL_IF( \ - intrinsiccv::sve2::add_abs_with_threshold); \ - INTRINSICCV_ADD_SME2_IMPL( \ - intrinsiccv::sme2::add_abs_with_threshold); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, const type *, size_t, \ - type *, size_t, size_t, size_t, type) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::add_abs_with_threshold, \ + INTRINSICCV_SVE2_IMPL_IF( \ + intrinsiccv::sve2::add_abs_with_threshold), \ + intrinsiccv::sme2::add_abs_with_threshold, void, const type *, \ + size_t, const type *, size_t, type *, size_t, size_t, size_t, type) INTRINSICCV_DEFINE_C_API(intrinsiccv_add_abs_with_threshold, int16_t); diff --git a/intrinsiccv/src/arithmetics/add_api.cpp b/intrinsiccv/src/arithmetics/add_api.cpp index 363d4cd94..fdcff9255 100644 --- a/intrinsiccv/src/arithmetics/add_api.cpp +++ b/intrinsiccv/src/arithmetics/add_api.cpp @@ -35,17 +35,12 @@ void saturating_add(const T *src_a, size_t src_a_stride, const T *src_b, } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::saturating_add); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_add); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::saturating_add); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, const type *, size_t, \ - type *, size_t, size_t, size_t) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_add, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_add), \ + intrinsiccv::sme2::saturating_add, void, const type *, size_t, \ + const type *, size_t, type *, size_t, size_t, size_t) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_add_s8, int8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_add_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/multiply_api.cpp b/intrinsiccv/src/arithmetics/multiply_api.cpp index ff9f00668..9ecd171c4 100644 --- a/intrinsiccv/src/arithmetics/multiply_api.cpp +++ b/intrinsiccv/src/arithmetics/multiply_api.cpp @@ -35,17 +35,12 @@ void saturating_multiply(const T *src_a, size_t src_a_stride, const T *src_b, // } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::saturating_multiply); \ - INTRINSICCV_ADD_SVE2_IMPL_IF( \ - intrinsiccv::sve2::saturating_multiply); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, const type *, size_t, \ - type *, size_t, size_t, size_t, double) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_multiply, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_multiply), \ + nullptr, void, const type *, size_t, const type *, size_t, type *, \ + size_t, size_t, size_t, double) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_multiply_u8, uint8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_multiply_s8, int8_t); diff --git a/intrinsiccv/src/arithmetics/scale_api.cpp b/intrinsiccv/src/arithmetics/scale_api.cpp index 4ee262b7f..da7d995e1 100644 --- a/intrinsiccv/src/arithmetics/scale_api.cpp +++ b/intrinsiccv/src/arithmetics/scale_api.cpp @@ -20,14 +20,9 @@ namespace sve2 {} // namespace sve2 namespace sme2 {} // namespace sme2 #define INTRINSICCV_DEFINE_SCALE_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::scale); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, type *, size_t, size_t, \ - size_t, float, float) + INTRINSICCV_MULTIVERSION_C_API(name, intrinsiccv::neon::scale, \ + nullptr, nullptr, void, const type *, size_t, \ + type *, size_t, size_t, size_t, float, float) INTRINSICCV_DEFINE_SCALE_API(intrinsiccv_scale_u8, uint8_t); // INTRINSICCV_DEFINE_SCALE_API(intrinsiccv_scale_s8, int8_t); diff --git a/intrinsiccv/src/arithmetics/sub_api.cpp b/intrinsiccv/src/arithmetics/sub_api.cpp index e52fe080e..929d1f32d 100644 --- a/intrinsiccv/src/arithmetics/sub_api.cpp +++ b/intrinsiccv/src/arithmetics/sub_api.cpp @@ -34,17 +34,12 @@ void saturating_sub(const T *src_a, size_t src_a_stride, const T *src_b, } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::saturating_sub); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_sub); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::saturating_sub); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, const type *, size_t, \ - type *, size_t, size_t, size_t) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::saturating_sub, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::saturating_sub), \ + intrinsiccv::sme2::saturating_sub, void, const type *, size_t, \ + const type *, size_t, type *, size_t, size_t, size_t) INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_sub_s8, int8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_saturating_sub_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/threshold_api.cpp b/intrinsiccv/src/arithmetics/threshold_api.cpp index 53968ccd8..5ec4410b6 100644 --- a/intrinsiccv/src/arithmetics/threshold_api.cpp +++ b/intrinsiccv/src/arithmetics/threshold_api.cpp @@ -28,17 +28,12 @@ void threshold_binary(const T *src, size_t src_stride, T *dst, T threshold, T value); } // namespace sme2 -#define INTRINSICCV_DEFINE_C_API(name, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::threshold_binary); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::threshold_binary); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::threshold_binary); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const type *, size_t, type *, size_t, size_t, \ - size_t, type, type) +#define INTRINSICCV_DEFINE_C_API(name, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::threshold_binary, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::threshold_binary), \ + intrinsiccv::sme2::threshold_binary, void, const type *, size_t, \ + type *, size_t, size_t, size_t, type, type) INTRINSICCV_DEFINE_C_API(intrinsiccv_threshold_binary_u8, uint8_t); diff --git a/intrinsiccv/src/arithmetics/transpose_api.cpp b/intrinsiccv/src/arithmetics/transpose_api.cpp index 7cf11cbfc..3143ff10c 100644 --- a/intrinsiccv/src/arithmetics/transpose_api.cpp +++ b/intrinsiccv/src/arithmetics/transpose_api.cpp @@ -8,12 +8,8 @@ namespace intrinsiccv { -static IFuncImpls transpose_impls_builder(void) { - IFuncImpls impls; - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::transpose); - return impls; -} -INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_transpose, transpose_impls_builder, +INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_transpose, + intrinsiccv::neon::transpose, nullptr, nullptr, void, const void *, size_t, void *, size_t, size_t, size_t, size_t); diff --git a/intrinsiccv/src/conversions/gray_to_rgb_api.cpp b/intrinsiccv/src/conversions/gray_to_rgb_api.cpp index 36b79889b..020499bf6 100644 --- a/intrinsiccv/src/conversions/gray_to_rgb_api.cpp +++ b/intrinsiccv/src/conversions/gray_to_rgb_api.cpp @@ -8,17 +8,13 @@ namespace intrinsiccv { -#define INTRINSICCV_DEFINE_C_API(name, partialname) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::partialname); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::partialname); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::partialname); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, name##_impls_builder, void, const uint8_t *src, size_t src_stride, \ - uint8_t *dst, size_t dst_stride, size_t width, size_t height) +#define INTRINSICCV_DEFINE_C_API(name, partialname) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ + intrinsiccv::sme2::partialname, void, const uint8_t *src, \ + size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, \ + size_t height) INTRINSICCV_DEFINE_C_API(intrinsiccv_gray_to_rgb_u8, gray_to_rgb_u8); INTRINSICCV_DEFINE_C_API(intrinsiccv_gray_to_rgba_u8, gray_to_rgba_u8); diff --git a/intrinsiccv/src/conversions/merge_api.cpp b/intrinsiccv/src/conversions/merge_api.cpp index 622aae866..ff3ce0b34 100644 --- a/intrinsiccv/src/conversions/merge_api.cpp +++ b/intrinsiccv/src/conversions/merge_api.cpp @@ -8,13 +8,9 @@ namespace intrinsiccv { -static IFuncImpls merge_impls_builder(void) { - IFuncImpls impls; - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::merge); - return impls; -} -INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_merge, merge_impls_builder, void, - const void **, const size_t *, void *, size_t, - size_t, size_t, size_t, size_t); +INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_merge, intrinsiccv::neon::merge, + nullptr, nullptr, void, const void **, + const size_t *, void *, size_t, size_t, size_t, + size_t, size_t); } // namespace intrinsiccv diff --git a/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp b/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp index 911e7a78b..1ca54020f 100644 --- a/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp +++ b/intrinsiccv/src/conversions/rgb_to_rgb_api.cpp @@ -9,17 +9,13 @@ namespace intrinsiccv { -#define INTRINSICCV_DEFINE_C_API(name, partialname) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::partialname); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::partialname); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::partialname); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, name##_impls_builder, void, const uint8_t *src, size_t src_stride, \ - uint8_t *dst, size_t dst_stride, size_t width, size_t height) +#define INTRINSICCV_DEFINE_C_API(name, partialname) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ + intrinsiccv::sme2::partialname, void, const uint8_t *src, \ + size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, \ + size_t height) INTRINSICCV_DEFINE_C_API(intrinsiccv_rgb_to_bgr_u8, rgb_to_bgr_u8); INTRINSICCV_DEFINE_C_API(intrinsiccv_rgba_to_bgra_u8, rgba_to_bgra_u8); diff --git a/intrinsiccv/src/conversions/split_api.cpp b/intrinsiccv/src/conversions/split_api.cpp index 61a80ae02..715a0e7bb 100644 --- a/intrinsiccv/src/conversions/split_api.cpp +++ b/intrinsiccv/src/conversions/split_api.cpp @@ -8,15 +8,11 @@ namespace intrinsiccv { -static IFuncImpls split_impls_builder(void) { - IFuncImpls impls; - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::split); - return impls; -} -INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_split, split_impls_builder, void, - const void *src_data, size_t src_stride, - void **dst_data, size_t *dst_strides, - size_t width, size_t height, size_t channels, +INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_split, intrinsiccv::neon::split, + nullptr, nullptr, void, const void *src_data, + size_t src_stride, void **dst_data, + const size_t *dst_strides, size_t width, + size_t height, size_t channels, size_t element_size); } // namespace intrinsiccv diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp b/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp index bf98eb5d4..536a2c3a2 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp +++ b/intrinsiccv/src/conversions/yuv_to_rgb_api.cpp @@ -8,16 +8,10 @@ namespace intrinsiccv { -#define INTRINSICCV_DEFINE_C_API(name, partialname) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::partialname); \ - INTRINSICCV_ADD_SVE2_IMPL(intrinsiccv::sve2::partialname); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::partialname); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, name##_impls_builder, void, const uint8_t *, size_t, \ +#define INTRINSICCV_DEFINE_C_API(name, partialname) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, intrinsiccv::sve2::partialname, \ + intrinsiccv::sme2::partialname, void, const uint8_t *, size_t, \ const uint8_t *, size_t, uint8_t *, size_t, size_t, size_t, bool) INTRINSICCV_DEFINE_C_API(intrinsiccv_yuv_sp_to_rgb_u8, yuv_sp_to_rgb_u8); diff --git a/intrinsiccv/src/filters/gaussian_blur_api.cpp b/intrinsiccv/src/filters/gaussian_blur_api.cpp index ca06e80c8..a474889d5 100644 --- a/intrinsiccv/src/filters/gaussian_blur_api.cpp +++ b/intrinsiccv/src/filters/gaussian_blur_api.cpp @@ -39,33 +39,21 @@ void intrinsiccv_filter_release(intrinsiccv_filter_params_t *params) { } // extern "C" -static IFuncImpls gaussian_blur_3x3_u8_impls_builder(void) { - IFuncImpls impls; - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::gaussian_blur_3x3_u8); - return impls; -} INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_gaussian_blur_3x3_u8, - gaussian_blur_3x3_u8_impls_builder, void, - const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels, + intrinsiccv::neon::gaussian_blur_3x3_u8, nullptr, + nullptr, void, const uint8_t *src, + size_t src_stride, uint8_t *dst, + size_t dst_stride, size_t width, size_t height, + size_t channels, intrinsiccv_border_type_t border_type, const intrinsiccv_filter_params_t *params); -static IFuncImpls gaussian_blur_5x5_u8_impls_builder(void) { - IFuncImpls impls; - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::gaussian_blur_5x5_u8); - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::gaussian_blur_5x5_u8); - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::gaussian_blur_5x5_u8); - return impls; -} - -INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_gaussian_blur_5x5_u8, - gaussian_blur_5x5_u8_impls_builder, void, - const uint8_t *src, size_t src_stride, - uint8_t *dst, size_t dst_stride, size_t width, - size_t height, size_t channels, - intrinsiccv_border_type_t border_type, - const intrinsiccv_filter_params_t *params); +INTRINSICCV_MULTIVERSION_C_API( + intrinsiccv_gaussian_blur_5x5_u8, intrinsiccv::neon::gaussian_blur_5x5_u8, + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::gaussian_blur_5x5_u8), + intrinsiccv::sme2::gaussian_blur_5x5_u8, void, const uint8_t *src, + size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, + size_t height, size_t channels, intrinsiccv_border_type_t border_type, + const intrinsiccv_filter_params_t *params); } // namespace intrinsiccv diff --git a/intrinsiccv/src/filters/sobel_api.cpp b/intrinsiccv/src/filters/sobel_api.cpp index 3047aa2b2..78c843993 100644 --- a/intrinsiccv/src/filters/sobel_api.cpp +++ b/intrinsiccv/src/filters/sobel_api.cpp @@ -9,17 +9,12 @@ namespace intrinsiccv { #define INTRINSICCV_DEFINE_C_API(name, partialname) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::partialname); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::partialname); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::partialname); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API(name, name##_impls_builder, void, \ - const uint8_t *src, size_t src_stride, \ - int16_t *dst, size_t dst_stride, \ - size_t width, size_t height, size_t channels) + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::partialname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::partialname), \ + intrinsiccv::sme2::partialname, void, const uint8_t *src, \ + size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, \ + size_t height, size_t channels) INTRINSICCV_DEFINE_C_API(intrinsiccv_sobel_3x3_horizontal_s16_u8, sobel_3x3_horizontal_s16_u8); diff --git a/intrinsiccv/src/morphology/morphology_api.cpp b/intrinsiccv/src/morphology/morphology_api.cpp index 3d279eae0..788965b51 100644 --- a/intrinsiccv/src/morphology/morphology_api.cpp +++ b/intrinsiccv/src/morphology/morphology_api.cpp @@ -82,18 +82,13 @@ void intrinsiccv_morphology_release(intrinsiccv_morphology_params_t *params) { } // extern "C" -#define INTRINSICCV_DEFINE_C_API(name, tname, type) \ - static IFuncImpls name##_impls_builder(void) { \ - IFuncImpls impls; \ - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::tname); \ - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::tname); \ - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::tname); \ - return impls; \ - } \ - INTRINSICCV_MULTIVERSION_C_API( \ - name, name##_impls_builder, void, const type *src, size_t src_stride, \ - type *dst, size_t dst_stride, size_t width, size_t height, \ - const intrinsiccv_morphology_params_t *) +#define INTRINSICCV_DEFINE_C_API(name, tname, type) \ + INTRINSICCV_MULTIVERSION_C_API( \ + name, intrinsiccv::neon::tname, \ + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::tname), \ + intrinsiccv::sme2::tname, void, const type *src, \ + size_t src_stride, type *dst, size_t dst_stride, size_t width, \ + size_t height, const intrinsiccv_morphology_params_t *) INTRINSICCV_DEFINE_C_API(intrinsiccv_dilate_u8, dilate, uint8_t); INTRINSICCV_DEFINE_C_API(intrinsiccv_erode_u8, erode, uint8_t); diff --git a/intrinsiccv/src/resize/resize_api.cpp b/intrinsiccv/src/resize/resize_api.cpp index f89aee754..0fe577a6e 100644 --- a/intrinsiccv/src/resize/resize_api.cpp +++ b/intrinsiccv/src/resize/resize_api.cpp @@ -8,18 +8,11 @@ namespace intrinsiccv { -static IFuncImpls resize_to_quarter_u8_impls_builder(void) { - IFuncImpls impls; - INTRINSICCV_ADD_NEON_IMPL(intrinsiccv::neon::resize_to_quarter_u8); - INTRINSICCV_ADD_SVE2_IMPL_IF(intrinsiccv::sve2::resize_to_quarter_u8); - INTRINSICCV_ADD_SME2_IMPL(intrinsiccv::sme2::resize_to_quarter_u8); - return impls; -} -INTRINSICCV_MULTIVERSION_C_API(intrinsiccv_resize_to_quarter_u8, - resize_to_quarter_u8_impls_builder, void, - const uint8_t *src, size_t src_stride, - size_t src_width, size_t src_height, - uint8_t *dst, size_t dst_stride, - size_t dst_width, size_t dst_height); +INTRINSICCV_MULTIVERSION_C_API( + intrinsiccv_resize_to_quarter_u8, intrinsiccv::neon::resize_to_quarter_u8, + INTRINSICCV_SVE2_IMPL_IF(intrinsiccv::sve2::resize_to_quarter_u8), + intrinsiccv::sme2::resize_to_quarter_u8, void, const uint8_t *src, + size_t src_stride, size_t src_width, size_t src_height, uint8_t *dst, + size_t dst_stride, size_t dst_width, size_t dst_height); } // namespace intrinsiccv -- GitLab