From 02ed6ca33a68c75eb391d8d6c3b586cf7c9080f7 Mon Sep 17 00:00:00 2001 From: Daniil Kulikov Date: Fri, 18 Jul 2025 17:46:44 +0100 Subject: [PATCH] Add SME2 target --- adapters/opencv/CMakeLists.txt | 8 ++++ doc/build.md | 3 ++ kleidicv/CMakeLists.txt | 37 +++++++++++++++++++ kleidicv/include/kleidicv/config.h.in | 23 ++++++++++-- kleidicv/include/kleidicv/dispatch.h | 35 +++++++++++++++--- kleidicv/include/kleidicv/traits.h | 2 +- kleidicv/include/kleidicv/types.h | 14 +++---- kleidicv/src/analysis/min_max_api.cpp | 4 +- kleidicv/src/arithmetics/absdiff_api.cpp | 2 +- .../add_abs_with_threshold_api.cpp | 2 +- kleidicv/src/arithmetics/add_api.cpp | 2 +- kleidicv/src/arithmetics/compare_api.cpp | 4 +- kleidicv/src/arithmetics/exp_api.cpp | 2 +- kleidicv/src/arithmetics/in_range_api.cpp | 2 +- kleidicv/src/arithmetics/multiply_api.cpp | 2 +- kleidicv/src/arithmetics/rotate_api.cpp | 2 +- kleidicv/src/arithmetics/scale_api.cpp | 4 +- kleidicv/src/arithmetics/sub_api.cpp | 2 +- kleidicv/src/arithmetics/sum_api.cpp | 2 +- kleidicv/src/arithmetics/threshold_api.cpp | 2 +- kleidicv/src/arithmetics/transpose_api.cpp | 2 +- kleidicv/src/conversions/float_conv_api.cpp | 10 +++-- kleidicv/src/conversions/gray_to_rgb_api.cpp | 2 +- kleidicv/src/conversions/merge_api.cpp | 2 +- kleidicv/src/conversions/rgb_to_rgb_api.cpp | 2 +- kleidicv/src/conversions/rgb_to_yuv_api.cpp | 2 +- kleidicv/src/conversions/split_api.cpp | 2 +- .../src/conversions/yuv_sp_to_rgb_api.cpp | 2 +- kleidicv/src/conversions/yuv_to_rgb_api.cpp | 2 +- .../src/filters/blur_and_downsample_api.cpp | 2 +- kleidicv/src/filters/gaussian_blur_api.cpp | 4 +- kleidicv/src/filters/gaussian_blur_fixed_sc.h | 2 +- kleidicv/src/filters/median_blur_api.cpp | 6 +-- kleidicv/src/filters/scharr_api.cpp | 2 +- .../src/filters/separable_filter_2d_api.cpp | 2 +- kleidicv/src/filters/sobel_api.cpp | 2 +- kleidicv/src/logical/bitwise_and_api.cpp | 2 +- kleidicv/src/morphology/morphology_api.cpp | 2 +- kleidicv/src/resize/resize_api.cpp | 2 +- kleidicv/src/resize/resize_linear_api.cpp | 4 +- kleidicv/src/transform/remap_api.cpp | 17 ++++++--- .../src/transform/warp_perspective_api.cpp | 2 +- 42 files changed, 163 insertions(+), 66 deletions(-) diff --git a/adapters/opencv/CMakeLists.txt b/adapters/opencv/CMakeLists.txt index 816cb0e0a..59ca58c1a 100644 --- a/adapters/opencv/CMakeLists.txt +++ b/adapters/opencv/CMakeLists.txt @@ -63,6 +63,14 @@ if(NOT BUILD_SHARED_LIBS) COMPONENT dev ) endif() + if(KLEIDICV_ENABLE_SME2) + ocv_install_target(kleidicv_sme2 + EXPORT OpenCVModules + ARCHIVE + DESTINATION ${OPENCV_3P_LIB_INSTALL_PATH} + COMPONENT dev + ) + endif() ocv_install_target(kleidicv EXPORT OpenCVModules ARCHIVE diff --git a/doc/build.md b/doc/build.md index 69915d144..a4d07baa3 100644 --- a/doc/build.md +++ b/doc/build.md @@ -223,5 +223,8 @@ modified at build time via the following CMake options: - `KLEIDICV_BENCHMARK` - Enable building KleidiCV benchmarks. The benchmarks use Google Benchmark which will be downloaded automatically. Off by default. - `KLEIDICV_ENABLE_SME` - Enable Scalable Matrix Extension and Streaming Scalable Vector Extension code paths. Off by default while the [ACLE SME specification is in beta](https://github.com/ARM-software/acle/blob/main/main/acle.md#sme-language-extensions-and-intrinsics). - `KLEIDICV_LIMIT_SME_TO_SELECTED_ALGORITHMS` - Limit Scalable Matrix Extension code paths to cases where it is expected to provide a benefit over other code paths. On by default. Has no effect if `KLEIDICV_ENABLE_SME` is off. +- `KLEIDICV_ENABLE_SME2` - Enable Scalable Matrix Extension 2 and Streaming Scalable Vector Extension code paths. Off by default while the [ACLE SME specification is in beta](https://github.com/ARM-software/acle/blob/main/main/acle.md#sme-language-extensions-and-intrinsics). + - `KLEIDICV_LIMIT_SME2_TO_SELECTED_ALGORITHMS` - Limit Scalable Matrix Extension 2 code paths to cases where it is expected to provide a benefit over other code paths. On by default. Has no effect if `KLEIDICV_ENABLE_SME2` is off. + - If enabled, enables `KLEIDICV_ENABLE_SME` as well. - `KLEIDICV_ENABLE_SVE2` - Enable Scalable Vector Extension 2 code paths. This is on by default for some popular compilers known to support SVE2 but otherwise off by default. - `KLEIDICV_LIMIT_SVE2_TO_SELECTED_ALGORITHMS` - Limit Scalable Vector Extension 2 code paths to cases where it is expected to provide a benefit over other code paths. On by default. Has no effect if `KLEIDICV_ENABLE_SVE2` is off. diff --git a/kleidicv/CMakeLists.txt b/kleidicv/CMakeLists.txt index 525102853..4371b13ec 100644 --- a/kleidicv/CMakeLists.txt +++ b/kleidicv/CMakeLists.txt @@ -29,6 +29,18 @@ option(KLEIDICV_ENABLE_SVE2 "Enable SVE2 code paths" ${KLEIDICV_ENABLE_SVE2_DEFA # https://github.com/ARM-software/acle/blob/main/main/acle.md#sme-language-extensions-and-intrinsics # If SME2 is enabled than SME is also enabled by default. option(KLEIDICV_ENABLE_SME2 "Enable SME2 code paths" OFF) + +# Temporary while there is no SME2 code +file(GLOB KLEIDICV_SME2_SOURCES + "${CMAKE_CURRENT_LIST_DIR}/src/*_sme2.cpp" + "${CMAKE_CURRENT_LIST_DIR}/src/**/*_sme2.cpp" +) + +if (NOT KLEIDICV_SME2_SOURCES) + set(KLEIDICV_ENABLE_SME2 OFF) + message("KLEIDICV_ENABLE_SME2 was disabled since there is no SME2 sources") +endif() + if(KLEIDICV_ENABLE_SME2) option(KLEIDICV_ENABLE_SME "Enable SME code paths" ON) else() @@ -45,6 +57,11 @@ option( "Limits SVE2 code paths to selected algorithms. Has no effect if KLEIDICV_ENABLE_SVE2 is false." ON ) +option( + KLEIDICV_LIMIT_SME2_TO_SELECTED_ALGORITHMS + "Limits SVE2 code paths to selected algorithms. Has no effect if KLEIDICV_ENABLE_SME2 is false." + ON +) option( KLEIDICV_USE_CV_NAMESPACE_IN_OPENCV_HAL "Controls whether to use the cv namespace. Other OpenCV HAL implementations might require this, but it can cause issues as well." @@ -78,6 +95,10 @@ if(KLEIDICV_ENABLE_SVE2 AND NOT KLEIDICV_LIMIT_SVE2_TO_SELECTED_ALGORITHMS) set(KLEIDICV_ALWAYS_ENABLE_SVE2 ON) endif() +if(KLEIDICV_ENABLE_SME2 AND NOT KLEIDICV_LIMIT_SME2_TO_SELECTED_ALGORITHMS) + set(KLEIDICV_ALWAYS_ENABLE_SME2 ON) +endif() + configure_file("${CMAKE_CURRENT_LIST_DIR}/include/kleidicv/config.h.in" "include/kleidicv/config.h") file(GLOB KLEIDICV_API_SOURCES @@ -188,6 +209,17 @@ if(KLEIDICV_ENABLE_SME) ) endif() +if(KLEIDICV_ENABLE_SME2) + add_library(kleidicv_sme2 OBJECT ${KLEIDICV_SME2_SOURCES}) + target_include_directories(kleidicv_sme2 PRIVATE ${KLEIDICV_INCLUDE_DIRS}) + set_target_properties(kleidicv_sme2 PROPERTIES CXX_STANDARD 17) + target_compile_options(kleidicv_sme2 PRIVATE + ${KLEIDICV_CXX_FLAGS} + "-march=armv9-a+sve2+sme2" + "-DKLEIDICV_TARGET_SME2=1" + ) +endif() + add_library(kleidicv STATIC ${KLEIDICV_API_SOURCES}) target_include_directories(kleidicv PRIVATE ${KLEIDICV_INCLUDE_DIRS}) set_target_properties(kleidicv PROPERTIES CXX_STANDARD 17) @@ -203,3 +235,8 @@ if(KLEIDICV_ENABLE_SME) target_compile_definitions(kleidicv PRIVATE KLEIDICV_HAVE_SME) target_link_libraries(kleidicv PRIVATE kleidicv_sme) endif() + +if(KLEIDICV_ENABLE_SME2) + target_compile_definitions(kleidicv PRIVATE KLEIDICV_HAVE_SME2) + target_link_libraries(kleidicv PRIVATE kleidicv_sme2) +endif() diff --git a/kleidicv/include/kleidicv/config.h.in b/kleidicv/include/kleidicv/config.h.in index ec5f14cc8..7666c24fe 100644 --- a/kleidicv/include/kleidicv/config.h.in +++ b/kleidicv/include/kleidicv/config.h.in @@ -7,6 +7,8 @@ // Main configuration switches. +#cmakedefine01 KLEIDICV_ALWAYS_ENABLE_SME2 + #cmakedefine01 KLEIDICV_ALWAYS_ENABLE_SME #cmakedefine01 KLEIDICV_ALWAYS_ENABLE_SVE2 @@ -40,6 +42,11 @@ #define KLEIDICV_TARGET_SME 0 #endif +// Set to '1' if compiling SME2 code paths, otherwise it is set to '0'. +#ifndef KLEIDICV_TARGET_SME2 +#define KLEIDICV_TARGET_SME2 0 +#endif + // Derived configuration switches and macros below. #define KLEIDICV_TARGET_NAMESPACE kleidicv @@ -56,14 +63,24 @@ #define KLEIDICV_TARGET_NAMESPACE kleidicv::sve2 #endif -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 #undef KLEIDICV_ASSUME_128BIT_SVE2 #define KLEIDICV_ASSUME_128BIT_SVE2 0 +#define KLEIDICV_LOCALLY_STREAMING __arm_locally_streaming +#define KLEIDICV_STREAMING_COMPATIBLE __arm_streaming_compatible + +#if KLEIDICV_TARGET_SME #define KLEIDICV_TARGET_FN_ATTRS KLEIDICV_ATTR_SECTION(".text.sme") #undef KLEIDICV_TARGET_NAMESPACE #define KLEIDICV_TARGET_NAMESPACE kleidicv::sme -#define KLEIDICV_LOCALLY_STREAMING __arm_locally_streaming -#define KLEIDICV_STREAMING_COMPATIBLE __arm_streaming_compatible +#endif + +#if KLEIDICV_TARGET_SME2 +#define KLEIDICV_TARGET_FN_ATTRS KLEIDICV_ATTR_SECTION(".text.sme2") +#undef KLEIDICV_TARGET_NAMESPACE +#define KLEIDICV_TARGET_NAMESPACE kleidicv::sme2 +#endif + #else #define KLEIDICV_LOCALLY_STREAMING #define KLEIDICV_STREAMING_COMPATIBLE diff --git a/kleidicv/include/kleidicv/dispatch.h b/kleidicv/include/kleidicv/dispatch.h index 923781d58..b3c79f259 100644 --- a/kleidicv/include/kleidicv/dispatch.h +++ b/kleidicv/include/kleidicv/dispatch.h @@ -7,7 +7,8 @@ #include "kleidicv/config.h" -#if defined(KLEIDICV_HAVE_SVE2) || defined(KLEIDICV_HAVE_SME) +#if defined(KLEIDICV_HAVE_SVE2) || defined(KLEIDICV_HAVE_SME) || \ + defined(KLEIDICV_HAVE_SME2) #include #include @@ -55,12 +56,29 @@ static inline bool hwcaps_has_sme(HwCaps hwcaps) { #define KLEIDICV_SME_RESOLVE(x) #endif // KLEIDICV_HAVE_SME +#ifdef KLEIDICV_HAVE_SME2 +static inline bool hwcaps_has_sme2(HwCaps hwcaps) { + const int kSME2Bit = 37; + return hwcaps.hwcap2 & (1UL << kSME2Bit); +} + +#define KLEIDICV_SME2_RESOLVE(sme2_impl) \ + if (!std::is_null_pointer_v && \ + KLEIDICV_TARGET_NAMESPACE::hwcaps_has_sme2(hwcaps)) { \ + return sme2_impl; \ + } +#else +#define KLEIDICV_SME2_RESOLVE(x) +#endif // KLEIDICV_HAVE_SME2 + } // namespace KLEIDICV_TARGET_NAMESPACE -#define KLEIDICV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, sme_impl) \ +#define KLEIDICV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, sme_impl, \ + sme2_impl) \ static decltype(neon_impl) api_name##_resolver() { \ [[maybe_unused]] KLEIDICV_TARGET_NAMESPACE::HwCaps hwcaps = \ KLEIDICV_TARGET_NAMESPACE::get_hwcaps(); \ + KLEIDICV_SME2_RESOLVE(sme2_impl); \ KLEIDICV_SME_RESOLVE(sme_impl); \ KLEIDICV_SVE2_RESOLVE(sve2_impl); \ return neon_impl; \ @@ -69,15 +87,22 @@ static inline bool hwcaps_has_sme(HwCaps hwcaps) { decltype(neon_impl) api_name = api_name##_resolver(); \ } -#else // KLEIDICV_HAVE_SVE2 || KLEIDICV_HAVE_SME +#else // KLEIDICV_HAVE_SVE2 || KLEIDICV_HAVE_SME || KLEIDICV_HAVE_SME2 -#define KLEIDICV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, sme_impl) \ +#define KLEIDICV_MULTIVERSION_C_API(api_name, neon_impl, sve2_impl, sme_impl, \ + sme2_impl) \ \ extern "C" { \ decltype(neon_impl) api_name = neon_impl; \ } -#endif // KLEIDICV_HAVE_SVE2 || KLEIDICV_HAVE_SME +#endif // KLEIDICV_HAVE_SVE2 || KLEIDICV_HAVE_SME || KLEIDICV_HAVE_SME2 + +#if KLEIDICV_ALWAYS_ENABLE_SME2 +#define KLEIDICV_SME2_IMPL_IF(func) func +#else +#define KLEIDICV_SME2_IMPL_IF(func) nullptr +#endif // KLEIDICV_ALWAYS_ENABLE_SME2 #if KLEIDICV_ALWAYS_ENABLE_SME #define KLEIDICV_SME_IMPL_IF(func) func diff --git a/kleidicv/include/kleidicv/traits.h b/kleidicv/include/kleidicv/traits.h index 28740d91e..b0202f359 100644 --- a/kleidicv/include/kleidicv/traits.h +++ b/kleidicv/include/kleidicv/traits.h @@ -17,7 +17,7 @@ class Monostate {}; template class remove_streaming_compatible; -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 template class remove_streaming_compatible { diff --git a/kleidicv/include/kleidicv/types.h b/kleidicv/include/kleidicv/types.h index 678eaa924..dc2782466 100644 --- a/kleidicv/include/kleidicv/types.h +++ b/kleidicv/include/kleidicv/types.h @@ -13,7 +13,7 @@ #include "kleidicv/ctypes.h" #include "kleidicv/utils.h" -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 #include #endif @@ -528,7 +528,7 @@ class CopyRows final { public: void process_row(size_t length, Columns src, Columns dst) KLEIDICV_STREAMING_COMPATIBLE { -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 __arm_sc_memmove(static_cast(&dst[0]), static_cast(&src[0]), length * sizeof(T) * dst.channels()); @@ -553,7 +553,7 @@ class CopyNonOverlappingRows final { public: void process_row(size_t length, Columns src, Columns dst) KLEIDICV_STREAMING_COMPATIBLE { -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 __arm_sc_memcpy(static_cast(&dst[0]), static_cast(&src[0]), length * sizeof(T) * dst.channels()); @@ -580,7 +580,7 @@ void make_zero_border_border(Rectangle rect, Rows rows, Margin margin) { if (margin.left()) { size_t margin_width_in_bytes = margin.left() * sizeof(T) * rows.channels(); for (size_t index = 0; index < rect.height(); ++index) { -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 __arm_sc_memset(&rows.at(index)[0], 0, margin_width_in_bytes); #else std::memset(&rows.at(index)[0], 0, margin_width_in_bytes); @@ -592,7 +592,7 @@ void make_zero_border_border(Rectangle rect, Rows rows, Margin margin) { size_t top_width = rect.width() - margin.left() - margin.right(); size_t top_width_in_bytes = top_width * sizeof(T) * rows.channels(); for (size_t index = 0; index < margin.top(); ++index) { -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 __arm_sc_memset(&rows.at(index, margin.left())[0], 0, top_width_in_bytes); #else std::memset(&rows.at(index, margin.left())[0], 0, top_width_in_bytes); @@ -603,7 +603,7 @@ void make_zero_border_border(Rectangle rect, Rows rows, Margin margin) { if (margin.right()) { size_t margin_width_in_bytes = margin.right() * sizeof(T) * rows.channels(); for (size_t index = 0; index < rect.height(); ++index) { -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 __arm_sc_memset(&rows.at(index, rect.width() - margin.right())[0], 0, margin_width_in_bytes); #else @@ -618,7 +618,7 @@ void make_zero_border_border(Rectangle rect, Rows rows, Margin margin) { size_t bottom_width_in_bytes = bottom_width * sizeof(T) * rows.channels(); for (size_t index = rect.height() - margin.bottom(); index < rect.height(); ++index) { -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 __arm_sc_memset(&rows.at(index, margin.left())[0], 0, bottom_width_in_bytes); #else diff --git a/kleidicv/src/analysis/min_max_api.cpp b/kleidicv/src/analysis/min_max_api.cpp index 0e4e0d708..3ce2b6fcd 100644 --- a/kleidicv/src/analysis/min_max_api.cpp +++ b/kleidicv/src/analysis/min_max_api.cpp @@ -41,7 +41,7 @@ kleidicv_error_t min_max(const T *src, size_t src_stride, size_t width, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::min_max, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::min_max), \ - &kleidicv::sme::min_max) + &kleidicv::sme::min_max, nullptr) KLEIDICV_DEFINE_MINMAX_API(kleidicv_min_max_u8, uint8_t); KLEIDICV_DEFINE_MINMAX_API(kleidicv_min_max_s8, int8_t); @@ -52,6 +52,6 @@ KLEIDICV_DEFINE_MINMAX_API(kleidicv_min_max_f32, float); #define KLEIDICV_DEFINE_MINMAXLOC_API(name, type) \ KLEIDICV_MULTIVERSION_C_API(name, &kleidicv::neon::min_max_loc, \ - nullptr, nullptr) + nullptr, nullptr, nullptr) KLEIDICV_DEFINE_MINMAXLOC_API(kleidicv_min_max_loc_u8, uint8_t); diff --git a/kleidicv/src/arithmetics/absdiff_api.cpp b/kleidicv/src/arithmetics/absdiff_api.cpp index e9dc56202..7090d18cc 100644 --- a/kleidicv/src/arithmetics/absdiff_api.cpp +++ b/kleidicv/src/arithmetics/absdiff_api.cpp @@ -43,7 +43,7 @@ kleidicv_error_t saturating_absdiff(const T *src_a, size_t src_a_stride, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::saturating_absdiff, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::saturating_absdiff), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::saturating_absdiff)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::saturating_absdiff), nullptr) KLEIDICV_DEFINE_C_API(kleidicv_saturating_absdiff_u8, uint8_t); KLEIDICV_DEFINE_C_API(kleidicv_saturating_absdiff_s8, int8_t); diff --git a/kleidicv/src/arithmetics/add_abs_with_threshold_api.cpp b/kleidicv/src/arithmetics/add_abs_with_threshold_api.cpp index daf138f38..11cbb9c50 100644 --- a/kleidicv/src/arithmetics/add_abs_with_threshold_api.cpp +++ b/kleidicv/src/arithmetics/add_abs_with_threshold_api.cpp @@ -39,6 +39,6 @@ kleidicv_error_t saturating_add_abs_with_threshold( name, &kleidicv::neon::saturating_add_abs_with_threshold, \ KLEIDICV_SVE2_IMPL_IF( \ &kleidicv::sve2::saturating_add_abs_with_threshold), \ - &kleidicv::sme::saturating_add_abs_with_threshold) + &kleidicv::sme::saturating_add_abs_with_threshold, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_saturating_add_abs_with_threshold_s16, int16_t); diff --git a/kleidicv/src/arithmetics/add_api.cpp b/kleidicv/src/arithmetics/add_api.cpp index 744af872a..a7311412c 100644 --- a/kleidicv/src/arithmetics/add_api.cpp +++ b/kleidicv/src/arithmetics/add_api.cpp @@ -40,7 +40,7 @@ kleidicv_error_t saturating_add(const T *src_a, size_t src_a_stride, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::saturating_add, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::saturating_add), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::saturating_add)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::saturating_add), nullptr) KLEIDICV_DEFINE_C_API(kleidicv_saturating_add_s8, int8_t); KLEIDICV_DEFINE_C_API(kleidicv_saturating_add_u8, uint8_t); diff --git a/kleidicv/src/arithmetics/compare_api.cpp b/kleidicv/src/arithmetics/compare_api.cpp index 497d06f06..c46692252 100644 --- a/kleidicv/src/arithmetics/compare_api.cpp +++ b/kleidicv/src/arithmetics/compare_api.cpp @@ -56,13 +56,13 @@ kleidicv_error_t compare_greater(const ScalarType *src_a, size_t src_a_stride, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::compare_equal, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::compare_equal), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::compare_equal)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::compare_equal), nullptr) #define KLEIDICV_DEFINE_CMP_GT_API(name, type) \ KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::compare_greater, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::compare_greater), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::compare_greater)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::compare_greater), nullptr) KLEIDICV_DEFINE_CMP_EQ_API(kleidicv_compare_equal_u8, uint8_t); KLEIDICV_DEFINE_CMP_GT_API(kleidicv_compare_greater_u8, uint8_t); diff --git a/kleidicv/src/arithmetics/exp_api.cpp b/kleidicv/src/arithmetics/exp_api.cpp index 2f5ffc5e4..552572cbd 100644 --- a/kleidicv/src/arithmetics/exp_api.cpp +++ b/kleidicv/src/arithmetics/exp_api.cpp @@ -37,6 +37,6 @@ kleidicv_error_t exp(const T* src, size_t src_stride, T* dst, size_t dst_stride, #define KLEIDICV_DEFINE_C_API(name, type) \ KLEIDICV_MULTIVERSION_C_API(name, &kleidicv::neon::exp, \ &kleidicv::sve2::exp, \ - &kleidicv::sme::exp) + &kleidicv::sme::exp, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_exp_f32, float); diff --git a/kleidicv/src/arithmetics/in_range_api.cpp b/kleidicv/src/arithmetics/in_range_api.cpp index db70c4288..453de3c10 100644 --- a/kleidicv/src/arithmetics/in_range_api.cpp +++ b/kleidicv/src/arithmetics/in_range_api.cpp @@ -34,7 +34,7 @@ kleidicv_error_t in_range(const T *src, size_t src_stride, uint8_t *dst, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::in_range, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::in_range), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::in_range)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::in_range), nullptr) KLEIDICV_DEFINE_C_API(kleidicv_in_range_u8, uint8_t); KLEIDICV_DEFINE_C_API(kleidicv_in_range_f32, float); diff --git a/kleidicv/src/arithmetics/multiply_api.cpp b/kleidicv/src/arithmetics/multiply_api.cpp index 3b48a1fe4..a71044501 100644 --- a/kleidicv/src/arithmetics/multiply_api.cpp +++ b/kleidicv/src/arithmetics/multiply_api.cpp @@ -44,7 +44,7 @@ kleidicv_error_t saturating_multiply(const T *src_a, size_t src_a_stride, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::saturating_multiply, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::saturating_multiply), \ - nullptr) + nullptr, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_saturating_multiply_u8, uint8_t); KLEIDICV_DEFINE_C_API(kleidicv_saturating_multiply_s8, int8_t); diff --git a/kleidicv/src/arithmetics/rotate_api.cpp b/kleidicv/src/arithmetics/rotate_api.cpp index 3a2d8b8b3..96cf67401 100644 --- a/kleidicv/src/arithmetics/rotate_api.cpp +++ b/kleidicv/src/arithmetics/rotate_api.cpp @@ -7,4 +7,4 @@ #include "kleidicv/kleidicv.h" KLEIDICV_MULTIVERSION_C_API(kleidicv_rotate, &kleidicv::neon::rotate, nullptr, - nullptr); + nullptr, nullptr); diff --git a/kleidicv/src/arithmetics/scale_api.cpp b/kleidicv/src/arithmetics/scale_api.cpp index 643aca5ce..28ae7fcda 100644 --- a/kleidicv/src/arithmetics/scale_api.cpp +++ b/kleidicv/src/arithmetics/scale_api.cpp @@ -36,8 +36,8 @@ kleidicv_error_t scale(const T *src, size_t src_stride, T *dst, } // namespace kleidicv KLEIDICV_MULTIVERSION_C_API(kleidicv_scale_u8, &kleidicv::neon::scale, - nullptr, nullptr); + nullptr, nullptr, nullptr); KLEIDICV_MULTIVERSION_C_API( kleidicv_scale_f32, &kleidicv::neon::scale, KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::scale), - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::scale)); + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::scale), nullptr); diff --git a/kleidicv/src/arithmetics/sub_api.cpp b/kleidicv/src/arithmetics/sub_api.cpp index 77dfb7b79..fa84e131a 100644 --- a/kleidicv/src/arithmetics/sub_api.cpp +++ b/kleidicv/src/arithmetics/sub_api.cpp @@ -39,7 +39,7 @@ kleidicv_error_t saturating_sub(const T *src_a, size_t src_a_stride, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::saturating_sub, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::saturating_sub), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::saturating_sub)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::saturating_sub), nullptr) KLEIDICV_DEFINE_C_API(kleidicv_saturating_sub_s8, int8_t); KLEIDICV_DEFINE_C_API(kleidicv_saturating_sub_u8, uint8_t); diff --git a/kleidicv/src/arithmetics/sum_api.cpp b/kleidicv/src/arithmetics/sum_api.cpp index e1590dd87..4de3238c2 100644 --- a/kleidicv/src/arithmetics/sum_api.cpp +++ b/kleidicv/src/arithmetics/sum_api.cpp @@ -36,4 +36,4 @@ kleidicv_error_t sum(const T *src, size_t src_stride, size_t width, KLEIDICV_MULTIVERSION_C_API( kleidicv_sum_f32, (&kleidicv::neon::sum), KLEIDICV_SVE2_IMPL_IF((&kleidicv::sve2::sum)), - (&kleidicv::sme::sum)); + (&kleidicv::sme::sum), nullptr); diff --git a/kleidicv/src/arithmetics/threshold_api.cpp b/kleidicv/src/arithmetics/threshold_api.cpp index 86cfe1088..2e0000aea 100644 --- a/kleidicv/src/arithmetics/threshold_api.cpp +++ b/kleidicv/src/arithmetics/threshold_api.cpp @@ -34,6 +34,6 @@ kleidicv_error_t threshold_binary(const T *src, size_t src_stride, T *dst, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::threshold_binary, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::threshold_binary), \ - &kleidicv::sme::threshold_binary) + &kleidicv::sme::threshold_binary, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_threshold_binary_u8, uint8_t); diff --git a/kleidicv/src/arithmetics/transpose_api.cpp b/kleidicv/src/arithmetics/transpose_api.cpp index d5c9e9bba..93c9cea09 100644 --- a/kleidicv/src/arithmetics/transpose_api.cpp +++ b/kleidicv/src/arithmetics/transpose_api.cpp @@ -7,4 +7,4 @@ #include "kleidicv/kleidicv.h" KLEIDICV_MULTIVERSION_C_API(kleidicv_transpose, &kleidicv::neon::transpose, - nullptr, nullptr); + nullptr, nullptr, nullptr); diff --git a/kleidicv/src/conversions/float_conv_api.cpp b/kleidicv/src/conversions/float_conv_api.cpp index f9c3a68ab..275dbd3a8 100644 --- a/kleidicv/src/conversions/float_conv_api.cpp +++ b/kleidicv/src/conversions/float_conv_api.cpp @@ -32,17 +32,19 @@ kleidicv_error_t float_conversion(const InputType* src, size_t src_stride, KLEIDICV_MULTIVERSION_C_API( kleidicv_f32_to_s8, &kleidicv::neon::f32_to_s8, KLEIDICV_SVE2_IMPL_IF((&kleidicv::sve2::float_conversion)), - (&kleidicv::sme::float_conversion)); + (&kleidicv::sme::float_conversion), nullptr); KLEIDICV_MULTIVERSION_C_API( kleidicv_f32_to_u8, &kleidicv::neon::f32_to_u8, KLEIDICV_SVE2_IMPL_IF((&kleidicv::sve2::float_conversion)), - (&kleidicv::sme::float_conversion)); + (&kleidicv::sme::float_conversion), nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_s8_to_f32, &kleidicv::neon::s8_to_f32, (&kleidicv::sve2::float_conversion), - (&kleidicv::sme::float_conversion)); + (&kleidicv::sme::float_conversion), + nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_u8_to_f32, &kleidicv::neon::u8_to_f32, (&kleidicv::sve2::float_conversion), - (&kleidicv::sme::float_conversion)); + (&kleidicv::sme::float_conversion), + nullptr); diff --git a/kleidicv/src/conversions/gray_to_rgb_api.cpp b/kleidicv/src/conversions/gray_to_rgb_api.cpp index 080ea4e22..af97331b5 100644 --- a/kleidicv/src/conversions/gray_to_rgb_api.cpp +++ b/kleidicv/src/conversions/gray_to_rgb_api.cpp @@ -10,7 +10,7 @@ KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::partialname, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::partialname), \ - &kleidicv::sme::partialname) + &kleidicv::sme::partialname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_gray_to_rgb_u8, gray_to_rgb_u8); KLEIDICV_DEFINE_C_API(kleidicv_gray_to_rgba_u8, gray_to_rgba_u8); diff --git a/kleidicv/src/conversions/merge_api.cpp b/kleidicv/src/conversions/merge_api.cpp index 91f7e8ef9..dc45fc395 100644 --- a/kleidicv/src/conversions/merge_api.cpp +++ b/kleidicv/src/conversions/merge_api.cpp @@ -7,4 +7,4 @@ #include "kleidicv/kleidicv.h" KLEIDICV_MULTIVERSION_C_API(kleidicv_merge, &kleidicv::neon::merge, nullptr, - nullptr); + nullptr, nullptr); diff --git a/kleidicv/src/conversions/rgb_to_rgb_api.cpp b/kleidicv/src/conversions/rgb_to_rgb_api.cpp index 82631e916..a38471fe3 100644 --- a/kleidicv/src/conversions/rgb_to_rgb_api.cpp +++ b/kleidicv/src/conversions/rgb_to_rgb_api.cpp @@ -11,7 +11,7 @@ KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::partialname, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::partialname), \ - &kleidicv::sme::partialname) + &kleidicv::sme::partialname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_rgb_to_bgr_u8, rgb_to_bgr_u8); KLEIDICV_DEFINE_C_API(kleidicv_rgba_to_bgra_u8, rgba_to_bgra_u8); diff --git a/kleidicv/src/conversions/rgb_to_yuv_api.cpp b/kleidicv/src/conversions/rgb_to_yuv_api.cpp index e7704560c..bd928a7fa 100644 --- a/kleidicv/src/conversions/rgb_to_yuv_api.cpp +++ b/kleidicv/src/conversions/rgb_to_yuv_api.cpp @@ -10,7 +10,7 @@ KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::partialname, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::partialname), \ - &kleidicv::sme::partialname) + &kleidicv::sme::partialname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_rgb_to_yuv_u8, rgb_to_yuv_u8); KLEIDICV_DEFINE_C_API(kleidicv_bgr_to_yuv_u8, bgr_to_yuv_u8); diff --git a/kleidicv/src/conversions/split_api.cpp b/kleidicv/src/conversions/split_api.cpp index 05b3d8763..8de6e18b4 100644 --- a/kleidicv/src/conversions/split_api.cpp +++ b/kleidicv/src/conversions/split_api.cpp @@ -7,4 +7,4 @@ #include "kleidicv/kleidicv.h" KLEIDICV_MULTIVERSION_C_API(kleidicv_split, &kleidicv::neon::split, nullptr, - nullptr); + nullptr, nullptr); diff --git a/kleidicv/src/conversions/yuv_sp_to_rgb_api.cpp b/kleidicv/src/conversions/yuv_sp_to_rgb_api.cpp index 013473940..098f5ce87 100644 --- a/kleidicv/src/conversions/yuv_sp_to_rgb_api.cpp +++ b/kleidicv/src/conversions/yuv_sp_to_rgb_api.cpp @@ -9,7 +9,7 @@ #define KLEIDICV_DEFINE_C_API(name, partialname) \ KLEIDICV_MULTIVERSION_C_API(name, &kleidicv::neon::partialname, \ &kleidicv::sve2::partialname, \ - &kleidicv::sme::partialname) + &kleidicv::sme::partialname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_yuv_sp_to_rgb_u8, yuv_sp_to_rgb_u8); KLEIDICV_DEFINE_C_API(kleidicv_yuv_sp_to_bgr_u8, yuv_sp_to_bgr_u8); diff --git a/kleidicv/src/conversions/yuv_to_rgb_api.cpp b/kleidicv/src/conversions/yuv_to_rgb_api.cpp index 1997b9fef..e7ad51a8c 100644 --- a/kleidicv/src/conversions/yuv_to_rgb_api.cpp +++ b/kleidicv/src/conversions/yuv_to_rgb_api.cpp @@ -10,7 +10,7 @@ KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::partialname, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::partialname), \ - &kleidicv::sme::partialname) + &kleidicv::sme::partialname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_yuv_to_rgb_u8, yuv_to_rgb_u8); KLEIDICV_DEFINE_C_API(kleidicv_yuv_to_bgr_u8, yuv_to_bgr_u8); diff --git a/kleidicv/src/filters/blur_and_downsample_api.cpp b/kleidicv/src/filters/blur_and_downsample_api.cpp index 54be86c03..8addded00 100644 --- a/kleidicv/src/filters/blur_and_downsample_api.cpp +++ b/kleidicv/src/filters/blur_and_downsample_api.cpp @@ -10,7 +10,7 @@ KLEIDICV_MULTIVERSION_C_API( kleidicv_blur_and_downsample_stripe_u8, &kleidicv::neon::kleidicv_blur_and_downsample_stripe_u8, &kleidicv::sve2::kleidicv_blur_and_downsample_stripe_u8, - &kleidicv::sme::kleidicv_blur_and_downsample_stripe_u8); + &kleidicv::sme::kleidicv_blur_and_downsample_stripe_u8, nullptr); extern "C" { diff --git a/kleidicv/src/filters/gaussian_blur_api.cpp b/kleidicv/src/filters/gaussian_blur_api.cpp index 921e4d4f7..300d7d8ad 100644 --- a/kleidicv/src/filters/gaussian_blur_api.cpp +++ b/kleidicv/src/filters/gaussian_blur_api.cpp @@ -10,11 +10,11 @@ KLEIDICV_MULTIVERSION_C_API( kleidicv_gaussian_blur_fixed_stripe_u8, &kleidicv::neon::gaussian_blur_fixed_stripe_u8, KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::gaussian_blur_fixed_stripe_u8), - &kleidicv::sme::gaussian_blur_fixed_stripe_u8); + &kleidicv::sme::gaussian_blur_fixed_stripe_u8, nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_gaussian_blur_arbitrary_stripe_u8, &kleidicv::neon::gaussian_blur_arbitrary_stripe_u8, - nullptr, nullptr); + nullptr, nullptr, nullptr); extern "C" { diff --git a/kleidicv/src/filters/gaussian_blur_fixed_sc.h b/kleidicv/src/filters/gaussian_blur_fixed_sc.h index a50741a7c..cec5a9fe0 100644 --- a/kleidicv/src/filters/gaussian_blur_fixed_sc.h +++ b/kleidicv/src/filters/gaussian_blur_fixed_sc.h @@ -17,7 +17,7 @@ #include "kleidicv/filters/sigma.h" #include "kleidicv/workspace/separable.h" -#if KLEIDICV_TARGET_SME +#if KLEIDICV_TARGET_SME || KLEIDICV_TARGET_SME2 #include #endif diff --git a/kleidicv/src/filters/median_blur_api.cpp b/kleidicv/src/filters/median_blur_api.cpp index 470673d5b..a9a66d40f 100644 --- a/kleidicv/src/filters/median_blur_api.cpp +++ b/kleidicv/src/filters/median_blur_api.cpp @@ -11,7 +11,7 @@ name, &kleidicv::neon::median_blur_sorting_network_stripe, \ KLEIDICV_SVE2_IMPL_IF( \ kleidicv::sve2::median_blur_sorting_network_stripe), \ - &kleidicv::sme::median_blur_sorting_network_stripe) + &kleidicv::sme::median_blur_sorting_network_stripe, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_median_blur_sorting_network_stripe_s8, int8_t); @@ -31,11 +31,11 @@ KLEIDICV_DEFINE_C_API(kleidicv_median_blur_sorting_network_stripe_f32, float); KLEIDICV_MULTIVERSION_C_API(kleidicv_median_blur_small_hist_stripe_u8, &kleidicv::neon::median_blur_small_hist_stripe_u8, - nullptr, nullptr); + nullptr, nullptr, nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_median_blur_large_hist_stripe_u8, &kleidicv::neon::median_blur_large_hist_stripe_u8, - nullptr, nullptr); + nullptr, nullptr, nullptr); extern "C" { diff --git a/kleidicv/src/filters/scharr_api.cpp b/kleidicv/src/filters/scharr_api.cpp index 63f15829b..d30dd61c9 100644 --- a/kleidicv/src/filters/scharr_api.cpp +++ b/kleidicv/src/filters/scharr_api.cpp @@ -11,7 +11,7 @@ KLEIDICV_MULTIVERSION_C_API( &kleidicv::neon::kleidicv_scharr_interleaved_stripe_s16_u8, KLEIDICV_SVE2_IMPL_IF( &kleidicv::sve2::kleidicv_scharr_interleaved_stripe_s16_u8), - &kleidicv::sme::kleidicv_scharr_interleaved_stripe_s16_u8); + &kleidicv::sme::kleidicv_scharr_interleaved_stripe_s16_u8, nullptr); extern "C" { diff --git a/kleidicv/src/filters/separable_filter_2d_api.cpp b/kleidicv/src/filters/separable_filter_2d_api.cpp index ab74b25f9..9bebc29d7 100644 --- a/kleidicv/src/filters/separable_filter_2d_api.cpp +++ b/kleidicv/src/filters/separable_filter_2d_api.cpp @@ -51,7 +51,7 @@ kleidicv_error_t separable_filter_2d_stripe( KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::separable_filter_2d_stripe, \ KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::separable_filter_2d_stripe), \ - &kleidicv::sme::separable_filter_2d_stripe) + &kleidicv::sme::separable_filter_2d_stripe, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_separable_filter_2d_stripe_u8, uint8_t); KLEIDICV_DEFINE_C_API(kleidicv_separable_filter_2d_stripe_u16, uint16_t); diff --git a/kleidicv/src/filters/sobel_api.cpp b/kleidicv/src/filters/sobel_api.cpp index b96b62d7f..32e4b2207 100644 --- a/kleidicv/src/filters/sobel_api.cpp +++ b/kleidicv/src/filters/sobel_api.cpp @@ -10,7 +10,7 @@ KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::partialname, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::partialname), \ - &kleidicv::sme::partialname) + &kleidicv::sme::partialname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_sobel_3x3_horizontal_stripe_s16_u8, sobel_3x3_horizontal_stripe_s16_u8); diff --git a/kleidicv/src/logical/bitwise_and_api.cpp b/kleidicv/src/logical/bitwise_and_api.cpp index a5ef3147e..c546cd6e2 100644 --- a/kleidicv/src/logical/bitwise_and_api.cpp +++ b/kleidicv/src/logical/bitwise_and_api.cpp @@ -40,6 +40,6 @@ kleidicv_error_t bitwise_and(const T *src_a, size_t src_a_stride, KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::bitwise_and, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::bitwise_and), \ - KLEIDICV_SME_IMPL_IF(&kleidicv::sme::bitwise_and)) + KLEIDICV_SME_IMPL_IF(&kleidicv::sme::bitwise_and), nullptr) KLEIDICV_DEFINE_C_API(kleidicv_bitwise_and, uint8_t); diff --git a/kleidicv/src/morphology/morphology_api.cpp b/kleidicv/src/morphology/morphology_api.cpp index f1e9dca80..e9a772ec2 100644 --- a/kleidicv/src/morphology/morphology_api.cpp +++ b/kleidicv/src/morphology/morphology_api.cpp @@ -112,7 +112,7 @@ kleidicv_error_t kleidicv_morphology_release( KLEIDICV_MULTIVERSION_C_API( \ name, &kleidicv::neon::tname, \ KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::tname), \ - &kleidicv::sme::tname) + &kleidicv::sme::tname, nullptr) KLEIDICV_DEFINE_C_API(kleidicv_dilate_u8, dilate, uint8_t); KLEIDICV_DEFINE_C_API(kleidicv_erode_u8, erode, uint8_t); diff --git a/kleidicv/src/resize/resize_api.cpp b/kleidicv/src/resize/resize_api.cpp index dd744aa0a..69c2310a9 100644 --- a/kleidicv/src/resize/resize_api.cpp +++ b/kleidicv/src/resize/resize_api.cpp @@ -9,4 +9,4 @@ KLEIDICV_MULTIVERSION_C_API( kleidicv_resize_to_quarter_u8, &kleidicv::neon::resize_to_quarter_u8, KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::resize_to_quarter_u8), - &kleidicv::sme::resize_to_quarter_u8); + &kleidicv::sme::resize_to_quarter_u8, nullptr); diff --git a/kleidicv/src/resize/resize_linear_api.cpp b/kleidicv/src/resize/resize_linear_api.cpp index 2e48849f8..681b38723 100644 --- a/kleidicv/src/resize/resize_linear_api.cpp +++ b/kleidicv/src/resize/resize_linear_api.cpp @@ -9,13 +9,13 @@ KLEIDICV_MULTIVERSION_C_API( kleidicv_resize_linear_stripe_u8, &kleidicv::neon::resize_linear_stripe_u8, KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::resize_linear_stripe_u8), - &kleidicv::sme::resize_linear_stripe_u8); + &kleidicv::sme::resize_linear_stripe_u8, nullptr); KLEIDICV_MULTIVERSION_C_API( kleidicv_resize_linear_stripe_f32, &kleidicv::neon::resize_linear_stripe_f32, KLEIDICV_SVE2_IMPL_IF(&kleidicv::sve2::resize_linear_stripe_f32), - &kleidicv::sme::resize_linear_stripe_f32); + &kleidicv::sme::resize_linear_stripe_f32, nullptr); extern "C" { diff --git a/kleidicv/src/transform/remap_api.cpp b/kleidicv/src/transform/remap_api.cpp index 28ed84d3c..b9bda552e 100644 --- a/kleidicv/src/transform/remap_api.cpp +++ b/kleidicv/src/transform/remap_api.cpp @@ -8,25 +8,30 @@ KLEIDICV_MULTIVERSION_C_API(kleidicv_remap_s16_u8, &kleidicv::neon::remap_s16, - &kleidicv::sve2::remap_s16, nullptr); + &kleidicv::sve2::remap_s16, nullptr, + nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_remap_s16_u16, &kleidicv::neon::remap_s16, - &kleidicv::sve2::remap_s16, nullptr); + &kleidicv::sve2::remap_s16, nullptr, + nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_remap_s16point5_u8, &kleidicv::neon::remap_s16point5, - &kleidicv::sve2::remap_s16point5, nullptr); + &kleidicv::sve2::remap_s16point5, nullptr, + nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_remap_s16point5_u16, &kleidicv::neon::remap_s16point5, - &kleidicv::sve2::remap_s16point5, + &kleidicv::sve2::remap_s16point5, nullptr, nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_remap_f32_u8, &kleidicv::neon::remap_f32, - &kleidicv::sve2::remap_f32, nullptr); + &kleidicv::sve2::remap_f32, nullptr, + nullptr); KLEIDICV_MULTIVERSION_C_API(kleidicv_remap_f32_u16, &kleidicv::neon::remap_f32, - &kleidicv::sve2::remap_f32, nullptr); + &kleidicv::sve2::remap_f32, nullptr, + nullptr); diff --git a/kleidicv/src/transform/warp_perspective_api.cpp b/kleidicv/src/transform/warp_perspective_api.cpp index 16b80e121..4e5498dc0 100644 --- a/kleidicv/src/transform/warp_perspective_api.cpp +++ b/kleidicv/src/transform/warp_perspective_api.cpp @@ -10,7 +10,7 @@ KLEIDICV_MULTIVERSION_C_API(kleidicv_warp_perspective_stripe_u8, &kleidicv::neon::warp_perspective_stripe, &kleidicv::sve2::warp_perspective_stripe, - nullptr); + nullptr, nullptr); extern "C" { -- GitLab