diff --git a/build-aux/share/portproton/scripts/functions_helper b/build-aux/share/portproton/scripts/functions_helper index b46d6389..294bacf6 100755 --- a/build-aux/share/portproton/scripts/functions_helper +++ b/build-aux/share/portproton/scripts/functions_helper @@ -615,6 +615,20 @@ check_wayland_session () { } export -f check_wayland_session +check_arm () { + if [[ -n "$ARM_IN_USE" ]] + then [[ "$ARM_IN_USE" == 1 ]] && return 0 || return 1 + fi + if [[ "$(uname -m)" =~ ^(aarch64|arm64)$ ]] ; then + export ARM_IN_USE=1 + return 0 + else + export ARM_IN_USE=0 + return 1 + fi +} +export -f check_arm + check_flatpak () { if [[ -n "$FLATPAK_IN_USE" ]] then [[ "$FLATPAK_IN_USE" == 1 ]] && return 0 || return 1 @@ -1140,7 +1154,12 @@ init_wine_ver () { export WINEDIR="${WINEDIR}/files" fi - if [[ "$PW_USE_WOW64" == "1" ]] \ + if [[ -d "${WINEDIR}/bin-arm64" ]] + then + export WINE="${WINEDIR}/bin-arm64/wine" + export WINELOADER="${WINEDIR}/bin-arm64/wine" + export WINESERVER="${WINEDIR}/bin-arm64/wineserver" + elif [[ "$PW_USE_WOW64" == "1" ]] \ && [[ -d "${WINEDIR}/bin-wow64" ]] then print_warning "wine wow64 mode in use!" @@ -1186,7 +1205,9 @@ init_wine_ver () { if ! check_flatpak ; then WINE_LIBRARY_PATH="${WINEDIR}/lib" - if [[ -d "${WINEDIR}/lib64/gstreamer-1.0" ]] + if [[ -d "${WINEDIR}/lib/aarch64-linux-gnu" ]] + then WINE_LIBRARY_PATH+=":${WINEDIR}/lib/aarch64-linux-gnu:${WINEDIR}/lib/x86_64-linux-gnu:${WINEDIR}/lib/i386-linux-gnu" + elif [[ -d "${WINEDIR}/lib64/gstreamer-1.0" ]] then WINE_LIBRARY_PATH+=":${WINEDIR}/lib64" elif [[ -d "${WINEDIR}/lib/x86_64-linux-gnu" ]] then WINE_LIBRARY_PATH+=":${WINEDIR}/lib/x86_64-linux-gnu:${WINEDIR}/lib/i386-linux-gnu" @@ -1199,10 +1220,19 @@ init_wine_ver () { if [[ -d "${WINEDIR}"/share/espeak-ng-data ]] ; then export ESPEAK_DATA_PATH="${WINEDIR}"/share/ fi + if [[ -f "${WINEDIR}/share/fex-emu/Config.json" ]] \ + && [[ -f "${WINEDIR}/lib/wine/aarch64-unix/libwow64fex.so" ]] + then + export FEX_APP_CONFIG="${FEX_APP_CONFIG:-${WINEDIR}/share/fex-emu/Config.json}" + export FEX_APP_CONFIG_LOCATION="${FEX_APP_CONFIG_LOCATION:-${WINEDIR}/share/fex-emu}" + fi return 0 } pw_init_runtime () { + if check_arm ; then + export PW_USE_RUNTIME="0" + fi if [[ ! -f "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \ || [[ ! -f "${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-wrap" ]] then @@ -1211,7 +1241,11 @@ pw_init_runtime () { if [[ "$PW_USE_RUNTIME" != "1" ]] \ || [[ "$PW_WINE_USE" == "USE_SYSTEM_WINE" ]] then - export PW_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib32" + if check_arm ; then + export PW_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}" + else + export PW_LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:${PW_PLUGINS_PATH}/portable/lib/lib64:${PW_PLUGINS_PATH}/portable/lib/lib32" + fi export PW_VK_LAYER_PATH="${PW_PLUGINS_PATH}/portable/share/vulkan/implicit_layer.d" if [[ -z "$PW_TERM" ]] ; then export PW_TERM="env LD_LIBRARY_PATH=\"${PW_LD_LIBRARY_PATH}\" ${PORTPROTONQT_PYTHON:-python3} -m portprotonqt.scripts_utils.easyterm -e" @@ -1244,7 +1278,13 @@ ${nvidia_lib32_path}" PW_PV_OVERRIDES="/usr/lib/pressure-vessel/overrides/lib" if ! check_flatpak; then - export PW_LD_LIBRARY_PATH="\ + if check_arm ; then + export PW_LD_LIBRARY_PATH="\ +${PW_PV_OVERRIDES}/aarch64-linux-gnu/aliases:\ +/overrides/lib/aarch64-linux-gnu:\ +/lib/aarch64-linux-gnu" + else + export PW_LD_LIBRARY_PATH="\ ${PW_PLUGINS_PATH}/portable/lib/lib64:\ ${PW_PLUGINS_PATH}/portable/lib/lib32:\ ${PW_PV_OVERRIDES}/x86_64-linux-gnu/aliases:\ @@ -1253,6 +1293,7 @@ ${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ /overrides/lib/i386-linux-gnu:\ /lib/x86_64-linux-gnu:\ /lib/i386-linux-gnu" + fi fi export PW_PATH="${PW_PLUGINS_PATH}/portable/bin${PATH:+:$PATH}" @@ -1295,7 +1336,11 @@ ${PW_PV_OVERRIDES}/i386-linux-gnu/aliases:\ export PRESSURE_VESSEL_RUNTIME_BASE="${PW_WINELIB}" export PRESSURE_VESSEL_VARIABLE_DIR="${PW_WINELIB}/var" export PRESSURE_VESSEL_PREFIX="${PW_WINELIB}/pressure-vessel" - export PRESSURE_VESSEL_ARCHITECTURES="x86_64-linux-gnu:i386-linux-gnu" + if check_arm ; then + export PRESSURE_VESSEL_ARCHITECTURES="aarch64-linux-gnu" + else + export PRESSURE_VESSEL_ARCHITECTURES="x86_64-linux-gnu:i386-linux-gnu" + fi export FONTCONFIG_PATH='' unset PRESSURE_VESSEL_FILESYSTEMS_RO PRESSURE_VESSEL_FILESYSTEMS_RW @@ -1651,13 +1696,18 @@ pw_check_and_download_runtime () { } pw_check_and_download_dxvk_and_vkd3d () { + if check_arm ; then + # ARM64 Wine runners provide compatible DXVK and VKD3D builds. + # Build ARM64 dxvk using cross-compiler + export PW_USE_SUPPLIED_DXVK_VKD3D="1" + return 0 + fi case "${PW_VULKAN_USE}" in 1) DXVK_VAR_VER="${DXVK_SAREK_VER}"; VKD3D_VAR_VER="${VKD3D_SAREK_VER}" ;; 2) DXVK_VAR_VER="${DXVK_OLD_VER}"; VKD3D_VAR_VER="${VKD3D_OLD_VER}" ;; 6) DXVK_VAR_VER="${DXVK_NEW_VER}"; VKD3D_VAR_VER="${VKD3D_NEW_VER}" ;; *) DXVK_VAR_VER=""; VKD3D_VAR_VER="" ;; esac - # Download DXVK if [[ -n "${DXVK_VAR_VER}" ]] ; then if [[ ! -d "${PW_VULKAN_DIR}/dxvk-${DXVK_VAR_VER}" ]] ; then @@ -1746,6 +1796,10 @@ pw_check_and_download_dxvk_and_vkd3d () { } pw_check_and_download_plugins () { + if check_arm ; then + # ARM64 plugins archive needs an architecture-specific rebuild. + return 0 + fi if [[ ! -f "${PW_PLUGINS_PATH}/portable/lib/lib64/libvkbasalt.so" ]] ; then print_info "Download and install plugins${PW_PLUGINS_VER}..." if try_download "github.com/Castro-Fidel/wine_builds/releases/download/plugins${PW_PLUGINS_VER}/plugins${PW_PLUGINS_VER}.tar.xz" "${PORT_WINE_TMP_PATH}/plugins${PW_PLUGINS_VER}.tar.xz" ; then @@ -2647,7 +2701,10 @@ pw_enable_gamemode_basic () { start_portproton () { pw_check_and_download_plugins - if [[ "${PW_DISABLE_RUNTIME_DOWNLOAD}" == "1" ]] ; then + if check_arm ; then + export PW_USE_RUNTIME="0" + try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}" + elif [[ "${PW_DISABLE_RUNTIME_DOWNLOAD}" == "1" ]] ; then try_remove_dir "${PORT_WINE_TMP_PATH}/libs${PW_LIBS_VER}" else pw_check_and_download_runtime @@ -2787,15 +2844,19 @@ start_portproton () { var_winedlloverride_update "winebth.sys=d" pw_wineboot () { + local wine_pe64_path="${WINEDIR}/lib64/wine/x86_64-windows" + if [[ -d "${WINEDIR}/lib/wine/aarch64-windows" ]] + then wine_pe64_path="${WINEDIR}/lib/wine/aarch64-windows" + fi LIST_NATIVE_WINE_DLL_LINKS="winevulkan ir50_32 amd_ags_x64 wined3d vulkan-1" for dll in $LIST_NATIVE_WINE_DLL_LINKS ; do - try_force_link_file "${WINEDIR}/lib64/wine/x86_64-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" + try_force_link_file "${wine_pe64_path}/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" try_force_link_file "${WINEDIR}/lib/wine/i386-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll" done LIST_NATIVE_WINE_DLL_COPY="atl100 ntdll shell32" for dll in $LIST_NATIVE_WINE_DLL_COPY ; do - try_copy_file "${WINEDIR}/lib64/wine/x86_64-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" + try_copy_file "${wine_pe64_path}/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" try_copy_file "${WINEDIR}/lib/wine/i386-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll" done @@ -2807,7 +2868,7 @@ start_portproton () { try_force_link_file "${WINEDIR}/lib64/icu/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" elif [[ -f "${WINEDIR}/lib/wine/icu/i386-windows/${dll}.dll" ]] ; then try_force_link_file "${WINEDIR}/lib/wine/icu/i386-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll" - try_force_link_file "${WINEDIR}/lib/wine/icu/x86_64-windows/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" + try_force_link_file "${WINEDIR}/lib/wine/icu/${wine_pe64_path##*/}/${dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" else try_remove_file "${WINEPREFIX}/drive_c/windows/syswow64/${dll}.dll" try_remove_file "${WINEPREFIX}/drive_c/windows/system32/${dll}.dll" @@ -2829,7 +2890,9 @@ start_portproton () { then pw_clear_pfx check_dirs_and_files_in_pfx - if [[ "${PW_PREFIX_NAME}" == "DEFAULT" ]] ; then + if check_arm ; then + pw_wineboot -i + elif [[ "${PW_PREFIX_NAME}" == "DEFAULT" ]] ; then unpack "${PW_PLUGINS_PATH}/default_pfx.tar.xz" "${PORT_DATA_PATH}/data/prefixes/${PW_PREFIX_NAME}/" silent pw_wineboot -r echo "based_on_default" >> "${PORT_DATA_PATH}/data/prefixes/${PW_PREFIX_NAME}/winetricks.log" @@ -3225,9 +3288,18 @@ start_portproton () { export __GL_YIELD="NOTHING" export mesa_glthread="true" + PW_SUPPLIED_PE64_ARCH="x86_64-windows" + PW_WINE_PE64_PATH="${WINEDIR}/lib64/wine/x86_64-windows" + if [[ -d "${WINEDIR}/lib/wine/aarch64-windows" ]] + then + PW_SUPPLIED_PE64_ARCH="aarch64-windows" + PW_WINE_PE64_PATH="${WINEDIR}/lib/wine/aarch64-windows" + export DXVK_ENABLE_NVAPI="0" + fi + if [[ $PW_USE_SUPPLIED_DXVK_VKD3D == "1" ]] \ && [[ ! $PW_WINE_USE =~ (PROTON_LG|WINE_LG) ]] \ - && [[ -f "${WINEDIR}/lib64/wine/dxvk/d3d9.dll" || -f "${WINEDIR}/lib/wine/dxvk/x86_64-windows/d3d9.dll" ]] ; then + && [[ -f "${WINEDIR}/lib64/wine/dxvk/d3d9.dll" || -f "${WINEDIR}/lib/wine/dxvk/${PW_SUPPLIED_PE64_ARCH}/d3d9.dll" ]] ; then if [[ -f "${WINEDIR}/lib64/wine/dxvk/d3d10.dll" && -f "${WINEDIR}/lib64/wine/dxvk/d3d10_1.dll" ]] ; then CP_DXVK_FILES="d3d11 d3d10core d3d10_1 d3d10 d3d9 dxgi" CP_WINE_FILES="" @@ -3240,13 +3312,13 @@ start_portproton () { try_force_link_file "${WINEDIR}/lib/wine/d8vk/d3d8.dll" "${WINEPREFIX}/drive_c/windows/syswow64/d3d8.dll" try_force_link_file "${WINEDIR}/lib64/wine/d8vk/d3d8.dll" "${WINEPREFIX}/drive_c/windows/system32/d3d8.dll" var_winedlloverride_update "d3d8=n" - elif [[ -f "${WINEDIR}/lib64/wine/dxvk/d3d8.dll" || -f "${WINEDIR}/lib/wine/dxvk/x86_64-windows/d3d8.dll" ]] + elif [[ -f "${WINEDIR}/lib64/wine/dxvk/d3d8.dll" || -f "${WINEDIR}/lib/wine/dxvk/${PW_SUPPLIED_PE64_ARCH}/d3d8.dll" ]] then add_to_var CP_DXVK_FILES "d3d8" else add_to_var CP_WINE_FILES "d3d8" fi fi if [[ -f "${WINEDIR}/lib64/wine/vkd3d-proton/d3d12core.dll" ]] \ - || [[ -f "${WINEDIR}/lib/wine/vkd3d-proton/x86_64-windows/d3d12core.dll" ]] ; then + || [[ -f "${WINEDIR}/lib/wine/vkd3d-proton/${PW_SUPPLIED_PE64_ARCH}/d3d12core.dll" ]] ; then CP_VKD3D_FILES="d3d12 d3d12core" elif [[ -f "${WINEDIR}/lib64/wine/vkd3d-proton/d3d12.dll" ]] ; then CP_VKD3D_FILES="d3d12" @@ -3254,7 +3326,7 @@ start_portproton () { else add_to_var CP_WINE_FILES "d3d12 d3d12core" fi - [[ -f "${WINEDIR}/lib/wine/dxvk/x86_64-windows/d3d9.dll" ]] && PW_USE_SUPPLIED_DXVK_VKD3D="2" + [[ -f "${WINEDIR}/lib/wine/dxvk/${PW_SUPPLIED_PE64_ARCH}/d3d9.dll" ]] && PW_USE_SUPPLIED_DXVK_VKD3D="2" else PW_USE_SUPPLIED_DXVK_VKD3D="0" fi @@ -3492,7 +3564,7 @@ start_portproton () { print_info "Try create symlink WINE files..." for copy_wine_dll in $CP_WINE_FILES ; do - try_force_link_file "${WINEDIR}/lib64/wine/x86_64-windows/${copy_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${copy_wine_dll}.dll" + try_force_link_file "${PW_WINE_PE64_PATH}/${copy_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${copy_wine_dll}.dll" try_force_link_file "${WINEDIR}/lib/wine/i386-windows/${copy_wine_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${copy_wine_dll}.dll" done @@ -3521,7 +3593,7 @@ start_portproton () { case "$PW_USE_SUPPLIED_DXVK_VKD3D" in 2) try_force_link_file "${WINEDIR}/lib/wine/dxvk/i386-windows/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_dxvk_dll}.dll" - try_force_link_file "${WINEDIR}/lib/wine/dxvk/x86_64-windows/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_dxvk_dll}.dll" ;; + try_force_link_file "${WINEDIR}/lib/wine/dxvk/${PW_SUPPLIED_PE64_ARCH}/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_dxvk_dll}.dll" ;; 1) try_force_link_file "${WINEDIR}/lib/wine/dxvk/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_dxvk_dll}.dll" try_force_link_file "${WINEDIR}/lib64/wine/dxvk/${wine_dxvk_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_dxvk_dll}.dll" ;; @@ -3568,7 +3640,7 @@ start_portproton () { 2) if [[ $wine_vkd3d_dll =~ d3d12 ]] ; then try_force_link_file "${WINEDIR}/lib/wine/vkd3d-proton/i386-windows/${wine_vkd3d_dll}.dll" "${WINEPREFIX}/drive_c/windows/syswow64/${wine_vkd3d_dll}.dll" - try_force_link_file "${WINEDIR}/lib/wine/vkd3d-proton/x86_64-windows/${wine_vkd3d_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_vkd3d_dll}.dll" + try_force_link_file "${WINEDIR}/lib/wine/vkd3d-proton/${PW_SUPPLIED_PE64_ARCH}/${wine_vkd3d_dll}.dll" "${WINEPREFIX}/drive_c/windows/system32/${wine_vkd3d_dll}.dll" fi ;; 1) if [[ $wine_vkd3d_dll =~ d3d12 ]] ; then @@ -4356,7 +4428,8 @@ gui_edit_db () { DISABLE_EDIT_DB_LIST+=" PW_USE_SUPPLIED_DXVK_VKD3D" fi - if [[ ! -f "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \ + if check_arm \ + || [[ ! -f "${PW_WINELIB}/runtime/files/bin/vkcube" ]] \ || [[ ! -f "${PW_WINELIB}/pressure-vessel/bin/pressure-vessel-wrap" ]] then DISABLE_EDIT_DB_LIST+=" PW_USE_RUNTIME"