Merge pull request #93364 from bruvzg/mingw-llvm-arm64

[Windows/ARM64] Fix raycast/embree ARM64 build with LLVM/MinGW.
This commit is contained in:
Rémi Verschelde 2024-06-20 16:18:40 +02:00
commit 6fec188fc2
No known key found for this signature in database
GPG Key ID: C3336907360768E1
4 changed files with 65 additions and 2 deletions

View File

@ -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

View File

@ -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"]):

View File

@ -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

View File

@ -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