Windows: Add ARM64 support

* Only works on machines with a Qualcomm Snapdragon 8cx Gen3 or above.
  Older generation devices are not and will not be supported due to
  some driver issues
* Requires VS2022 for building.
* Uses new MSVC preprocessor for sse2neon compatibility.
* SIMD is not enabled, waiting on conversion of blenlib to C++.

Ref #119126

Pull Request: https://projects.blender.org/blender/blender/pulls/117036
This commit is contained in:
Anthony Roberts
2024-03-06 15:46:43 +01:00
committed by Brecht Van Lommel
parent 3d5fa7698f
commit 445fd42c61
32 changed files with 233 additions and 53 deletions
+12 -7
View File
@@ -87,12 +87,17 @@ endif()
if(NOT APPLE)
set(WITH_XR_OPENXR ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_DEVICE_OPTIX ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_CUDA_BINARIES ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_HIP_BINARIES ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_DEVICE_ONEAPI ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_ONEAPI_BINARIES ON CACHE BOOL "" FORCE)
# Can't use CMAKE_SYSTEM_PROCESSOR here as it's not set yet,
# so fall back to checking the env for vcvarsall's VSCMD_ARG_TGT_ARCH
if(NOT (WIN32 AND "$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64"))
set(WITH_CYCLES_DEVICE_OPTIX ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_CUDA_BINARIES ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_HIP_BINARIES ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_DEVICE_ONEAPI ON CACHE BOOL "" FORCE)
set(WITH_CYCLES_ONEAPI_BINARIES ON CACHE BOOL "" FORCE)
endif()
endif()
if(WIN32)
set(WITH_CYCLES_DEVICE_HIPRT ON CACHE BOOL "" FORCE)
if(WIN32 AND NOT (WIN32 AND "$ENV{VSCMD_ARG_TGT_ARCH}" STREQUAL "arm64"))
set(WITH_CYCLES_DEVICE_HIPRT ON CACHE BOOL "" FORCE)
endif()
@@ -257,7 +257,11 @@ set(PLATFORM_LINKFLAGS_RELEASE "${PLATFORM_LINKFLAGS} ${PDB_INFO_OVERRIDE_LINKER
string(APPEND CMAKE_STATIC_LINKER_FLAGS " /ignore:4221")
if(CMAKE_CL_64)
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:X64 ")
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:ARM64 ")
else()
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:X64 ")
endif()
else()
string(PREPEND PLATFORM_LINKFLAGS "/MACHINE:IX86 /LARGEADDRESSAWARE ")
endif()
@@ -266,7 +270,11 @@ if(NOT DEFINED LIBDIR)
# Setup 64bit and 64bit windows systems
if(CMAKE_CL_64)
message(STATUS "64 bit compiler detected.")
set(LIBDIR_BASE "windows_x64")
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
set(LIBDIR_BASE "windows_arm64")
else()
set(LIBDIR_BASE "windows_x64")
endif()
else()
message(FATAL_ERROR "32 bit compiler detected, blender no longer provides pre-build libraries for 32 bit windows, please set the LIBDIR cmake variable to your own library folder")
endif()
@@ -604,9 +612,15 @@ if(NOT WITH_WINDOWS_FIND_MODULES)
if(NOT BOOST_VERSION)
message(FATAL_ERROR "Unable to determine Boost version")
endif()
set(BOOST_POSTFIX "vc142-mt-x64-${BOOST_VERSION}")
set(BOOST_DEBUG_POSTFIX "vc142-mt-gyd-x64-${BOOST_VERSION}")
set(BOOST_PREFIX "")
if(CMAKE_SYSTEM_PROCESSOR MATCHES ARM64)
set(BOOST_POSTFIX "vc143-mt-a64-${BOOST_VERSION}")
set(BOOST_DEBUG_POSTFIX "vc143-mt-gyd-a64-${BOOST_VERSION}")
set(BOOST_PREFIX "")
else()
set(BOOST_POSTFIX "vc142-mt-x64-${BOOST_VERSION}")
set(BOOST_DEBUG_POSTFIX "vc142-mt-gyd-x64-${BOOST_VERSION}")
set(BOOST_PREFIX "")
endif()
endif()
if(WITH_BOOST)
@@ -625,8 +639,9 @@ if(WITH_BOOST)
if(NOT Boost_FOUND)
warn_hardcoded_paths(BOOST)
# This is file new in 3.4 if it does not exist, assume we are building against 3.3 libs
# Note, as ARM64 was introduced in 4.x, this check is not needed
set(BOOST_34_TRIGGER_FILE ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python${_PYTHON_VERSION_NO_DOTS}-${BOOST_DEBUG_POSTFIX}.lib)
if(NOT EXISTS ${BOOST_34_TRIGGER_FILE})
if (NOT EXISTS ${BOOST_34_TRIGGER_FILE})
set(BOOST_DEBUG_POSTFIX "vc142-mt-gd-x64-${BOOST_VERSION}")
set(BOOST_PREFIX "lib")
endif()
@@ -893,6 +908,15 @@ if(WITH_CODEC_SNDFILE)
endif()
endif()
if(WITH_CPU_SIMD AND SUPPORT_NEON_BUILD)
windows_find_package(sse2neon)
if(NOT SSE2NEON_FOUND)
set(SSE2NEON_ROOT_DIR ${LIBDIR}/sse2neon)
set(SSE2NEON_INCLUDE_DIRS ${LIBDIR}/sse2neon)
set(SSE2NEON_FOUND True)
endif()
endif()
if(WITH_CYCLES AND WITH_CYCLES_OSL)
set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation")
set(OSL_SHADER_DIR ${CYCLES_OSL}/shaders)
+5 -1
View File
@@ -1,4 +1,8 @@
set BUILD_VS_LIBDIR=lib/windows_x64
if "%BUILD_ARCH%" == "arm64" (
set BUILD_VS_LIBDIR=lib/windows_arm64
) else (
set BUILD_VS_LIBDIR=lib/windows_x64
)
if NOT "%verbose%" == "" (
echo Library Directory = "%BUILD_VS_LIBDIR%"
@@ -19,6 +19,11 @@ if "%WITH_PYDEBUG%"=="1" (
set PYDEBUG_CMAKE_ARGS=-DWINDOWS_PYTHON_DEBUG=On
)
if "%BUILD_ARCH%"=="arm64" (
set MSBUILD_PLATFORM=arm64
set BUILD_PLATFORM_SELECT=-A ARM64
)
set BUILD_CMAKE_ARGS=%BUILD_CMAKE_ARGS% -G "Visual Studio %BUILD_VS_VER% %BUILD_VS_YEAR%%BUILD_GENERATOR_POST%" %BUILD_PLATFORM_SELECT% %TESTS_CMAKE_ARGS% %CLANG_CMAKE_ARGS% %ASAN_CMAKE_ARGS% %PYDEBUG_CMAKE_ARGS%
if NOT EXIST %BUILD_DIR%\nul (
@@ -5,12 +5,18 @@ if "%BUILD_ARCH%"=="" (
) else if "%PROCESSOR_ARCHITEW6432%" == "AMD64" (
set WINDOWS_ARCH= Win64
set BUILD_ARCH=x64
) else if "%PROCESSOR_ARCHITECTURE%" == "ARM64" (
set WINDOWS_ARCH= arm64
set BUILD_ARCH=arm64
) else (
echo Error: 32 bit builds of blender are no longer supported.
goto ERR
)
) else if "%BUILD_ARCH%"=="x64" (
set WINDOWS_ARCH= Win64
) else if "%BUILD_ARCH%"=="arm64" (
set WINDOWS_ARCH= arm64
set BUILD_ARCH=arm64
)
:EOF
exit /b 0
+18
View File
@@ -23,6 +23,24 @@ if EXIST %PYTHON% (
goto detect_python_done
)
rem Additionally check for the ARM64 version
set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\310\bin\python.exe
if EXIST %PYTHON% (
goto detect_python_done
)
set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\311\bin\python.exe
if EXIST %PYTHON% (
goto detect_python_done
)
set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\312\bin\python.exe
if EXIST %PYTHON% (
goto detect_python_done
)
set PYTHON=%BLENDER_DIR%\lib\windows_arm64\python\39\bin\python.exe
if EXIST %PYTHON% (
goto detect_python_done
)
if NOT EXIST %PYTHON% (
if EXIST %BLENDER_DIR%\lib\windows_x64\.git (
echo Warning: Python not found, there is likely an issue with the library folder
+5
View File
@@ -3,6 +3,11 @@ if EXIST %BLENDER_DIR%\lib\windows_x64\llvm\bin\clang-format.exe (
goto detect_done
)
if EXIST %BLENDER_DIR%\lib\windows_arm64\llvm\bin\clang-format.exe (
set CF_PATH=lib\windows_arm64\llvm\bin
goto detect_done
)
echo clang-format not found
exit /b 1
+2
View File
@@ -50,6 +50,8 @@ if NOT "%1" == "" (
goto ERR
) else if "%1" == "x64" (
set BUILD_ARCH=x64
) else if "%1" == "arm64" (
set BUILD_ARCH=arm64
) else if "%1" == "2019" (
set BUILD_VS_YEAR=2019
) else if "%1" == "2019pre" (
+5 -1
View File
@@ -9,7 +9,11 @@ cd "%BLENDER_DIR%/scripts/addons"
for /f "delims=" %%i in ('"%GIT%" rev-parse --abbrev-ref HEAD') do echo Addons_Branch_name=%%i
for /f "delims=" %%i in ('"%GIT%" rev-parse HEAD') do echo Addons_Branch_hash=%%i
cd "%BLENDER_DIR%/lib/windows_x64"
if "%BUILD_ARCH%" == "arm64" (
cd "%BLENDER_DIR%/lib/windows_arm64"
) else (
cd "%BLENDER_DIR%/lib/windows_x64"
)
for /f "delims=" %%i in ('"%GIT%" rev-parse --abbrev-ref HEAD') do echo Libs_Branch_name=%%i
for /f "delims=" %%i in ('"%GIT%" rev-parse HEAD') do echo Libs_Branch_hash=%%i