diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index bf370350400bfd9e1efd838a12e2a72ec11f9472..72df1c94be12d25a55e1769230080cbb8d05190e 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # If changing this image ID, please also change it in .gitlab-ci.yml -FROM registry.gitlab.arm.com/kleidi/kleidicv:12 +FROM registry.gitlab.arm.com/kleidi/kleidicv:13 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index ae0dcd1a6c2e0420626c13983747870e4d769577..49bd3f5c35ca92fda8f99195d3d2cea28af33bb6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,7 +3,7 @@ # SPDX-License-Identifier: Apache-2.0 # If changing this image ID, please also change it in .devcontainer/Dockerfile -image: registry.gitlab.arm.com/kleidi/kleidicv:12 +image: registry.gitlab.arm.com/kleidi/kleidicv:13 variables: KUBERNETES_CPU_REQUEST: "16" diff --git a/conformity/opencv/tests.cpp b/conformity/opencv/tests.cpp index b3d15769c53bedd794794302dfe60f1b6a8f5268..14ccc52c691d59f115cb22a9d822c26f9d9dbf85 100644 --- a/conformity/opencv/tests.cpp +++ b/conformity/opencv/tests.cpp @@ -23,7 +23,7 @@ static std::vector merge_tests( } std::vector all_tests = merge_tests({ - // clang-format off + // clang-format off binary_op_tests_get, cvtcolor_tests_get, #if KLEIDICV_ENABLE_ALL_OPENCV_HAL @@ -41,7 +41,7 @@ std::vector all_tests = merge_tests({ in_range_tests_get, remap_tests_get, blur_and_downsample_tests_get, - // clang-format on + // clang-format on }); #if MANAGER diff --git a/conformity/opencv/utils.h b/conformity/opencv/utils.h index c6778d4f04803067bed74e5d4809a24092a83e50..ef5ae65fcb6ffff7ec0cf647ee50b46938de63a8 100644 --- a/conformity/opencv/utils.h +++ b/conformity/opencv/utils.h @@ -96,16 +96,14 @@ int run_tests(RecreatedMessageQueue& request_queue, typedef bool (*test_function)(int index, RecreatedMessageQueue& request_queue, RecreatedMessageQueue& reply_queue); using test = std::pair; -#define TEST(name, test_func, x) \ - { name, test_func } +#define TEST(name, test_func, x) {name, test_func} #else void wait_for_requests(OpenedMessageQueue& request_queue, OpenedMessageQueue& reply_queue); typedef cv::Mat (*exec_function)(cv::Mat& input); using test = std::pair; -#define TEST(name, x, exec_func) \ - { name, exec_func } +#define TEST(name, x, exec_func) {name, exec_func} #endif #endif // KLEIDICV_OPENCV_CONFORMITY_UTILS_H_ diff --git a/docker/Dockerfile b/docker/Dockerfile index 2f9d362979a6399cea443f284b97ba9231e27524..ce2430a921f1c8307afd41c63f4ace8955c766e5 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -2,11 +2,12 @@ # # SPDX-License-Identifier: Apache-2.0 -FROM ubuntu:23.10 +FROM ubuntu:24.04 RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends install \ ca-certificates \ + ccache \ cmake \ doxygen \ g++-aarch64-linux-gnu \ @@ -21,24 +22,29 @@ RUN apt-get update \ ninja-build \ patch \ pipx \ - python3-six \ + python3 \ shellcheck \ software-properties-common \ wget -# Install latest version of most LLVM tools except clang-format because -# we prioritise stability when it comes to how we format our code. +# Install latest version of most LLVM tools except clang-format and clang-tidy +# because we prioritise stability when it comes to how we format our code and +# which cland-tidy checks we expect. ENV LLVM_VERSION=20 +ENV CLANG_FORMAT_VERSION=19 +ENV CLANG_TIDY_VERSION=19 RUN wget -q https://apt.llvm.org/llvm-snapshot.gpg.key -O /etc/apt/trusted.gpg.d/apt.llvm.org.asc \ && echo "ce6eee4130298f79b0e0f09a89f93c1bc711cd68e7e3182d37c8e96c5227e2f0 /etc/apt/trusted.gpg.d/apt.llvm.org.asc" | sha256sum -c - \ && . /etc/os-release \ && add-apt-repository "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME} main" \ + && add-apt-repository "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${CLANG_FORMAT_VERSION} main" \ + && add-apt-repository "deb http://apt.llvm.org/${VERSION_CODENAME}/ llvm-toolchain-${VERSION_CODENAME}-${CLANG_TIDY_VERSION} main" \ && apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get -y --no-install-recommends install \ clang-${LLVM_VERSION} \ - clang-format-17 \ - clang-tidy-${LLVM_VERSION} \ + clang-format-${CLANG_FORMAT_VERSION} \ + clang-tidy-${CLANG_TIDY_VERSION} \ clang-tools-${LLVM_VERSION} \ libclang-rt-${LLVM_VERSION}-dev \ lld-${LLVM_VERSION} \ diff --git a/kleidicv/src/conversions/gray_to_rgb_sc.h b/kleidicv/src/conversions/gray_to_rgb_sc.h index a0a1c7c242d2717710b1bdbaf4c9ac229971855d..ca635694caec2b15cdace0dab4c41963f5d12c66 100644 --- a/kleidicv/src/conversions/gray_to_rgb_sc.h +++ b/kleidicv/src/conversions/gray_to_rgb_sc.h @@ -100,7 +100,7 @@ class GrayToRGB final : svuint8x3_t &indices_; #endif // KLEIDICV_PREFER_INTERLEAVING_LOAD_STORE -}; // end of class GrayToRGB +}; // end of class GrayToRGB template class GrayToRGBAWithInterleaving final : public UnrollTwice { @@ -198,7 +198,7 @@ class GrayToRGBAWithLookUpTable final : public UnrollTwice, } svuint8x4_t &indices_; -}; // end of class GrayToRGBAWithLookUpTable +}; // end of class GrayToRGBAWithLookUpTable #endif // !KLEIDICV_PREFER_INTERLEAVING_LOAD_STORE KLEIDICV_TARGET_FN_ATTRS static kleidicv_error_t gray_to_rgb_u8_sc( diff --git a/kleidicv/src/conversions/rgb_to_rgb_sc.h b/kleidicv/src/conversions/rgb_to_rgb_sc.h index 8ec8cda393564ea153e85f97e4748f70a0c48c22..e07c6a93c1fc401ce1e722cba150adb1ada38fdc 100644 --- a/kleidicv/src/conversions/rgb_to_rgb_sc.h +++ b/kleidicv/src/conversions/rgb_to_rgb_sc.h @@ -96,7 +96,7 @@ class RGBToBGR final : svuint8x4_t &indices_; #endif // !KLEIDICV_PREFER_INTERLEAVING_LOAD_STORE || // !KLEIDICV_ASSUME_128BIT_SVE2 -}; // end of class RGBToBGR +}; // end of class RGBToBGR template class RGBAToBGRA final : public UnrollTwice { diff --git a/scripts/benchmark/build.sh b/scripts/benchmark/build.sh index 32453a53d6720042340fa5f83646523d6f1501fb..2515e274b07e7b0be58ac3e77bfab21e7fc0e227 100755 --- a/scripts/benchmark/build.sh +++ b/scripts/benchmark/build.sh @@ -3,7 +3,7 @@ # SPDX-FileCopyrightText: 2024 Arm Limited and/or its affiliates # # SPDX-License-Identifier: Apache-2.0 -# + # Builds the perf benchmarks for OpenCV with Android target. # # The following builds will be created: @@ -39,13 +39,6 @@ KLEIDICV_SOURCE_PATH="$(realpath "${SCRIPT_PATH}/..")" export COMMON_EXTRA_CMAKE_ARGS="\ -DANDROID_ABI=arm64-v8a \ - -DBUILD_ANDROID_EXAMPLES=OFF \ - -DBUILD_ANDROID_PROJECTS=OFF \ - -DBUILD_JAVA=OFF \ - -DWITH_QT=OFF \ - -DBUILD_OPENCV_PYTHON=NO \ - -DBUILD_OPENCV_PYTHON2=NO \ - -DBUILD_OPENCV_PYTHON3=NO \ -DBUILD_TESTS=OFF \ -DBUILD_PERF_TESTS=ON \ -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON \ diff --git a/scripts/build-opencv.sh b/scripts/build-opencv.sh index 85ea0973aab7d8986cb407c0212ee09b1797490c..aeb39e9ae6dd04f09b571c9ba85e29abefcd8c22 100755 --- a/scripts/build-opencv.sh +++ b/scripts/build-opencv.sh @@ -1,9 +1,9 @@ #!/usr/bin/env bash -# + # SPDX-FileCopyrightText: 2024 Arm Limited and/or its affiliates # # SPDX-License-Identifier: Apache-2.0 -# + # Builds a given target for OpenCV. # # The build artifacts are placed in the `build` directory. @@ -97,6 +97,35 @@ cmake_config_args=( "-DCMAKE_SHARED_LINKER_FLAGS=${CMAKE_SHARED_LINKER_FLAGS}" "-DCMAKE_CXX_STANDARD=14" "-DOPENCV_DISABLE_THREAD_SUPPORT=ON" + + "-DCV_TRACE=OFF" + "-DBUILD_EXAMPLES=OFF" + "-DBUILD_opencv_apps=OFF" + "-DBUILD_ANDROID_EXAMPLES=OFF" + "-DBUILD_ANDROID_PROJECTS=OFF" + "-DBUILD_JAVA=OFF" + "-DWITH_QT=OFF" + "-DBUILD_OPENCV_PYTHON=NO" + "-DBUILD_OPENCV_PYTHON2=NO" + "-DBUILD_OPENCV_PYTHON3=NO" + "-DWITH_VTK=OFF" + "-DWITH_JASPER=OFF" + "-DWITH_OPENJPEG=OFF" + "-DWITH_JPEG=OFF" + "-DWITH_WEBP=OFF" + "-DWITH_PNG=OFF" + "-DWITH_TIFF=OFF" + "-DWITH_V4L=OFF" + "-DWITH_OPENCL=OFF" + "-DWITH_FLATBUFFERS=OFF" + "-DWITH_PROTOBUF=OFF" + "-DWITH_IMGCODEC_HDR=OFF" + "-DWITH_IMGCODEC_SUNRASTER=OFF" + "-DWITH_IMGCODEC_PXM=OFF" + "-DWITH_IMGCODEC_PFM=OFF" + "-DWITH_ADE=OFF" + "-DWITH_LAPACK=OFF" + "-DOPENCV_PYTHON_SKIP_DETECTION=ON" ) if [[ -n "${CMAKE_CROSSCOMPILING_EMULATOR}" ]]; then diff --git a/scripts/ci-opencv.sh b/scripts/ci-opencv.sh index ca25c177ac2456ef7463a089f274f038359aa743..f46892aedc132ec3d6561493d2e14d5aa4e9c871 100755 --- a/scripts/ci-opencv.sh +++ b/scripts/ci-opencv.sh @@ -9,19 +9,36 @@ set -exu # Ensure we're at the root of the repo. cd "$(dirname "${BASH_SOURCE[0]}")/.." -# Run OpenCV conformity checks -TESTRESULT=0 export OPENCV_VERSION="4.10.0" +# ------------------------------------------------------------------------------ +# Try to build unpatched OpenCV with KleidiCV +# ------------------------------------------------------------------------------ +mkdir -p build/unpatched-opencv-src +tar -xzf /opt/opencv-${OPENCV_VERSION}.tar.gz -C build/unpatched-opencv-src +BUILD_ID=unpatched-opencv \ +OPENCV_PATH="$(pwd)/build/unpatched-opencv-src/opencv-${OPENCV_VERSION}" \ +CMAKE_EXE_LINKER_FLAGS="--rtlib=compiler-rt -fuse-ld=lld" \ +EXTRA_CMAKE_ARGS="-DBUILD_SHARED_LIBS=OFF -DWITH_KLEIDICV=ON -DKLEIDICV_SOURCE_PATH=$(pwd)" \ +./scripts/build-opencv.sh + +# ------------------------------------------------------------------------------ +# Run OpenCV conformity checks +# ------------------------------------------------------------------------------ +TESTRESULT=0 CLEAN="ON" \ OPENCV_URL="/opt/opencv-${OPENCV_VERSION}.tar.gz" \ LDFLAGS="--rtlib=compiler-rt -fuse-ld=lld" \ ./scripts/run_opencv_conformity_checks.sh || TESTRESULT=1 +# ------------------------------------------------------------------------------ +# Run a subset of OpenCV's test suite +# ------------------------------------------------------------------------------ # Build OpenCV test executables from already configured conformity check project +# The OpenCV source is patched in this case ninja -C build/conformity/opencv_kleidicv opencv_test_imgproc opencv_test_core -# Run a subset of the OpenCV test suite, requres opencv_extra for the test images +# Some tests require opencv_extra for the test images tar xf /opt/opencv-extra-${OPENCV_VERSION}.tar.gz -C build mv build/opencv_extra-${OPENCV_VERSION} build/opencv_extra @@ -45,7 +62,6 @@ IMGPROC_TEST_PATTERNS=( '*Imgproc_Morphology*' '*Imgproc_GaussianBlur*' '*Imgproc_Sobel*' - '*Imgproc_Canny*' '*Imgproc_Resize*' '*Imgproc_Dilate*' '*Imgproc_Erode*' diff --git a/scripts/ci.sh b/scripts/ci.sh index 00b38771013509ff24d5467f31ddaac4a8b8e47a..044464ad38029aaf56cd471fd8dda537bdeb66e4 100755 --- a/scripts/ci.sh +++ b/scripts/ci.sh @@ -17,6 +17,9 @@ if ! command -v qemu-aarch64; then apt-get -y --no-install-recommends install qemu-user fi +# Force ccache for all CMake builds +export CMAKE_CXX_COMPILER_LAUNCHER=ccache + # Check format of C++ files CHECK_ONLY=ON VERBOSE=ON scripts/format.sh @@ -36,7 +39,7 @@ doxygen # Build cmake -S . -B build -G Ninja \ -DCMAKE_COMPILE_WARNING_AS_ERROR=ON \ - -DCMAKE_CXX_CLANG_TIDY=clang-tidy \ + -DCMAKE_CXX_CLANG_TIDY=clang-tidy-19 \ -DCMAKE_CXX_FLAGS="--target=aarch64-linux-gnu --coverage" \ -DCMAKE_EXE_LINKER_FLAGS="--rtlib=compiler-rt -static -fuse-ld=lld" \ -DKLEIDICV_LIMIT_SME2_TO_SELECTED_ALGORITHMS=OFF \ diff --git a/scripts/format.sh b/scripts/format.sh index 9e19c150c1b3fc8229ba8461fb62155620bcac6b..121a43ca2e170b55ca7f738e71c0ef0f480ca44b 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -8,7 +8,7 @@ # # Options: # CHECK_ONLY: If set to 'ON', the script exists with non-zero value if source is not formatted. Defaults to 'OFF'. -# CLANG_FORMAT_BIN_PATH: Clang-format binary, defaults to 'clang-format=17'. +# CLANG_FORMAT_BIN_PATH: Clang-format binary, defaults to 'clang-format=19'. # VERBOSE: If set to 'ON', verbose output is printed. Defaults to 'OFF'. # ------------------------------------------------------------------------------ @@ -23,7 +23,7 @@ SCRIPT_PATH="$(realpath "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")" KLEIDICV_ROOT_PATH="$(realpath "${SCRIPT_PATH}"/..)" : "${CHECK_ONLY:=OFF}" -: "${CLANG_FORMAT_BIN_PATH:=clang-format-17}" +: "${CLANG_FORMAT_BIN_PATH:=clang-format-19}" : "${VERBOSE:=OFF}" # ------------------------------------------------------------------------------ diff --git a/scripts/run_opencv_conformity_checks.sh b/scripts/run_opencv_conformity_checks.sh index c51224bb81cd80feb6cf66d0054750136aed6a13..a4d9625ae889f6997a431ba838111cba7f2cbdd6 100755 --- a/scripts/run_opencv_conformity_checks.sh +++ b/scripts/run_opencv_conformity_checks.sh @@ -27,6 +27,38 @@ common_cmake_args=( -S "${SOURCE_PATH}" -G Ninja "-DBUILD_SHARED_LIBS=OFF" + "-DBUILD_TESTS=ON" + "-DBUILD_PERF_TESTS=OFF" + "-DBUILD_LIST=imgproc,core,ts" + + "-DCV_TRACE=OFF" + "-DBUILD_EXAMPLES=OFF" + "-DBUILD_opencv_apps=OFF" + "-DBUILD_ANDROID_EXAMPLES=OFF" + "-DBUILD_ANDROID_PROJECTS=OFF" + "-DBUILD_JAVA=OFF" + "-DWITH_QT=OFF" + "-DBUILD_OPENCV_PYTHON=NO" + "-DBUILD_OPENCV_PYTHON2=NO" + "-DBUILD_OPENCV_PYTHON3=NO" + "-DWITH_VTK=OFF" + "-DWITH_JASPER=OFF" + "-DWITH_OPENJPEG=OFF" + "-DWITH_JPEG=OFF" + "-DWITH_WEBP=OFF" + "-DWITH_PNG=OFF" + "-DWITH_TIFF=OFF" + "-DWITH_V4L=OFF" + "-DWITH_OPENCL=OFF" + "-DWITH_FLATBUFFERS=OFF" + "-DWITH_PROTOBUF=OFF" + "-DWITH_IMGCODEC_HDR=OFF" + "-DWITH_IMGCODEC_SUNRASTER=OFF" + "-DWITH_IMGCODEC_PXM=OFF" + "-DWITH_IMGCODEC_PFM=OFF" + "-DWITH_ADE=OFF" + "-DWITH_LAPACK=OFF" + "-DOPENCV_PYTHON_SKIP_DETECTION=ON" ) if [[ -n "${OPENCV_VERSION}" ]]; then diff --git a/test/api/test_exp.cpp b/test/api/test_exp.cpp index 0b87c7aba4ce04024ee1369d2ee0421524154229..33fa48953d9ace65ab98cbd0a5481da0a13adb21 100644 --- a/test/api/test_exp.cpp +++ b/test/api/test_exp.cpp @@ -198,7 +198,7 @@ class ExpTestAll final : public ExpTestCustomBase { float last_value_; float value_; }; // end of class LinearFloatGenerator -}; // end of class ExpTestAll +}; // end of class ExpTestAll template class Exp : public testing::Test {};