Merge pull request #16027 from shibayan:arm64-windows10
authorTatsuro Shibamura <me@shibayan.jp>
Mon, 16 Dec 2019 21:23:30 +0000 (06:23 +0900)
committerAlexander Alekhin <alexander.a.alekhin@gmail.com>
Mon, 16 Dec 2019 21:23:30 +0000 (00:23 +0300)
* 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

13 files changed:
3rdparty/openexr/IlmImf/ImfSimd.h
cmake/checks/cpu_neon.cpp
modules/core/include/opencv2/core/cv_cpu_dispatch.h
modules/core/include/opencv2/core/fast_math.hpp
modules/core/include/opencv2/core/hal/intrin.hpp
modules/core/include/opencv2/core/hal/intrin_neon.hpp
modules/core/src/matmul.simd.hpp
modules/core/src/parallel.cpp
modules/flann/include/opencv2/flann/dist.h
modules/highgui/CMakeLists.txt
modules/highgui/src/window_w32.cpp
modules/ts/include/opencv2/ts/ts_ext.hpp
samples/directx/CMakeLists.txt

index 3489bd0..908fe0e 100644 (file)
@@ -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
 
index dda6e08..c309e85 100644 (file)
@@ -1,6 +1,6 @@
 #include <stdio.h>
 
-#if defined _WIN32 && defined(_M_ARM)
+#if defined _WIN32 && (defined(_M_ARM) || defined(_M_ARM64))
 # include <Intrin.h>
 # include <arm_neon.h>
 # 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()
 {
index 8e5ce35..42651ae 100644 (file)
@@ -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 <arm_neon.h>
 #  else
 #    include <immintrin.h>
 #  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 <Intrin.h>
 # include <arm_neon.h>
 # 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 <Intrin.h>
 # include <arm_neon.h>
 # define CV_NEON 1
index 0fbb280..0f53cf5 100644 (file)
@@ -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) ==
index ae3bac1..5a105a7 100644 (file)
@@ -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;
index 4da389f..7411b28 100644 (file)
@@ -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) \
 { \
index 1360ed4..5c60d30 100644 (file)
@@ -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 )
     {
index 70b26ff..9dd8648 100644 (file)
@@ -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 );
index fe19bb0..07a1cc2 100644 (file)
@@ -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 <Intrin.h>
 #endif
 
index e02c55d..bd7c898 100644 (file)
@@ -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)
index 2efee3c..46f580d 100644 (file)
@@ -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) )
index f920673..f22a9d4 100644 (file)
@@ -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)
index c1d4c5d..3041e27 100644 (file)
@@ -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()