diff --git a/intrinsiccv/include/intrinsiccv/sve2.h b/intrinsiccv/include/intrinsiccv/sve2.h index 3bfae8108a13a372f4fc109839d6120b3caf8d06..7fe117a6f8c839c3dbe5559aaf8b38d0bed9707c 100644 --- a/intrinsiccv/include/intrinsiccv/sve2.h +++ b/intrinsiccv/include/intrinsiccv/sve2.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2023 Arm Limited and/or its affiliates +// SPDX-FileCopyrightText: 2023 - 2024 Arm Limited and/or its affiliates // // SPDX-License-Identifier: Apache-2.0 @@ -768,6 +768,15 @@ using SeparableFilter3x3 = SeparableFilter; template using SeparableFilter5x5 = SeparableFilter; +// Swap two variables, since some C++ Standard Library implementations do not +// allow using std::swap for SVE vectors. +template +static inline void swap_scalable(T &a, T &b) INTRINSICCV_STREAMING_COMPATIBLE { + T tmp = a; + a = b; + b = tmp; +} + } // namespace intrinsiccv::sve2 #endif // INTRINSICCV_SVE2_H diff --git a/intrinsiccv/include/intrinsiccv/utils.h b/intrinsiccv/include/intrinsiccv/utils.h index 785c5a1ca8ea6024148d2f0aa52b8e4137c92367..c6d4652a9fc80f35eb587ffbdd3a8c639ae162c8 100644 --- a/intrinsiccv/include/intrinsiccv/utils.h +++ b/intrinsiccv/include/intrinsiccv/utils.h @@ -61,15 +61,6 @@ static T rounding_shift_right(T value, return (value + (1UL << (shift - 1))) >> shift; } -// Swap two variables, since non-Android toolchains do not allow using std::swap -// for SVE vectors. -template -static inline void swap(T &a, T &b) INTRINSICCV_STREAMING_COMPATIBLE { - T tmp = a; - a = b; - b = tmp; -} - // When placed in a loop, it effectively disables loop vectorization. static inline void disable_loop_vectorization() INTRINSICCV_STREAMING_COMPATIBLE { diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp b/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp index 0b6102b888fa4217602f17356af5be2929ec1277..04861ee8c5e78bb048cb740eca63fe5ab088862b 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp +++ b/intrinsiccv/src/conversions/yuv_to_rgb_neon.cpp @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: Apache-2.0 +#include + #include "intrinsiccv/conversions/yuv_to_rgb.h" #include "intrinsiccv/intrinsiccv.h" #include "intrinsiccv/neon.h" @@ -80,8 +82,8 @@ class YUVSpToRGBxOrBGRx final : public UnrollOnce { // Swap U and V channels for NV21 (order is V, U). if (is_nv21_) { - swap(u_l, v_l); - swap(u_h, v_h); + std::swap(u_l, v_l); + std::swap(u_h, v_h); } // R - Y = Rbase + Weight(RV) * V = @@ -172,8 +174,8 @@ class YUVSpToRGBxOrBGRx final : public UnrollOnce { rgba1.val[3] = vdupq_n_u8(0xFF); if constexpr (BGR) { - swap(rgba0.val[0], rgba0.val[2]); - swap(rgba1.val[0], rgba1.val[2]); + std::swap(rgba0.val[0], rgba0.val[2]); + std::swap(rgba1.val[0], rgba1.val[2]); } // Store RGB pixels to memory. @@ -192,8 +194,8 @@ class YUVSpToRGBxOrBGRx final : public UnrollOnce { rgb1.val[2] = vcombine_u8(b1.val[0], b1.val[1]); if constexpr (BGR) { - swap(rgb0.val[0], rgb0.val[2]); - swap(rgb1.val[0], rgb1.val[2]); + std::swap(rgb0.val[0], rgb0.val[2]); + std::swap(rgb1.val[0], rgb1.val[2]); } // Store RGB pixels to memory. @@ -222,7 +224,7 @@ class YUVSpToRGBxOrBGRx final : public UnrollOnce { v_m128 = uv_row[1] - 128; uv_row += 2; if (is_nv21_) { - swap(u_m128, v_m128); + std::swap(u_m128, v_m128); } } @@ -238,7 +240,7 @@ class YUVSpToRGBxOrBGRx final : public UnrollOnce { b = rounding_shift_right(b, kWeightScale); if constexpr (BGR) { - swap(r, b); + std::swap(r, b); } rgbx_rows[selector][0] = saturating_cast(r); diff --git a/intrinsiccv/src/conversions/yuv_to_rgb_sc.h b/intrinsiccv/src/conversions/yuv_to_rgb_sc.h index 5d935ca9500285c5c27b9e880ec74c24ee3d8eed..aedfcc62aeb88071ee0578911a46ba1593ba1a34 100644 --- a/intrinsiccv/src/conversions/yuv_to_rgb_sc.h +++ b/intrinsiccv/src/conversions/yuv_to_rgb_sc.h @@ -5,8 +5,6 @@ #ifndef INTRINSICCV_YUV_TO_RGB_SC_H #define INTRINSICCV_YUV_TO_RGB_SC_H -#include - #include "intrinsiccv/conversions/yuv_to_rgb.h" #include "intrinsiccv/intrinsiccv.h" #include "intrinsiccv/sve2.h" @@ -81,7 +79,7 @@ class YUVSpToRGBxOrBGRx final { if (is_nv21_) { // Swap U and V channels for NV21 (order is V, U). - swap(u, v); + swap_scalable(u, v); } svint32_t u_b = svmovlb(u);