From: Tatsuro Shibamura Date: Mon, 16 Dec 2019 21:23:30 +0000 (+0900) Subject: Merge pull request #16027 from shibayan:arm64-windows10 X-Git-Tag: accepted/tizen/6.0/unified/20201030.111113~1^2~11^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=971ae00942329f71a6b76fe24278c39c51301eee;p=platform%2Fupstream%2Fopencv.git Merge pull request #16027 from shibayan:arm64-windows10 * Support ARM64 Windows 10 platform * Fixed detection issue for ARM64 Windows 10 * Try enabling ARM NEON intrin * build: disable NEON with MSVC compiler * samples(directx): gdi32 dependency --- diff --git a/3rdparty/openexr/IlmImf/ImfSimd.h b/3rdparty/openexr/IlmImf/ImfSimd.h index 3489bd0..908fe0e 100644 --- a/3rdparty/openexr/IlmImf/ImfSimd.h +++ b/3rdparty/openexr/IlmImf/ImfSimd.h @@ -45,7 +45,7 @@ // GCC and Visual Studio SSE2 compiler flags -#if defined __SSE2__ || (_MSC_VER >= 1300 && !_M_CEE_PURE) +#if defined __SSE2__ || (defined(_M_X64) || _M_IX86_FP == 2) #define IMF_HAVE_SSE2 1 #endif diff --git a/cmake/checks/cpu_neon.cpp b/cmake/checks/cpu_neon.cpp index dda6e08..c309e85 100644 --- a/cmake/checks/cpu_neon.cpp +++ b/cmake/checks/cpu_neon.cpp @@ -1,6 +1,6 @@ #include -#if defined _WIN32 && defined(_M_ARM) +#if defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) # include # include # define CV_NEON 1 @@ -9,6 +9,10 @@ # define CV_NEON 1 #endif +// MSVC 2019 bug. Details: https://github.com/opencv/opencv/pull/16027 +void test_aliased_type(const uint8x16_t& a) { } +void test_aliased_type(const int8x16_t& a) { } + #if defined CV_NEON int test() { diff --git a/modules/core/include/opencv2/core/cv_cpu_dispatch.h b/modules/core/include/opencv2/core/cv_cpu_dispatch.h index 8e5ce35..42651ae 100644 --- a/modules/core/include/opencv2/core/cv_cpu_dispatch.h +++ b/modules/core/include/opencv2/core/cv_cpu_dispatch.h @@ -72,7 +72,7 @@ # define CV_AVX 1 #endif #ifdef CV_CPU_COMPILE_FP16 -# if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) +# if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM) || defined(_M_ARM64) # include # else # include @@ -133,7 +133,7 @@ # define CV_FMA3 1 #endif -#if defined _WIN32 && defined(_M_ARM) +#if defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) && (defined(CV_CPU_COMPILE_NEON) || !defined(_MSC_VER)) # include # include # define CV_NEON 1 @@ -201,7 +201,7 @@ struct VZeroUpperGuard { # define CV_MMX 1 # define CV_SSE 1 # define CV_SSE2 1 -#elif defined _WIN32 && defined(_M_ARM) +#elif defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) && (defined(CV_CPU_COMPILE_NEON) || !defined(_MSC_VER)) # include # include # define CV_NEON 1 diff --git a/modules/core/include/opencv2/core/fast_math.hpp b/modules/core/include/opencv2/core/fast_math.hpp index 0fbb280..0f53cf5 100644 --- a/modules/core/include/opencv2/core/fast_math.hpp +++ b/modules/core/include/opencv2/core/fast_math.hpp @@ -289,7 +289,7 @@ CV_INLINE int cvIsInf( double value ) { #if defined CV_INLINE_ISINF_DBL CV_INLINE_ISINF_DBL(value); -#elif defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__) || defined(__PPC64__) +#elif defined(__x86_64__) || defined(_M_X64) || defined(__aarch64__) || defined(_M_ARM64) || defined(__PPC64__) Cv64suf ieee754; ieee754.f = value; return (ieee754.u & 0x7fffffff00000000) == diff --git a/modules/core/include/opencv2/core/hal/intrin.hpp b/modules/core/include/opencv2/core/hal/intrin.hpp index ae3bac1..5a105a7 100644 --- a/modules/core/include/opencv2/core/hal/intrin.hpp +++ b/modules/core/include/opencv2/core/hal/intrin.hpp @@ -58,7 +58,7 @@ namespace { inline unsigned int trailingZeros32(unsigned int value) { #if defined(_MSC_VER) -#if (_MSC_VER < 1700) || defined(_M_ARM) +#if (_MSC_VER < 1700) || defined(_M_ARM) || defined(_M_ARM64) unsigned long index = 0; _BitScanForward(&index, value); return (unsigned int)index; diff --git a/modules/core/include/opencv2/core/hal/intrin_neon.hpp b/modules/core/include/opencv2/core/hal/intrin_neon.hpp index 4da389f..7411b28 100644 --- a/modules/core/include/opencv2/core/hal/intrin_neon.hpp +++ b/modules/core/include/opencv2/core/hal/intrin_neon.hpp @@ -56,7 +56,7 @@ namespace cv CV_CPU_OPTIMIZATION_HAL_NAMESPACE_BEGIN #define CV_SIMD128 1 -#if defined(__aarch64__) +#if defined(__aarch64__) || defined(_M_ARM64) #define CV_SIMD128_64F 1 #else #define CV_SIMD128_64F 0 @@ -1531,7 +1531,7 @@ inline v_int32x4 v_load_expand_q(const schar* ptr) return v_int32x4(vmovl_s16(v1)); } -#if defined(__aarch64__) +#if defined(__aarch64__) || defined(_M_ARM64) #define OPENCV_HAL_IMPL_NEON_UNPACKS(_Tpvec, suffix) \ inline void v_zip(const v_##_Tpvec& a0, const v_##_Tpvec& a1, v_##_Tpvec& b0, v_##_Tpvec& b1) \ { \ diff --git a/modules/core/src/matmul.simd.hpp b/modules/core/src/matmul.simd.hpp index 1360ed4..5c60d30 100644 --- a/modules/core/src/matmul.simd.hpp +++ b/modules/core/src/matmul.simd.hpp @@ -1537,7 +1537,7 @@ transform_8u( const uchar* src, uchar* dst, const float* m, int len, int scn, in static void transform_16u( const ushort* src, ushort* dst, const float* m, int len, int scn, int dcn ) { -#if CV_SIMD && !defined(__aarch64__) +#if CV_SIMD && !defined(__aarch64__) && !defined(_M_ARM64) if( scn == 3 && dcn == 3 ) { int x = 0; @@ -1606,7 +1606,7 @@ transform_16u( const ushort* src, ushort* dst, const float* m, int len, int scn, static void transform_32f( const float* src, float* dst, const float* m, int len, int scn, int dcn ) { -#if CV_SIMD && !defined(__aarch64__) +#if CV_SIMD && !defined(__aarch64__) && !defined(_M_ARM64) int x = 0; if( scn == 3 && dcn == 3 ) { diff --git a/modules/core/src/parallel.cpp b/modules/core/src/parallel.cpp index 70b26ff..9dd8648 100644 --- a/modules/core/src/parallel.cpp +++ b/modules/core/src/parallel.cpp @@ -783,7 +783,7 @@ int cv::getNumberOfCPUs(void) { #if defined _WIN32 SYSTEM_INFO sysinfo; -#if (defined(_M_ARM) || defined(_M_X64) || defined(WINRT)) && _WIN32_WINNT >= 0x501 +#if (defined(_M_ARM) || defined(_M_ARM64) || defined(_M_X64) || defined(WINRT)) && _WIN32_WINNT >= 0x501 GetNativeSystemInfo( &sysinfo ); #else GetSystemInfo( &sysinfo ); diff --git a/modules/flann/include/opencv2/flann/dist.h b/modules/flann/include/opencv2/flann/dist.h index fe19bb0..07a1cc2 100644 --- a/modules/flann/include/opencv2/flann/dist.h +++ b/modules/flann/include/opencv2/flann/dist.h @@ -45,7 +45,7 @@ typedef unsigned __int64 uint64_t; #include "defines.h" -#if defined _WIN32 && defined(_M_ARM) +#if defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64)) # include #endif diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index e02c55d..bd7c898 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -118,6 +118,9 @@ elseif(WINRT) endif() elseif(HAVE_WIN32UI) list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_w32.cpp) + if(OpenCV_ARCH STREQUAL "ARM64") + list(APPEND HIGHGUI_LIBRARIES "comdlg32" "advapi32") + endif() elseif(HAVE_GTK OR HAVE_GTK3) list(APPEND highgui_srcs ${CMAKE_CURRENT_LIST_DIR}/src/window_gtk.cpp) elseif(HAVE_CARBON) diff --git a/modules/highgui/src/window_w32.cpp b/modules/highgui/src/window_w32.cpp index 2efee3c..46f580d 100644 --- a/modules/highgui/src/window_w32.cpp +++ b/modules/highgui/src/window_w32.cpp @@ -75,7 +75,7 @@ using namespace cv; static const char* trackbar_text = " "; -#if defined _M_X64 || defined __x86_64 +#if defined _M_X64 || defined __x86_64 || defined _M_ARM64 #define icvGetWindowLongPtr GetWindowLongPtr #define icvSetWindowLongPtr( hwnd, id, ptr ) SetWindowLongPtr( hwnd, id, (LONG_PTR)(ptr) ) diff --git a/modules/ts/include/opencv2/ts/ts_ext.hpp b/modules/ts/include/opencv2/ts/ts_ext.hpp index f920673..f22a9d4 100644 --- a/modules/ts/include/opencv2/ts/ts_ext.hpp +++ b/modules/ts/include/opencv2/ts/ts_ext.hpp @@ -94,7 +94,7 @@ bool checkBigDataTests(); } \ // Special type of tests which require / use or validate processing of huge amount of data (>= 2Gb) -#if defined(_M_X64) || defined(__x86_64__) || defined(__aarch64__) +#if defined(_M_X64) || defined(_M_ARM64) || defined(__x86_64__) || defined(__aarch64__) #define BIGDATA_TEST(test_case_name, test_name) TEST_(BigData_ ## test_case_name, test_name, ::testing::Test, Body, CV__TEST_BIGDATA_BODY_IMPL) #else #define BIGDATA_TEST(test_case_name, test_name) TEST_(BigData_ ## test_case_name, DISABLED_ ## test_name, ::testing::Test, Body, CV__TEST_BIGDATA_BODY_IMPL) diff --git a/samples/directx/CMakeLists.txt b/samples/directx/CMakeLists.txt index c1d4c5d..3041e27 100644 --- a/samples/directx/CMakeLists.txt +++ b/samples/directx/CMakeLists.txt @@ -18,4 +18,5 @@ file(GLOB all_samples RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.cpp) foreach(sample_filename ${all_samples}) ocv_define_sample(tgt ${sample_filename} directx) ocv_target_link_libraries(${tgt} PRIVATE ${OPENCV_LINKER_LIBS} ${OPENCV_DIRECTX_SAMPLES_REQUIRED_DEPS}) + ocv_target_link_libraries(${tgt} PRIVATE "gdi32") endforeach()