From 92825ba76a975d105d5a0b6916617b87fe281cee Mon Sep 17 00:00:00 2001 From: Corentin MUNOZ Date: Tue, 1 Jul 2025 10:53:10 +0200 Subject: [PATCH] Build: compile with simd extensions --- CMakeLists.vtk.txt | 84 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/CMakeLists.vtk.txt b/CMakeLists.vtk.txt index 4614cf99..9d0e95ab 100644 --- a/CMakeLists.vtk.txt +++ b/CMakeLists.vtk.txt @@ -50,8 +50,7 @@ set(sources jaricom.c jcarith.c - jdarith.c - jsimd_none.c) + jdarith.c) include(CheckSymbolExists) check_symbol_exists("memset" "string.h" HAVE_MEMSET) @@ -90,6 +89,70 @@ else () set(JPEG_SHARED_LIBS 0) endif () +# Macro from libjpeg-turbo +macro(boolean_number var) + if(${var}) + set(${var} 1 ${ARGN}) + else() + set(${var} 0 ${ARGN}) + endif() +endmacro() + +# Check from libjpeg-turbo +# Detect CPU type and whether we're building 64-bit or 32-bit code +math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8") +string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LC) +if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR + CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR + CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR + CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR + CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32") + if(BITS EQUAL 64 OR CMAKE_C_COMPILER_ABI MATCHES "ELF X32") + set(CPU_TYPE x86_64) + else() + set(CPU_TYPE i386) + endif() + if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ${CPU_TYPE}) + set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE}) + endif() +elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR + CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^arm") + if(BITS EQUAL 64) + set(CPU_TYPE arm64) + else() + set(CPU_TYPE arm) + endif() +else() + set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC}) +endif() +if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR + CMAKE_OSX_ARCHITECTURES MATCHES "arm64" OR + CMAKE_OSX_ARCHITECTURES MATCHES "i386") + set(CPU_TYPE ${CMAKE_OSX_ARCHITECTURES}) +endif() +if(MSVC_IDE AND CMAKE_GENERATOR_PLATFORM MATCHES "arm64") + set(CPU_TYPE arm64) +endif() + +option(VTK_JPEG_ENABLE_SIMD "Enables SIMD extensions when compiling libjpeg-turbo" OFF) +mark_as_advanced(VTK_JPEG_ENABLE_SIMD) +if (VTK_JPEG_ENABLE_SIMD AND NOT EMSCRIPTEN) + set(WITH_SIMD 1) + # Force full ARM Neon instrinsics + if (CPU_TYPE MATCHES "arm") + set(NEON_INTRINSICS ON) + endif () + # WITH_SIMD will be set to 0 if SIMD configuration failed + add_subdirectory(simd) + if(NOT WITH_SIMD) + message(FATAL_ERROR "VTK_JPEG_ENABLE_SIMD=ON but SIMD compilation is not available") + endif() +else() + list(APPEND sources + jsimd_none.c + ) +endif() + configure_file( "${CMAKE_CURRENT_SOURCE_DIR}${header_input_dir}/jconfig.h.in" "${CMAKE_CURRENT_BINARY_DIR}/jconfig.h") @@ -125,3 +188,20 @@ vtk_module_add_module(VTK::jpeg target_include_directories(jpeg PUBLIC "$") + +if(WITH_SIMD) + target_include_directories(simd PRIVATE "$") + # XXX(cmake-3.26): `BUILD_LOCAL_INTERFACE` genex. + if (CMAKE_VERSION VERSION_LESS "3.26") + # Avoid needing to export the `simd` target. Only works as long as + # `simd` is "just" an `OBJECT` library and doesn't have other usage + # requirements. + target_sources(jpeg PRIVATE "$") + else () + # No need to export the target at all. + target_link_libraries(jpeg PRIVATE "$") + endif () + if(WIN32) + target_compile_definitions(simd PRIVATE jpeg_EXPORTS=1) + endif() +endif() -- GitLab