From 638e76dbcfb26b75b6a2ee5f456c7b0e7ae069ab Mon Sep 17 00:00:00 2001 From: Varun-Nair Date: Fri, 20 Mar 2026 01:49:29 -0700 Subject: [PATCH] Fix NEON intrinsics build on aarch64 with GCC Ocean's ARM NEON code compiles under Clang (Android/iOS) but fails under GCC on aarch64 Linux servers (e.g., NVIDIA GH200 Grace Hopper). Three categories of fix across 6 files: 1. constexpr on NEON vector types (47 occurrences, 5 files) GCC does not support constexpr on NEON types like uint8x16_t (Clang extension). Replace with const. 2. Signed/unsigned shift mismatch in FrameConverter.cpp (6 occurrences) vrshrq_n_s16() called on unsigned data from vrhaddq_u16(). Replace with vrshrq_n_u16(). 3. Wrong lane accessor types (6 occurrences, 2 files) vget_low_u8/vget_high_u8 called on uint16x8_t, int8x16_t, and int16x8_t arguments. Replace with type-matched accessors. All changes are mechanical and do not alter runtime behavior. Tested on NVIDIA GH200 (aarch64, GCC 11, Ubuntu 22.04). Successfully builds projectaria_tools _core_pybinds.so and extracts VRS data end-to-end. --- impl/ocean/cv/FrameConverter.cpp | 12 ++-- impl/ocean/cv/FrameConverter.h | 14 ++-- impl/ocean/cv/FrameConverterY10_Packed.h | 34 +++++----- impl/ocean/cv/FrameInterpolatorBilinear.cpp | 64 +++++++++---------- impl/ocean/cv/FrameInterpolatorBilinear.h | 4 +- .../cv/FrameInterpolatorNearestPixel.cpp | 4 +- impl/ocean/cv/FrameShrinker.cpp | 2 +- 7 files changed, 67 insertions(+), 67 deletions(-) diff --git a/impl/ocean/cv/FrameConverter.cpp b/impl/ocean/cv/FrameConverter.cpp index 66e285e78..9a0e91ce6 100644 --- a/impl/ocean/cv/FrameConverter.cpp +++ b/impl/ocean/cv/FrameConverter.cpp @@ -2639,9 +2639,9 @@ void FrameConverter::convertTwoRows_1Plane3Channels_To_1Plane1ChannelAnd1Plane2C // let's handle the last two channels - const int16x8_t sourcePlaneAverage_0_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_s16(vrhaddq_u16(sourcePlaneAverage_0_Upper_u_16x8, sourcePlaneAverage_0_Lower_u_16x8), 1)); - const int16x8_t sourcePlaneAverage_1_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_s16(vrhaddq_u16(sourcePlaneAverage_1_Upper_u_16x8, sourcePlaneAverage_1_Lower_u_16x8), 1)); - const int16x8_t sourcePlaneAverage_2_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_s16(vrhaddq_u16(sourcePlaneAverage_2_Upper_u_16x8, sourcePlaneAverage_2_Lower_u_16x8), 1)); + const int16x8_t sourcePlaneAverage_0_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_u16(vrhaddq_u16(sourcePlaneAverage_0_Upper_u_16x8, sourcePlaneAverage_0_Lower_u_16x8), 1)); + const int16x8_t sourcePlaneAverage_1_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_u16(vrhaddq_u16(sourcePlaneAverage_1_Upper_u_16x8, sourcePlaneAverage_1_Lower_u_16x8), 1)); + const int16x8_t sourcePlaneAverage_2_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_u16(vrhaddq_u16(sourcePlaneAverage_2_Upper_u_16x8, sourcePlaneAverage_2_Lower_u_16x8), 1)); int16x8_t intermediate_1_s_16x8 = vmlaq_n_s16(vmlaq_n_s16(vmulq_n_s16(sourcePlaneAverage_0_s_16x8, factorChannel10_128), sourcePlaneAverage_1_s_16x8, factorChannel11_128), sourcePlaneAverage_2_s_16x8, factorChannel12_128); // = channel0 * factor0 + channel1 * factor1 + channel2 * factor2 int16x8_t intermediate_2_s_16x8 = vmlaq_n_s16(vmlaq_n_s16(vmulq_n_s16(sourcePlaneAverage_0_s_16x8, factorChannel20_128), sourcePlaneAverage_1_s_16x8, factorChannel21_128), sourcePlaneAverage_2_s_16x8, factorChannel22_128); @@ -2872,9 +2872,9 @@ void FrameConverter::convertTwoRows_1Plane3Channels_To_1Plane1ChannelAnd2Planes1 // let's handle the last two channels - const int16x8_t sourcePlaneAverage_0_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_s16(vrhaddq_u16(sourcePlaneAverage_0_Upper_u_16x8, sourcePlaneAverage_0_Lower_u_16x8), 1)); - const int16x8_t sourcePlaneAverage_1_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_s16(vrhaddq_u16(sourcePlaneAverage_1_Upper_u_16x8, sourcePlaneAverage_1_Lower_u_16x8), 1)); - const int16x8_t sourcePlaneAverage_2_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_s16(vrhaddq_u16(sourcePlaneAverage_2_Upper_u_16x8, sourcePlaneAverage_2_Lower_u_16x8), 1)); + const int16x8_t sourcePlaneAverage_0_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_u16(vrhaddq_u16(sourcePlaneAverage_0_Upper_u_16x8, sourcePlaneAverage_0_Lower_u_16x8), 1)); + const int16x8_t sourcePlaneAverage_1_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_u16(vrhaddq_u16(sourcePlaneAverage_1_Upper_u_16x8, sourcePlaneAverage_1_Lower_u_16x8), 1)); + const int16x8_t sourcePlaneAverage_2_s_16x8 = vreinterpretq_s16_u16(vrshrq_n_u16(vrhaddq_u16(sourcePlaneAverage_2_Upper_u_16x8, sourcePlaneAverage_2_Lower_u_16x8), 1)); int16x8_t intermediate_1_s_16x8 = vmlaq_n_s16(vmlaq_n_s16(vmulq_n_s16(sourcePlaneAverage_0_s_16x8, factorChannel10_128), sourcePlaneAverage_1_s_16x8, factorChannel11_128), sourcePlaneAverage_2_s_16x8, factorChannel12_128); // = channel0 * factor0 + channel1 * factor1 + channel2 * factor2 int16x8_t intermediate_2_s_16x8 = vmlaq_n_s16(vmlaq_n_s16(vmulq_n_s16(sourcePlaneAverage_0_s_16x8, factorChannel20_128), sourcePlaneAverage_1_s_16x8, factorChannel21_128), sourcePlaneAverage_2_s_16x8, factorChannel22_128); diff --git a/impl/ocean/cv/FrameConverter.h b/impl/ocean/cv/FrameConverter.h index 0b8fc2b3f..948644503 100644 --- a/impl/ocean/cv/FrameConverter.h +++ b/impl/ocean/cv/FrameConverter.h @@ -3536,10 +3536,10 @@ OCEAN_FORCE_INLINE void FrameConverter::unpack5ElementsBayerMosaicPacked10Bit(co template OCEAN_FORCE_INLINE void FrameConverter::unpack15ElementsBayerMosaicPacked10BitNEON(const uint8_t* const packed, uint16x8_t& unpackedAB_u_16x8, uint16x4_t& unpackedC_u_16x4) { - constexpr uint8x8_t shuffleC_u_8x8 = NEON::create_uint8x8(6u, 2u, 6u, 3u, 6u, 4u, 6u, 5u); + const uint8x8_t shuffleC_u_8x8 = NEON::create_uint8x8(6u, 2u, 6u, 3u, 6u, 4u, 6u, 5u); - constexpr int8x16_t leftShifts_s_8x16 = NEON::create_int8x16(6, 0, 4, 0, 2, 0, 0, 0, 6, 0, 4, 0, 2, 0, 0, 0); - constexpr int16x8_t rightShifts_s_16x8 = NEON::create_int16x8(-6, -6, -6, -6, -6, -6, -6, -6); + const int8x16_t leftShifts_s_8x16 = NEON::create_int8x16(6, 0, 4, 0, 2, 0, 0, 0, 6, 0, 4, 0, 2, 0, 0, 0); + const int16x8_t rightShifts_s_16x8 = NEON::create_int16x8(-6, -6, -6, -6, -6, -6, -6, -6); const uint8x16_t packed_u_8x16 = tAllowLastOverlappingElement ? vld1q_u8(packed) : vcombine_u8(vld1_u8(packed), vext_u8(vld1_u8(packed + 7), shuffleC_u_8x8, 1)); // shuffleC_u_8x8 is just a dummy value @@ -3547,13 +3547,13 @@ OCEAN_FORCE_INLINE void FrameConverter::unpack15ElementsBayerMosaicPacked10BitNE // 8 9 7 9 6 9 5 9 3 4 2 4 1 4 0 4 #ifdef __aarch64__ - constexpr uint8x16_t shuffle_u_8x16 = NEON::create_uint8x16(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u, 9u, 5u, 9u, 6u, 9u, 7u, 9u, 8u); + const uint8x16_t shuffle_u_8x16 = NEON::create_uint8x16(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u, 9u, 5u, 9u, 6u, 9u, 7u, 9u, 8u); const uint8x16_t intermediateAB_u_8x16 = vqtbl1q_u8(packed_u_8x16, shuffle_u_8x16); #else const uint8x8_t packedA_u_8x8 = vget_low_u8(packed_u_8x16); const uint8x8_t packedB_u_8x8 = vget_low_u8(vextq_u8(packed_u_8x16, packed_u_8x16, 5)); - constexpr uint8x8_t shuffleAB_u_8x8 = NEON::create_uint8x8(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u); + const uint8x8_t shuffleAB_u_8x8 = NEON::create_uint8x8(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u); const uint8x16_t intermediateAB_u_8x16 = vcombine_u8(vtbl1_u8(packedA_u_8x8, shuffleAB_u_8x8), vtbl1_u8(packedB_u_8x8, shuffleAB_u_8x8)); #endif // __aarch64__ @@ -3567,14 +3567,14 @@ OCEAN_FORCE_INLINE void FrameConverter::unpack15ElementsBayerMosaicPacked10BitNE // ... 99------ 33333333 44------ 22222222 44------ 11111111 44------ 00000000 44------ const uint16x8_t intermediateAB_u_16x8 = vreinterpretq_u16_u8(vshlq_u8(intermediateAB_u_8x16, leftShifts_s_8x16)); - const uint16x4_t intermediateC_u_16x4 = vreinterpret_u16_u8(vshl_u8(intermediateC_u_8x8, vget_low_u8(leftShifts_s_8x16))); + const uint16x4_t intermediateC_u_16x4 = vreinterpret_u16_u8(vshl_u8(intermediateC_u_8x8, vget_low_s8(leftShifts_s_8x16))); // ... 99------ 33333333 44------ 22222222 44------ 11111111 44------ 00000000 44------ // ... 55555599 ------33 33333344 ------22 22222244 ------11 11111144 ------00 00000044 unpackedAB_u_16x8 = vshlq_u16(intermediateAB_u_16x8, rightShifts_s_16x8); - unpackedC_u_16x4 = vshl_u16(intermediateC_u_16x4, vget_low_u8(rightShifts_s_16x8)); + unpackedC_u_16x4 = vshl_u16(intermediateC_u_16x4, vget_low_s16(rightShifts_s_16x8)); } #endif // OCEAN_HARDWARE_NEON_VERSION diff --git a/impl/ocean/cv/FrameConverterY10_Packed.h b/impl/ocean/cv/FrameConverterY10_Packed.h index 7261132db..081d0ecaa 100644 --- a/impl/ocean/cv/FrameConverterY10_Packed.h +++ b/impl/ocean/cv/FrameConverterY10_Packed.h @@ -402,7 +402,7 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Li // F E D C B A 9 8 7 6 5 4 3 2 1 0 // D C B A 8 7 6 5 3 2 1 0 X X X X - constexpr uint8x16_t shuffle_u_8x16 = NEON::create_uint8x16(16u, 16u, 16u, 16u, 0u, 1u, 2u, 3u, 5u, 6u, 7u, 8u, 10u, 11u, 12u, 13u); + const uint8x16_t shuffle_u_8x16 = NEON::create_uint8x16(16u, 16u, 16u, 16u, 0u, 1u, 2u, 3u, 5u, 6u, 7u, 8u, 10u, 11u, 12u, 13u); const uint8x16_t intermediateA_u_8x16 = vqtbl1q_u8(packedA_u_8x16, shuffle_u_8x16); const uint8x8_t intermediateB_u_8x8 = vext_u8(packedB_u_8x8, packedB_u_8x8, 3); @@ -411,7 +411,7 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Li #else - constexpr uint8x16_t mask_u_8x16 = NEON::create_uint8x16(0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0xFFu, 0xFFu, 0xFFu); + const uint8x16_t mask_u_8x16 = NEON::create_uint8x16(0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0xFFu, 0xFFu, 0xFFu); const uint8x16_t packedA_u_8x16 = vld1q_u8(source); const uint8x8_t packedB_u_8x8 = vld1_u8(source + 11); @@ -419,8 +419,8 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Li const uint8x8_t packedAA_u_8x8 = vget_low_u8(packedA_u_8x16); const uint8x8_t packedAB_u_8x8 = vget_high_u8(packedA_u_8x16); - constexpr uint8x8_t shuffleA_u_8x8 = NEON::create_uint8x8(8u, 0u, 1u, 2u, 3u, 5u, 6u, 7u); - constexpr uint8x8_t shuffleB_u_8x8 = NEON::create_uint8x8(0u, 2u, 3u, 4u, 5u, 7u, 8u, 8u); + const uint8x8_t shuffleA_u_8x8 = NEON::create_uint8x8(8u, 0u, 1u, 2u, 3u, 5u, 6u, 7u); + const uint8x8_t shuffleB_u_8x8 = NEON::create_uint8x8(0u, 2u, 3u, 4u, 5u, 7u, 8u, 8u); const uint8x16_t intermediateA_u_8x16 = vextq_u8(vcombine_u8(vtbl1_u8(packedAA_u_8x8, shuffleA_u_8x8), vtbl1_u8(packedAB_u_8x8, shuffleB_u_8x8)), mask_u_8x16, 1); // we use the first zero element of mask_u_8x16 const uint8x16_t intermediateB_u_8x16 = vcombine_u8(vget_low_u8(mask_u_8x16), vand_u8(packedB_u_8x8, vget_high_u8(mask_u_8x16))); @@ -437,8 +437,8 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Ap { static_assert(0u < tStep01 && tStep01 < tStep12 && tStep12 < 1023u, "Invalid steps"); - constexpr int8x16_t leftShifts_s_8x16 = NEON::create_int8x16(6, 0, 4, 0, 2, 0, 0, 0, 6, 0, 4, 0, 2, 0, 0, 0); - constexpr int16x8_t rightShifts_s_16x8 = NEON::create_int16x8(-6, -6, -6, -6, -6, -6, -6, -6); + const int8x16_t leftShifts_s_8x16 = NEON::create_int8x16(6, 0, 4, 0, 2, 0, 0, 0, 6, 0, 4, 0, 2, 0, 0, 0); + const int16x8_t rightShifts_s_16x8 = NEON::create_int16x8(-6, -6, -6, -6, -6, -6, -6, -6); #ifdef __aarch64__ @@ -447,17 +447,17 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Ap // F E D C B A 9 8 7 6 5 4 3 2 1 0 // 8 9 7 9 6 9 5 9 3 4 2 4 1 4 0 4 - constexpr uint8x16_t shuffleAB_u_8x16 = NEON::create_uint8x16(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u, 9u, 5u, 9u, 6u, 9u, 7u, 9u, 8u); + const uint8x16_t shuffleAB_u_8x16 = NEON::create_uint8x16(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u, 9u, 5u, 9u, 6u, 9u, 7u, 9u, 8u); const uint8x16_t intermediateAB_u_8x16 = vqtbl1q_u8(packedAB_u_8x16, shuffleAB_u_8x16); - constexpr uint8x16_t shuffleCD_u_8x16 = NEON::create_uint8x16(10u, 6u, 10u, 7u, 10u, 8u, 10u, 9u, 15u, 11u, 15u, 12u, 15u, 13u, 15u, 14u); + const uint8x16_t shuffleCD_u_8x16 = NEON::create_uint8x16(10u, 6u, 10u, 7u, 10u, 8u, 10u, 9u, 15u, 11u, 15u, 12u, 15u, 13u, 15u, 14u); const uint8x16_t intermediateCD_u_8x16 = vqtbl1q_u8(packedCD_u_8x16, shuffleCD_u_8x16); #else - constexpr uint8x8_t shuffleAB_u_8x8 = NEON::create_uint8x8(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u); - constexpr uint8x8_t shuffleC_u_8x8 = NEON::create_uint8x8(6u, 2u, 6u, 3u, 6u, 4u, 6u, 5u); - constexpr uint8x8_t shuffleD_u_8x8 = NEON::create_uint8x8(7u, 3u, 7u, 4u, 7u, 5u, 7u, 6u); + const uint8x8_t shuffleAB_u_8x8 = NEON::create_uint8x8(4u, 0u, 4u, 1u, 4u, 2u, 4u, 3u); + const uint8x8_t shuffleC_u_8x8 = NEON::create_uint8x8(6u, 2u, 6u, 3u, 6u, 4u, 6u, 5u); + const uint8x8_t shuffleD_u_8x8 = NEON::create_uint8x8(7u, 3u, 7u, 4u, 7u, 5u, 7u, 6u); const uint8x16_t packedAB_u_8x16 = vld1q_u8(source); const uint8x8_t packedForD_u_8x8 = vld1_u8(source + 12); @@ -490,8 +490,8 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Ap // [step01, step12]: f_1(x) = m_1 * x + c_1 // [step21, 1 ]: f_2(x) = m_2 * x + c_2, with f_2(1) = 1 - constexpr int16x8_t step01_s_16x8 = NEON::create_int16x8(int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01)); - constexpr int16x8_t step12_s_16x8 = NEON::create_int16x8(int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12)); + const int16x8_t step01_s_16x8 = NEON::create_int16x8(int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01), int16_t(tStep01)); + const int16x8_t step12_s_16x8 = NEON::create_int16x8(int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12), int16_t(tStep12)); // determining masks to switch between one of the tree linear equations @@ -506,10 +506,10 @@ OCEAN_FORCE_INLINE void FrameConverterY10_Packed::convert16PixelY10_PackedToY8Ap const uint8x16_t isWithin1_u_8x16 = vmvnq_u8(vorrq_u8(isWithin0_u_8x16, isWithin2_u_8x16)); // unpacked > step01 && unpacked <= step02 ? 0xFFFFFFFF : 0x00000000 - const int16x4_t unpackedA_s_16x4 = vreinterpret_s16_u16(vget_low_u8(unpackedAB_u_16x8)); - const int16x4_t unpackedB_s_16x4 = vreinterpret_s16_u16(vget_high_u8(unpackedAB_u_16x8)); - const int16x4_t unpackedC_s_16x4 = vreinterpret_s16_u16(vget_low_u8(unpackedCD_u_16x8)); - const int16x4_t unpackedD_s_16x4 = vreinterpret_s16_u16(vget_high_u8(unpackedCD_u_16x8)); + const int16x4_t unpackedA_s_16x4 = vreinterpret_s16_u16(vget_low_u16(unpackedAB_u_16x8)); + const int16x4_t unpackedB_s_16x4 = vreinterpret_s16_u16(vget_high_u16(unpackedAB_u_16x8)); + const int16x4_t unpackedC_s_16x4 = vreinterpret_s16_u16(vget_low_u16(unpackedCD_u_16x8)); + const int16x4_t unpackedD_s_16x4 = vreinterpret_s16_u16(vget_high_u16(unpackedCD_u_16x8)); // result0 = (m0 * x) / 256) const uint16x8_t resultAB0_u_16x8 = vcombine_u16(vqrshrun_n_s32(vmull_s16(m0_s_16x4, unpackedA_s_16x4), 8), vqrshrun_n_s32(vmull_s16(m0_s_16x4, unpackedB_s_16x4), 8)); diff --git a/impl/ocean/cv/FrameInterpolatorBilinear.cpp b/impl/ocean/cv/FrameInterpolatorBilinear.cpp index 996bd5c4c..3a7db5df1 100644 --- a/impl/ocean/cv/FrameInterpolatorBilinear.cpp +++ b/impl/ocean/cv/FrameInterpolatorBilinear.cpp @@ -730,8 +730,8 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To224x224_8BitPerChan constexpr uint8_t topRowOffsets[14] = {0u, 2u, 3u, 5u, 7u, 9u, 11u, 12u, 14u, 16u, 18u, 20u, 21u, 23u}; - constexpr uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(0u, 1u, 2u, 3u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 12u, 13u); // [ 0L 0R 1L 1R ... - constexpr uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 12u, 13u, 14u, 15u, 255u, 255u, 255u, 255u); // [ 8L 8R 9L 9R ... 13L 13R X X X X ] + const uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(0u, 1u, 2u, 3u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 12u, 13u); // [ 0L 0R 1L 1R ... + const uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 12u, 13u, 14u, 15u, 255u, 255u, 255u, 255u); // [ 8L 8R 9L 9R ... 13L 13R X X X X ] /* * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 @@ -743,10 +743,10 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To224x224_8BitPerChan constexpr uint8_t factorsTop[14] = {78u, 105u, 5u, 32u, 59u, 87u, 114u, 14u, 41u, 69u, 96u, 123u, 23u, 50u}; - constexpr uint8x8_t factorsLeftRightA_u_8x8 = NEON::create_uint8x8(78u, 50u, 105u, 23u, 5u, 123u, 32u, 96u); - constexpr uint8x8_t factorsLeftRightB_u_8x8 = NEON::create_uint8x8(59u, 69u, 87u, 41u, 114u, 14u, 14u, 114u); - constexpr uint8x8_t factorsLeftRightC_u_8x8 = NEON::create_uint8x8(41u, 87u, 69u, 59u, 96u, 32u, 123u, 5u); - constexpr uint8x8_t factorsLeftRightD_u_8x8 = NEON::create_uint8x8(23u, 105u, 50u, 78u, 0u, 0u, 0u, 0u); + const uint8x8_t factorsLeftRightA_u_8x8 = NEON::create_uint8x8(78u, 50u, 105u, 23u, 5u, 123u, 32u, 96u); + const uint8x8_t factorsLeftRightB_u_8x8 = NEON::create_uint8x8(59u, 69u, 87u, 41u, 114u, 14u, 14u, 114u); + const uint8x8_t factorsLeftRightC_u_8x8 = NEON::create_uint8x8(41u, 87u, 69u, 59u, 96u, 32u, 123u, 5u); + const uint8x8_t factorsLeftRightD_u_8x8 = NEON::create_uint8x8(23u, 105u, 50u, 78u, 0u, 0u, 0u, 0u); const unsigned int sourceStrideElements = 400u + sourcePaddingElements; @@ -881,8 +881,8 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To256x256_8BitPerChan constexpr uint8_t topRowOffsets[16] = {0u, 1u, 3u, 4u, 6u, 8u, 9u, 11u, 12u, 14u, 15u, 17u, 19u, 20u, 22u, 23u}; - constexpr uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(0u, 1u, 1u, 2u, 3u, 4u, 4u, 5u, 6u, 7u, 8u, 9u, 9u, 10u, 11u, 12u); // [ 0L 0R 1L 1R ... - constexpr uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(3u, 4u, 5u, 6u, 6u, 7u, 8u, 9u, 10u, 11u, 11u, 12u, 13u, 14u, 14u, 15u); // [ 8L 8R 9L 9R ... + const uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(0u, 1u, 1u, 2u, 3u, 4u, 4u, 5u, 6u, 7u, 8u, 9u, 9u, 10u, 11u, 12u); // [ 0L 0R 1L 1R ... + const uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(3u, 4u, 5u, 6u, 6u, 7u, 8u, 9u, 10u, 11u, 11u, 12u, 13u, 14u, 14u, 15u); // [ 8L 8R 9L 9R ... /* * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @@ -894,10 +894,10 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To256x256_8BitPerChan constexpr uint8_t factorsTop[16] = {92u, 20u, 76u, 4u, 60u, 116u, 44u, 100u, 28u, 84u, 12u, 68u, 124u, 52u, 108u, 36u}; - constexpr uint8x8_t factorsLeftRightA_u_8x8 = NEON::create_uint8x8(92u, 36u, 20u, 108u, 76u, 52u, 4u, 124u); - constexpr uint8x8_t factorsLeftRightB_u_8x8 = NEON::create_uint8x8(60u, 68u, 116u, 12u, 44u, 84u, 100u, 28u); - constexpr uint8x8_t factorsLeftRightC_u_8x8 = NEON::create_uint8x8(28u, 100u, 84u, 44u, 12u, 116u, 68u, 60u); - constexpr uint8x8_t factorsLeftRightD_u_8x8 = NEON::create_uint8x8(124u, 4u, 52u, 76u, 108u, 20u, 36u, 92u); + const uint8x8_t factorsLeftRightA_u_8x8 = NEON::create_uint8x8(92u, 36u, 20u, 108u, 76u, 52u, 4u, 124u); + const uint8x8_t factorsLeftRightB_u_8x8 = NEON::create_uint8x8(60u, 68u, 116u, 12u, 44u, 84u, 100u, 28u); + const uint8x8_t factorsLeftRightC_u_8x8 = NEON::create_uint8x8(28u, 100u, 84u, 44u, 12u, 116u, 68u, 60u); + const uint8x8_t factorsLeftRightD_u_8x8 = NEON::create_uint8x8(124u, 4u, 52u, 76u, 108u, 20u, 36u, 92u); const unsigned int sourceStrideElements = 400u + sourcePaddingElements; @@ -1116,11 +1116,11 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To256x256_8BitPerChan constexpr uint8_t topRowOffsets[16] = {0u, 1u, 3u, 4u, 6u, 8u, 9u, 11u, 12u, 14u, 15u, 17u, 19u, 20u, 22u, 23u}; - constexpr uint8x16_t shuffleLeftA_u_8x16 = NEON::create_uint8x16(16u, 16u, 16u, 16u, 16u, 0u, 1u, 3u, 4u, 6u, 8u, 9u, 11u, 12u, 14u, 15u); - constexpr uint8x16_t shuffleLeftB_u_8x16 = NEON::create_uint8x16(8u, 10u, 11u, 13u, 14u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u); + const uint8x16_t shuffleLeftA_u_8x16 = NEON::create_uint8x16(16u, 16u, 16u, 16u, 16u, 0u, 1u, 3u, 4u, 6u, 8u, 9u, 11u, 12u, 14u, 15u); + const uint8x16_t shuffleLeftB_u_8x16 = NEON::create_uint8x16(8u, 10u, 11u, 13u, 14u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u); - constexpr uint8x16_t shuffleRightA_u_8x16 = NEON::create_uint8x16(16u, 16u, 16u, 16u, 16u, 16u, 1u, 2u, 4u, 5u, 7u, 9u, 10u, 12u, 13u, 15u); - constexpr uint8x16_t shuffleRightB_u_8x16 = NEON::create_uint8x16(7u, 9u, 11u, 12u, 14u, 15u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u); + const uint8x16_t shuffleRightA_u_8x16 = NEON::create_uint8x16(16u, 16u, 16u, 16u, 16u, 16u, 1u, 2u, 4u, 5u, 7u, 9u, 10u, 12u, 13u, 15u); + const uint8x16_t shuffleRightB_u_8x16 = NEON::create_uint8x16(7u, 9u, 11u, 12u, 14u, 15u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u); /* * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @@ -1132,11 +1132,11 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To256x256_8BitPerChan constexpr uint8_t factorsTop[16] = {92u, 20u, 76u, 4u, 60u, 116u, 44u, 100u, 28u, 84u, 12u, 68u, 124u, 52u, 108u, 36u}; - constexpr uint8x8_t factorsLeftA_u_8x8 = NEON::create_uint8x8(92u, 20u, 76u, 4u, 60u, 116u, 44u, 100u); - constexpr uint8x8_t factorsLeftB_u_8x8 = NEON::create_uint8x8(28u, 84u, 12u, 68u, 124u, 52u, 108u, 36u); + const uint8x8_t factorsLeftA_u_8x8 = NEON::create_uint8x8(92u, 20u, 76u, 4u, 60u, 116u, 44u, 100u); + const uint8x8_t factorsLeftB_u_8x8 = NEON::create_uint8x8(28u, 84u, 12u, 68u, 124u, 52u, 108u, 36u); - constexpr uint8x8_t factorsRightA_u_8x8 = NEON::create_uint8x8(36u, 108u, 52u, 124u, 68u, 12u, 84u, 28u); - constexpr uint8x8_t factorsRightB_u_8x8 = NEON::create_uint8x8(100u, 44u, 116u, 60u, 4u, 76u, 20u, 92u); + const uint8x8_t factorsRightA_u_8x8 = NEON::create_uint8x8(36u, 108u, 52u, 124u, 68u, 12u, 84u, 28u); + const uint8x8_t factorsRightB_u_8x8 = NEON::create_uint8x8(100u, 44u, 116u, 60u, 4u, 76u, 20u, 92u); const unsigned int sourceStrideElements = 400u + sourcePaddingElements; @@ -1272,8 +1272,8 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To256x256_8BitPerChan constexpr uint8_t topRowOffsets[16] = {0u, 1u, 3u, 4u, 6u, 8u, 9u, 11u, 12u, 14u, 15u, 17u, 19u, 20u, 22u, 23u}; - constexpr uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(0u, 1u, 1u, 2u, 3u, 4u, 4u, 5u, 6u, 7u, 8u, 9u, 9u, 10u, 11u, 12u); // [ 0L 0R 1L 1R ... - constexpr uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(3u, 4u, 5u, 6u, 6u, 7u, 8u, 9u, 10u, 11u, 11u, 12u, 13u, 14u, 14u, 15u); // [ 8L 8R 9L 9R ... + const uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(0u, 1u, 1u, 2u, 3u, 4u, 4u, 5u, 6u, 7u, 8u, 9u, 9u, 10u, 11u, 12u); // [ 0L 0R 1L 1R ... + const uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(3u, 4u, 5u, 6u, 6u, 7u, 8u, 9u, 10u, 11u, 11u, 12u, 13u, 14u, 14u, 15u); // [ 8L 8R 9L 9R ... /* * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 @@ -1285,10 +1285,10 @@ void FrameInterpolatorBilinear::SpecialCases::resize400x400To256x256_8BitPerChan constexpr uint8_t factorsTop[16] = {92u, 20u, 76u, 4u, 60u, 116u, 44u, 100u, 28u, 84u, 12u, 68u, 124u, 52u, 108u, 36u}; - constexpr uint8x8_t factorsLeftRightA_u_8x8 = NEON::create_uint8x8(92u, 36u, 20u, 108u, 76u, 52u, 4u, 124u); - constexpr uint8x8_t factorsLeftRightB_u_8x8 = NEON::create_uint8x8(60u, 68u, 116u, 12u, 44u, 84u, 100u, 28u); - constexpr uint8x8_t factorsLeftRightC_u_8x8 = NEON::create_uint8x8(28u, 100u, 84u, 44u, 12u, 116u, 68u, 60u); - constexpr uint8x8_t factorsLeftRightD_u_8x8 = NEON::create_uint8x8(124u, 4u, 52u, 76u, 108u, 20u, 36u, 92u); + const uint8x8_t factorsLeftRightA_u_8x8 = NEON::create_uint8x8(92u, 36u, 20u, 108u, 76u, 52u, 4u, 124u); + const uint8x8_t factorsLeftRightB_u_8x8 = NEON::create_uint8x8(60u, 68u, 116u, 12u, 44u, 84u, 100u, 28u); + const uint8x8_t factorsLeftRightC_u_8x8 = NEON::create_uint8x8(28u, 100u, 84u, 44u, 12u, 116u, 68u, 60u); + const uint8x8_t factorsLeftRightD_u_8x8 = NEON::create_uint8x8(124u, 4u, 52u, 76u, 108u, 20u, 36u, 92u); const unsigned int sourceStrideElements = 400u + sourcePaddingElements; @@ -1658,8 +1658,8 @@ inline void FrameInterpolatorBilinear::interpolateRowHorizontal8BitPerChannel7Bi ocean_assert_and_suppress_unused(channels == 2u, channels); - constexpr uint8x8_t mask_left_8x8 = NEON::create_uint8x8(0, 0, 2, 2, 4, 4, 6, 6); - constexpr uint8x8_t mask_right_8x8 = NEON::create_uint8x8(1, 1, 3, 3, 5, 5, 7, 7); + const uint8x8_t mask_left_8x8 = NEON::create_uint8x8(0, 0, 2, 2, 4, 4, 6, 6); + const uint8x8_t mask_right_8x8 = NEON::create_uint8x8(1, 1, 3, 3, 5, 5, 7, 7); for (unsigned int x = 0; x < targetWidth; x += 8u) { @@ -1869,10 +1869,10 @@ inline void FrameInterpolatorBilinear::interpolateRowHorizontal8BitPerChannel7Bi ocean_assert_and_suppress_unused(channels == 4u, channels); - constexpr uint8x8_t mask_02_8x8 = NEON::create_uint8x8(0, 0, 0, 0, 2, 2, 2, 2); - constexpr uint8x8_t mask_13_8x8 = NEON::create_uint8x8(1, 1, 1, 1, 3, 3, 3, 3); - constexpr uint8x8_t mask_46_8x8 = NEON::create_uint8x8(4, 4, 4, 4, 6, 6, 6, 6); - constexpr uint8x8_t mask_57_8x8 = NEON::create_uint8x8(5, 5, 5, 5, 7, 7, 7, 7); + const uint8x8_t mask_02_8x8 = NEON::create_uint8x8(0, 0, 0, 0, 2, 2, 2, 2); + const uint8x8_t mask_13_8x8 = NEON::create_uint8x8(1, 1, 1, 1, 3, 3, 3, 3); + const uint8x8_t mask_46_8x8 = NEON::create_uint8x8(4, 4, 4, 4, 6, 6, 6, 6); + const uint8x8_t mask_57_8x8 = NEON::create_uint8x8(5, 5, 5, 5, 7, 7, 7, 7); for (unsigned int x = 0; x < targetWidth; x += 8u) { diff --git a/impl/ocean/cv/FrameInterpolatorBilinear.h b/impl/ocean/cv/FrameInterpolatorBilinear.h index e019ad49f..eab33d4b1 100644 --- a/impl/ocean/cv/FrameInterpolatorBilinear.h +++ b/impl/ocean/cv/FrameInterpolatorBilinear.h @@ -3949,8 +3949,8 @@ OCEAN_FORCE_INLINE void FrameInterpolatorBilinear::interpolate4Pixels8BitPerChan // ARM64 is not affected. #if defined(__aarch64__) - constexpr uint8x8_t m64_mask0 = NEON::create_uint8x8(0, 4, 1, 1, 1, 1, 1, 1); - constexpr uint8x8_t m64_mask1 = NEON::create_uint8x8(1, 1, 0, 4, 1, 1, 1, 1); + const uint8x8_t m64_mask0 = NEON::create_uint8x8(0, 4, 1, 1, 1, 1, 1, 1); + const uint8x8_t m64_mask1 = NEON::create_uint8x8(1, 1, 0, 4, 1, 1, 1, 1); const uint8x8_t m64_interpolation01 = vtbl1_u8(vget_low_u8(m128_interpolation), m64_mask0); const uint8x8_t m64_interpolation23 = vtbl1_u8(vget_high_u8(m128_interpolation), m64_mask1); diff --git a/impl/ocean/cv/FrameInterpolatorNearestPixel.cpp b/impl/ocean/cv/FrameInterpolatorNearestPixel.cpp index 77f48cd90..f68a74702 100644 --- a/impl/ocean/cv/FrameInterpolatorNearestPixel.cpp +++ b/impl/ocean/cv/FrameInterpolatorNearestPixel.cpp @@ -271,8 +271,8 @@ void FrameInterpolatorNearestPixel::SpecialCases::resize400x400To224x224_8BitPer constexpr uint8_t topRowOffsets[14] = {0u, 1u, 3u, 5u, 7u, 8u, 10u, 12u, 14u, 16u, 17u, 19u, 21u, 23u}; - constexpr uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(255u, 255u, 255u, 255u, 255u, 255u, 255u, 0u, 1u, 3u, 5u, 7u, 8u, 10u, 12u, 14u); - constexpr uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(7u, 8u, 10u, 12u, 14u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u); + const uint8x16_t shuffleA_u_8x16 = NEON::create_uint8x16(255u, 255u, 255u, 255u, 255u, 255u, 255u, 0u, 1u, 3u, 5u, 7u, 8u, 10u, 12u, 14u); + const uint8x16_t shuffleB_u_8x16 = NEON::create_uint8x16(7u, 8u, 10u, 12u, 14u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u, 255u); const unsigned int sourceStrideElements = 400u + sourcePaddingElements; const unsigned int targetStrideElements = 224u + targetPaddingElements; diff --git a/impl/ocean/cv/FrameShrinker.cpp b/impl/ocean/cv/FrameShrinker.cpp index 2afc477c6..0c7fb8f60 100644 --- a/impl/ocean/cv/FrameShrinker.cpp +++ b/impl/ocean/cv/FrameShrinker.cpp @@ -1243,7 +1243,7 @@ inline void FrameShrinker::downsampleByTwoRowHorizontal8BitPerChannel14641NEON<1 * */ - constexpr uint8x8_t mask1233 = NEON::create_uint8x8(2, 3, 4, 5, 6, 7, 6, 7); + const uint8x8_t mask1233 = NEON::create_uint8x8(2, 3, 4, 5, 6, 7, 6, 7); const uint16x8_t constant_6_u_16x8 = vdupq_n_u16(6u);