Line | Branch | Exec | Source |
---|---|---|---|
1 | // SPDX-FileCopyrightText: 2025 Arm Limited and/or its affiliates <open-source-office@arm.com> | ||
2 | // | ||
3 | // SPDX-License-Identifier: Apache-2.0 | ||
4 | |||
5 | #ifndef KLEIDICV_PROCESS_FILTERS_FILTER_2D_H | ||
6 | #define KLEIDICV_PROCESS_FILTERS_FILTER_2D_H | ||
7 | |||
8 | #include "kleidicv/kleidicv.h" | ||
9 | #include "kleidicv/types.h" | ||
10 | #include "kleidicv/workspace/border_types.h" | ||
11 | |||
12 | namespace KLEIDICV_TARGET_NAMESPACE { | ||
13 | |||
14 | // Primary Template for Filter 2D. | ||
15 | template <typename InnerFilterType, const size_t S> | ||
16 | class Filter2D; | ||
17 | |||
18 | template <typename FilterType> | ||
19 | 4830 | void process_filter2d(Rectangle rect, size_t y_begin, size_t y_end, | |
20 | Rows<const typename FilterType::SourceType> src_rows, | ||
21 | Rows<typename FilterType::DestinationType> dst_rows, | ||
22 | typename FilterType::BorderType border_type, | ||
23 | FilterType filter) KLEIDICV_STREAMING { | ||
24 | // Border helper which calculates border offsets. | ||
25 | 9660 | typename FilterType::BorderInfoType vertical_border{rect.height(), | |
26 | 4830 | border_type}; | |
27 | 9660 | typename FilterType::BorderInfoType horizontal_border{rect.width(), | |
28 | 4830 | border_type}; | |
29 | |||
30 |
42/42✓ Branch 0 taken 198 times.
✓ Branch 1 taken 924 times.
✓ Branch 2 taken 192 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 212 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 243 times.
✓ Branch 7 taken 2384 times.
✓ Branch 8 taken 234 times.
✓ Branch 9 taken 2314 times.
✓ Branch 10 taken 271 times.
✓ Branch 11 taken 820 times.
✓ Branch 12 taken 252 times.
✓ Branch 13 taken 2454 times.
✓ Branch 14 taken 225 times.
✓ Branch 15 taken 2244 times.
✓ Branch 16 taken 262 times.
✓ Branch 17 taken 380 times.
✓ Branch 18 taken 232 times.
✓ Branch 19 taken 2052 times.
✓ Branch 20 taken 216 times.
✓ Branch 21 taken 1804 times.
✓ Branch 22 taken 260 times.
✓ Branch 23 taken 488 times.
✓ Branch 24 taken 216 times.
✓ Branch 25 taken 1434 times.
✓ Branch 26 taken 203 times.
✓ Branch 27 taken 1580 times.
✓ Branch 28 taken 192 times.
✓ Branch 29 taken 96 times.
✓ Branch 30 taken 230 times.
✓ Branch 31 taken 652 times.
✓ Branch 32 taken 226 times.
✓ Branch 33 taken 868 times.
✓ Branch 34 taken 226 times.
✓ Branch 35 taken 100 times.
✓ Branch 36 taken 232 times.
✓ Branch 37 taken 1668 times.
✓ Branch 38 taken 214 times.
✓ Branch 39 taken 1528 times.
✓ Branch 40 taken 294 times.
✓ Branch 41 taken 108 times.
|
30858 | for (size_t vertical_index = y_begin; vertical_index < y_end; |
31 | 26028 | ++vertical_index) { | |
32 | 26028 | auto vertical_offsets = vertical_border.offsets_with_border(vertical_index); | |
33 | 26028 | constexpr size_t kMargin = filter.kMargin; | |
34 | |||
35 | // Process data affected by left border. | ||
36 | KLEIDICV_FORCE_LOOP_UNROLL | ||
37 |
42/42✓ Branch 0 taken 1848 times.
✓ Branch 1 taken 924 times.
✓ Branch 2 taken 3744 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 1700 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 5516 times.
✓ Branch 7 taken 2384 times.
✓ Branch 8 taken 6124 times.
✓ Branch 9 taken 2314 times.
✓ Branch 10 taken 2316 times.
✓ Branch 11 taken 820 times.
✓ Branch 12 taken 4908 times.
✓ Branch 13 taken 2454 times.
✓ Branch 14 taken 6732 times.
✓ Branch 15 taken 2244 times.
✓ Branch 16 taken 688 times.
✓ Branch 17 taken 380 times.
✓ Branch 18 taken 4520 times.
✓ Branch 19 taken 2052 times.
✓ Branch 20 taken 5104 times.
✓ Branch 21 taken 1804 times.
✓ Branch 22 taken 1320 times.
✓ Branch 23 taken 488 times.
✓ Branch 24 taken 2868 times.
✓ Branch 25 taken 1434 times.
✓ Branch 26 taken 4740 times.
✓ Branch 27 taken 1580 times.
✓ Branch 28 taken 96 times.
✓ Branch 29 taken 96 times.
✓ Branch 30 taken 1268 times.
✓ Branch 31 taken 652 times.
✓ Branch 32 taken 2532 times.
✓ Branch 33 taken 868 times.
✓ Branch 34 taken 100 times.
✓ Branch 35 taken 100 times.
✓ Branch 36 taken 3304 times.
✓ Branch 37 taken 1668 times.
✓ Branch 38 taken 4520 times.
✓ Branch 39 taken 1528 times.
✓ Branch 40 taken 108 times.
✓ Branch 41 taken 108 times.
|
90084 | for (size_t horizontal_index = 0; horizontal_index < kMargin; |
38 | 64056 | ++horizontal_index) { | |
39 | 64056 | auto horizontal_offsets = | |
40 | 64056 | horizontal_border.offsets_with_left_border(horizontal_index); | |
41 | 64056 | filter.process_one_pixel_with_horizontal_borders( | |
42 | 64056 | src_rows.at(vertical_index, horizontal_index), | |
43 | 64056 | dst_rows.at(vertical_index, horizontal_index), vertical_offsets, | |
44 | 64056 | horizontal_offsets); | |
45 | 64056 | } | |
46 | |||
47 | // Process data which is not affected by any borders in bulk. | ||
48 | 26028 | size_t width_without_borders = rect.width() - (2 * kMargin); | |
49 | 26028 | auto horizontal_offsets = horizontal_border.offsets_without_border(); | |
50 | 26028 | filter.process_pixels_without_horizontal_borders( | |
51 | 26028 | width_without_borders, src_rows.at(vertical_index, kMargin), | |
52 | 26028 | dst_rows.at(vertical_index, kMargin), vertical_offsets, | |
53 | 26028 | horizontal_offsets); | |
54 | |||
55 | // Process data affected by right border. | ||
56 | KLEIDICV_FORCE_LOOP_UNROLL | ||
57 |
42/42✓ Branch 0 taken 1848 times.
✓ Branch 1 taken 924 times.
✓ Branch 2 taken 3744 times.
✓ Branch 3 taken 1248 times.
✓ Branch 4 taken 1700 times.
✓ Branch 5 taken 882 times.
✓ Branch 6 taken 5516 times.
✓ Branch 7 taken 2384 times.
✓ Branch 8 taken 6124 times.
✓ Branch 9 taken 2314 times.
✓ Branch 10 taken 2316 times.
✓ Branch 11 taken 820 times.
✓ Branch 12 taken 4908 times.
✓ Branch 13 taken 2454 times.
✓ Branch 14 taken 6732 times.
✓ Branch 15 taken 2244 times.
✓ Branch 16 taken 688 times.
✓ Branch 17 taken 380 times.
✓ Branch 18 taken 4520 times.
✓ Branch 19 taken 2052 times.
✓ Branch 20 taken 5104 times.
✓ Branch 21 taken 1804 times.
✓ Branch 22 taken 1320 times.
✓ Branch 23 taken 488 times.
✓ Branch 24 taken 2868 times.
✓ Branch 25 taken 1434 times.
✓ Branch 26 taken 4740 times.
✓ Branch 27 taken 1580 times.
✓ Branch 28 taken 96 times.
✓ Branch 29 taken 96 times.
✓ Branch 30 taken 1268 times.
✓ Branch 31 taken 652 times.
✓ Branch 32 taken 2532 times.
✓ Branch 33 taken 868 times.
✓ Branch 34 taken 100 times.
✓ Branch 35 taken 100 times.
✓ Branch 36 taken 3304 times.
✓ Branch 37 taken 1668 times.
✓ Branch 38 taken 4520 times.
✓ Branch 39 taken 1528 times.
✓ Branch 40 taken 108 times.
✓ Branch 41 taken 108 times.
|
90084 | for (size_t horizontal_index = 0; horizontal_index < kMargin; |
58 | 64056 | ++horizontal_index) { | |
59 | 64056 | size_t index = rect.width() - kMargin + horizontal_index; | |
60 | 64056 | auto horizontal_offsets = | |
61 | 64056 | horizontal_border.offsets_with_right_border(index); | |
62 | 64056 | filter.process_one_pixel_with_horizontal_borders( | |
63 | 64056 | src_rows.at(vertical_index, index), | |
64 | 64056 | dst_rows.at(vertical_index, index), vertical_offsets, | |
65 | 64056 | horizontal_offsets); | |
66 | 64056 | } | |
67 | 26028 | } | |
68 | 4830 | } | |
69 | |||
70 | template <typename FilterType> | ||
71 | 1752 | void process_filter2d_by_dual_rows( | |
72 | Rectangle rect, size_t y_begin, size_t y_end, | ||
73 | Rows<const typename FilterType::SourceType> src_rows, | ||
74 | Rows<typename FilterType::DestinationType> dst_rows, | ||
75 | typename FilterType::BorderType border_type, | ||
76 | FilterType filter) KLEIDICV_STREAMING { | ||
77 | // Border helper which calculates border offsets. | ||
78 | 3504 | typename FilterType::BorderInfoType vertical_border{rect.height(), | |
79 | 1752 | border_type}; | |
80 | 3504 | typename FilterType::BorderInfoType horizontal_border{rect.width(), | |
81 | 1752 | border_type}; | |
82 | 1752 | constexpr size_t kMargin = filter.kMargin; | |
83 | 1752 | size_t vertical_index = y_begin; | |
84 | |||
85 |
14/14✓ Branch 0 taken 192 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 1560 times.
✓ Branch 3 taken 294 times.
✓ Branch 4 taken 1560 times.
✓ Branch 5 taken 294 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 294 times.
✓ Branch 8 taken 192 times.
✓ Branch 9 taken 192 times.
✓ Branch 10 taken 192 times.
✓ Branch 11 taken 192 times.
✓ Branch 12 taken 1560 times.
✓ Branch 13 taken 294 times.
|
8568 | for (; vertical_index < y_end - 1; vertical_index += 2) { |
86 | // Recalculate vertical border offsets. | ||
87 | 6816 | auto vertical_offsets_0 = | |
88 | 6816 | vertical_border.offsets_with_border(vertical_index); | |
89 | 6816 | auto vertical_offsets_1 = | |
90 | 6816 | vertical_border.offsets_with_border(vertical_index + 1); | |
91 | |||
92 | // Process data affected by left border. | ||
93 | KLEIDICV_FORCE_LOOP_UNROLL | ||
94 |
14/14✓ Branch 0 taken 192 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 1560 times.
✓ Branch 3 taken 1560 times.
✓ Branch 4 taken 1560 times.
✓ Branch 5 taken 1560 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 1560 times.
✓ Branch 8 taken 192 times.
✓ Branch 9 taken 192 times.
✓ Branch 10 taken 192 times.
✓ Branch 11 taken 192 times.
✓ Branch 12 taken 1560 times.
✓ Branch 13 taken 1560 times.
|
13632 | for (size_t horizontal_index = 0; horizontal_index < kMargin; |
95 | 6816 | ++horizontal_index) { | |
96 | 6816 | auto horizontal_offsets = | |
97 | 6816 | horizontal_border.offsets_with_left_border(horizontal_index); | |
98 | 6816 | filter.process_two_pixels_with_horizontal_borders( | |
99 | 6816 | src_rows.at(vertical_index, horizontal_index), | |
100 | 6816 | dst_rows.at(vertical_index, horizontal_index), vertical_offsets_0, | |
101 | 6816 | vertical_offsets_1, horizontal_offsets); | |
102 | 6816 | } | |
103 | |||
104 | // Process data which is not affected by any borders in bulk. | ||
105 | 6816 | size_t width_without_borders = rect.width() - (2 * kMargin); | |
106 | 6816 | auto horizontal_offsets = horizontal_border.offsets_without_border(); | |
107 | 6816 | filter.process_pixels_of_dual_rows_without_horizontal_borders( | |
108 | 6816 | width_without_borders, src_rows.at(vertical_index, kMargin), | |
109 | 6816 | dst_rows.at(vertical_index, kMargin), vertical_offsets_0, | |
110 | 6816 | vertical_offsets_1, horizontal_offsets); | |
111 | |||
112 | // Process data affected by right border. | ||
113 | KLEIDICV_FORCE_LOOP_UNROLL | ||
114 |
14/14✓ Branch 0 taken 192 times.
✓ Branch 1 taken 192 times.
✓ Branch 2 taken 1560 times.
✓ Branch 3 taken 1560 times.
✓ Branch 4 taken 1560 times.
✓ Branch 5 taken 1560 times.
✓ Branch 6 taken 1560 times.
✓ Branch 7 taken 1560 times.
✓ Branch 8 taken 192 times.
✓ Branch 9 taken 192 times.
✓ Branch 10 taken 192 times.
✓ Branch 11 taken 192 times.
✓ Branch 12 taken 1560 times.
✓ Branch 13 taken 1560 times.
|
13632 | for (size_t horizontal_index = 0; horizontal_index < kMargin; |
115 | 6816 | ++horizontal_index) { | |
116 | 6816 | size_t index = rect.width() - kMargin + horizontal_index; | |
117 | 6816 | auto horizontal_offsets = | |
118 | 6816 | horizontal_border.offsets_with_right_border(index); | |
119 | |||
120 | 6816 | filter.process_two_pixels_with_horizontal_borders( | |
121 | 6816 | src_rows.at(vertical_index, index), | |
122 | 6816 | dst_rows.at(vertical_index, index), vertical_offsets_0, | |
123 | 6816 | vertical_offsets_1, horizontal_offsets); | |
124 | 6816 | } | |
125 | 6816 | } | |
126 | |||
127 | 3504 | process_filter2d(rect, vertical_index, y_end, src_rows, dst_rows, border_type, | |
128 | 1752 | filter); | |
129 | 1752 | } | |
130 | |||
131 | } // namespace KLEIDICV_TARGET_NAMESPACE | ||
132 | |||
133 | #endif // KLEIDICV_PROCESS_FILTERS_FILTER_2D_H | ||
134 |