| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | // SPDX-FileCopyrightText: 2023 - 2026 Arm Limited and/or its affiliates <open-source-office@arm.com> | ||
| 2 | // | ||
| 3 | // SPDX-License-Identifier: Apache-2.0 | ||
| 4 | |||
| 5 | #include "kleidicv/dispatch.h" | ||
| 6 | #include "kleidicv/filters/separable_filter_2d.h" | ||
| 7 | #include "kleidicv/kleidicv.h" | ||
| 8 | #include "kleidicv/workspace/separable.h" | ||
| 9 | |||
| 10 | namespace kleidicv { | ||
| 11 | |||
| 12 | namespace neon { | ||
| 13 | |||
| 14 | template <typename T> | ||
| 15 | kleidicv_error_t separable_filter_2d_stripe( | ||
| 16 | const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, | ||
| 17 | size_t height, size_t y_begin, size_t y_end, size_t channels, | ||
| 18 | const T *kernel_x, size_t kernel_width, const T *kernel_y, | ||
| 19 | size_t kernel_height, FixedBorderType border_type); | ||
| 20 | |||
| 21 | } // namespace neon | ||
| 22 | |||
| 23 | namespace sve2 { | ||
| 24 | |||
| 25 | template <typename T> | ||
| 26 | kleidicv_error_t separable_filter_2d_stripe( | ||
| 27 | const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, | ||
| 28 | size_t height, size_t y_begin, size_t y_end, size_t channels, | ||
| 29 | const T *kernel_x, size_t kernel_width, const T *kernel_y, | ||
| 30 | size_t kernel_height, FixedBorderType border_type); | ||
| 31 | |||
| 32 | } // namespace sve2 | ||
| 33 | |||
| 34 | namespace sme { | ||
| 35 | |||
| 36 | template <typename T> | ||
| 37 | kleidicv_error_t separable_filter_2d_stripe( | ||
| 38 | const T *src, size_t src_stride, T *dst, size_t dst_stride, size_t width, | ||
| 39 | size_t height, size_t y_begin, size_t y_end, size_t channels, | ||
| 40 | const T *kernel_x, size_t kernel_width, const T *kernel_y, | ||
| 41 | size_t kernel_height, FixedBorderType border_type); | ||
| 42 | |||
| 43 | } // namespace sme | ||
| 44 | |||
| 45 | } // namespace kleidicv | ||
| 46 | |||
| 47 | #define KLEIDICV_DEFINE_C_API(name, type) \ | ||
| 48 | KLEIDICV_MULTIVERSION_C_API( \ | ||
| 49 | name, &kleidicv::neon::separable_filter_2d_stripe<type>, \ | ||
| 50 | KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::separable_filter_2d_stripe<type>), \ | ||
| 51 | &kleidicv::sme::separable_filter_2d_stripe<type>, nullptr) | ||
| 52 | |||
| 53 |
4/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
|
10 | KLEIDICV_DEFINE_C_API(kleidicv_separable_filter_2d_stripe_u8, uint8_t); |
| 54 |
4/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 3 times.
✓ Branch 2 taken 2 times.
✓ Branch 3 taken 1 times.
|
10 | KLEIDICV_DEFINE_C_API(kleidicv_separable_filter_2d_stripe_u16, uint16_t); |
| 55 | |||
| 56 | extern "C" { | ||
| 57 | |||
| 58 | 320 | kleidicv_error_t kleidicv_separable_filter_2d_u8( | |
| 59 | const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, | ||
| 60 | size_t width, size_t height, size_t channels, const uint8_t *kernel_x, | ||
| 61 | size_t kernel_width, const uint8_t *kernel_y, size_t kernel_height, | ||
| 62 | kleidicv_border_type_t border_type) { | ||
| 63 |
4/4✓ Branch 0 taken 100 times.
✓ Branch 1 taken 220 times.
✓ Branch 2 taken 100 times.
✓ Branch 3 taken 220 times.
|
640 | if (!kleidicv::separable_filter_2d_is_implemented(width, height, kernel_width, |
| 64 | 320 | kernel_height)) { | |
| 65 | 100 | return KLEIDICV_ERROR_NOT_IMPLEMENTED; | |
| 66 | } | ||
| 67 | 220 | auto fixed_border_type = kleidicv::get_fixed_border_type(border_type); | |
| 68 |
2/2✓ Branch 0 taken 208 times.
✓ Branch 1 taken 12 times.
|
220 | if (!fixed_border_type) { |
| 69 | 12 | return KLEIDICV_ERROR_NOT_IMPLEMENTED; | |
| 70 | } | ||
| 71 | |||
| 72 | 416 | return kleidicv_separable_filter_2d_stripe_u8( | |
| 73 | 208 | src, src_stride, dst, dst_stride, width, height, 0, height, channels, | |
| 74 | 208 | kernel_x, kernel_width, kernel_y, kernel_height, *fixed_border_type); | |
| 75 | 320 | } | |
| 76 | |||
| 77 | 320 | kleidicv_error_t kleidicv_separable_filter_2d_u16( | |
| 78 | const uint16_t *src, size_t src_stride, uint16_t *dst, size_t dst_stride, | ||
| 79 | size_t width, size_t height, size_t channels, const uint16_t *kernel_x, | ||
| 80 | size_t kernel_width, const uint16_t *kernel_y, size_t kernel_height, | ||
| 81 | kleidicv_border_type_t border_type) { | ||
| 82 |
4/4✓ Branch 0 taken 100 times.
✓ Branch 1 taken 220 times.
✓ Branch 2 taken 100 times.
✓ Branch 3 taken 220 times.
|
640 | if (!kleidicv::separable_filter_2d_is_implemented(width, height, kernel_width, |
| 83 | 320 | kernel_height)) { | |
| 84 | 100 | return KLEIDICV_ERROR_NOT_IMPLEMENTED; | |
| 85 | } | ||
| 86 | 220 | auto fixed_border_type = kleidicv::get_fixed_border_type(border_type); | |
| 87 |
2/2✓ Branch 0 taken 208 times.
✓ Branch 1 taken 12 times.
|
220 | if (!fixed_border_type) { |
| 88 | 12 | return KLEIDICV_ERROR_NOT_IMPLEMENTED; | |
| 89 | } | ||
| 90 | |||
| 91 | 416 | return kleidicv_separable_filter_2d_stripe_u16( | |
| 92 | 208 | src, src_stride, dst, dst_stride, width, height, 0, height, channels, | |
| 93 | 208 | kernel_x, kernel_width, kernel_y, kernel_height, *fixed_border_type); | |
| 94 | 320 | } | |
| 95 | |||
| 96 | } // extern "C" | ||
| 97 |