Browse Source

[Windows/ARM64] Fix raycast/embree ARM64 build with LLVM/MinGW.

bruvzg 1 year ago
parent
commit
04d70c11fc

+ 1 - 1
modules/raycast/config.py

@@ -1,6 +1,6 @@
 def can_build(env, platform):
     # Supported architectures and platforms depend on the Embree library.
-    if env["arch"] == "arm64" and platform == "windows":
+    if env["arch"] == "arm64" and platform == "windows" and env.msvc:
         return False
     if env["arch"] in ["x86_64", "arm64", "wasm32"]:
         return True

+ 1 - 0
platform/windows/detect.py

@@ -678,6 +678,7 @@ def configure_mingw(env: "SConsEnvironment"):
         env["CXX"] = mingw_bin_prefix + "clang++"
         if try_cmd("as --version", env["mingw_prefix"], env["arch"]):
             env["AS"] = mingw_bin_prefix + "as"
+            env.Append(ASFLAGS=["-c"])
         if try_cmd("ar --version", env["mingw_prefix"], env["arch"]):
             env["AR"] = mingw_bin_prefix + "ar"
         if try_cmd("ranlib --version", env["mingw_prefix"], env["arch"]):

+ 17 - 1
thirdparty/embree/common/simd/arm/sse2neon.h

@@ -102,7 +102,9 @@
 #include <stdint.h>
 #include <stdlib.h>
 
-#if defined(_WIN32)
+// -- GODOT start --
+#if defined(_WIN32) && !defined(__MINGW32__)
+// -- GODOT end --
 /* Definitions for _mm_{malloc,free} are provided by <malloc.h>
  * from both MinGW-w64 and MSVC.
  */
@@ -1888,7 +1890,13 @@ FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b)
 #if !defined(SSE2NEON_ALLOC_DEFINED)
 FORCE_INLINE void _mm_free(void *addr)
 {
+// -- GODOT start --
+#if defined(_WIN32)
+    _aligned_free(addr);
+#else
     free(addr);
+#endif
+// -- GODOT end --
 }
 #endif
 
@@ -2080,8 +2088,16 @@ FORCE_INLINE void *_mm_malloc(size_t size, size_t align)
         return malloc(size);
     if (align == 2 || (sizeof(void *) == 8 && align == 4))
         align = sizeof(void *);
+// -- GODOT start --
+#if defined(_WIN32)
+    ptr = _aligned_malloc(size, align);
+    if (ptr)
+        return ptr;
+#else
     if (!posix_memalign(&ptr, align, size))
         return ptr;
+#endif
+// -- GODOT end --
     return NULL;
 }
 #endif

+ 46 - 0
thirdparty/embree/patches/mingw-llvm-arm64.diff

@@ -0,0 +1,46 @@
+diff --git a/thirdparty/embree/common/simd/arm/sse2neon.h b/thirdparty/embree/common/simd/arm/sse2neon.h
+index b18d41e783..c54d0b7951 100644
+--- a/thirdparty/embree/common/simd/arm/sse2neon.h
++++ b/thirdparty/embree/common/simd/arm/sse2neon.h
+@@ -102,7 +102,9 @@
+ #include <stdint.h>
+ #include <stdlib.h>
+ 
+-#if defined(_WIN32)
++// -- GODOT start --
++#if defined(_WIN32) && !defined(__MINGW32__)
++// -- GODOT end --
+ /* Definitions for _mm_{malloc,free} are provided by <malloc.h>
+  * from both MinGW-w64 and MSVC.
+  */
+@@ -2080,8 +2082,16 @@ FORCE_INLINE void *_mm_malloc(size_t size, size_t align)
+         return malloc(size);
+     if (align == 2 || (sizeof(void *) == 8 && align == 4))
+         align = sizeof(void *);
+-    if (!posix_memalign(&ptr, align, size))
++// -- GODOT start --
++#if defined(_WIN32)
++    ptr = _aligned_malloc(size, align);
++    if (ptr)
+         return ptr;
++#else
++    if (!posix_memalign(&ptr, align, size))
++        return ptr;
++#endif
++// -- GODOT end --
+     return NULL;
+ }
+ #endif
+@@ -1890,7 +1890,13 @@ FORCE_INLINE __m128 _mm_div_ss(__m128 a, __m128 b)
+ #if !defined(SSE2NEON_ALLOC_DEFINED)
+ FORCE_INLINE void _mm_free(void *addr)
+ {
++// -- GODOT start --
++#if defined(_WIN32)
++    _aligned_free(addr);
++#else
+     free(addr);
++#endif
++// -- GODOT end --
+ }
+ #endif