Compare commits
1 commit
master
...
no-shuffle
Author | SHA1 | Date | |
---|---|---|---|
![]() |
df8f9ce172 |
244 changed files with 2479 additions and 4454 deletions
|
@ -13,8 +13,8 @@ fi
|
||||||
cd src/android
|
cd src/android
|
||||||
chmod +x ./gradlew
|
chmod +x ./gradlew
|
||||||
|
|
||||||
./gradlew assembleMainlineRelease
|
./gradlew assembleRelease
|
||||||
./gradlew bundleMainlineRelease
|
./gradlew bundleRelease
|
||||||
|
|
||||||
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
if [ ! -z "${ANDROID_KEYSTORE_B64}" ]; then
|
||||||
rm "${ANDROID_KEYSTORE_FILE}"
|
rm "${ANDROID_KEYSTORE_FILE}"
|
||||||
|
|
|
@ -10,7 +10,7 @@ if (-not ([bool](net session 2>$null))) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$VSVer = "17"
|
$VSVer = "17"
|
||||||
$ExeFile = "vs_community.exe"
|
$ExeFile = "vs_BuildTools.exe"
|
||||||
$Uri = "https://aka.ms/vs/$VSVer/release/$ExeFile"
|
$Uri = "https://aka.ms/vs/$VSVer/release/$ExeFile"
|
||||||
$Destination = "./$ExeFile"
|
$Destination = "./$ExeFile"
|
||||||
|
|
||||||
|
@ -19,39 +19,21 @@ $WebClient = New-Object System.Net.WebClient
|
||||||
$WebClient.DownloadFile($Uri, $Destination)
|
$WebClient.DownloadFile($Uri, $Destination)
|
||||||
Write-Host "Finished downloading $ExeFile"
|
Write-Host "Finished downloading $ExeFile"
|
||||||
|
|
||||||
|
$VSROOT = "C:/VSBuildTools/$VSVer"
|
||||||
$Arguments = @(
|
$Arguments = @(
|
||||||
"--quiet", # Suppress installer UI
|
"--installPath `"$VSROOT`"", # set custom installation path
|
||||||
"--wait", # Wait for installation to complete
|
"--quiet", # suppress UI
|
||||||
"--norestart", # Prevent automatic restart
|
"--wait", # wait for installation to complete
|
||||||
"--force", # Force installation even if components are already installed
|
"--norestart", # prevent automatic restart
|
||||||
"--add Microsoft.VisualStudio.Workload.NativeDesktop", # Desktop development with C++
|
"--add Microsoft.VisualStudio.Workload.VCTools", # add C++ build tools workload
|
||||||
"--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64", # Core C++ compiler/tools for x86/x64
|
"--add Microsoft.VisualStudio.Component.VC.Tools.x86.x64", # add core x86/x64 C++ tools
|
||||||
"--add Microsoft.VisualStudio.Component.Windows11SDK.26100",# Windows 11 SDK (26100)
|
"--add Microsoft.VisualStudio.Component.Windows10SDK.19041" # add specific Windows SDK
|
||||||
"--add Microsoft.VisualStudio.Component.Windows10SDK.19041",# Windows 10 SDK (19041)
|
|
||||||
"--add Microsoft.VisualStudio.Component.VC.Llvm.Clang", # LLVM Clang compiler
|
|
||||||
"--add Microsoft.VisualStudio.Component.VC.Llvm.ClangToolset", # LLVM Clang integration toolset
|
|
||||||
"--add Microsoft.VisualStudio.Component.Windows11SDK.22621",# Windows 11 SDK (22621)
|
|
||||||
"--add Microsoft.VisualStudio.Component.VC.CMake.Project", # CMake project support
|
|
||||||
"--add Microsoft.VisualStudio.ComponentGroup.VC.Tools.142.x86.x64", # VC++ 14.2 toolset
|
|
||||||
"--add Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Llvm.Clang" # LLVM Clang for native desktop
|
|
||||||
)
|
)
|
||||||
|
|
||||||
Write-Host "Installing Visual Studio Build Tools"
|
Write-Host "Installing Visual Studio Build Tools"
|
||||||
$InstallProcess = Start-Process -FilePath $Destination -NoNewWindow -PassThru -ArgumentList $Arguments
|
$InstallProcess = Start-Process -FilePath $Destination -NoNewWindow -PassThru -Wait -ArgumentList $Arguments
|
||||||
|
|
||||||
# Spinner while installing
|
|
||||||
$Spinner = "|/-\"
|
|
||||||
$i = 0
|
|
||||||
while (-not $InstallProcess.HasExited) {
|
|
||||||
Write-Host -NoNewline ("`rInstalling... " + $Spinner[$i % $Spinner.Length])
|
|
||||||
Start-Sleep -Milliseconds 250
|
|
||||||
$i++
|
|
||||||
}
|
|
||||||
|
|
||||||
# Clear spinner line
|
|
||||||
Write-Host "`rSetup completed! "
|
|
||||||
|
|
||||||
$ExitCode = $InstallProcess.ExitCode
|
$ExitCode = $InstallProcess.ExitCode
|
||||||
|
|
||||||
if ($ExitCode -ne 0) {
|
if ($ExitCode -ne 0) {
|
||||||
Write-Host "Error installing Visual Studio Build Tools (Error: $ExitCode)"
|
Write-Host "Error installing Visual Studio Build Tools (Error: $ExitCode)"
|
||||||
Exit $ExitCode
|
Exit $ExitCode
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
shell=sh
|
|
377
CMakeLists.txt
377
CMakeLists.txt
|
@ -32,20 +32,10 @@ endif()
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/externals/cmake-modules")
|
||||||
|
|
||||||
# NB: this does not account for SPARC
|
|
||||||
# If you get Eden working on SPARC, please shoot crueter@crueter.xyz multiple emails
|
|
||||||
# and you will be hailed for eternity
|
|
||||||
if (PLATFORM_SUN)
|
if (PLATFORM_SUN)
|
||||||
# Terrific Solaris pkg shenanigans
|
# Terrific Solaris pkg shenanigans
|
||||||
list(APPEND CMAKE_PREFIX_PATH "/usr/lib/qt/6.6/lib/amd64/cmake")
|
list(APPEND CMAKE_PREFIX_PATH "/usr/lib/qt/6.6/lib/amd64/cmake")
|
||||||
list(APPEND CMAKE_MODULE_PATH "/usr/lib/qt/6.6/lib/amd64/cmake")
|
list(APPEND CMAKE_MODULE_PATH "/usr/lib/qt/6.6/lib/amd64/cmake")
|
||||||
|
|
||||||
# amazing
|
|
||||||
# absolutely incredible
|
|
||||||
list(APPEND CMAKE_PREFIX_PATH "/usr/lib/amd64/cmake")
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "/usr/lib/amd64/cmake")
|
|
||||||
|
|
||||||
# For some mighty reason, doing a normal release build sometimes may not trigger
|
# For some mighty reason, doing a normal release build sometimes may not trigger
|
||||||
# the proper -O3 switch to materialize
|
# the proper -O3 switch to materialize
|
||||||
if (CMAKE_BUILD_TYPE MATCHES "Release")
|
if (CMAKE_BUILD_TYPE MATCHES "Release")
|
||||||
|
@ -149,55 +139,65 @@ endif()
|
||||||
|
|
||||||
# Set bundled sdl2/qt as dependent options.
|
# Set bundled sdl2/qt as dependent options.
|
||||||
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
|
# On Linux system SDL2 is likely to be lacking HIDAPI support which have drawbacks but is needed for SDL motion
|
||||||
cmake_dependent_option(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
|
CMAKE_DEPENDENT_OPTION(ENABLE_SDL2 "Enable the SDL2 frontend" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
if (ENABLE_SDL2)
|
|
||||||
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
|
||||||
cmake_dependent_option(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "NOT MSVC" OFF)
|
|
||||||
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# qt stuff
|
|
||||||
option(ENABLE_QT "Enable the Qt frontend" ON)
|
|
||||||
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
|
||||||
option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF)
|
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
|
||||||
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
|
||||||
option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
|
|
||||||
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
|
||||||
|
|
||||||
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
|
||||||
|
|
||||||
set(EXT_DEFAULT OFF)
|
set(EXT_DEFAULT OFF)
|
||||||
|
|
||||||
if (MSVC OR ANDROID)
|
if (MSVC OR ANDROID)
|
||||||
set(EXT_DEFAULT ON)
|
set(EXT_DEFAULT ON)
|
||||||
endif()
|
endif()
|
||||||
option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT})
|
|
||||||
|
|
||||||
# ffmpeg
|
if (ENABLE_SDL2)
|
||||||
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
# TODO(crueter): Cleanup, each dep that has a bundled option should allow to choose between bundled, external, system
|
||||||
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" "${PLATFORM_SUN}" "NOT WIN32 AND NOT ANDROID" OFF)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_EXTERNAL_SDL2 "Compile external SDL2" OFF "NOT MSVC" OFF)
|
||||||
|
option(YUZU_USE_BUNDLED_SDL2 "Download bundled SDL2 build" "${MSVC}")
|
||||||
# sirit
|
endif()
|
||||||
option(YUZU_USE_BUNDLED_SIRIT "Download bundled sirit" ${EXT_DEFAULT})
|
|
||||||
|
|
||||||
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF)
|
cmake_dependent_option(ENABLE_LIBUSB "Enable the use of LibUSB" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF)
|
cmake_dependent_option(ENABLE_OPENGL "Enable OpenGL" ON "NOT WIN32 OR NOT ARCHITECTURE_arm64" OFF)
|
||||||
mark_as_advanced(FORCE ENABLE_OPENGL)
|
mark_as_advanced(FORCE ENABLE_OPENGL)
|
||||||
|
|
||||||
|
option(ENABLE_QT "Enable the Qt frontend" ON)
|
||||||
|
option(ENABLE_QT_TRANSLATION "Enable translations for the Qt frontend" OFF)
|
||||||
|
option(ENABLE_QT_UPDATE_CHECKER "Enable update checker for the Qt frontend" OFF)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_QT "Download bundled Qt binaries" "${MSVC}" "ENABLE_QT" OFF)
|
||||||
|
|
||||||
|
option(YUZU_USE_CPM "Use CPM to fetch system dependencies (fmt, boost, etc) if needed. Externals will still be fetched." ${EXT_DEFAULT})
|
||||||
|
|
||||||
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
option(ENABLE_WEB_SERVICE "Enable web services (telemetry, etc.)" ON)
|
||||||
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
option(ENABLE_WIFI_SCAN "Enable WiFi scanning" OFF)
|
||||||
|
|
||||||
cmake_dependent_option(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF)
|
option(YUZU_USE_BUNDLED_FFMPEG "Download bundled FFmpeg" ${EXT_DEFAULT})
|
||||||
|
cmake_dependent_option(YUZU_USE_EXTERNAL_FFMPEG "Build FFmpeg from source" OFF "NOT WIN32 AND NOT ANDROID" OFF)
|
||||||
|
|
||||||
|
option(YUZU_USE_QT_MULTIMEDIA "Use QtMultimedia for Camera" OFF)
|
||||||
|
|
||||||
|
option(YUZU_USE_QT_WEB_ENGINE "Use QtWebEngine for web applet implementation" OFF)
|
||||||
|
|
||||||
|
set(YUZU_QT_MIRROR "" CACHE STRING "What mirror to use for downloading the bundled Qt libraries")
|
||||||
|
|
||||||
|
option(ENABLE_CUBEB "Enables the cubeb audio backend" ON)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(USE_DISCORD_PRESENCE "Enables Discord Rich Presence" OFF "ENABLE_QT" OFF)
|
||||||
|
|
||||||
option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
option(YUZU_TESTS "Compile tests" "${BUILD_TESTING}")
|
||||||
|
|
||||||
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" OFF)
|
option(YUZU_USE_PRECOMPILED_HEADERS "Use precompiled headers" ${EXT_DEFAULT})
|
||||||
if (YUZU_USE_PRECOMPILED_HEADERS)
|
|
||||||
message(STATUS "Using Precompiled Headers.")
|
# TODO(crueter): CI this?
|
||||||
set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON)
|
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
||||||
endif()
|
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
|
||||||
|
|
||||||
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
|
option(YUZU_ENABLE_LTO "Enable link-time optimization" OFF)
|
||||||
if(YUZU_ENABLE_LTO)
|
if(YUZU_ENABLE_LTO)
|
||||||
include(CheckIPOSupported)
|
include(CheckIPOSupported)
|
||||||
|
@ -205,44 +205,17 @@ if(YUZU_ENABLE_LTO)
|
||||||
if(NOT COMPILER_SUPPORTS_LTO)
|
if(NOT COMPILER_SUPPORTS_LTO)
|
||||||
message(FATAL_ERROR "Your compiler does not support interprocedural optimization (IPO). Re-run CMake with -DYUZU_ENABLE_LTO=OFF.")
|
message(FATAL_ERROR "Your compiler does not support interprocedural optimization (IPO). Re-run CMake with -DYUZU_ENABLE_LTO=OFF.")
|
||||||
endif()
|
endif()
|
||||||
set(CMAKE_POLICY_DEFAULT_CMP0069 NEW)
|
|
||||||
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${COMPILER_SUPPORTS_LTO})
|
set(CMAKE_INTERPROCEDURAL_OPTIMIZATION ${COMPILER_SUPPORTS_LTO})
|
||||||
endif()
|
endif()
|
||||||
option(USE_CCACHE "Use ccache for compilation" OFF)
|
|
||||||
set(CCACHE_PATH "ccache" CACHE STRING "Path to ccache binary")
|
|
||||||
if(USE_CCACHE)
|
|
||||||
find_program(CCACHE_BINARY ${CCACHE_PATH})
|
|
||||||
if(CCACHE_BINARY)
|
|
||||||
message(STATUS "Found ccache at: ${CCACHE_BINARY}")
|
|
||||||
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_BINARY})
|
|
||||||
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_BINARY})
|
|
||||||
if (YUZU_USE_PRECOMPILED_HEADERS)
|
|
||||||
message(FATAL_ERROR "Precompiled headers are incompatible with ccache. Re-run CMake with -DYUZU_USE_PRECOMPILED_HEADERS=OFF.")
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(WARNING "USE_CCACHE enabled, but no executable found at: ${CCACHE_PATH}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# TODO(crueter): CI this?
|
|
||||||
option(YUZU_DOWNLOAD_ANDROID_VVL "Download validation layer binary for android" ON)
|
|
||||||
|
|
||||||
option(YUZU_LEGACY "Apply patches that improve compatibility with older GPUs (e.g. Snapdragon 865) at the cost of performance" OFF)
|
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_ROOM "Enable dedicated room functionality" ON "NOT ANDROID" OFF)
|
|
||||||
cmake_dependent_option(YUZU_ROOM_STANDALONE "Enable standalone room executable" ON "YUZU_ROOM" OFF)
|
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_CMD "Compile the eden-cli executable" ON "ENABLE_SDL2;NOT ANDROID" OFF)
|
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_CRASH_DUMPS "Compile crash dump (Minidump) support" OFF "WIN32 OR LINUX" OFF)
|
|
||||||
|
|
||||||
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
option(YUZU_DOWNLOAD_TIME_ZONE_DATA "Always download time zone binaries" ON)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "NOT WIN32" OFF)
|
||||||
|
|
||||||
|
CMAKE_DEPENDENT_OPTION(USE_SYSTEM_MOLTENVK "Use the system MoltenVK lib (instead of the bundled one)" OFF "APPLE" OFF)
|
||||||
|
|
||||||
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
set(YUZU_TZDB_PATH "" CACHE STRING "Path to a pre-downloaded timezone database")
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_USE_FASTER_LD "Check if a faster linker is available" ON "LINUX" OFF)
|
|
||||||
|
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib" ON "APPLE" OFF)
|
|
||||||
|
|
||||||
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
||||||
|
|
||||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
set(DEFAULT_ENABLE_OPENSSL ON)
|
||||||
|
@ -255,12 +228,15 @@ if (ANDROID OR WIN32 OR APPLE OR PLATFORM_SUN)
|
||||||
# your own copy of it.
|
# your own copy of it.
|
||||||
set(DEFAULT_ENABLE_OPENSSL OFF)
|
set(DEFAULT_ENABLE_OPENSSL OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ENABLE_WEB_SERVICE)
|
if (ENABLE_WEB_SERVICE)
|
||||||
set(DEFAULT_ENABLE_OPENSSL ON)
|
set(DEFAULT_ENABLE_OPENSSL ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
|
option(ENABLE_OPENSSL "Enable OpenSSL backend for ISslConnection" ${DEFAULT_ENABLE_OPENSSL})
|
||||||
|
|
||||||
if (ENABLE_OPENSSL)
|
if (ENABLE_OPENSSL)
|
||||||
cmake_dependent_option(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON)
|
CMAKE_DEPENDENT_OPTION(YUZU_USE_BUNDLED_OPENSSL "Download bundled OpenSSL build" "${MSVC}" "NOT ANDROID" ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
if (ANDROID AND YUZU_DOWNLOAD_ANDROID_VVL)
|
||||||
|
@ -287,11 +263,19 @@ if (ANDROID)
|
||||||
set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe
|
set(CMAKE_POLICY_VERSION_MINIMUM 3.5) # Workaround for Oboe
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# We need to downgrade debug info (/Zi -> /Z7) to use an older but more cacheable format
|
if (YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
# See https://github.com/nanoant/CMakePCHCompiler/issues/21
|
if (MSVC AND CCACHE)
|
||||||
if(WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
|
# buildcache does not properly cache PCH files, leading to compilation errors.
|
||||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
# See https://github.com/mbitsnbites/buildcache/discussions/230
|
||||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
message(WARNING "buildcache does not properly support Precompiled Headers. Disabling PCH")
|
||||||
|
set(DYNARMIC_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE)
|
||||||
|
set(YUZU_USE_PRECOMPILED_HEADERS OFF CACHE BOOL "" FORCE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
|
message(STATUS "Using Precompiled Headers.")
|
||||||
|
set(CMAKE_PCH_INSTANTIATE_TEMPLATES ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Default to a Release build
|
# Default to a Release build
|
||||||
|
@ -333,32 +317,16 @@ if (UNIX)
|
||||||
add_compile_definitions(YUZU_UNIX=1)
|
add_compile_definitions(YUZU_UNIX=1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_LEGACY)
|
|
||||||
message(WARNING "Making legacy build. Performance may suffer.")
|
|
||||||
add_compile_definitions(YUZU_LEGACY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
|
if (ARCHITECTURE_arm64 AND (ANDROID OR PLATFORM_LINUX))
|
||||||
set(HAS_NCE 1)
|
set(HAS_NCE 1)
|
||||||
add_compile_definitions(HAS_NCE=1)
|
add_compile_definitions(HAS_NCE=1)
|
||||||
|
find_package(oaknut 2.0.1)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_ROOM)
|
if (YUZU_ROOM)
|
||||||
add_compile_definitions(YUZU_ROOM)
|
add_compile_definitions(YUZU_ROOM)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ANDROID OR PLATFORM_FREEBSD OR PLATFORM_OPENBSD OR PLATFORM_SUN OR APPLE)
|
|
||||||
if(CXX_APPLE OR CXX_CLANG)
|
|
||||||
# libc++ has stop_token and jthread as experimental
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-library")
|
|
||||||
else()
|
|
||||||
# Uses glibc, mostly?
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1")
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Build/optimization presets
|
# Build/optimization presets
|
||||||
if (PLATFORM_LINUX OR CXX_CLANG)
|
if (PLATFORM_LINUX OR CXX_CLANG)
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
|
@ -478,7 +446,22 @@ if (YUZU_USE_CPM)
|
||||||
|
|
||||||
if (zstd_ADDED)
|
if (zstd_ADDED)
|
||||||
add_library(zstd::zstd ALIAS libzstd_static)
|
add_library(zstd::zstd ALIAS libzstd_static)
|
||||||
add_library(zstd::libzstd ALIAS libzstd_static)
|
endif()
|
||||||
|
|
||||||
|
# Catch2
|
||||||
|
if (YUZU_TESTS OR DYNARMIC_TESTS)
|
||||||
|
AddJsonPackage(catch2)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ENet
|
||||||
|
AddJsonPackage(enet)
|
||||||
|
|
||||||
|
if (enet_ADDED)
|
||||||
|
target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT TARGET enet::enet)
|
||||||
|
add_library(enet::enet ALIAS enet)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Opus
|
# Opus
|
||||||
|
@ -495,10 +478,31 @@ if (YUZU_USE_CPM)
|
||||||
if (NOT TARGET Opus::opus)
|
if (NOT TARGET Opus::opus)
|
||||||
add_library(Opus::opus ALIAS opus)
|
add_library(Opus::opus ALIAS opus)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# VulkanUtilityHeaders - pulls in headers and utility libs
|
||||||
|
AddJsonPackage(vulkan-utility-headers)
|
||||||
|
|
||||||
|
# small hack
|
||||||
|
if (NOT VulkanUtilityLibraries_ADDED)
|
||||||
|
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# SPIRV Headers
|
||||||
|
AddJsonPackage(spirv-headers)
|
||||||
|
|
||||||
|
# SPIRV Tools
|
||||||
|
AddJsonPackage(spirv-tools)
|
||||||
|
|
||||||
|
if (SPIRV-Tools_ADDED)
|
||||||
|
add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static)
|
||||||
|
target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# mbedtls
|
||||||
|
AddJsonPackage(mbedtls)
|
||||||
else()
|
else()
|
||||||
# Enforce the search mode of non-required packages for better and shorter failure messages
|
# Enforce the search mode of non-required packages for better and shorter failure messages
|
||||||
find_package(fmt 8 REQUIRED)
|
find_package(fmt 8 REQUIRED)
|
||||||
|
|
||||||
if (NOT YUZU_DISABLE_LLVM)
|
if (NOT YUZU_DISABLE_LLVM)
|
||||||
find_package(LLVM MODULE COMPONENTS Demangle)
|
find_package(LLVM MODULE COMPONENTS Demangle)
|
||||||
endif()
|
endif()
|
||||||
|
@ -507,16 +511,39 @@ else()
|
||||||
find_package(lz4 REQUIRED)
|
find_package(lz4 REQUIRED)
|
||||||
find_package(RenderDoc MODULE)
|
find_package(RenderDoc MODULE)
|
||||||
find_package(stb MODULE)
|
find_package(stb MODULE)
|
||||||
|
find_package(enet 1.3 MODULE REQUIRED)
|
||||||
find_package(Opus 1.3 MODULE REQUIRED)
|
find_package(Opus 1.3 MODULE REQUIRED)
|
||||||
find_package(ZLIB 1.2 REQUIRED)
|
find_package(ZLIB 1.2 REQUIRED)
|
||||||
find_package(zstd 1.5 REQUIRED MODULE)
|
find_package(zstd 1.5 REQUIRED MODULE)
|
||||||
|
|
||||||
# wow
|
# wow
|
||||||
if (PLATFORM_LINUX)
|
if (PLATFORM_LINUX)
|
||||||
find_package(Boost 1.57.0 CONFIG REQUIRED headers context system fiber)
|
find_package(Boost 1.57.0 REQUIRED headers context system fiber)
|
||||||
else()
|
else()
|
||||||
find_package(Boost 1.57.0 CONFIG REQUIRED)
|
find_package(Boost 1.57.0 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# OpenBSD does not package mbedtls3 (only 2)
|
||||||
|
if (PLATFORM_OPENBSD)
|
||||||
|
AddJsonPackage(mbedtls)
|
||||||
|
else()
|
||||||
|
find_package(MbedTLS 3 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(VulkanUtilityLibraries REQUIRED)
|
||||||
|
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
||||||
|
|
||||||
|
# FreeBSD does not package spirv-headers
|
||||||
|
if (PLATFORM_FREEBSD)
|
||||||
|
AddJsonPackage(spirv-headers)
|
||||||
|
else()
|
||||||
|
find_package(SPIRV-Headers 1.3.274 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(SPIRV-Tools MODULE REQUIRED)
|
||||||
|
|
||||||
|
if (YUZU_TESTS)
|
||||||
|
find_package(Catch2 3.0.1 REQUIRED)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
|
||||||
|
@ -532,6 +559,90 @@ if(NOT TARGET Boost::headers)
|
||||||
AddJsonPackage(boost_headers)
|
AddJsonPackage(boost_headers)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# DiscordRPC
|
||||||
|
if (USE_DISCORD_PRESENCE)
|
||||||
|
if (ARCHITECTURE_arm64)
|
||||||
|
add_compile_definitions(RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
AddJsonPackage(discord-rpc)
|
||||||
|
|
||||||
|
target_include_directories(discord-rpc INTERFACE ${discord-rpc_SOURCE_DIR}/include)
|
||||||
|
add_library(DiscordRPC::discord-rpc ALIAS discord-rpc)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# SimpleIni
|
||||||
|
AddJsonPackage(simpleini)
|
||||||
|
|
||||||
|
# Most linux distros don't package cubeb, so enable regardless of cpm settings
|
||||||
|
if(ENABLE_CUBEB)
|
||||||
|
AddJsonPackage(cubeb)
|
||||||
|
|
||||||
|
if (cubeb_ADDED)
|
||||||
|
if (NOT MSVC)
|
||||||
|
if (TARGET speex)
|
||||||
|
target_compile_options(speex PRIVATE -Wno-sign-compare)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "")
|
||||||
|
target_compile_options(cubeb INTERFACE
|
||||||
|
-Wno-implicit-const-int-float-conversion
|
||||||
|
-Wno-shadow
|
||||||
|
-Wno-missing-declarations
|
||||||
|
-Wno-return-type
|
||||||
|
-Wno-uninitialized
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
target_compile_options(cubeb PRIVATE
|
||||||
|
/wd4456
|
||||||
|
/wd4458
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT TARGET cubeb::cubeb)
|
||||||
|
add_library(cubeb::cubeb ALIAS cubeb)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package
|
||||||
|
if (ENABLE_SDL2)
|
||||||
|
if (YUZU_USE_EXTERNAL_SDL2)
|
||||||
|
message(STATUS "Using SDL2 from externals.")
|
||||||
|
if (NOT WIN32)
|
||||||
|
# Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers
|
||||||
|
# Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095)
|
||||||
|
# Yuzu-cmd also needs: Video (depends on Loadso/Dlopen)
|
||||||
|
# CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809)
|
||||||
|
set(SDL_UNUSED_SUBSYSTEMS
|
||||||
|
File Filesystem
|
||||||
|
Locale Power Render)
|
||||||
|
foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS})
|
||||||
|
string(TOUPPER ${_SUB} _OPT)
|
||||||
|
set(SDL_${_OPT} OFF)
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
set(HIDAPI ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (APPLE)
|
||||||
|
set(SDL_FILE ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck")
|
||||||
|
set(SDL_PIPEWIRE OFF) # build errors out with this on
|
||||||
|
AddJsonPackage("sdl2_steamdeck")
|
||||||
|
else()
|
||||||
|
AddJsonPackage("sdl2_generic")
|
||||||
|
endif()
|
||||||
|
elseif (YUZU_USE_BUNDLED_SDL2)
|
||||||
|
message(STATUS "Using bundled SDL2")
|
||||||
|
AddJsonPackage(sdl2)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package(SDL2 2.26.4 REQUIRED)
|
||||||
|
endif()
|
||||||
|
|
||||||
# List of all FFmpeg components required
|
# List of all FFmpeg components required
|
||||||
set(FFmpeg_COMPONENTS
|
set(FFmpeg_COMPONENTS
|
||||||
avcodec
|
avcodec
|
||||||
|
@ -562,12 +673,6 @@ add_subdirectory(externals)
|
||||||
# pass targets from externals
|
# pass targets from externals
|
||||||
find_package(libusb)
|
find_package(libusb)
|
||||||
find_package(VulkanMemoryAllocator)
|
find_package(VulkanMemoryAllocator)
|
||||||
find_package(enet)
|
|
||||||
find_package(MbedTLS)
|
|
||||||
find_package(VulkanUtilityLibraries)
|
|
||||||
find_package(SimpleIni)
|
|
||||||
find_package(SPIRV-Tools)
|
|
||||||
find_package(sirit)
|
|
||||||
|
|
||||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||||
find_package(xbyak)
|
find_package(xbyak)
|
||||||
|
@ -581,26 +686,6 @@ if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)
|
||||||
find_package(cpp-jwt)
|
find_package(cpp-jwt)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
|
|
||||||
find_package(oaknut)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_SDL2)
|
|
||||||
find_package(SDL2)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (USE_DISCORD_PRESENCE)
|
|
||||||
find_package(DiscordRPC)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_CUBEB)
|
|
||||||
find_package(cubeb)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (YUZU_TESTS OR DYNARMIC_TESTS)
|
|
||||||
find_package(Catch2)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_QT)
|
if (ENABLE_QT)
|
||||||
if (YUZU_USE_BUNDLED_QT)
|
if (YUZU_USE_BUNDLED_QT)
|
||||||
download_qt(6.8.3)
|
download_qt(6.8.3)
|
||||||
|
@ -619,8 +704,6 @@ if (ENABLE_QT)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
# yes Qt, we get it
|
|
||||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
|
||||||
find_package(Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS GuiPrivate)
|
find_package(Qt6 REQUIRED COMPONENTS DBus OPTIONAL_COMPONENTS GuiPrivate)
|
||||||
elseif (UNIX AND NOT APPLE)
|
elseif (UNIX AND NOT APPLE)
|
||||||
find_package(Qt6 REQUIRED COMPONENTS DBus Gui)
|
find_package(Qt6 REQUIRED COMPONENTS DBus Gui)
|
||||||
|
@ -811,47 +894,25 @@ if (MSVC AND CXX_CLANG)
|
||||||
link_libraries(llvm-mingw-runtime)
|
link_libraries(llvm-mingw-runtime)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
#[[
|
|
||||||
search order:
|
|
||||||
- gold (GCC only) - the best, generally, but unfortunately not packaged anymore
|
|
||||||
- mold (GCC only) - generally does well on GCC
|
|
||||||
- ldd - preferred on clang
|
|
||||||
- bfd - the final fallback
|
|
||||||
- If none are found (macOS uses ld.prime, etc) just use the default linker
|
|
||||||
]]
|
|
||||||
if (YUZU_USE_FASTER_LD)
|
if (YUZU_USE_FASTER_LD)
|
||||||
find_program(LINKER_BFD bfd)
|
# clang should always use lld
|
||||||
if (LINKER_BFD)
|
find_program(LLD lld)
|
||||||
set(LINKER bfd)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_program(LINKER_LLD lld)
|
if (LLD)
|
||||||
if (LINKER_LLD)
|
|
||||||
set(LINKER lld)
|
set(LINKER lld)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# GNU appears to work better with mold
|
||||||
|
# TODO: mold has been slow lately, see if better options exist (search for gold?)
|
||||||
if (CXX_GCC)
|
if (CXX_GCC)
|
||||||
find_program(LINKER_MOLD mold)
|
find_program(MOLD mold)
|
||||||
if (LINKER_MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1")
|
if (MOLD AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "12.1")
|
||||||
set(LINKER mold)
|
set(LINKER mold)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
find_program(LINKER_GOLD gold)
|
|
||||||
if (LINKER_GOLD)
|
|
||||||
set(LINKER gold)
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (LINKER)
|
|
||||||
message(NOTICE "Selecting ${LINKER} as linker")
|
message(NOTICE "Selecting ${LINKER} as linker")
|
||||||
add_link_options("-fuse-ld=${LINKER}")
|
add_link_options("-fuse-ld=${LINKER}")
|
||||||
else()
|
|
||||||
message(WARNING "No faster linker found--using default")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (LINKER STREQUAL "lld" AND CXX_GCC)
|
|
||||||
message(WARNING "Using lld on GCC may cause issues with certain LTO settings. If the program fails to compile, disable YUZU_USE_FASTER_LD, or install mold or GNU gold.")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Set runtime library to MD/MDd for all configurations
|
# Set runtime library to MD/MDd for all configurations
|
||||||
|
|
|
@ -743,11 +743,9 @@ function(CPMAddPackage)
|
||||||
if(NOT DEFINED CPM_ARGS_NAME)
|
if(NOT DEFINED CPM_ARGS_NAME)
|
||||||
set(CPM_ARGS_NAME ${nameFromUrl})
|
set(CPM_ARGS_NAME ${nameFromUrl})
|
||||||
endif()
|
endif()
|
||||||
|
if(NOT DEFINED CPM_ARGS_VERSION)
|
||||||
# this is dumb and should not be done
|
set(CPM_ARGS_VERSION ${verFromUrl})
|
||||||
# if(NOT DEFINED CPM_ARGS_VERSION)
|
endif()
|
||||||
# set(CPM_ARGS_VERSION ${verFromUrl})
|
|
||||||
# endif()
|
|
||||||
|
|
||||||
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS URL "${CPM_ARGS_URL}")
|
list(APPEND CPM_ARGS_UNPARSED_ARGUMENTS URL "${CPM_ARGS_URL}")
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -107,6 +107,7 @@ function(AddJsonPackage)
|
||||||
get_json_element("${object}" name name "${JSON_NAME}")
|
get_json_element("${object}" name name "${JSON_NAME}")
|
||||||
get_json_element("${object}" extension extension "tar.zst")
|
get_json_element("${object}" extension extension "tar.zst")
|
||||||
get_json_element("${object}" min_version min_version "")
|
get_json_element("${object}" min_version min_version "")
|
||||||
|
get_json_element("${object}" cmake_filename cmake_filename "")
|
||||||
get_json_element("${object}" raw_disabled disabled_platforms "")
|
get_json_element("${object}" raw_disabled disabled_platforms "")
|
||||||
|
|
||||||
if (raw_disabled)
|
if (raw_disabled)
|
||||||
|
@ -123,6 +124,7 @@ function(AddJsonPackage)
|
||||||
EXTENSION ${extension}
|
EXTENSION ${extension}
|
||||||
MIN_VERSION ${min_version}
|
MIN_VERSION ${min_version}
|
||||||
DISABLED_PLATFORMS ${disabled_platforms}
|
DISABLED_PLATFORMS ${disabled_platforms}
|
||||||
|
CMAKE_FILENAME ${cmake_filename}
|
||||||
)
|
)
|
||||||
|
|
||||||
# pass stuff to parent scope
|
# pass stuff to parent scope
|
||||||
|
@ -137,7 +139,6 @@ function(AddJsonPackage)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
get_json_element("${object}" hash hash "")
|
get_json_element("${object}" hash hash "")
|
||||||
get_json_element("${object}" hash_suffix hash_suffix "")
|
|
||||||
get_json_element("${object}" sha sha "")
|
get_json_element("${object}" sha sha "")
|
||||||
get_json_element("${object}" url url "")
|
get_json_element("${object}" url url "")
|
||||||
get_json_element("${object}" key key "")
|
get_json_element("${object}" key key "")
|
||||||
|
@ -207,7 +208,6 @@ function(AddJsonPackage)
|
||||||
VERSION "${version}"
|
VERSION "${version}"
|
||||||
URL "${url}"
|
URL "${url}"
|
||||||
HASH "${hash}"
|
HASH "${hash}"
|
||||||
HASH_SUFFIX "${hash_suffix}"
|
|
||||||
SHA "${sha}"
|
SHA "${sha}"
|
||||||
REPO "${repo}"
|
REPO "${repo}"
|
||||||
KEY "${key}"
|
KEY "${key}"
|
||||||
|
@ -277,7 +277,6 @@ function(AddPackage)
|
||||||
|
|
||||||
KEY
|
KEY
|
||||||
BUNDLED_PACKAGE
|
BUNDLED_PACKAGE
|
||||||
FORCE_BUNDLED_PACKAGE
|
|
||||||
FIND_PACKAGE_ARGUMENTS
|
FIND_PACKAGE_ARGUMENTS
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -427,9 +426,7 @@ function(AddPackage)
|
||||||
- BUNDLED_PACKAGE
|
- BUNDLED_PACKAGE
|
||||||
- default to allow local
|
- default to allow local
|
||||||
]]#
|
]]#
|
||||||
if (PKG_ARGS_FORCE_BUNDLED_PACKAGE)
|
if (${PKG_ARGS_NAME}_FORCE_SYSTEM)
|
||||||
set_precedence(OFF OFF)
|
|
||||||
elseif (${PKG_ARGS_NAME}_FORCE_SYSTEM)
|
|
||||||
set_precedence(ON ON)
|
set_precedence(ON ON)
|
||||||
elseif (${PKG_ARGS_NAME}_FORCE_BUNDLED)
|
elseif (${PKG_ARGS_NAME}_FORCE_BUNDLED)
|
||||||
set_precedence(OFF OFF)
|
set_precedence(OFF OFF)
|
||||||
|
@ -449,14 +446,9 @@ function(AddPackage)
|
||||||
set_precedence(ON OFF)
|
set_precedence(ON OFF)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (DEFINED PKG_ARGS_VERSION)
|
|
||||||
list(APPEND EXTRA_ARGS
|
|
||||||
VERSION ${PKG_ARGS_VERSION}
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
CPMAddPackage(
|
CPMAddPackage(
|
||||||
NAME ${PKG_ARGS_NAME}
|
NAME ${PKG_ARGS_NAME}
|
||||||
|
VERSION ${PKG_ARGS_VERSION}
|
||||||
URL ${pkg_url}
|
URL ${pkg_url}
|
||||||
URL_HASH ${pkg_hash}
|
URL_HASH ${pkg_hash}
|
||||||
CUSTOM_CACHE_KEY ${pkg_key}
|
CUSTOM_CACHE_KEY ${pkg_key}
|
||||||
|
@ -467,8 +459,6 @@ function(AddPackage)
|
||||||
PATCHES ${PKG_ARGS_PATCHES}
|
PATCHES ${PKG_ARGS_PATCHES}
|
||||||
EXCLUDE_FROM_ALL ON
|
EXCLUDE_FROM_ALL ON
|
||||||
|
|
||||||
${EXTRA_ARGS}
|
|
||||||
|
|
||||||
${PKG_ARGS_UNPARSED_ARGUMENTS}
|
${PKG_ARGS_UNPARSED_ARGUMENTS}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -521,12 +511,12 @@ function(add_ci_package key)
|
||||||
NAME ${ARTIFACT_PACKAGE}
|
NAME ${ARTIFACT_PACKAGE}
|
||||||
REPO ${ARTIFACT_REPO}
|
REPO ${ARTIFACT_REPO}
|
||||||
TAG v${ARTIFACT_VERSION}
|
TAG v${ARTIFACT_VERSION}
|
||||||
GIT_VERSION ${ARTIFACT_VERSION}
|
VERSION ${ARTIFACT_VERSION}
|
||||||
ARTIFACT ${ARTIFACT}
|
ARTIFACT ${ARTIFACT}
|
||||||
|
|
||||||
KEY ${key}-${ARTIFACT_VERSION}
|
KEY ${key}
|
||||||
HASH_SUFFIX sha512sum
|
HASH_SUFFIX sha512sum
|
||||||
FORCE_BUNDLED_PACKAGE ON
|
BUNDLED_PACKAGE ON
|
||||||
)
|
)
|
||||||
|
|
||||||
set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE)
|
set(ARTIFACT_DIR ${${ARTIFACT_PACKAGE}_SOURCE_DIR} PARENT_SCOPE)
|
||||||
|
@ -543,6 +533,7 @@ function(AddCIPackage)
|
||||||
EXTENSION
|
EXTENSION
|
||||||
MIN_VERSION
|
MIN_VERSION
|
||||||
DISABLED_PLATFORMS
|
DISABLED_PLATFORMS
|
||||||
|
CMAKE_FILENAME
|
||||||
)
|
)
|
||||||
|
|
||||||
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN})
|
cmake_parse_arguments(PKG_ARGS "" "${oneValueArgs}" "" ${ARGN})
|
||||||
|
@ -598,28 +589,25 @@ function(AddCIPackage)
|
||||||
add_ci_package(android)
|
add_ci_package(android)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(PLATFORM_SUN AND NOT "solaris-amd64" IN_LIST DISABLED_PLATFORMS)
|
if(PLATFORM_SUN AND NOT "solaris" IN_LIST DISABLED_PLATFORMS)
|
||||||
add_ci_package(solaris-amd64)
|
add_ci_package(solaris)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(PLATFORM_FREEBSD AND NOT "freebsd-amd64" IN_LIST DISABLED_PLATFORMS)
|
if(PLATFORM_FREEBSD AND NOT "freebsd" IN_LIST DISABLED_PLATFORMS)
|
||||||
add_ci_package(freebsd-amd64)
|
add_ci_package(freebsd)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux-amd64" IN_LIST DISABLED_PLATFORMS)
|
if((PLATFORM_LINUX AND ARCHITECTURE_x86_64) AND NOT "linux" IN_LIST DISABLED_PLATFORMS)
|
||||||
add_ci_package(linux-amd64)
|
add_ci_package(linux)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if((PLATFORM_LINUX AND ARCHITECTURE_arm64) AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS)
|
if((PLATFORM_LINUX AND ARCHITECTURE_arm64) AND NOT "linux-aarch64" IN_LIST DISABLED_PLATFORMS)
|
||||||
add_ci_package(linux-aarch64)
|
add_ci_package(linux-aarch64)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# TODO(crueter): macOS amd64/aarch64 split mayhaps
|
|
||||||
if (APPLE AND NOT "macos-universal" IN_LIST DISABLED_PLATFORMS)
|
|
||||||
add_ci_package(macos-universal)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (DEFINED ARTIFACT_DIR)
|
if (DEFINED ARTIFACT_DIR)
|
||||||
|
include(${ARTIFACT_DIR}/${ARTIFACT_CMAKE}.cmake)
|
||||||
|
|
||||||
set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE)
|
set(${ARTIFACT_PACKAGE}_ADDED TRUE PARENT_SCOPE)
|
||||||
set(${ARTIFACT_PACKAGE}_SOURCE_DIR "${ARTIFACT_DIR}" PARENT_SCOPE)
|
set(${ARTIFACT_PACKAGE}_SOURCE_DIR "${ARTIFACT_DIR}" PARENT_SCOPE)
|
||||||
else()
|
else()
|
||||||
|
|
|
@ -10,7 +10,6 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi
|
||||||
set(package_base_url "https://github.com/eden-emulator/")
|
set(package_base_url "https://github.com/eden-emulator/")
|
||||||
set(package_repo "no_platform")
|
set(package_repo "no_platform")
|
||||||
set(package_extension "no_platform")
|
set(package_extension "no_platform")
|
||||||
set(CACHE_KEY "")
|
|
||||||
|
|
||||||
# TODO(crueter): Need to convert ffmpeg to a CI.
|
# TODO(crueter): Need to convert ffmpeg to a CI.
|
||||||
if (WIN32 OR FORCE_WIN_ARCHIVES)
|
if (WIN32 OR FORCE_WIN_ARCHIVES)
|
||||||
|
@ -34,9 +33,8 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "No package available for this platform")
|
message(FATAL_ERROR "No package available for this platform")
|
||||||
endif()
|
endif()
|
||||||
string(CONCAT package_url "${package_base_url}" "${package_repo}")
|
set(package_url "${package_base_url}${package_repo}")
|
||||||
string(CONCAT full_url "${package_url}" "${remote_path}" "${lib_name}" "${package_extension}")
|
set(full_url ${package_url}${remote_path}${lib_name}${package_extension})
|
||||||
message(STATUS "Resolved bundled URL: ${full_url}")
|
|
||||||
|
|
||||||
# TODO(crueter): DELETE THIS ENTIRELY, GLORY BE TO THE CI!
|
# TODO(crueter): DELETE THIS ENTIRELY, GLORY BE TO THE CI!
|
||||||
AddPackage(
|
AddPackage(
|
||||||
|
@ -49,12 +47,26 @@ function(download_bundled_external remote_path lib_name cpm_key prefix_var versi
|
||||||
# TODO(crueter): hash
|
# TODO(crueter): hash
|
||||||
)
|
)
|
||||||
|
|
||||||
if (DEFINED ${cpm_key}_SOURCE_DIR)
|
|
||||||
set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE)
|
set(${prefix_var} "${${cpm_key}_SOURCE_DIR}" PARENT_SCOPE)
|
||||||
message(STATUS "Using bundled binaries at ${${cpm_key}_SOURCE_DIR}")
|
message(STATUS "Using bundled binaries at ${${cpm_key}_SOURCE_DIR}")
|
||||||
else()
|
endfunction()
|
||||||
message(FATAL_ERROR "AddPackage did not set ${cpm_key}_SOURCE_DIR")
|
|
||||||
|
function(download_moltenvk_external platform version)
|
||||||
|
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
||||||
|
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
|
||||||
|
if (NOT EXISTS ${MOLTENVK_DIR})
|
||||||
|
if (NOT EXISTS ${MOLTENVK_TAR})
|
||||||
|
file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar
|
||||||
|
${MOLTENVK_TAR} SHOW_PROGRESS)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
|
||||||
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Add the MoltenVK library path to the prefix so find_library can locate it.
|
||||||
|
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}")
|
||||||
|
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
# Determine installation parameters for OS, architecture, and compiler
|
# Determine installation parameters for OS, architecture, and compiler
|
||||||
|
@ -96,7 +108,7 @@ function(determine_qt_parameters target host_out type_out arch_out arch_path_out
|
||||||
set(host "linux")
|
set(host "linux")
|
||||||
set(type "desktop")
|
set(type "desktop")
|
||||||
set(arch "linux_gcc_64")
|
set(arch "linux_gcc_64")
|
||||||
set(arch_path "gcc_64")
|
set(arch_path "linux")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(${host_out} "${host}" PARENT_SCOPE)
|
set(${host_out} "${host}" PARENT_SCOPE)
|
||||||
|
@ -131,79 +143,56 @@ function(download_qt_configuration prefix_out target host type arch arch_path ba
|
||||||
set(install_args -c "${CURRENT_MODULE_DIR}/aqt_config.ini")
|
set(install_args -c "${CURRENT_MODULE_DIR}/aqt_config.ini")
|
||||||
if (tool)
|
if (tool)
|
||||||
set(prefix "${base_path}/Tools")
|
set(prefix "${base_path}/Tools")
|
||||||
list(APPEND install_args install-tool --outputdir "${base_path}" "${host}" desktop "${target}")
|
set(install_args ${install_args} install-tool --outputdir ${base_path} ${host} desktop ${target})
|
||||||
else()
|
else()
|
||||||
set(prefix "${base_path}/${target}/${arch_path}")
|
set(prefix "${base_path}/${target}/${arch_path}")
|
||||||
list(APPEND install_args install-qt --outputdir "${base_path}" "${host}" "${type}" "${target}" "${arch}" -m qt_base)
|
set(install_args ${install_args} install-qt --outputdir ${base_path} ${host} ${type} ${target} ${arch} -m qt_base)
|
||||||
|
|
||||||
if (YUZU_USE_QT_MULTIMEDIA)
|
if (YUZU_USE_QT_MULTIMEDIA)
|
||||||
list(APPEND install_args qtmultimedia)
|
set(install_args ${install_args} qtmultimedia)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_USE_QT_WEB_ENGINE)
|
if (YUZU_USE_QT_WEB_ENGINE)
|
||||||
list(APPEND install_args qtpositioning qtwebchannel qtwebengine)
|
set(install_args ${install_args} qtpositioning qtwebchannel qtwebengine)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (NOT "${YUZU_QT_MIRROR}" STREQUAL "")
|
if (NOT ${YUZU_QT_MIRROR} STREQUAL "")
|
||||||
message(STATUS "Using Qt mirror ${YUZU_QT_MIRROR}")
|
message(STATUS "Using Qt mirror ${YUZU_QT_MIRROR}")
|
||||||
list(APPEND install_args -b "${YUZU_QT_MIRROR}")
|
set(install_args ${install_args} -b ${YUZU_QT_MIRROR})
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS "Install Args: ${install_args}")
|
message(STATUS "Install Args ${install_args}")
|
||||||
|
|
||||||
if (NOT EXISTS "${prefix}")
|
if (NOT EXISTS "${prefix}")
|
||||||
message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}")
|
message(STATUS "Downloading Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path}")
|
||||||
set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.3.0")
|
set(AQT_PREBUILD_BASE_URL "https://github.com/miurahr/aqtinstall/releases/download/v3.3.0")
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
set(aqt_path "${base_path}/aqt.exe")
|
set(aqt_path "${base_path}/aqt.exe")
|
||||||
if (NOT EXISTS "${aqt_path}")
|
if (NOT EXISTS "${aqt_path}")
|
||||||
file(DOWNLOAD "${AQT_PREBUILD_BASE_URL}/aqt.exe" "${aqt_path}" SHOW_PROGRESS)
|
file(DOWNLOAD
|
||||||
endif()
|
${AQT_PREBUILD_BASE_URL}/aqt.exe
|
||||||
execute_process(COMMAND "${aqt_path}" ${install_args}
|
${aqt_path} SHOW_PROGRESS)
|
||||||
WORKING_DIRECTORY "${base_path}"
|
|
||||||
RESULT_VARIABLE aqt_res
|
|
||||||
OUTPUT_VARIABLE aqt_out
|
|
||||||
ERROR_VARIABLE aqt_err)
|
|
||||||
if (NOT aqt_res EQUAL 0)
|
|
||||||
message(FATAL_ERROR "aqt.exe failed: ${aqt_err}")
|
|
||||||
endif()
|
endif()
|
||||||
|
execute_process(COMMAND ${aqt_path} ${install_args}
|
||||||
|
WORKING_DIRECTORY ${base_path})
|
||||||
elseif (APPLE)
|
elseif (APPLE)
|
||||||
set(aqt_path "${base_path}/aqt-macos")
|
set(aqt_path "${base_path}/aqt-macos")
|
||||||
if (NOT EXISTS "${aqt_path}")
|
if (NOT EXISTS "${aqt_path}")
|
||||||
file(DOWNLOAD "${AQT_PREBUILD_BASE_URL}/aqt-macos" "${aqt_path}" SHOW_PROGRESS)
|
file(DOWNLOAD
|
||||||
endif()
|
${AQT_PREBUILD_BASE_URL}/aqt-macos
|
||||||
execute_process(COMMAND chmod +x "${aqt_path}")
|
${aqt_path} SHOW_PROGRESS)
|
||||||
execute_process(COMMAND "${aqt_path}" ${install_args}
|
|
||||||
WORKING_DIRECTORY "${base_path}"
|
|
||||||
RESULT_VARIABLE aqt_res
|
|
||||||
ERROR_VARIABLE aqt_err)
|
|
||||||
if (NOT aqt_res EQUAL 0)
|
|
||||||
message(FATAL_ERROR "aqt-macos failed: ${aqt_err}")
|
|
||||||
endif()
|
endif()
|
||||||
|
execute_process(COMMAND chmod +x ${aqt_path})
|
||||||
|
execute_process(COMMAND ${aqt_path} ${install_args}
|
||||||
|
WORKING_DIRECTORY ${base_path})
|
||||||
else()
|
else()
|
||||||
find_program(PYTHON3_EXECUTABLE python3)
|
|
||||||
if (NOT PYTHON3_EXECUTABLE)
|
|
||||||
message(FATAL_ERROR "python3 is required to install Qt using aqt (pip mode).")
|
|
||||||
endif()
|
|
||||||
set(aqt_install_path "${base_path}/aqt")
|
set(aqt_install_path "${base_path}/aqt")
|
||||||
file(MAKE_DIRECTORY "${aqt_install_path}")
|
file(MAKE_DIRECTORY "${aqt_install_path}")
|
||||||
|
|
||||||
execute_process(COMMAND "${PYTHON3_EXECUTABLE}" -m pip install --target="${aqt_install_path}" aqtinstall
|
execute_process(COMMAND python3 -m pip install --target=${aqt_install_path} aqtinstall
|
||||||
WORKING_DIRECTORY "${base_path}"
|
WORKING_DIRECTORY ${base_path})
|
||||||
RESULT_VARIABLE pip_res
|
execute_process(COMMAND ${CMAKE_COMMAND} -E env PYTHONPATH=${aqt_install_path} python3 -m aqt ${install_args}
|
||||||
ERROR_VARIABLE pip_err)
|
WORKING_DIRECTORY ${base_path})
|
||||||
if (NOT pip_res EQUAL 0)
|
|
||||||
message(FATAL_ERROR "pip install aqtinstall failed: ${pip_err}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(COMMAND "${CMAKE_COMMAND}" -E env PYTHONPATH="${aqt_install_path}" "${PYTHON3_EXECUTABLE}" -m aqt ${install_args}
|
|
||||||
WORKING_DIRECTORY "${base_path}"
|
|
||||||
RESULT_VARIABLE aqt_res
|
|
||||||
ERROR_VARIABLE aqt_err)
|
|
||||||
if (NOT aqt_res EQUAL 0)
|
|
||||||
message(FATAL_ERROR "aqt (python) failed: ${aqt_err}")
|
|
||||||
endif()
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
message(STATUS "Downloaded Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path} to ${prefix}")
|
message(STATUS "Downloaded Qt binaries for ${target}:${host}:${type}:${arch}:${arch_path} to ${prefix}")
|
||||||
|
@ -221,7 +210,7 @@ endfunction()
|
||||||
function(download_qt target)
|
function(download_qt target)
|
||||||
determine_qt_parameters("${target}" host type arch arch_path host_type host_arch host_arch_path)
|
determine_qt_parameters("${target}" host type arch arch_path host_type host_arch host_arch_path)
|
||||||
|
|
||||||
set(base_path "${CMAKE_BINARY_DIR}/externals/qt")
|
get_external_prefix(qt base_path)
|
||||||
file(MAKE_DIRECTORY "${base_path}")
|
file(MAKE_DIRECTORY "${base_path}")
|
||||||
|
|
||||||
download_qt_configuration(prefix "${target}" "${host}" "${type}" "${arch}" "${arch_path}" "${base_path}")
|
download_qt_configuration(prefix "${target}" "${host}" "${type}" "${arch}" "${arch_path}" "${base_path}")
|
||||||
|
@ -238,34 +227,26 @@ function(download_qt target)
|
||||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
function(download_moltenvk version platform)
|
function(download_moltenvk)
|
||||||
if(NOT version)
|
set(MOLTENVK_PLATFORM "macOS")
|
||||||
message(FATAL_ERROR "download_moltenvk: version argument is required")
|
|
||||||
endif()
|
|
||||||
if(NOT platform)
|
|
||||||
message(FATAL_ERROR "download_moltenvk: platform argument is required")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
set(MOLTENVK_DIR "${CMAKE_BINARY_DIR}/externals/MoltenVK")
|
||||||
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
|
set(MOLTENVK_TAR "${CMAKE_BINARY_DIR}/externals/MoltenVK.tar")
|
||||||
|
if (NOT EXISTS ${MOLTENVK_DIR})
|
||||||
|
if (NOT EXISTS ${MOLTENVK_TAR})
|
||||||
|
file(DOWNLOAD https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.10-rc2/MoltenVK-all.tar
|
||||||
|
${MOLTENVK_TAR} SHOW_PROGRESS)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT EXISTS "${MOLTENVK_DIR}")
|
execute_process(COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
|
||||||
if(NOT EXISTS "${MOLTENVK_TAR}")
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals")
|
||||||
file(DOWNLOAD "https://github.com/KhronosGroup/MoltenVK/releases/download/${version}/MoltenVK-${platform}.tar"
|
endif()
|
||||||
"${MOLTENVK_TAR}" SHOW_PROGRESS)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
execute_process(
|
# Add the MoltenVK library path to the prefix so find_library can locate it.
|
||||||
COMMAND ${CMAKE_COMMAND} -E tar xf "${MOLTENVK_TAR}"
|
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${MOLTENVK_PLATFORM}")
|
||||||
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/externals"
|
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
||||||
RESULT_VARIABLE tar_res
|
|
||||||
ERROR_VARIABLE tar_err
|
|
||||||
)
|
|
||||||
if(NOT tar_res EQUAL 0)
|
|
||||||
message(FATAL_ERROR "Extracting MoltenVK failed: ${tar_err}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
list(APPEND CMAKE_PREFIX_PATH "${MOLTENVK_DIR}/MoltenVK/dylib/${platform}")
|
|
||||||
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} PARENT_SCOPE)
|
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
function(get_external_prefix lib_name prefix_var)
|
||||||
|
set(${prefix_var} "${CMAKE_BINARY_DIR}/externals/${lib_name}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
|
@ -13,12 +13,9 @@ find_package_handle_standard_args(zstd
|
||||||
if (zstd_FOUND AND NOT TARGET zstd::zstd)
|
if (zstd_FOUND AND NOT TARGET zstd::zstd)
|
||||||
if (TARGET zstd::libzstd_shared)
|
if (TARGET zstd::libzstd_shared)
|
||||||
add_library(zstd::zstd ALIAS zstd::libzstd_shared)
|
add_library(zstd::zstd ALIAS zstd::libzstd_shared)
|
||||||
add_library(zstd::libzstd ALIAS zstd::libzstd_shared)
|
|
||||||
elseif (TARGET zstd::libzstd_static)
|
elseif (TARGET zstd::libzstd_static)
|
||||||
add_library(zstd::zstd ALIAS zstd::libzstd_static)
|
add_library(zstd::zstd ALIAS zstd::libzstd_static)
|
||||||
add_library(zstd::libzstd ALIAS zstd::libzstd_static)
|
|
||||||
else()
|
else()
|
||||||
add_library(zstd::zstd ALIAS PkgConfig::ZSTD)
|
add_library(zstd::zstd ALIAS PkgConfig::ZSTD)
|
||||||
add_library(zstd::libzstd ALIAS PkgConfig::ZSTD)
|
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
|
@ -31,11 +31,7 @@ set(GIT_DESC ${BUILD_VERSION})
|
||||||
set(REPO_NAME "Eden")
|
set(REPO_NAME "Eden")
|
||||||
set(BUILD_ID ${GIT_REFSPEC})
|
set(BUILD_ID ${GIT_REFSPEC})
|
||||||
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
set(BUILD_FULLNAME "${REPO_NAME} ${BUILD_VERSION} ")
|
||||||
|
|
||||||
set(CXX_COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
|
set(CXX_COMPILER "${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}")
|
||||||
|
|
||||||
# Auto-updater metadata! Must somewhat mirror GitHub API endpoint
|
|
||||||
set(BUILD_AUTO_UPDATE_WEBSITE "https://github.com")
|
|
||||||
set(BUILD_AUTO_UPDATE_API "http://api.github.com")
|
|
||||||
set(BUILD_AUTO_UPDATE_REPO "eden-emulator/Releases")
|
|
||||||
|
|
||||||
configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY)
|
configure_file(scm_rev.cpp.in scm_rev.cpp @ONLY)
|
||||||
|
|
|
@ -48,8 +48,6 @@ A list of supported games will be available in future. Please be patient.
|
||||||
|
|
||||||
Check out our [website](https://eden-emu.dev) for the latest news on exciting features, monthly progress reports, and more!
|
Check out our [website](https://eden-emu.dev) for the latest news on exciting features, monthly progress reports, and more!
|
||||||
|
|
||||||
[](https://repology.org/project/eden-emulator/versions)
|
|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
|
|
||||||
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/kXAmGCXBGD) or [Revolt](https://rvlt.gg/qKgFEAbH).
|
Most of the development happens on our Git server. It is also where [our central repository](https://git.eden-emu.dev/eden-emu/eden) is hosted. For development discussions, please join us on [Discord](https://discord.gg/kXAmGCXBGD) or [Revolt](https://rvlt.gg/qKgFEAbH).
|
||||||
|
@ -65,8 +63,6 @@ Alternatively, if you wish to add translations, go to the [Eden project on Trans
|
||||||
|
|
||||||
See the [General Build Guide](docs/Build.md)
|
See the [General Build Guide](docs/Build.md)
|
||||||
|
|
||||||
For information on provided development tooling, see the [Tools directory](./tools)
|
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
You can download the latest releases from [here](https://github.com/eden-emulator/Releases/releases).
|
You can download the latest releases from [here](https://github.com/eden-emulator/Releases/releases).
|
||||||
|
|
133
cpmfile.json
133
cpmfile.json
|
@ -4,11 +4,8 @@
|
||||||
"package": "OpenSSL",
|
"package": "OpenSSL",
|
||||||
"name": "openssl",
|
"name": "openssl",
|
||||||
"repo": "crueter-ci/OpenSSL",
|
"repo": "crueter-ci/OpenSSL",
|
||||||
"version": "3.6.0",
|
"version": "3.5.3",
|
||||||
"min_version": "1.1.1",
|
"min_version": "1.1.1"
|
||||||
"disabled_platforms": [
|
|
||||||
"macos-universal"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"boost": {
|
"boost": {
|
||||||
"package": "Boost",
|
"package": "Boost",
|
||||||
|
@ -18,7 +15,6 @@
|
||||||
"hash": "4fb7f6fde92762305aad8754d7643cd918dd1f3f67e104e9ab385b18c73178d72a17321354eb203b790b6702f2cf6d725a5d6e2dfbc63b1e35f9eb59fb42ece9",
|
"hash": "4fb7f6fde92762305aad8754d7643cd918dd1f3f67e104e9ab385b18c73178d72a17321354eb203b790b6702f2cf6d725a5d6e2dfbc63b1e35f9eb59fb42ece9",
|
||||||
"git_version": "1.89.0",
|
"git_version": "1.89.0",
|
||||||
"version": "1.57",
|
"version": "1.57",
|
||||||
"find_args": "CONFIG",
|
|
||||||
"patches": [
|
"patches": [
|
||||||
"0001-clang-cl.patch",
|
"0001-clang-cl.patch",
|
||||||
"0002-use-marmasm.patch",
|
"0002-use-marmasm.patch",
|
||||||
|
@ -27,10 +23,12 @@
|
||||||
},
|
},
|
||||||
"fmt": {
|
"fmt": {
|
||||||
"repo": "fmtlib/fmt",
|
"repo": "fmtlib/fmt",
|
||||||
"tag": "%VERSION%",
|
"sha": "40626af88b",
|
||||||
"hash": "c4ab814c20fbad7e3f0ae169125a4988a2795631194703251481dc36b18da65c886c4faa9acd046b0a295005217b3689eb0126108a9ba5aac2ca909aae263c2f",
|
"hash": "d59f06c24339f223de4ec2afeba1c67b5835a0f350a1ffa86242a72fc3e616a6b8b21798355428d4200c75287308b66634619ffa0b52ba5bd74cc01772ea1a8a",
|
||||||
"version": "8",
|
"version": "8",
|
||||||
"git_version": "12.0.0"
|
"options": [
|
||||||
|
"FMT_INSTALL OFF"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"lz4": {
|
"lz4": {
|
||||||
"name": "lz4",
|
"name": "lz4",
|
||||||
|
@ -42,18 +40,16 @@
|
||||||
"nlohmann": {
|
"nlohmann": {
|
||||||
"package": "nlohmann_json",
|
"package": "nlohmann_json",
|
||||||
"repo": "nlohmann/json",
|
"repo": "nlohmann/json",
|
||||||
"tag": "v%VERSION%",
|
"sha": "55f93686c0",
|
||||||
"hash": "6cc1e86261f8fac21cc17a33da3b6b3c3cd5c116755651642af3c9e99bb3538fd42c1bd50397a77c8fb6821bc62d90e6b91bcdde77a78f58f2416c62fc53b97d",
|
"hash": "b739749b066800e21154506ea150d2c5cbce8a45344177f46f884547a1399d26753166fd0df8135269ce28cf223552b1b65cd625b88c844d54753f2434900486",
|
||||||
"version": "3.8",
|
"version": "3.8"
|
||||||
"git_version": "3.12.0"
|
|
||||||
},
|
},
|
||||||
"zlib": {
|
"zlib": {
|
||||||
"package": "ZLIB",
|
"package": "ZLIB",
|
||||||
"repo": "madler/zlib",
|
"repo": "madler/zlib",
|
||||||
"tag": "v%VERSION%",
|
"sha": "51b7f2abda",
|
||||||
"hash": "8c9642495bafd6fad4ab9fb67f09b268c69ff9af0f4f20cf15dfc18852ff1f312bd8ca41de761b3f8d8e90e77d79f2ccacd3d4c5b19e475ecf09d021fdfe9088",
|
"hash": "16eaf1f3752489d12fd9ce30f7b5f7cbd5cb8ff53d617005a9847ae72d937f65e01e68be747f62d7ac19fd0c9aeba9956e60f16d6b465c5fdc2f3d08b4db2e6c",
|
||||||
"version": "1.2",
|
"version": "1.2",
|
||||||
"git_version": "1.3.1",
|
|
||||||
"options": [
|
"options": [
|
||||||
"ZLIB_BUILD_SHARED OFF",
|
"ZLIB_BUILD_SHARED OFF",
|
||||||
"ZLIB_INSTALL OFF"
|
"ZLIB_INSTALL OFF"
|
||||||
|
@ -61,8 +57,8 @@
|
||||||
},
|
},
|
||||||
"zstd": {
|
"zstd": {
|
||||||
"repo": "facebook/zstd",
|
"repo": "facebook/zstd",
|
||||||
"sha": "b8d6101fba",
|
"sha": "f8745da6ff",
|
||||||
"hash": "a6c8e5272214fd3e65e03ae4fc375f452bd2f646623886664ee23e239e35751cfc842db4d34a84a8039d89fc8f76556121f2a4ae350d017bdff5e22150f9c3de",
|
"hash": "3037007f990040fe32573b46f9bef8762fd5dbeeb07ffffcbfeba51ec98167edae39bb9c87f9299efcd61c4e467c5e84f7c19f0df7799bc1fc04864a278792ee",
|
||||||
"version": "1.5",
|
"version": "1.5",
|
||||||
"source_subdir": "build/cmake",
|
"source_subdir": "build/cmake",
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE",
|
||||||
|
@ -70,6 +66,20 @@
|
||||||
"ZSTD_BUILD_SHARED OFF"
|
"ZSTD_BUILD_SHARED OFF"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"catch2": {
|
||||||
|
"package": "Catch2",
|
||||||
|
"repo": "catchorg/Catch2",
|
||||||
|
"sha": "644821ce28",
|
||||||
|
"hash": "f8795f98acf2c02c0db8e734cc866d5caebab4b4a306e93598b97cb3c0c728dafe8283dce27ffe8d42460e5ae7302f3f32e7e274a7f991b73511ac88eef21b1f",
|
||||||
|
"version": "3.0.1"
|
||||||
|
},
|
||||||
|
"enet": {
|
||||||
|
"repo": "lsalzman/enet",
|
||||||
|
"sha": "2662c0de09",
|
||||||
|
"hash": "3de1beb4fa3d6b1e03eda8dd1e7580694f854af3ed3975dcdabfdcdf76b97f322b9734d35ea7f185855bb490d957842b938b26da4dd2dfded509390f8d2794dd",
|
||||||
|
"version": "1.3",
|
||||||
|
"find_args": "MODULE"
|
||||||
|
},
|
||||||
"opus": {
|
"opus": {
|
||||||
"package": "Opus",
|
"package": "Opus",
|
||||||
"repo": "crueter/opus",
|
"repo": "crueter/opus",
|
||||||
|
@ -81,16 +91,101 @@
|
||||||
"OPUS_PRESUME_NEON ON"
|
"OPUS_PRESUME_NEON ON"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"vulkan-utility-headers": {
|
||||||
|
"package": "VulkanUtilityLibraries",
|
||||||
|
"repo": "scripts/VulkanUtilityHeaders",
|
||||||
|
"tag": "1.4.326",
|
||||||
|
"artifact": "VulkanUtilityHeaders.tar.zst",
|
||||||
|
"git_host": "git.crueter.xyz",
|
||||||
|
"hash": "5924629755cb1605c4aa4eee20ef7957a9dd8d61e4df548be656d98054f2730c4109693c1bd35811f401f4705d2ccff9fc849be32b0d8480bc3f73541a5e0964"
|
||||||
|
},
|
||||||
|
"spirv-tools": {
|
||||||
|
"package": "SPIRV-Tools",
|
||||||
|
"repo": "KhronosGroup/SPIRV-Tools",
|
||||||
|
"sha": "40eb301f32",
|
||||||
|
"hash": "58d0fb1047d69373cf24c73e6f78c73a72a6cca3b4df1d9f083b9dcc0962745ef154abf3dbe9b3623b835be20c6ec769431cf11733349f45e7568b3525f707aa",
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"options": [
|
||||||
|
"SPIRV_SKIP_EXECUTABLES ON"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"spirv-headers": {
|
||||||
|
"package": "SPIRV-Headers",
|
||||||
|
"repo": "KhronosGroup/SPIRV-Headers",
|
||||||
|
"sha": "4e209d3d7e",
|
||||||
|
"hash": "f48bbe18341ed55ea0fe280dbbbc0a44bf222278de6e716e143ca1e95ca320b06d4d23d6583fbf8d03e1428f3dac8fa00e5b82ddcd6b425e6236d85af09550a4",
|
||||||
|
"options": [
|
||||||
|
"SPIRV_WERROR OFF"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mbedtls": {
|
||||||
|
"package": "MbedTLS",
|
||||||
|
"repo": "Mbed-TLS/mbedtls",
|
||||||
|
"tag": "mbedtls-%VERSION%",
|
||||||
|
"hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da",
|
||||||
|
"version": "3",
|
||||||
|
"git_version": "3.6.4",
|
||||||
|
"artifact": "%TAG%.tar.bz2"
|
||||||
|
},
|
||||||
|
"cubeb": {
|
||||||
|
"repo": "mozilla/cubeb",
|
||||||
|
"sha": "fa02160712",
|
||||||
|
"hash": "82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61",
|
||||||
|
"find_args": "CONFIG",
|
||||||
|
"options": [
|
||||||
|
"USE_SANITIZERS OFF",
|
||||||
|
"BUILD_TESTS OFF",
|
||||||
|
"BUILD_TOOLS OFF",
|
||||||
|
"BUNDLE_SPEEX ON"
|
||||||
|
]
|
||||||
|
},
|
||||||
"boost_headers": {
|
"boost_headers": {
|
||||||
"repo": "boostorg/headers",
|
"repo": "boostorg/headers",
|
||||||
"sha": "95930ca8f5",
|
"sha": "95930ca8f5",
|
||||||
"hash": "d1dece16f3b209109de02123c537bfe1adf07a62b16c166367e7e5d62e0f7c323bf804c89b3192dd6871bc58a9d879d25a1cc3f7b9da0e497cf266f165816e2a",
|
"hash": "d1dece16f3b209109de02123c537bfe1adf07a62b16c166367e7e5d62e0f7c323bf804c89b3192dd6871bc58a9d879d25a1cc3f7b9da0e497cf266f165816e2a",
|
||||||
"bundled": true
|
"bundled": true
|
||||||
},
|
},
|
||||||
|
"discord-rpc": {
|
||||||
|
"repo": "eden-emulator/discord-rpc",
|
||||||
|
"sha": "1cf7772bb6",
|
||||||
|
"hash": "e9b35e6f2c075823257bcd59f06fe7bb2ccce1976f44818d2e28810435ef79c712a3c4f20f40da41f691342a4058cf86b078eb7f9d9e4dae83c0547c21ec4f97"
|
||||||
|
},
|
||||||
|
"simpleini": {
|
||||||
|
"package": "SimpleIni",
|
||||||
|
"repo": "brofield/simpleini",
|
||||||
|
"sha": "09c21bda1d",
|
||||||
|
"hash": "99779ca9b6e040d36558cadf484f9ffdab5b47bcc8fc72e4d33639d1d60c0ceb4410d335ba445d72a4324e455167fd6769d99b459943aa135bec085dff2d4b7c",
|
||||||
|
"find_args": "MODULE"
|
||||||
|
},
|
||||||
|
"sdl2_generic": {
|
||||||
|
"package": "SDL2",
|
||||||
|
"repo": "libsdl-org/SDL",
|
||||||
|
"sha": "54772f345a",
|
||||||
|
"hash": "2a68a0e01c390043aa9d9df63d8a20a52076c88bb460ac4e0f33194ca7d9bc8fadbbcc04e7506872ac4b6354a73fbc267c036f82200da59465789b87c7d9e3a4",
|
||||||
|
"key": "generic",
|
||||||
|
"bundled": true
|
||||||
|
},
|
||||||
|
"sdl2_steamdeck": {
|
||||||
|
"package": "SDL2",
|
||||||
|
"repo": "libsdl-org/SDL",
|
||||||
|
"sha": "cc016b0046",
|
||||||
|
"hash": "34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b",
|
||||||
|
"key": "steamdeck",
|
||||||
|
"bundled": true
|
||||||
|
},
|
||||||
|
"sdl2": {
|
||||||
|
"ci": true,
|
||||||
|
"package": "SDL2",
|
||||||
|
"name": "SDL2",
|
||||||
|
"repo": "crueter-ci/SDL2",
|
||||||
|
"version": "2.32.8",
|
||||||
|
"min_version": "2.26.4",
|
||||||
|
"cmake_filename": "sdl2"
|
||||||
|
},
|
||||||
"llvm-mingw": {
|
"llvm-mingw": {
|
||||||
"repo": "misc/llvm-mingw",
|
"repo": "misc/llvm-mingw",
|
||||||
"git_host": "git.crueter.xyz",
|
"git_host": "git.crueter.xyz",
|
||||||
"tag": "%VERSION%",
|
"tag": "20250828",
|
||||||
"version": "20250828",
|
"version": "20250828",
|
||||||
"artifact": "clang-rt-builtins.tar.zst",
|
"artifact": "clang-rt-builtins.tar.zst",
|
||||||
"hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181"
|
"hash": "d902392caf94e84f223766e2cc51ca5fab6cae36ab8dc6ef9ef6a683ab1c483bfcfe291ef0bd38ab16a4ecc4078344fa8af72da2f225ab4c378dee23f6186181"
|
||||||
|
|
250
docs/CPM.md
Normal file
250
docs/CPM.md
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
# CPM
|
||||||
|
|
||||||
|
CPM (CMake Package Manager) is the preferred method of managing dependencies within Eden.
|
||||||
|
|
||||||
|
Global Options:
|
||||||
|
|
||||||
|
- `YUZU_USE_CPM` is set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing
|
||||||
|
* If this is `OFF`, required system dependencies will be searched via `find_package`, although certain externals use CPM regardless.
|
||||||
|
- `CPMUTIL_FORCE_SYSTEM` (default `OFF`): Require all CPM dependencies to use system packages. NOT RECOMMENDED!
|
||||||
|
* Many packages, e.g. mcl, sirit, xbyak, discord-rpc, are not generally available as a system package.
|
||||||
|
* You may optionally override these (see CPMUtil section)
|
||||||
|
- `CPMUTIL_FORCE_BUNDLED` (default `ON` on MSVC and Android, `OFF` elsewhere): Require all CPM dependencies to use bundled packages.
|
||||||
|
|
||||||
|
## CPMUtil
|
||||||
|
|
||||||
|
CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful utility functions to make dependency management a piece of cake.
|
||||||
|
|
||||||
|
### AddPackage
|
||||||
|
|
||||||
|
`AddPackage` is the core of the CPMUtil wrapper, and is generally the lowest level you will need to go when dealing with dependencies.
|
||||||
|
|
||||||
|
**Identification/Fetching**
|
||||||
|
|
||||||
|
- `NAME` (required): The package name (must be the same as the `find_package` name if applicable)
|
||||||
|
- `VERSION`: The minimum version of this package that can be used on the system
|
||||||
|
- `GIT_VERSION`: The "version" found within git
|
||||||
|
- `URL`: The URL to fetch.
|
||||||
|
- `REPO`: The GitHub repo to use (`owner/repo`).
|
||||||
|
* Only GitHub is supported for now, though other platforms will see support at some point
|
||||||
|
- `TAG`: The tag to fetch, if applicable.
|
||||||
|
- `ARTIFACT`: The name of the artifact, if applicable.
|
||||||
|
- `SHA`: Commit sha to fetch, if applicable.
|
||||||
|
- `BRANCH`: Branch to fetch, if applicable.
|
||||||
|
|
||||||
|
The following configurations are supported, in descending order of precedence:
|
||||||
|
|
||||||
|
- `URL`: Bare URL download, useful for custom artifacts
|
||||||
|
* If this is set, `GIT_URL` or `REPO` should be set to allow the dependency viewer to link to the project's Git repository.
|
||||||
|
* If this is NOT set, `REPO` must be defined.
|
||||||
|
- `REPO + TAG + ARTIFACT`: GitHub release artifact
|
||||||
|
* The final download URL will be `https://github.com/${REPO}/releases/download/${TAG}/${ARTIFACT}`
|
||||||
|
* Useful for prebuilt libraries and prefetched archives
|
||||||
|
- `REPO + TAG`: GitHub tag archive
|
||||||
|
* The final download URL will be `https://github.com/${REPO}/archive/refs/tags/${TAG}.tar.gz`
|
||||||
|
* Useful for pinning to a specific tag, better for build identification
|
||||||
|
- `REPO + SHA`: GitHub commit archive
|
||||||
|
* The final download URL will be `https://github.com/${REPO}/archive/${SHA}.zip`
|
||||||
|
* Useful for pinning to a specific commit
|
||||||
|
- `REPO + BRANCH`: GitHub branch archive
|
||||||
|
* The final download URL will be `https://github.com/${REPO}/archive/refs/heads/${BRANCH}.zip`
|
||||||
|
* Generally not recommended unless the branch is frozen
|
||||||
|
- `REPO`: GitHub master archive
|
||||||
|
* The final download URL will be `https://github.com/${REPO}/archive/refs/heads/master.zip`
|
||||||
|
* Generally not recommended unless the project is dead
|
||||||
|
|
||||||
|
**Hashing**
|
||||||
|
|
||||||
|
Hashing is used for verifying downloads. It's highly recommended to use these.
|
||||||
|
|
||||||
|
- `HASH_ALGO` (default `SHA512`): Hash algorithm to use
|
||||||
|
|
||||||
|
Hashing strategies, descending order of precedence:
|
||||||
|
|
||||||
|
- `HASH`: Bare hash verification, useful for static downloads e.g. commit archives
|
||||||
|
- `HASH_SUFFIX`: Download the hash as `${DOWNLOAD_URL}.${HASH_SUFFIX}`
|
||||||
|
* The downloaded hash *must* match the hash algorithm and contain nothing but the hash; no filenames or extra content.
|
||||||
|
- `HASH_URL`: Download the hash from a separate URL
|
||||||
|
|
||||||
|
**Additional Options**
|
||||||
|
|
||||||
|
- `KEY`: Custom cache key to use (stored as `.cache/cpm/${packagename_lower}/${key}`)
|
||||||
|
* Default is based on, in descending order of precedence:
|
||||||
|
- First 4 characters of the sha
|
||||||
|
- `GIT_VERSION`
|
||||||
|
- Tag
|
||||||
|
- `VERSION`
|
||||||
|
- Otherwise, CPM defaults will be used. This is not recommended as it doesn't produce reproducible caches
|
||||||
|
- `DOWNLOAD_ONLY`: Whether or not to configure the downloaded package via CMake
|
||||||
|
* Useful to turn `OFF` if the project doesn't use CMake
|
||||||
|
- `SOURCE_SUBDIR`: Subdirectory of the project containing a CMakeLists.txt file
|
||||||
|
- `FIND_PACKAGE_ARGUMENTS`: Arguments to pass to the `find_package` call
|
||||||
|
- `BUNDLED_PACKAGE`: Set to `ON` to force the usage of a bundled package
|
||||||
|
- `OPTIONS`: Options to pass to the configuration of the package
|
||||||
|
- `PATCHES`: Patches to apply to the package, stored in `.patch/${packagename_lower}/0001-patch-name.patch` and so on
|
||||||
|
- Other arguments can be passed to CPM as well
|
||||||
|
|
||||||
|
**Extra Variables**
|
||||||
|
|
||||||
|
For each added package, users may additionally force usage of the system/bundled package.
|
||||||
|
|
||||||
|
- `${package}_FORCE_SYSTEM`: Require the package to be installed on the system
|
||||||
|
- `${package}_FORCE_BUNDLED`: Force the package to be fetched and use the bundled version
|
||||||
|
|
||||||
|
**Bundled/System Switching**
|
||||||
|
|
||||||
|
Descending order of precedence:
|
||||||
|
- If `${package}_FORCE_SYSTEM` is true, requires the package to be on the system
|
||||||
|
- If `${package}_FORCE_BUNDLED` is true, forcefully uses the bundled package
|
||||||
|
- If `CPMUTIL_FORCE_SYSTEM` is true, requires the package to be on the system
|
||||||
|
- If `CPMUTIL_FORCE_BUNDLED` is true, forcefully uses the bundled package
|
||||||
|
- If the `BUNDLED_PACKAGE` argument is true, forcefully uses the bundled package
|
||||||
|
- Otherwise, CPM will search for the package first, and if not found, will use the bundled package
|
||||||
|
|
||||||
|
**Identification**
|
||||||
|
|
||||||
|
All dependencies must be identifiable in some way for usage in the dependency viewer. Lists are provided in descending order of precedence.
|
||||||
|
|
||||||
|
URLs:
|
||||||
|
|
||||||
|
- `GIT_URL`
|
||||||
|
- `REPO` as a GitHub repository
|
||||||
|
- `URL`
|
||||||
|
|
||||||
|
Versions (bundled):
|
||||||
|
|
||||||
|
- `SHA`
|
||||||
|
- `GIT_VERSION`
|
||||||
|
- `VERSION`
|
||||||
|
- `TAG`
|
||||||
|
- "unknown"
|
||||||
|
|
||||||
|
If the package is a system package, AddPackage will attempt to determine the package version and append ` (system)` to the identifier. Otherwise, it will be marked as `unknown (system)`
|
||||||
|
|
||||||
|
### AddCIPackage
|
||||||
|
|
||||||
|
Adds a package that follows crueter's CI repository spec.
|
||||||
|
|
||||||
|
- `VERSION` (required): The version to get (the tag will be `v${VERSION}`)
|
||||||
|
- `NAME` (required): Name used within the artifacts
|
||||||
|
- `REPO` (required): CI repository, e.g. `crueter-ci/OpenSSL`
|
||||||
|
- `PACKAGE` (required): `find_package` package name
|
||||||
|
- `EXTENSION`: Artifact extension (default `tar.zst`)
|
||||||
|
- `MIN_VERSION`: Minimum version for `find_package`. Only used if platform does not support this package as a bundled artifact
|
||||||
|
- `DISABLED_PLATFORMS`: List of platforms that lack artifacts for this package. One of:
|
||||||
|
* `windows-amd64`
|
||||||
|
* `windows-arm64`
|
||||||
|
* `android`
|
||||||
|
* `solaris`
|
||||||
|
* `freebsd`
|
||||||
|
* `linux`
|
||||||
|
* `linux-aarch64`
|
||||||
|
- `CMAKE_FILENAME`: Custom CMake filename, relative to the package root (default `${PACKAGE_ROOT}/${NAME}.cmake`)
|
||||||
|
|
||||||
|
### AddJsonPackage
|
||||||
|
|
||||||
|
This is the recommended method of usage for CPMUtil. In each directory that utilizes `CPMUtil`, there must be a `cpmfile.json` that defines dependencies in a similar manner to the individual calls.
|
||||||
|
|
||||||
|
The cpmfile is an object of objects, with each sub-object being named according to the package's identifier, e.g. `openssl`, which can then be fetched with `AddJsonPackage(<identifier>)`. Options are designed to map closely to the argument names, and are always strings unless otherwise specified.
|
||||||
|
|
||||||
|
- `package` -> `NAME` (`PACKAGE` for CI), defaults to the object key
|
||||||
|
- `repo` -> `REPO`
|
||||||
|
- `version` -> `VERSION`
|
||||||
|
- `ci` (bool)
|
||||||
|
|
||||||
|
If `ci` is `false`:
|
||||||
|
|
||||||
|
- `hash` -> `HASH`
|
||||||
|
- `sha` -> `SHA`
|
||||||
|
- `tag` -> `TAG`
|
||||||
|
- `artifact` -> `ARTIFACT`
|
||||||
|
- `git_version` -> `GIT_VERSION`
|
||||||
|
- `source_subdir` -> `SOURCE_SUBDIR`
|
||||||
|
- `bundled` -> `BUNDLED_PACKAGE`
|
||||||
|
- `find_args` -> `FIND_PACKAGE_ARGUMENTS`
|
||||||
|
- `patches` -> `PATCHES` (array)
|
||||||
|
- `options` -> `OPTIONS` (array)
|
||||||
|
|
||||||
|
Other arguments aren't currently supported. If you wish to add them, see the `AddJsonPackage` function in `CMakeModules/CPMUtil.cmake`.
|
||||||
|
|
||||||
|
If `ci` is `true`:
|
||||||
|
|
||||||
|
- `name` -> `NAME`, defaults to the object key
|
||||||
|
- `extension` -> `EXTENSION`, defaults to `tar.zst`
|
||||||
|
- `min_version` -> `MIN_VERSION`
|
||||||
|
- `cmake_filename` -> `CMAKE_FILENAME`
|
||||||
|
- `extension` -> `EXTENSION`
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
In order: OpenSSL CI, Boost (tag + artifact), Opus (options + find_args), discord-rpc (sha + options + patches)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"openssl": {
|
||||||
|
"ci": true,
|
||||||
|
"package": "OpenSSL",
|
||||||
|
"name": "openssl",
|
||||||
|
"repo": "crueter-ci/OpenSSL",
|
||||||
|
"version": "3.5.2",
|
||||||
|
"min_version": "1.1.1"
|
||||||
|
},
|
||||||
|
"boost": {
|
||||||
|
"package": "Boost",
|
||||||
|
"repo": "boostorg/boost",
|
||||||
|
"tag": "boost-1.88.0",
|
||||||
|
"artifact": "boost-1.88.0-cmake.7z",
|
||||||
|
"hash": "e5b049e5b61964480ca816395f63f95621e66cb9bcf616a8b10e441e0e69f129e22443acb11e77bc1e8170f8e4171b9b7719891efc43699782bfcd4b3a365f01",
|
||||||
|
"git_version": "1.88.0",
|
||||||
|
"version": "1.57"
|
||||||
|
},
|
||||||
|
"opus": {
|
||||||
|
"package": "Opus",
|
||||||
|
"repo": "xiph/opus",
|
||||||
|
"sha": "5ded705cf4",
|
||||||
|
"hash": "0dc89e58ddda1f3bc6a7037963994770c5806c10e66f5cc55c59286fc76d0544fe4eca7626772b888fd719f434bc8a92f792bdb350c807968b2ac14cfc04b203",
|
||||||
|
"version": "1.3",
|
||||||
|
"find_args": "MODULE",
|
||||||
|
"options": [
|
||||||
|
"OPUS_BUILD_TESTING OFF",
|
||||||
|
"OPUS_BUILD_PROGRAMS OFF",
|
||||||
|
"OPUS_INSTALL_PKG_CONFIG_MODULE OFF",
|
||||||
|
"OPUS_INSTALL_CMAKE_CONFIG_MODULE OFF"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"discord-rpc": {
|
||||||
|
"repo": "discord/discord-rpc",
|
||||||
|
"sha": "963aa9f3e5",
|
||||||
|
"hash": "386e1344e9a666d730f2d335ee3aef1fd05b1039febefd51aa751b705009cc764411397f3ca08dffd46205c72f75b235c870c737b2091a4ed0c3b061f5919bde",
|
||||||
|
"options": [
|
||||||
|
"BUILD_EXAMPLES OFF"
|
||||||
|
],
|
||||||
|
"patches": [
|
||||||
|
"0001-cmake-version.patch",
|
||||||
|
"0002-no-clang-format.patch",
|
||||||
|
"0003-fix-cpp17.patch"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Inclusion
|
||||||
|
|
||||||
|
To include CPMUtil:
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
include(CPMUtil)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Prefetching
|
||||||
|
|
||||||
|
- To prefetch a CPM dependency (requires cpmfile):
|
||||||
|
* `tools/cpm-fetch.sh <packages>`
|
||||||
|
- To prefetch all CPM dependencies:
|
||||||
|
* `tools/cpm-fetch-all.sh`
|
||||||
|
|
||||||
|
Currently, `cpm-fetch.sh` defines the following directories for cpmfiles (max depth of 2, so subdirs are caught as well):
|
||||||
|
|
||||||
|
`externals src/qt_common src/dynarmic .`
|
||||||
|
|
||||||
|
Whenever you add a new cpmfile, update the script accordingly
|
|
@ -1,14 +0,0 @@
|
||||||
# CPMUtil
|
|
||||||
|
|
||||||
CPMUtil is a wrapper around CPM that aims to reduce boilerplate and add useful utility functions to make dependency management a piece of cake.
|
|
||||||
|
|
||||||
See more in [its repository](https://git.crueter.xyz/CMake/CPMUtil)
|
|
||||||
|
|
||||||
Eden-specific options:
|
|
||||||
|
|
||||||
- `YUZU_USE_CPM` is set by default on MSVC and Android. Other platforms should use this if certain "required" system dependencies (e.g. OpenSSL) are broken or missing
|
|
||||||
* If this is `OFF`, required system dependencies will be searched via `find_package`, although most externals use CPM regardless.
|
|
||||||
|
|
||||||
## Tooling
|
|
||||||
|
|
||||||
See the [tooling docs](../tools/cpm)
|
|
|
@ -4,8 +4,8 @@ To build Eden, you MUST have a C++ compiler.
|
||||||
* On Linux, this is usually [GCC](https://gcc.gnu.org/) 11+ or [Clang](https://clang.llvm.org/) v14+
|
* On Linux, this is usually [GCC](https://gcc.gnu.org/) 11+ or [Clang](https://clang.llvm.org/) v14+
|
||||||
- GCC 12 also requires Clang 14+
|
- GCC 12 also requires Clang 14+
|
||||||
* On Windows, this is either:
|
* On Windows, this is either:
|
||||||
- **[MSVC](https://visualstudio.microsoft.com/downloads/)** (you should select *Community* option),
|
- **[MSVC](https://visualstudio.microsoft.com/downloads/)**,
|
||||||
* *A convenience script to install the Visual Community Studio 2022 with necessary tools is provided in `.ci/windows/install-msvc.ps1`*
|
* *A convenience script to install the **minimal** version (Visual Build Tools) is provided in `.ci/windows/install-msvc.ps1`*
|
||||||
- clang-cl - can be downloaded from the MSVC installer,
|
- clang-cl - can be downloaded from the MSVC installer,
|
||||||
- or **[MSYS2](https://www.msys2.org)**
|
- or **[MSYS2](https://www.msys2.org)**
|
||||||
* On macOS, this is Apple Clang
|
* On macOS, this is Apple Clang
|
||||||
|
@ -63,7 +63,6 @@ Certain other dependencies will be fetched by CPM regardless. System packages *c
|
||||||
* [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
|
* [VulkanMemoryAllocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator)
|
||||||
* [sirit](https://github.com/eden-emulator/sirit)
|
* [sirit](https://github.com/eden-emulator/sirit)
|
||||||
* [httplib](https://github.com/yhirose/cpp-httplib) - if `ENABLE_QT_UPDATE_CHECKER` or `ENABLE_WEB_SERVICE` are on
|
* [httplib](https://github.com/yhirose/cpp-httplib) - if `ENABLE_QT_UPDATE_CHECKER` or `ENABLE_WEB_SERVICE` are on
|
||||||
- This package is known to be broken on the AUR.
|
|
||||||
* [cpp-jwt](https://github.com/arun11299/cpp-jwt) 1.4+ - if `ENABLE_WEB_SERVICE` is on
|
* [cpp-jwt](https://github.com/arun11299/cpp-jwt) 1.4+ - if `ENABLE_WEB_SERVICE` is on
|
||||||
* [unordered-dense](https://github.com/martinus/unordered_dense)
|
* [unordered-dense](https://github.com/martinus/unordered_dense)
|
||||||
* [mcl](https://github.com/azahar-emu/mcl) - subject to removal
|
* [mcl](https://github.com/azahar-emu/mcl) - subject to removal
|
||||||
|
@ -102,7 +101,7 @@ sudo pacman -Syu --needed base-devel boost catch2 cmake enet ffmpeg fmt git glsl
|
||||||
<summary>Ubuntu, Debian, Mint Linux</summary>
|
<summary>Ubuntu, Debian, Mint Linux</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo apt-get install autoconf cmake g++ gcc git glslang-tools libasound2t64 libboost-context-dev libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libzydis-dev zydis-tools libzycore-dev vulkan-utility-libraries-dev libvulkan-dev spirv-tools spirv-headers libusb-1.0-0-dev libxbyak-dev
|
sudo apt-get install autoconf cmake g++ gcc git glslang-tools libasound2 libboost-context-dev libglu1-mesa-dev libhidapi-dev libpulse-dev libtool libudev-dev libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-xkb1 libxext-dev libxkbcommon-x11-0 mesa-common-dev nasm ninja-build qt6-base-private-dev libmbedtls-dev catch2 libfmt-dev liblz4-dev nlohmann-json3-dev libzstd-dev libssl-dev libavfilter-dev libavcodec-dev libswscale-dev pkg-config zlib1g-dev libva-dev libvdpau-dev qt6-tools-dev libzydis-dev zydis-tools libzycore-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
* Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required.
|
* Ubuntu 22.04, Linux Mint 20, or Debian 12 or later is required.
|
||||||
|
@ -195,7 +194,7 @@ Run the usual update + install of essential toolings: `sudo pkg update && sudo p
|
||||||
- **gcc**: `sudo pkg install developer/gcc-14`.
|
- **gcc**: `sudo pkg install developer/gcc-14`.
|
||||||
- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`.
|
- **clang**: Version 20 is broken, use `sudo pkg install developer/clang-19`.
|
||||||
|
|
||||||
Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/lz4 libusb-1 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`.
|
Then install the libraries: `sudo pkg install qt6 boost glslang libzip library/lz4 nlohmann-json openssl opus sdl2 zlib compress/zstd unzip pkg-config nasm autoconf mesa library/libdrm header-drm developer/fmt`.
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
|
@ -36,28 +36,6 @@ Pull requests are only to be merged by core developers when properly tested and
|
||||||
- Maintainers are permitted to change namespaces at will.
|
- Maintainers are permitted to change namespaces at will.
|
||||||
- Commits within PRs are not required to be namespaced, but it is highly recommended.
|
- Commits within PRs are not required to be namespaced, but it is highly recommended.
|
||||||
|
|
||||||
## Adding new settings
|
|
||||||
|
|
||||||
When adding new settings, use `tr("Setting:")` if the setting is meant to be a field, otherwise use `tr("Setting")` if the setting is meant to be a Yes/No or checkmark type of setting, see [this short style guide](https://learn.microsoft.com/en-us/style-guide/punctuation/colons#in-ui).
|
|
||||||
|
|
||||||
- The majority of software must work with the default option selected for such setting. Unless the setting significantly degrades performance.
|
|
||||||
- Debug settings must never be turned on by default.
|
|
||||||
- Provide reasonable bounds (for example, a setting controlling the amount of VRAM should never be 0).
|
|
||||||
- The description of the setting must be short and concise, if the setting "does a lot of things" consider splitting the setting into multiple if possible.
|
|
||||||
- Try to avoid excessive/redundant explainations "recommended for most users and games" can just be "(recommended)".
|
|
||||||
- Try to not write "slow/fast" options unless it clearly degrades/increases performance for a given case, as most options may modify behaviour that result in different metrics accross different systems. If for example the option is an "accuracy" option, writing "High" is sufficient to imply "Slow". No need to write "High (Slow)".
|
|
||||||
|
|
||||||
Some examples:
|
|
||||||
- "[...] negatively affecting image quality", "[...] degrading image quality": Same wording but with less filler.
|
|
||||||
- "[...] this may cause some glitches or crashes in some games", "[...] this may cause soft-crashes": Crashes implies there may be glitches (as crashes are technically a form of a fatal glitch). The entire sentence is structured as "may cause [...] on some games", which is redundant, because "may cause [...] in games" has the same semantic meaning ("may" is a chance that it will occur on "some" given set).
|
|
||||||
- "FIFO Relaxed is similar to FIFO [...]", "FIFO Relaxed [...]": The name already implies similarity.
|
|
||||||
- "[...] but may also reduce performance in some cases", "[...] but may degrade performance": Again, "some cases" and "may" implies there is a probability.
|
|
||||||
- "[...] it can [...] in some cases", "[...] it can [...]": Implied probability.
|
|
||||||
|
|
||||||
Before adding a new setting, consider:
|
|
||||||
- Does the piece of code that the setting pertains to, make a significant difference if it's on/off?
|
|
||||||
- Can it be auto-detected?
|
|
||||||
|
|
||||||
# IDE setup
|
# IDE setup
|
||||||
|
|
||||||
## VSCode
|
## VSCode
|
||||||
|
|
|
@ -31,7 +31,7 @@ Notes:
|
||||||
* Currently, build fails without this
|
* Currently, build fails without this
|
||||||
- `YUZU_USE_FASTER_LD` (ON) Check if a faster linker is available
|
- `YUZU_USE_FASTER_LD` (ON) Check if a faster linker is available
|
||||||
* Only available on UNIX
|
* Only available on UNIX
|
||||||
- `YUZU_USE_BUNDLED_MOLTENVK` (ON, macOS only) Download bundled MoltenVK lib)
|
- `USE_SYSTEM_MOLTENVK` (OFF, macOS only) Use the system MoltenVK lib (instead of the bundled one)
|
||||||
- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS)
|
- `YUZU_TZDB_PATH` (string) Path to a pre-downloaded timezone database (useful for nixOS)
|
||||||
- `ENABLE_OPENSSL` (ON for Linux and *BSD) Enable OpenSSL backend for the ssl service
|
- `ENABLE_OPENSSL` (ON for Linux and *BSD) Enable OpenSSL backend for the ssl service
|
||||||
* Always enabled if the web service is enabled
|
* Always enabled if the web service is enabled
|
||||||
|
|
|
@ -5,6 +5,6 @@ This contains documentation created by developers. This contains build instructi
|
||||||
- **[General Build Instructions](Build.md)**
|
- **[General Build Instructions](Build.md)**
|
||||||
- **[Development Guidelines](Development.md)**
|
- **[Development Guidelines](Development.md)**
|
||||||
- **[Dependencies](Deps.md)**
|
- **[Dependencies](Deps.md)**
|
||||||
- **[CPM - CMake Package Manager](CPMUtil.md)**
|
- **[CPM - CMake Package Manager](CPM.md)**
|
||||||
- **[Platform-Specific Caveats](Caveats.md)**
|
- **[Platform-Specific Caveats](Caveats.md)**
|
||||||
- **[User Handbook](User.md)**
|
- **[User Directory Handling](User.md)**
|
|
@ -27,7 +27,6 @@ The following are not valid reasons to sign up:
|
||||||
* To download and use Eden, see our [Releases page](https://github.com/eden-emulator/Releases/releases)!
|
* To download and use Eden, see our [Releases page](https://github.com/eden-emulator/Releases/releases)!
|
||||||
- I want to see the source code.
|
- I want to see the source code.
|
||||||
* To see Eden's source code, go [here](https://git.eden-emu.dev/eden-emu/eden).
|
* To see Eden's source code, go [here](https://git.eden-emu.dev/eden-emu/eden).
|
||||||
|
|
||||||
## Other Information
|
## Other Information
|
||||||
|
|
||||||
Requests that appear suspicious, automated, OR blank will generally be automatically filtered. In cases of suspicion, or any of the invalid reasons listed above, you may receive an email back asking for clarification.
|
Requests that appear suspicious, automated, OR blank will generally be automatically filtered. In cases of suspicion, or any of the invalid reasons listed above, you may receive an email back asking for clarification.
|
||||||
|
|
15
docs/User.md
15
docs/User.md
|
@ -1,10 +1,11 @@
|
||||||
# User Handbook
|
# User configuration
|
||||||
|
|
||||||
The "FAQ".
|
## Configuration directories
|
||||||
|
|
||||||
This handbook is primarily aimed at the end-user - baking useful knowledge for enhancing their emulation experience.
|
Eden will store configuration in the following directories:
|
||||||
|
|
||||||
- **[The Basics](user/Basics.md)**
|
- **Windows**: `%AppData%\Roaming`.
|
||||||
- **[Audio](user/Audio.md)**
|
- **Android**: Data is stored internally.
|
||||||
- **[Graphics](user/Graphics.md)**
|
- **Linux, macOS, FreeBSD, Solaris, OpenBSD**: `$XDG_DATA_HOME`, `$XDG_CACHE_HOME`, `$XDG_CONFIG_HOME`.
|
||||||
- **[Platforms and Architectures](user/Architectures.md)**
|
|
||||||
|
If a `user` directory is present in the current working directory, that will override all global configuration directories and the emulator will use that instead.
|
||||||
|
|
1
docs/build/Android.md
vendored
1
docs/build/Android.md
vendored
|
@ -33,7 +33,6 @@ Eden by default will be cloned into -
|
||||||
4. Navigate to `eden/src/android`.
|
4. Navigate to `eden/src/android`.
|
||||||
5. Then Build with `./gradlew assembleRelWithDebInfo`.
|
5. Then Build with `./gradlew assembleRelWithDebInfo`.
|
||||||
6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`.
|
6. To build the optimised build use `./gradlew assembleGenshinSpoofRelWithDebInfo`.
|
||||||
7. You can pass extra variables to cmake via `-PYUZU_ANDROID_ARGS="-D..."`
|
|
||||||
|
|
||||||
### Script
|
### Script
|
||||||
A convenience script for building is provided in `.ci/android/build.sh`. The built APK can be put into an `artifacts` directory via `.ci/android/package.sh`. On Windows, these must be done in the Git Bash or MinGW terminal.
|
A convenience script for building is provided in `.ci/android/build.sh`. The built APK can be put into an `artifacts` directory via `.ci/android/package.sh`. On Windows, these must be done in the Git Bash or MinGW terminal.
|
||||||
|
|
|
@ -1,132 +0,0 @@
|
||||||
# User Handbook - Architectures and Platforms
|
|
||||||
|
|
||||||
Notes and caveats for different architectures and platforms.
|
|
||||||
|
|
||||||
# Architectures
|
|
||||||
|
|
||||||
Eden is primarily designed to run on amd64 (x86_64--Intel/AMD 64-bit) and aarch64 (arm64--ARM 64-bit) CPUs. Each architecture tends to have their own quirks and fun stuff; this page serves as a reference for these quirks.
|
|
||||||
|
|
||||||
## amd64
|
|
||||||
|
|
||||||
AMD64, aka x86_64, is the most tested and supported architecture for desktop targets. Android is entirely unsupported.
|
|
||||||
|
|
||||||
### Caveats
|
|
||||||
|
|
||||||
AMD64 systems are almost always limited by the CPU. For example, a Zen 5/RX 6600 system will often hit max CPU usage before the GPU ever reaches 70% usage, with minimal exceptions (that tend to pop up only at >200fps). JIT is slow!
|
|
||||||
|
|
||||||
Computers on Linux will almost always run Eden strictly better than an equivalent machine on Windows. This is largely due to the way the Linux kernel handles memory management (and the lack of Microsoft spyware).
|
|
||||||
|
|
||||||
Intel Macs are believed to be supported, but no CI is provided for them. Performance will likely be awful on all but the highest-end iMacs and Pro-level Macs, and the MoltenVK requirement generally means Vulkan compatibility will suffer.
|
|
||||||
|
|
||||||
## aarch64
|
|
||||||
|
|
||||||
ARM64, aka aarch64, is the only supported architecture for Android, with limited experimental support available on Linux, Windows, and macOS.
|
|
||||||
|
|
||||||
### Caveats
|
|
||||||
|
|
||||||
NCE (Native Code Execution) is currently only available on Android and (experimentally) Linux. Support for macOS is in the works, but Windows is extremely unlikely to ever happen (if you want it--submit patches!). Generally, if NCE is available, you should pretty much always use it due to the massive performance hit JIT has.
|
|
||||||
|
|
||||||
When NCE is enabled, do note that the GPU will almost always be the limiting factor. This is especially the case for Android, as well as desktops that lack dedicated GPUs; Adreno, Mali, PowerVR, etc. GPUs are generally significantly weaker relative to their respective CPUs.
|
|
||||||
|
|
||||||
Windows/arm64 is *very* experimental and is unlikely to work at all. Support and testing is in the works.
|
|
||||||
|
|
||||||
## riscv64
|
|
||||||
|
|
||||||
RISC-V, aka riscv64, is sparsely tested, but preliminary tests from developers have reported at least partial support on Milk-V's Fedora/riscv64 Linux distribution. Performance, Vulkan support, compatibility, and build system caveats are largely unknown for the time being.
|
|
||||||
|
|
||||||
### Caveats
|
|
||||||
|
|
||||||
Windows/riscv64 doesn't exist, and may never (until corporate greed no longer consumes Microsoft).
|
|
||||||
|
|
||||||
Android/riscv64 is interesting. While support for it may be added if and when RISC-V phones/handhelds ever go mainstream, arm64 devices will always be preferred due to NCE.
|
|
||||||
|
|
||||||
Only Fedora/riscv64 has been tested, but in theory, every riscv64 distribution that has *at least* the standard build tools, Qt, FFmpeg, and SDL2 should work.
|
|
||||||
|
|
||||||
## Other
|
|
||||||
|
|
||||||
Other architectures, such as SPARC, MIPS, PowerPC, Loong, and all 32-bit architectures are completely unsupported, as there is no JIT backend or emitter thereof. If you want support for it--submit patches!
|
|
||||||
|
|
||||||
IA-64 (Itanium) support is completely unknown. Existing amd64 packages will not run on IA-64 (assuming you can even find a supported Windows/Linux distribution)
|
|
||||||
|
|
||||||
# Platforms
|
|
||||||
|
|
||||||
The vast majority of Eden's testing is done on Windows, Linux, and Android. However, first-class support is also provided for:
|
|
||||||
|
|
||||||
- FreeBSD
|
|
||||||
- OpenBSD
|
|
||||||
- OpenIndiana (Solaris)
|
|
||||||
- macOS
|
|
||||||
|
|
||||||
## Linux
|
|
||||||
|
|
||||||
While all modern Linux distributions are supported (Fedora >40, Ubuntu >24.04, Debian >12, Arch, Gentoo, etc.), the vast majority of testing and development for Linux is on Arch and Gentoo. Most major build system changes are tested on Gentoo first and foremost, so if builds fail on any modern distribution no matter what you do, it's likely a bug and should be reported.
|
|
||||||
|
|
||||||
Intel and Nvidia GPU support is limited. AMD (RADV) drivers receive first-class testing and are known to provide the most stable Eden experience possible.
|
|
||||||
|
|
||||||
Wayland is not recommended. Testing has shown significantly worse performance on most Wayland compositors compared to X11, alongside mysterious bugs and compatibility errors. For now, set `QT_QPA_PLATFORM=xcb` when running Eden, or pass `-platform xcb` to the launch arguments.
|
|
||||||
|
|
||||||
## Windows
|
|
||||||
|
|
||||||
Windows 10 and 11 are supported. Support for Windows 8.x is unknown, and Windows 7 support is unlikely to ever be added.
|
|
||||||
|
|
||||||
In order to run Eden, you will probably need to install the [Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170).
|
|
||||||
|
|
||||||
Neither AMD nor Nvidia drivers work nearly as well as Linux's RADV drivers. Compatibility is still largely the same, but performance and some hard-to-run games may suffer compared to Linux.
|
|
||||||
|
|
||||||
## Android
|
|
||||||
|
|
||||||
A cooler is always recommended. Phone SoCs tend to get very hot, especially those manufactured with the Samsung process or those lacking in power.
|
|
||||||
|
|
||||||
Adreno 6xx and 7xx GPUs with Turnip drivers will always have the best compatibility. "Stock" (system) drivers will have better performance on Adreno, but compatibility will suffer. Better support for stock drivers (including Adreno 8xx) is in the works.
|
|
||||||
|
|
||||||
Android 16 is always recommended, as it brought major improvements to Vulkan requirements and compatibility, *plus* significant performance gains. Some users reported an over 50% performance gain on some Pixel phones after updating.
|
|
||||||
|
|
||||||
Mali, PowerVR, Xclipse, and other GPU vendors generally lack in performance and compatibility. Notably:
|
|
||||||
- No PowerVR GPUs *except* the DXT-48-1536 are known to work with Eden at all.
|
|
||||||
- No Xclipse GPUs *except* the very latest (e.g. Xclipse 950) are known to work with Eden at all.
|
|
||||||
- Mali has especially bad performance, though the Mali-G715 (Tensor G4) and Immortalis-G925 are known to generally run surprisingly well, especially on Android 16.
|
|
||||||
- The status of all other GPU vendors is unknown. As long as they support Vulkan, they theoretically can run Eden.
|
|
||||||
- Note that these GPUs generally don't play well with driver injection. If you choose to inject custom drivers via a rooted system (Panfrost, RADV, etc), you may see good results.
|
|
||||||
|
|
||||||
Qualcomm Snapdragon SoCs are generally the most well supported.
|
|
||||||
- Google Tensor chips have pretty terrible performance, but even the G1 has been proven to be able to run some games well on the Pixel 6 Pro.
|
|
||||||
* The Tensor G4 is the best-supported at the time. How the G5 currently fares is unknown, but on paper, it should do about as well as a Snapdragon 8 Gen 2 with stock drivers.
|
|
||||||
- Samsung Exynos chips made before 2022 are not supported.
|
|
||||||
- MediaTek Dimensity chips are extremely weak and most before mid-2023 don't work at all.
|
|
||||||
* This means that most budget phones won't work, as they tend to use old MediaTek SoCs.
|
|
||||||
* Generally, if your phone doesn't cost *at least* as much as a Switch itself, it will not *emulate* the Switch very well.
|
|
||||||
- Snapdragon 865 and other old-ish SoCs may benefit from the Legacy build. These will reduce performance but *should* drastically improve compatibility.
|
|
||||||
- If you're not sure how powerful your SoC is, check [NanoReview](https://nanoreview.net/en/soc-compare) - e.g. [Tensor G5](https://archive.is/ylC4Z).
|
|
||||||
* A good base to compare to is the Snapdragon 865--e.g. [Tensor vs SD865](https://archive.is/M1P58)
|
|
||||||
* Some benchmarks may be misleading due to thermal throttling OR RAM requirements.
|
|
||||||
- For example, a Pixel 6a (Tensor G1) performs about 1/3 as well as an 865 due to its lack of RAM and poor thermals.
|
|
||||||
* Remember--always use a cooler if you can, and you MUST have *at least* 8GB of RAM!
|
|
||||||
- If you're not sure what SoC you have, check [GSMArena](https://www.gsmarena.com) - e.g. [Pixel 9 Pro](https://archive.ph/91VhA)
|
|
||||||
|
|
||||||
Custom ROMs are recommended, *as long as* you know what you're doing.
|
|
||||||
- For most devices, [LineageOS](https://lineageos.org/) is preferred.
|
|
||||||
- [CalyxOS](https://calyxos.org/) is available as well.
|
|
||||||
- For Google Pixel devices ONLY... and [soon another OEM](https://archive.ph/cPpMd)... [GrapheneOS](https://grapheneos.org/) is highly recommended.
|
|
||||||
* As of October 5, 2025, the Pixel 10 line is unsupported, however, [it will be](https://archive.is/viAUl) in the very near future!
|
|
||||||
* Keep checking the [FAQ page](https://grapheneos.org/faq#supported-devices) for news.
|
|
||||||
- Custom ROMs will likely be exclusively recommended in the future due to Google's upcoming [draconian](https://archive.is/hGIjZ), [anti-privacy, anti-user](https://archive.is/mc1CJ) verification requirements.
|
|
||||||
|
|
||||||
Eden is currently unavailable on F-Droid or the Play Store. Check back occasionally.
|
|
||||||
|
|
||||||
## macOS
|
|
||||||
|
|
||||||
macOS is relatively stable, with only the occasional crash and bug. Compatibility may suffer due to the MoltenVK layer, however.
|
|
||||||
|
|
||||||
Do note that building the GUI version with Qt versions higher than 6.7.3 will cause mysterious bugs, Vulkan errors, and crashes, alongside the cool feature of freezing the entire system UI randomly; we recommend you build with 6.7.3 (via aqtinstall) or earlier as the CI does.
|
|
||||||
|
|
||||||
## *BSD, Solaris
|
|
||||||
|
|
||||||
BSD and Solaris distributions tend to lag behind Linux in terms of Vulkan and other library compatibility. For example, OpenIndiana (Solaris) does not properly package Qt, meaning the recommended method of usage is to use `eden-cli` only for now. Solaris also generally works better with OpenGL.
|
|
||||||
|
|
||||||
AMD GPU support on these platforms is limited or nonexistent.
|
|
||||||
|
|
||||||
## VMs
|
|
||||||
|
|
||||||
Eden "can" run in a VM, but only with the software renderer, *unless* you create a hardware-accelerated KVM with GPU passthrough. If you *really* want to do this and don't have a spare GPU lying around, RX 570 and 580 GPUs are extremely cheap on the black market and are powerful enough to run most commercial games at 60fps.
|
|
||||||
|
|
||||||
Some users and developers have had success using a pure OpenGL-accelerated KVM on Linux with a Windows VM, but this is ridiculously tedious to set up. You're probably better off dual-booting.
|
|
|
@ -1,3 +0,0 @@
|
||||||
# User Handbook - Audio
|
|
||||||
|
|
||||||
`PULSE_SERVER=none` forces cubeb to use ALSA.
|
|
|
@ -1,57 +0,0 @@
|
||||||
# User Handbook - The Basics
|
|
||||||
|
|
||||||
## Introduction
|
|
||||||
|
|
||||||
Eden is a very complicated piece of software, and as such there are many knobs and toggles that can be configured. Most of these are invisible to normal users, however power users may be able to leverage them to their advantage.
|
|
||||||
|
|
||||||
This handbook primarily describes such knobs and toggles. Normal configuration options are described within the emulator itself and will not be covered in detail.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
The emulator is very demanding on hardware, and as such requires a decent mid-range computer/cellphone.
|
|
||||||
|
|
||||||
See [the requirements page](https://archive.is/sv83h) for recommended and minimum specs.
|
|
||||||
|
|
||||||
The CPU must support FMA for an optimal gameplay experience. The GPU needs to support OpenGL 4.6 ([compatibility list](https://opengl.gpuinfo.org/)), or Vulkan 1.1 ([compatibility list](https://vulkan.gpuinfo.org/)).
|
|
||||||
|
|
||||||
If your GPU doesn't support or is just behind by a minor version, see Mesa environment variables below (*nix only).
|
|
||||||
|
|
||||||
## User configuration
|
|
||||||
|
|
||||||
### Configuration directories
|
|
||||||
|
|
||||||
Eden will store configuration files in the following directories:
|
|
||||||
|
|
||||||
- **Windows**: `%AppData%\Roaming`.
|
|
||||||
- **Android**: Data is stored internally.
|
|
||||||
- **Linux, macOS, FreeBSD, Solaris, OpenBSD**: `$XDG_DATA_HOME`, `$XDG_CACHE_HOME`, `$XDG_CONFIG_HOME`.
|
|
||||||
|
|
||||||
If a `user` directory is present in the current working directory, that will override all global configuration directories and the emulator will use that instead.
|
|
||||||
|
|
||||||
### Environment variables
|
|
||||||
|
|
||||||
Throughout the handbook, environment variables are mentioned. These are often either global (system wide) or local (set in a script, bound only to the current session). It's heavily recommended to use them in a local context only, as this allows you to rollback changes easily (if for example, there are regressions setting them).
|
|
||||||
|
|
||||||
The recommended way is to create a `.bat` file alongside the emulator `.exe`; contents of which could resemble something like:
|
|
||||||
|
|
||||||
```bat
|
|
||||||
set "__GL_THREADED_OPTIMIZATIONS=1"
|
|
||||||
set "SOME_OTHER_VAR=1"
|
|
||||||
eden.exe
|
|
||||||
```
|
|
||||||
|
|
||||||
Android doesn't have a convenient way to set environment variables.
|
|
||||||
|
|
||||||
For other platforms, the recommended method is using a shell script:
|
|
||||||
|
|
||||||
```sh
|
|
||||||
export __GL_THREADED_OPTIMIZATIONS=1
|
|
||||||
export SOME_OTHER_VAR=1
|
|
||||||
./eden
|
|
||||||
```
|
|
||||||
|
|
||||||
Then just running `chmod +x script.sh && source script.sh`.
|
|
||||||
|
|
||||||
## Compatibility list
|
|
||||||
|
|
||||||
Eden doesn't mantain a compatibility list. However, [EmuReady](https://www.emuready.com/) has a more fine-grained compatibility information for multiple emulators/forks as well.
|
|
|
@ -1,62 +0,0 @@
|
||||||
# User Handbook - Graphics
|
|
||||||
|
|
||||||
## Visual Enhancements
|
|
||||||
|
|
||||||
### Anti-aliasing
|
|
||||||
|
|
||||||
Enhancements aimed at removing jagged lines/sharp edges and/or masking artifacts.
|
|
||||||
|
|
||||||
- **No AA**: Default, provides no anti-aliasing.
|
|
||||||
- **FXAA**: Fast Anti-Aliasing, an implementation as described on [this blog post](https://web.archive.org/web/20110831051323/http://timothylottes.blogspot.com/2011/03/nvidia-fxaa.html). Generally fast but with some innocuos artifacts.
|
|
||||||
- **SMAA**: Subpixel Morphological Anti-Aliasing, an implementation as described on [this article](https://web.archive.org/web/20250000000000*/https://www.iryoku.com/smaa/).
|
|
||||||
|
|
||||||
### Filters
|
|
||||||
|
|
||||||
Various graphical filters exist - each of them aimed at a specific target/image quality preset.
|
|
||||||
|
|
||||||
- **Nearest**: Provides no filtering - useful for debugging.
|
|
||||||
- **Pros**: Fast, works in any hardware.
|
|
||||||
- **Cons**: Less image quality.
|
|
||||||
- **Bilinear**: Provides the hardware default filtering of the Tegra X1.
|
|
||||||
- **Pros**: Fast with acceptable image quality.
|
|
||||||
- **Bicubic**: Provides a bicubic interpolation using a Catmull-Rom (or hardware-accelerated) implementation.
|
|
||||||
- **Pros**: Better image quality with more rounded edges.
|
|
||||||
- **Zero-Tangent, B-Spline, Mitchell**: Provides bicubic interpolation using the respective matrix weights. They're normally not hardware accelerated unless the device supports the `VK_QCOM_filter_cubic_weights` extension. The matrix weights are those matching [the specification itself](https://registry.khronos.org/vulkan/specs/latest/html/vkspec.html#VkSamplerCubicWeightsCreateInfoQCOM).
|
|
||||||
- **Pros/Cons**: Each of them is a variation of the Bicubic interpolation model with different weights, they offer different methods to fix some artifacts present in Catmull-Rom.
|
|
||||||
- **Spline-1**: Bicubic interpolation (similar to Mitchell) but with a faster texel fetch method. Generally less blurry than bicubic.
|
|
||||||
- **Pros**: Faster than bicubic even without hardware accelerated bicubic.
|
|
||||||
- **Gaussian**: Whole-area blur, an applied gaussian blur is done to the entire frame.
|
|
||||||
- **Pros**: Less edge artifacts.
|
|
||||||
- **Cons**: Slow and sometimes blurry.
|
|
||||||
- **Lanczos**: An implementation using `a = 3` (49 texel fetches). Provides sharper edges but blurrier artifacts.
|
|
||||||
- **Pros**: Less edge artifacts and less blurry than gaussian.
|
|
||||||
- **Cons**: Slow.
|
|
||||||
- **ScaleForce**: Experimental texture upscale method, see [ScaleFish](https://github.com/BreadFish64/ScaleFish).
|
|
||||||
- **Pros**: Relatively fast.
|
|
||||||
- **FSR**: Uses AMD FidelityFX Super Resolution to enhance image quality.
|
|
||||||
- **Pros**: Great for upscaling, and offers sharper visual quality.
|
|
||||||
- **Cons**: Somewhat slow, and may be offputtingly sharp.
|
|
||||||
- **Area**: Area interpolation (high kernel count).
|
|
||||||
- **Pros**: Best for downscaling (internal resolution > display resolution).
|
|
||||||
- **Cons**: Costly and slow.
|
|
||||||
- **MMPX**: Nearest-neighbour filter aimed at providing higher pixel-art quality.
|
|
||||||
- **Pros**: Offers decent pixel-art upscaling.
|
|
||||||
- **Cons**: Only works for pixel-art.
|
|
||||||
|
|
||||||
### External
|
|
||||||
|
|
||||||
While stock shaders offer a basic subset of options for most users, programs such as [ReShade](https://github.com/crosire/reshade) offer a more flexible experience. In addition to that users can also seek out modifications (mods) for enhancing visual experience (60 FPS mods, HDR, etc).
|
|
||||||
|
|
||||||
## Driver specifics
|
|
||||||
|
|
||||||
### Mesa environment variable hacks
|
|
||||||
|
|
||||||
The software requires a certain version of Vulkan and a certain version of OpenGL to work - otherwise it will refuse to load, this can be easily bypassed by setting an environment variable: `MESA_GL_VERSION_OVERRIDE=4.6 MESA_GLSL_VERSION_OVERRIDE=460` (OpenGL) and `MESA_VK_VERSION_OVERRIDE=1.3` (Vulkan), for more information see [Environment variables for Mesa](https://web.archive.org/web/20250000000000*/https://docs.mesa3d.org/envvars.html).
|
|
||||||
|
|
||||||
### NVIDIA OpenGL environment variables
|
|
||||||
|
|
||||||
Unstable multithreaded optimisations are offered by the stock proprietary NVIDIA driver on X11 platforms. Setting `__GL_THREADED_OPTIMIZATIONS` to `1` would enable such optimisations. This mainly benefits the OpenGL backend. For more information see [Environment Variables for X11 NVIDIA](https://web.archive.org/web/20250115162518/https://download.nvidia.com/XFree86/Linux-x86_64/435.17/README/openglenvvariables.html).
|
|
||||||
|
|
||||||
### swrast/LLVMpipe crashes under high load
|
|
||||||
|
|
||||||
The OpenGL backend would invoke behaviour that would result in swarst/LLVMpipe writing an invalid SSA IR (on old versions of Mesa), and then proceeding to crash. The solution is using a script found in [tools/llvmpipe-run.sh](../../tools/llvmpipe-run.sh).
|
|
153
externals/CMakeLists.txt
vendored
153
externals/CMakeLists.txt
vendored
|
@ -39,147 +39,6 @@ if (ARCHITECTURE_arm64 OR DYNARMIC_TESTS)
|
||||||
AddJsonPackage(oaknut)
|
AddJsonPackage(oaknut)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# enet
|
|
||||||
AddJsonPackage(enet)
|
|
||||||
|
|
||||||
if (enet_ADDED)
|
|
||||||
target_include_directories(enet INTERFACE ${enet_SOURCE_DIR}/include)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT TARGET enet::enet)
|
|
||||||
add_library(enet::enet ALIAS enet)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# mbedtls
|
|
||||||
AddJsonPackage(mbedtls)
|
|
||||||
|
|
||||||
# VulkanUtilityHeaders - pulls in headers and utility libs
|
|
||||||
AddJsonPackage(vulkan-utility-headers)
|
|
||||||
|
|
||||||
# small hack
|
|
||||||
if (NOT VulkanUtilityLibraries_ADDED)
|
|
||||||
find_package(VulkanHeaders 1.3.274 REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# DiscordRPC
|
|
||||||
if (USE_DISCORD_PRESENCE)
|
|
||||||
if (ARCHITECTURE_arm64)
|
|
||||||
add_compile_definitions(RAPIDJSON_ENDIAN=RAPIDJSON_LITTLEENDIAN)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
AddJsonPackage(discord-rpc)
|
|
||||||
|
|
||||||
if (DiscordRPC_ADDED)
|
|
||||||
target_include_directories(discord-rpc INTERFACE ${DiscordRPC_SOURCE_DIR}/include)
|
|
||||||
add_library(DiscordRPC::discord-rpc ALIAS discord-rpc)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# SimpleIni
|
|
||||||
AddJsonPackage(simpleini)
|
|
||||||
|
|
||||||
# Most linux distros don't package cubeb, so enable regardless of cpm settings
|
|
||||||
if(ENABLE_CUBEB)
|
|
||||||
AddJsonPackage(cubeb)
|
|
||||||
|
|
||||||
if (cubeb_ADDED)
|
|
||||||
if (NOT MSVC)
|
|
||||||
if (TARGET speex)
|
|
||||||
target_compile_options(speex PRIVATE -Wno-sign-compare)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set_target_properties(cubeb PROPERTIES COMPILE_OPTIONS "")
|
|
||||||
target_compile_options(cubeb INTERFACE
|
|
||||||
-Wno-implicit-const-int-float-conversion
|
|
||||||
-Wno-shadow
|
|
||||||
-Wno-missing-declarations
|
|
||||||
-Wno-return-type
|
|
||||||
-Wno-uninitialized
|
|
||||||
)
|
|
||||||
else()
|
|
||||||
target_compile_options(cubeb PRIVATE
|
|
||||||
/wd4456
|
|
||||||
/wd4458
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (NOT TARGET cubeb::cubeb)
|
|
||||||
add_library(cubeb::cubeb ALIAS cubeb)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# find SDL2 exports a bunch of variables that are needed, so its easier to do this outside of the YUZU_find_package
|
|
||||||
if (ENABLE_SDL2)
|
|
||||||
if (YUZU_USE_EXTERNAL_SDL2)
|
|
||||||
message(STATUS "Using SDL2 from externals.")
|
|
||||||
if (NOT WIN32)
|
|
||||||
# Yuzu itself needs: Atomic Audio Events Joystick Haptic Sensor Threads Timers
|
|
||||||
# Since 2.0.18 Atomic+Threads required for HIDAPI/libusb (see https://github.com/libsdl-org/SDL/issues/5095)
|
|
||||||
# Yuzu-cmd also needs: Video (depends on Loadso/Dlopen)
|
|
||||||
# CPUinfo also required for SDL Audio, at least until 2.28.0 (see https://github.com/libsdl-org/SDL/issues/7809)
|
|
||||||
set(SDL_UNUSED_SUBSYSTEMS
|
|
||||||
File Filesystem
|
|
||||||
Locale Power Render)
|
|
||||||
foreach(_SUB ${SDL_UNUSED_SUBSYSTEMS})
|
|
||||||
string(TOUPPER ${_SUB} _OPT)
|
|
||||||
set(SDL_${_OPT} OFF)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
set(HIDAPI ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
set(SDL_FILE ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if ("${YUZU_SYSTEM_PROFILE}" STREQUAL "steamdeck")
|
|
||||||
set(SDL_PIPEWIRE OFF) # build errors out with this on
|
|
||||||
AddJsonPackage("sdl2_steamdeck")
|
|
||||||
else()
|
|
||||||
AddJsonPackage("sdl2_generic")
|
|
||||||
endif()
|
|
||||||
elseif (YUZU_USE_BUNDLED_SDL2)
|
|
||||||
message(STATUS "Using bundled SDL2")
|
|
||||||
AddJsonPackage(sdl2)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(SDL2 2.26.4 REQUIRED)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# SPIRV Headers
|
|
||||||
AddJsonPackage(spirv-headers)
|
|
||||||
|
|
||||||
# Sirit
|
|
||||||
if (YUZU_USE_BUNDLED_SIRIT)
|
|
||||||
AddJsonPackage(sirit-ci)
|
|
||||||
else()
|
|
||||||
AddJsonPackage(sirit)
|
|
||||||
# Change to old-but-more-cacheable debug info on Windows
|
|
||||||
if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
|
|
||||||
get_target_property(sirit_opts sirit COMPILE_OPTIONS)
|
|
||||||
list(FILTER sirit_opts EXCLUDE REGEX "/Zi")
|
|
||||||
list(APPEND sirit_opts "/Z7")
|
|
||||||
set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${sirit_opts}")
|
|
||||||
endif()
|
|
||||||
if(MSVC AND CXX_CLANG)
|
|
||||||
target_compile_options(siritobj PRIVATE -Wno-error=unused-command-line-argument)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# SPIRV Tools
|
|
||||||
AddJsonPackage(spirv-tools)
|
|
||||||
|
|
||||||
if (SPIRV-Tools_ADDED)
|
|
||||||
add_library(SPIRV-Tools::SPIRV-Tools ALIAS SPIRV-Tools-static)
|
|
||||||
target_link_libraries(SPIRV-Tools-static PRIVATE SPIRV-Tools-opt SPIRV-Tools-link)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Catch2
|
|
||||||
if (YUZU_TESTS OR DYNARMIC_TESTS)
|
|
||||||
AddJsonPackage(catch2)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# getopt
|
# getopt
|
||||||
if (MSVC)
|
if (MSVC)
|
||||||
add_subdirectory(getopt)
|
add_subdirectory(getopt)
|
||||||
|
@ -208,6 +67,18 @@ if (VulkanMemoryAllocator_ADDED)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Sirit
|
||||||
|
AddJsonPackage(sirit)
|
||||||
|
|
||||||
|
if(MSVC AND USE_CCACHE AND sirit_ADDED)
|
||||||
|
get_target_property(_opts sirit COMPILE_OPTIONS)
|
||||||
|
list(FILTER _opts EXCLUDE REGEX "/Zi")
|
||||||
|
list(APPEND _opts "/Z7")
|
||||||
|
set_target_properties(sirit PROPERTIES COMPILE_OPTIONS "${_opts}")
|
||||||
|
elseif(MSVC AND CXX_CLANG)
|
||||||
|
target_compile_options(sirit PRIVATE -Wno-error=unused-command-line-argument)
|
||||||
|
endif()
|
||||||
|
|
||||||
# httplib
|
# httplib
|
||||||
if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)
|
if (ENABLE_WEB_SERVICE OR ENABLE_QT_UPDATE_CHECKER)
|
||||||
AddJsonPackage(httplib)
|
AddJsonPackage(httplib)
|
||||||
|
|
170
externals/cpmfile.json
vendored
170
externals/cpmfile.json
vendored
|
@ -2,34 +2,23 @@
|
||||||
"vulkan-memory-allocator": {
|
"vulkan-memory-allocator": {
|
||||||
"package": "VulkanMemoryAllocator",
|
"package": "VulkanMemoryAllocator",
|
||||||
"repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
|
"repo": "GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator",
|
||||||
"tag": "v%VERSION%",
|
"sha": "1076b348ab",
|
||||||
"hash": "deb5902ef8db0e329fbd5f3f4385eb0e26bdd9f14f3a2334823fb3fe18f36bc5d235d620d6e5f6fe3551ec3ea7038638899db8778c09f6d5c278f5ff95c3344b",
|
"hash": "a46b44e4286d08cffda058e856c47f44c7fed3da55fe9555976eb3907fdcc20ead0b1860b0c38319cda01dbf9b1aa5d4b4038c7f1f8fbd97283d837fa9af9772",
|
||||||
"find_args": "CONFIG",
|
"find_args": "CONFIG"
|
||||||
"git_version": "3.3.0"
|
|
||||||
},
|
},
|
||||||
"sirit": {
|
"sirit": {
|
||||||
"repo": "eden-emulator/sirit",
|
"repo": "eden-emulator/sirit",
|
||||||
"git_version": "1.0.2",
|
"sha": "db1f1e8ab5",
|
||||||
"tag": "v%VERSION%",
|
"hash": "73eb3a042848c63a10656545797e85f40d142009dfb7827384548a385e1e28e1ac72f42b25924ce530d58275f8638554281e884d72f9c7aaf4ed08690a414b05",
|
||||||
"artifact": "sirit-source-%VERSION%.tar.zst",
|
|
||||||
"hash_suffix": "sha512sum",
|
|
||||||
"find_args": "CONFIG",
|
"find_args": "CONFIG",
|
||||||
"options": [
|
"options": [
|
||||||
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
|
"SIRIT_USE_SYSTEM_SPIRV_HEADERS ON"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"sirit-ci": {
|
|
||||||
"ci": true,
|
|
||||||
"package": "sirit",
|
|
||||||
"name": "sirit",
|
|
||||||
"repo": "eden-emulator/sirit",
|
|
||||||
"version": "1.0.2"
|
|
||||||
},
|
|
||||||
"httplib": {
|
"httplib": {
|
||||||
"repo": "yhirose/cpp-httplib",
|
"repo": "yhirose/cpp-httplib",
|
||||||
"tag": "v%VERSION%",
|
"sha": "a609330e4c",
|
||||||
"hash": "b364500f76e2ecb0fe21b032d831272e3f1dfeea71af74e325f8fc4ce9dcdb3c941b97a5b422bdeafb9facd058597b90f8bfc284fb9afe3c33fefa15dd5a010b",
|
"hash": "dd3fd0572f8367d8549e1319fd98368b3e75801a293b0c3ac9b4adb806473a4506a484b3d389dc5bee5acc460cb90af7a20e5df705a1696b56496b30b9ce7ed2"
|
||||||
"git_version": "0.26.0"
|
|
||||||
},
|
},
|
||||||
"cpp-jwt": {
|
"cpp-jwt": {
|
||||||
"version": "1.4",
|
"version": "1.4",
|
||||||
|
@ -44,26 +33,22 @@
|
||||||
"xbyak_sun": {
|
"xbyak_sun": {
|
||||||
"package": "xbyak",
|
"package": "xbyak",
|
||||||
"repo": "herumi/xbyak",
|
"repo": "herumi/xbyak",
|
||||||
"tag": "v%VERSION%",
|
"sha": "9bb219333a",
|
||||||
"hash": "e84992c65ad62c577e2746ec5180132fd2875166d1e6b1521a0ff619787e1645792fe5f6a858fe94ed66f297912b6a6b89a509b5d5f5e81a2db1dd7e6790b1f5",
|
"hash": "303165d45c8c19387ec49d9fda7d7a4e0d86d4c0153898c23f25ce2d58ece567f44c0bbbfe348239b933edb6e1a1e34f4bc1c0ab3a285bee5da0e548879387b0",
|
||||||
"bundled": true,
|
"bundled": true
|
||||||
"git_version": "7.30"
|
|
||||||
},
|
},
|
||||||
"xbyak": {
|
"xbyak": {
|
||||||
"package": "xbyak",
|
"package": "xbyak",
|
||||||
"repo": "herumi/xbyak",
|
"repo": "herumi/xbyak",
|
||||||
"tag": "v%VERSION%",
|
"sha": "4e44f4614d",
|
||||||
"hash": "1042090405c426e339506c179d53e91d4d545ce9c9f53d8f797caa092d589f913a9bcb9c8f31c4c60870acb954c556e305fb6732c66bc3c8f1cd924f9172def9",
|
"hash": "5824e92159e07fa36a774aedd3b3ef3541d0241371d522cffa4ab3e1f215fa5097b1b77865b47b2481376c704fa079875557ea463ca63d0a7fd6a8a20a589e70",
|
||||||
"git_version": "7.22",
|
"bundled": true
|
||||||
"bundled": true,
|
|
||||||
"skip_updates": true
|
|
||||||
},
|
},
|
||||||
"oaknut": {
|
"oaknut": {
|
||||||
"repo": "eden-emulator/oaknut",
|
|
||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"git_version": "2.0.3",
|
"repo": "merryhime/oaknut",
|
||||||
"tag": "v%VERSION%",
|
"sha": "94c726ce03",
|
||||||
"hash": "9697e80a7d5d9bcb3ce51051a9a24962fb90ca79d215f1f03ae6b58da8ba13a63b5dda1b4dde3d26ac6445029696b8ef2883f4e5a777b342bba01283ed293856"
|
"hash": "d8d082242fa1881abce3c82f8dafa002c4e561e66a69e7fc038af67faa5eff2630f082d3d19579c88c4c9f9488e54552accc8cb90e7ce743efe043b6230c08ac"
|
||||||
},
|
},
|
||||||
"libadrenotools": {
|
"libadrenotools": {
|
||||||
"repo": "bylaws/libadrenotools",
|
"repo": "bylaws/libadrenotools",
|
||||||
|
@ -75,128 +60,15 @@
|
||||||
},
|
},
|
||||||
"oboe": {
|
"oboe": {
|
||||||
"repo": "google/oboe",
|
"repo": "google/oboe",
|
||||||
"tag": "%VERSION%",
|
"sha": "2bc873e53c",
|
||||||
"hash": "ce4011afe7345370d4ead3b891cd69a5ef224b129535783586c0ca75051d303ed446e6c7f10bde8da31fff58d6e307f1732a3ffd03b249f9ef1fd48fd4132715",
|
"hash": "02329058a7f9cf7d5039afaae5ab170d9f42f60f4c01e21eaf4f46073886922b057a9ae30eeac040b3ac182f51b9c1bfe9fe1050a2c9f6ce567a1a9a0ec2c768",
|
||||||
"git_version": "1.10.0",
|
|
||||||
"bundled": true
|
"bundled": true
|
||||||
},
|
},
|
||||||
"unordered-dense": {
|
"unordered-dense": {
|
||||||
"package": "unordered_dense",
|
"package": "unordered_dense",
|
||||||
"repo": "martinus/unordered_dense",
|
"repo": "martinus/unordered_dense",
|
||||||
"tag": "v%VERSION%",
|
"sha": "73f3cbb237",
|
||||||
"hash": "f9c819e28e1c1a387acfee09277d6af5e366597a0d39acf1c687acf0608a941ba966af8aaebdb8fba0126c7360269c4a51754ef4cab17c35c01a30215f953368",
|
"hash": "c08c03063938339d61392b687562909c1a92615b6ef39ec8df19ea472aa6b6478e70d7d5e33d4a27b5d23f7806daf57fe1bacb8124c8a945c918c7663a9e8532",
|
||||||
"find_args": "CONFIG",
|
"find_args": "CONFIG"
|
||||||
"git_version": "4.5.0"
|
|
||||||
},
|
|
||||||
"mbedtls": {
|
|
||||||
"package": "MbedTLS",
|
|
||||||
"repo": "Mbed-TLS/mbedtls",
|
|
||||||
"tag": "mbedtls-%VERSION%",
|
|
||||||
"hash": "6671fb8fcaa832e5b115dfdce8f78baa6a4aea71f5c89a640583634cdee27aefe3bf4be075744da91f7c3ae5ea4e0c765c8fc3937b5cfd9ea73d87ef496524da",
|
|
||||||
"version": "3",
|
|
||||||
"git_version": "3.6.4",
|
|
||||||
"artifact": "%TAG%.tar.bz2",
|
|
||||||
"skip_updates": true
|
|
||||||
},
|
|
||||||
"enet": {
|
|
||||||
"repo": "lsalzman/enet",
|
|
||||||
"tag": "v%VERSION%",
|
|
||||||
"hash": "a0d2fa8c957704dd49e00a726284ac5ca034b50b00d2b20a94fa1bbfbb80841467834bfdc84aa0ed0d6aab894608fd6c86c3b94eee46343f0e6d9c22e391dbf9",
|
|
||||||
"version": "1.3",
|
|
||||||
"git_version": "1.3.18",
|
|
||||||
"find_args": "MODULE"
|
|
||||||
},
|
|
||||||
"vulkan-utility-headers": {
|
|
||||||
"package": "VulkanUtilityLibraries",
|
|
||||||
"repo": "scripts/VulkanUtilityHeaders",
|
|
||||||
"tag": "%VERSION%",
|
|
||||||
"git_version": "1.4.328",
|
|
||||||
"artifact": "VulkanUtilityHeaders.tar.zst",
|
|
||||||
"git_host": "git.crueter.xyz",
|
|
||||||
"hash": "9922217b39faf73cd4fc1510f2fdba14a49aa5c0d77f9ee24ee0512cef16b234d0cabc83c1fec861fa5df1d43e7f086ca9b6501753899119f39c5ca530cb0dae"
|
|
||||||
},
|
|
||||||
"spirv-tools": {
|
|
||||||
"package": "SPIRV-Tools",
|
|
||||||
"repo": "crueter/SPIRV-Tools",
|
|
||||||
"sha": "2fa2d44485",
|
|
||||||
"hash": "45b198be1d09974ccb2438e8bfa5683f23a0421b058297c28eacfd77e454ec2cf87e77850eddd202efff34b004d8d6b4d12e9615e59bd72be904c196f5eb2169",
|
|
||||||
"git_version": "2025.4",
|
|
||||||
"options": [
|
|
||||||
"SPIRV_SKIP_EXECUTABLES ON"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"spirv-headers": {
|
|
||||||
"package": "SPIRV-Headers",
|
|
||||||
"repo": "KhronosGroup/SPIRV-Headers",
|
|
||||||
"sha": "01e0577914",
|
|
||||||
"hash": "d0f905311faf7d743de686fdf241dc4cb0a4f08e2184f5a3b3b2946e680db3cd89eeb72954eafe6fa457f93550e27d516575c8709cb134d8aecc0b43064636ce",
|
|
||||||
"options": [
|
|
||||||
"SPIRV_WERROR OFF"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"cubeb": {
|
|
||||||
"repo": "mozilla/cubeb",
|
|
||||||
"sha": "fa02160712",
|
|
||||||
"hash": "82d808356752e4064de48c8fecbe7856715ade1e76b53937116bf07129fc1cc5b3de5e4b408de3cd000187ba8dc32ca4109661cb7e0355a52e54bd81b9be1c61",
|
|
||||||
"find_args": "CONFIG",
|
|
||||||
"options": [
|
|
||||||
"USE_SANITIZERS OFF",
|
|
||||||
"BUILD_TESTS OFF",
|
|
||||||
"BUILD_TOOLS OFF",
|
|
||||||
"BUNDLE_SPEEX ON"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"sdl2": {
|
|
||||||
"ci": true,
|
|
||||||
"package": "SDL2",
|
|
||||||
"name": "SDL2",
|
|
||||||
"repo": "crueter-ci/SDL2",
|
|
||||||
"version": "2.32.10",
|
|
||||||
"min_version": "2.26.4",
|
|
||||||
"disabled_platforms": [
|
|
||||||
"macos-universal"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"catch2": {
|
|
||||||
"package": "Catch2",
|
|
||||||
"repo": "catchorg/Catch2",
|
|
||||||
"tag": "v%VERSION%",
|
|
||||||
"hash": "a95495142f915d6e9c2a23e80fe360343e9097680066a2f9d3037a070ba5f81ee5559a0407cc9e972dc2afae325873f1fc7ea07a64012c0f01aac6e549f03e3f",
|
|
||||||
"version": "3.0.1",
|
|
||||||
"git_version": "3.11.0"
|
|
||||||
},
|
|
||||||
"discord-rpc": {
|
|
||||||
"package": "DiscordRPC",
|
|
||||||
"repo": "eden-emulator/discord-rpc",
|
|
||||||
"sha": "1cf7772bb6",
|
|
||||||
"hash": "e9b35e6f2c075823257bcd59f06fe7bb2ccce1976f44818d2e28810435ef79c712a3c4f20f40da41f691342a4058cf86b078eb7f9d9e4dae83c0547c21ec4f97",
|
|
||||||
"find_args": "MODULE"
|
|
||||||
},
|
|
||||||
"simpleini": {
|
|
||||||
"package": "SimpleIni",
|
|
||||||
"repo": "brofield/simpleini",
|
|
||||||
"tag": "v%VERSION%",
|
|
||||||
"hash": "6c198636816a0018adbf7f735d402c64245c6fcd540b7360d4388d46f007f3a520686cdaec4705cb8cb31401b2cb4797a80b42ea5d08a6a5807c0848386f7ca1",
|
|
||||||
"find_args": "MODULE",
|
|
||||||
"git_version": "4.22"
|
|
||||||
},
|
|
||||||
"sdl2_generic": {
|
|
||||||
"package": "SDL2",
|
|
||||||
"repo": "libsdl-org/SDL",
|
|
||||||
"tag": "release-%VERSION%",
|
|
||||||
"hash": "d5622d6bb7266f7942a7b8ad43e8a22524893bf0c2ea1af91204838d9b78d32768843f6faa248757427b8404b8c6443776d4afa6b672cd8571a4e0c03a829383",
|
|
||||||
"key": "generic",
|
|
||||||
"bundled": true,
|
|
||||||
"git_version": "2.32.10",
|
|
||||||
"skip_updates": true
|
|
||||||
},
|
|
||||||
"sdl2_steamdeck": {
|
|
||||||
"package": "SDL2",
|
|
||||||
"repo": "libsdl-org/SDL",
|
|
||||||
"sha": "cc016b0046",
|
|
||||||
"hash": "34d5ef58da6a4f9efa6689c82f67badcbd741f5a4f562a9c2c30828fa839830fb07681c5dc6a7851520e261c8405a416ac0a2c2513b51984fb3b4fa4dcb3e20b",
|
|
||||||
"key": "steamdeck",
|
|
||||||
"bundled": true,
|
|
||||||
"skip_updates": "true"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
5
externals/ffmpeg/cpmfile.json
vendored
5
externals/ffmpeg/cpmfile.json
vendored
|
@ -13,9 +13,8 @@
|
||||||
"version": "8.0",
|
"version": "8.0",
|
||||||
"min_version": "4.1",
|
"min_version": "4.1",
|
||||||
"disabled_platforms": [
|
"disabled_platforms": [
|
||||||
"freebsd-amd64",
|
"freebsd",
|
||||||
"solaris-amd64",
|
"solaris"
|
||||||
"macos-universal"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
13
externals/libusb/CMakeLists.txt
vendored
13
externals/libusb/CMakeLists.txt
vendored
|
@ -6,7 +6,18 @@
|
||||||
|
|
||||||
include(CPMUtil)
|
include(CPMUtil)
|
||||||
|
|
||||||
AddJsonPackage(libusb)
|
# we love our libraries don't we folks
|
||||||
|
if (PLATFORM_SUN)
|
||||||
|
set(libusb_bundled ON)
|
||||||
|
else()
|
||||||
|
set(libusb_bundled OFF)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# TODO(crueter): Fix on Solaris
|
||||||
|
AddJsonPackage(
|
||||||
|
NAME libusb
|
||||||
|
BUNDLED_PACKAGE ${libusb_bundled}
|
||||||
|
)
|
||||||
|
|
||||||
if (NOT libusb_ADDED)
|
if (NOT libusb_ADDED)
|
||||||
return()
|
return()
|
||||||
|
|
7
externals/libusb/cpmfile.json
vendored
7
externals/libusb/cpmfile.json
vendored
|
@ -1,9 +1,8 @@
|
||||||
{
|
{
|
||||||
"libusb": {
|
"libusb": {
|
||||||
"repo": "libusb/libusb",
|
"repo": "libusb/libusb",
|
||||||
"tag": "v%VERSION%",
|
"sha": "c060e9ce30",
|
||||||
"hash": "98c5f7940ff06b25c9aa65aa98e23de4c79a4c1067595f4c73cc145af23a1c286639e1ba11185cd91bab702081f307b973f08a4c9746576dc8d01b3620a3aeb5",
|
"hash": "44647357ba1179020cfa6674d809fc35cf6f89bff1c57252fe3a610110f5013ad678fc6eb5918e751d4384c30e2fe678868dbffc5f85736157e546cb9d10accc",
|
||||||
"find_args": "MODULE",
|
"find_args": "MODULE"
|
||||||
"git_version": "1.0.29"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -101,9 +101,15 @@ if (MSVC AND NOT CXX_CLANG)
|
||||||
)
|
)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (WIN32 AND (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo"))
|
if (USE_CCACHE OR YUZU_USE_PRECOMPILED_HEADERS)
|
||||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
# when caching, we need to use /Z7 to downgrade debug info to use an older but more cacheable format
|
||||||
string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
# Precompiled headers are deleted if not using /Z7. See https://github.com/nanoant/CMakePCHCompiler/issues/21
|
||||||
|
add_compile_options(/Z7)
|
||||||
|
# Avoid D9025 warning
|
||||||
|
string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
|
||||||
|
string(REPLACE "/Zi" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
|
||||||
|
else()
|
||||||
|
add_compile_options(/Zi)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (ARCHITECTURE_x86_64)
|
if (ARCHITECTURE_x86_64)
|
||||||
|
|
|
@ -57,9 +57,9 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
// TODO If this is ever modified, change application_id in strings.xml
|
||||||
applicationId = "dev.eden.eden_emulator"
|
applicationId = "dev.eden.eden_emulator"
|
||||||
|
minSdk = 30
|
||||||
minSdk = 28
|
|
||||||
targetSdk = 36
|
targetSdk = 36
|
||||||
versionName = getGitVersion()
|
versionName = getGitVersion()
|
||||||
|
|
||||||
|
@ -72,32 +72,7 @@ android {
|
||||||
|
|
||||||
buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"")
|
buildConfigField("String", "GIT_HASH", "\"${getGitHash()}\"")
|
||||||
buildConfigField("String", "BRANCH", "\"${getBranch()}\"")
|
buildConfigField("String", "BRANCH", "\"${getBranch()}\"")
|
||||||
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
val extraCMakeArgs = (project.findProperty("YUZU_ANDROID_ARGS") as String?)?.split("\\s+".toRegex()) ?: emptyList()
|
|
||||||
|
|
||||||
arguments.addAll(listOf(
|
|
||||||
"-DENABLE_QT=0", // Don't use QT
|
|
||||||
"-DENABLE_SDL2=0", // Don't use SDL
|
|
||||||
"-DENABLE_WEB_SERVICE=1", // Enable web service
|
|
||||||
"-DENABLE_OPENSSL=ON",
|
|
||||||
"-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
|
|
||||||
"-DYUZU_USE_CPM=ON",
|
|
||||||
"-DCPMUTIL_FORCE_BUNDLED=ON",
|
|
||||||
"-DYUZU_USE_BUNDLED_FFMPEG=ON",
|
|
||||||
"-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
|
|
||||||
"-DBUILD_TESTING=OFF",
|
|
||||||
"-DYUZU_TESTS=OFF",
|
|
||||||
"-DDYNARMIC_TESTS=OFF",
|
|
||||||
*extraCMakeArgs.toTypedArray()
|
|
||||||
))
|
|
||||||
|
|
||||||
abiFilters("arm64-v8a")
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
|
val keystoreFile = System.getenv("ANDROID_KEYSTORE_FILE")
|
||||||
signingConfigs {
|
signingConfigs {
|
||||||
|
@ -119,6 +94,7 @@ android {
|
||||||
|
|
||||||
// Define build types, which are orthogonal to product flavors.
|
// Define build types, which are orthogonal to product flavors.
|
||||||
buildTypes {
|
buildTypes {
|
||||||
|
|
||||||
// Signed by release key, allowing for upload to Play Store.
|
// Signed by release key, allowing for upload to Play Store.
|
||||||
release {
|
release {
|
||||||
signingConfig = if (keystoreFile != null) {
|
signingConfig = if (keystoreFile != null) {
|
||||||
|
@ -127,6 +103,7 @@ android {
|
||||||
signingConfigs.getByName("default")
|
signingConfigs.getByName("default")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
resValue("string", "app_name_suffixed", "Eden")
|
||||||
isMinifyEnabled = true
|
isMinifyEnabled = true
|
||||||
isDebuggable = false
|
isDebuggable = false
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
|
@ -139,6 +116,7 @@ android {
|
||||||
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
|
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
|
||||||
register("relWithDebInfo") {
|
register("relWithDebInfo") {
|
||||||
isDefault = true
|
isDefault = true
|
||||||
|
resValue("string", "app_name_suffixed", "Eden Debug Release")
|
||||||
signingConfig = signingConfigs.getByName("default")
|
signingConfig = signingConfigs.getByName("default")
|
||||||
isDebuggable = true
|
isDebuggable = true
|
||||||
proguardFiles(
|
proguardFiles(
|
||||||
|
@ -154,6 +132,7 @@ android {
|
||||||
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
|
// Attaches 'debug' suffix to version and package name, allowing installation alongside the release build.
|
||||||
debug {
|
debug {
|
||||||
signingConfig = signingConfigs.getByName("default")
|
signingConfig = signingConfigs.getByName("default")
|
||||||
|
resValue("string", "app_name_suffixed", "Eden Debug")
|
||||||
isDebuggable = true
|
isDebuggable = true
|
||||||
isJniDebuggable = true
|
isJniDebuggable = true
|
||||||
versionNameSuffix = "-debug"
|
versionNameSuffix = "-debug"
|
||||||
|
@ -161,62 +140,19 @@ android {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is really annoying but idk any other ways to fix this behavior
|
|
||||||
applicationVariants.all {
|
|
||||||
val variant = this
|
|
||||||
when {
|
|
||||||
variant.flavorName == "legacy" && variant.buildType.name == "debug" -> {
|
|
||||||
variant.resValue("string", "app_name_suffixed", "Eden Legacy Debug")
|
|
||||||
}
|
|
||||||
variant.flavorName == "mainline" && variant.buildType.name == "debug" -> {
|
|
||||||
variant.resValue("string", "app_name_suffixed", "Eden Debug")
|
|
||||||
}
|
|
||||||
variant.flavorName == "genshinSpoof" && variant.buildType.name == "debug" -> {
|
|
||||||
variant.resValue("string", "app_name_suffixed", "Eden Optimized Debug")
|
|
||||||
}
|
|
||||||
variant.flavorName == "legacy" && variant.buildType.name == "relWithDebInfo" -> {
|
|
||||||
variant.resValue("string", "app_name_suffixed", "Eden Legacy Debug Release")
|
|
||||||
}
|
|
||||||
variant.flavorName == "mainline" && variant.buildType.name == "relWithDebInfo" -> {
|
|
||||||
variant.resValue("string", "app_name_suffixed", "Eden Debug Release")
|
|
||||||
}
|
|
||||||
variant.flavorName == "genshinSpoof" && variant.buildType.name == "relWithDebInfo" -> {
|
|
||||||
variant.resValue("string", "app_name_suffixed", "Eden Optimized Debug Release")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
android {
|
android {
|
||||||
flavorDimensions.add("version")
|
flavorDimensions.add("version")
|
||||||
productFlavors {
|
productFlavors {
|
||||||
create("mainline") {
|
create("mainline") {
|
||||||
dimension = "version"
|
dimension = "version"
|
||||||
resValue("string", "app_name_suffixed", "Eden")
|
// No need to set applicationId here
|
||||||
}
|
}
|
||||||
|
|
||||||
create("genshinSpoof") {
|
create("genshinSpoof") {
|
||||||
dimension = "version"
|
dimension = "version"
|
||||||
resValue("string", "app_name_suffixed", "Eden Optimized")
|
resValue("string", "app_name_suffixed", "Eden Optimised")
|
||||||
applicationId = "com.miHoYo.Yuanshen"
|
applicationId = "com.miHoYo.Yuanshen"
|
||||||
}
|
}
|
||||||
|
|
||||||
create("legacy") {
|
|
||||||
dimension = "version"
|
|
||||||
resValue("string", "app_name_suffixed", "Eden Legacy")
|
|
||||||
applicationId = "dev.legacy.eden_emulator"
|
|
||||||
|
|
||||||
externalNativeBuild {
|
|
||||||
cmake {
|
|
||||||
arguments.add("-DYUZU_LEGACY=ON")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sourceSets {
|
|
||||||
getByName("legacy") {
|
|
||||||
res.srcDirs("src/main/legacy")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -226,6 +162,29 @@ android {
|
||||||
path = file("../../../CMakeLists.txt")
|
path = file("../../../CMakeLists.txt")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
externalNativeBuild {
|
||||||
|
cmake {
|
||||||
|
arguments(
|
||||||
|
"-DENABLE_QT=0", // Don't use QT
|
||||||
|
"-DENABLE_SDL2=0", // Don't use SDL
|
||||||
|
"-DENABLE_WEB_SERVICE=1", // Enable web service
|
||||||
|
"-DENABLE_OPENSSL=ON",
|
||||||
|
"-DANDROID_ARM_NEON=true", // cryptopp requires Neon to work
|
||||||
|
"-DYUZU_USE_CPM=ON",
|
||||||
|
"-DCPMUTIL_FORCE_BUNDLED=ON",
|
||||||
|
"-DYUZU_USE_BUNDLED_FFMPEG=ON",
|
||||||
|
"-DCMAKE_EXPORT_COMPILE_COMMANDS=ON",
|
||||||
|
"-DBUILD_TESTING=OFF",
|
||||||
|
"-DYUZU_TESTS=OFF",
|
||||||
|
"-DDYNARMIC_TESTS=OFF"
|
||||||
|
)
|
||||||
|
|
||||||
|
abiFilters("arm64-v8a")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tasks.register<Delete>("ktlintReset", fun Delete.() {
|
tasks.register<Delete>("ktlintReset", fun Delete.() {
|
||||||
|
|
|
@ -68,9 +68,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||||
var isActivityRecreated = false
|
var isActivityRecreated = false
|
||||||
private lateinit var nfcReader: NfcReader
|
private lateinit var nfcReader: NfcReader
|
||||||
|
|
||||||
private var touchDownTime: Long = 0
|
|
||||||
private val maxTapDuration = 500L
|
|
||||||
|
|
||||||
private val gyro = FloatArray(3)
|
private val gyro = FloatArray(3)
|
||||||
private val accel = FloatArray(3)
|
private val accel = FloatArray(3)
|
||||||
private var motionTimestamp: Long = 0
|
private var motionTimestamp: Long = 0
|
||||||
|
@ -492,38 +489,6 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun dispatchTouchEvent(event: MotionEvent): Boolean {
|
|
||||||
val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment
|
|
||||||
val emulationFragment = navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment
|
|
||||||
|
|
||||||
emulationFragment?.let { fragment ->
|
|
||||||
when (event.action) {
|
|
||||||
MotionEvent.ACTION_DOWN -> {
|
|
||||||
touchDownTime = System.currentTimeMillis()
|
|
||||||
// show overlay immediately on touch and cancel timer
|
|
||||||
if (!emulationViewModel.drawerOpen.value) {
|
|
||||||
fragment.handler.removeCallbacksAndMessages(null)
|
|
||||||
fragment.showOverlay()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MotionEvent.ACTION_UP -> {
|
|
||||||
if (!emulationViewModel.drawerOpen.value) {
|
|
||||||
val touchDuration = System.currentTimeMillis() - touchDownTime
|
|
||||||
|
|
||||||
if (touchDuration <= maxTapDuration) {
|
|
||||||
fragment.handleScreenTap(false)
|
|
||||||
} else {
|
|
||||||
// just start the auto-hide timer without toggling visibility
|
|
||||||
fragment.handleScreenTap(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return super.dispatchTouchEvent(event)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onEmulationStarted() {
|
fun onEmulationStarted() {
|
||||||
emulationViewModel.setEmulationStarted(true)
|
emulationViewModel.setEmulationStarted(true)
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,11 +51,10 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||||
|
|
||||||
SOC_OVERLAY_BACKGROUND("soc_overlay_background"),
|
SOC_OVERLAY_BACKGROUND("soc_overlay_background"),
|
||||||
|
|
||||||
|
ENABLE_RAII("enable_raii"),
|
||||||
FRAME_INTERPOLATION("frame_interpolation"),
|
FRAME_INTERPOLATION("frame_interpolation"),
|
||||||
// FRAME_SKIPPING("frame_skipping"),
|
// FRAME_SKIPPING("frame_skipping"),
|
||||||
|
|
||||||
ENABLE_INPUT_OVERLAY_AUTO_HIDE("enable_input_overlay_auto_hide"),
|
|
||||||
|
|
||||||
PERF_OVERLAY_BACKGROUND("perf_overlay_background"),
|
PERF_OVERLAY_BACKGROUND("perf_overlay_background"),
|
||||||
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
|
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
|
||||||
|
|
||||||
|
@ -70,6 +69,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||||
DEBUG_FLUSH_BY_LINE("flush_line"),
|
DEBUG_FLUSH_BY_LINE("flush_line"),
|
||||||
USE_LRU_CACHE("use_lru_cache");
|
USE_LRU_CACHE("use_lru_cache");
|
||||||
|
|
||||||
|
external fun isRaiiEnabled(): Boolean
|
||||||
|
|
||||||
// external fun isFrameSkippingEnabled(): Boolean
|
// external fun isFrameSkippingEnabled(): Boolean
|
||||||
external fun isFrameInterpolationEnabled(): Boolean
|
external fun isFrameInterpolationEnabled(): Boolean
|
||||||
|
|
|
@ -59,8 +59,7 @@ enum class IntSetting(override val key: String) : AbstractIntSetting {
|
||||||
OFFLINE_WEB_APPLET("offline_web_applet_mode"),
|
OFFLINE_WEB_APPLET("offline_web_applet_mode"),
|
||||||
LOGIN_SHARE_APPLET("login_share_applet_mode"),
|
LOGIN_SHARE_APPLET("login_share_applet_mode"),
|
||||||
WIFI_WEB_AUTH_APPLET("wifi_web_auth_applet_mode"),
|
WIFI_WEB_AUTH_APPLET("wifi_web_auth_applet_mode"),
|
||||||
MY_PAGE_APPLET("my_page_applet_mode"),
|
MY_PAGE_APPLET("my_page_applet_mode")
|
||||||
INPUT_OVERLAY_AUTO_HIDE("input_overlay_auto_hide")
|
|
||||||
;
|
;
|
||||||
|
|
||||||
override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
|
override fun getInt(needsGlobal: Boolean): Int = NativeConfig.getInt(key, needsGlobal)
|
||||||
|
|
|
@ -12,7 +12,6 @@ object Settings {
|
||||||
SECTION_SYSTEM(R.string.preferences_system),
|
SECTION_SYSTEM(R.string.preferences_system),
|
||||||
SECTION_RENDERER(R.string.preferences_graphics),
|
SECTION_RENDERER(R.string.preferences_graphics),
|
||||||
SECTION_PERFORMANCE_STATS(R.string.stats_overlay_options),
|
SECTION_PERFORMANCE_STATS(R.string.stats_overlay_options),
|
||||||
SECTION_INPUT_OVERLAY(R.string.input_overlay_options),
|
|
||||||
SECTION_SOC_OVERLAY(R.string.soc_overlay_options),
|
SECTION_SOC_OVERLAY(R.string.soc_overlay_options),
|
||||||
SECTION_AUDIO(R.string.preferences_audio),
|
SECTION_AUDIO(R.string.preferences_audio),
|
||||||
SECTION_INPUT(R.string.preferences_controls),
|
SECTION_INPUT(R.string.preferences_controls),
|
||||||
|
|
|
@ -96,7 +96,6 @@ abstract class SettingsItem(
|
||||||
const val TYPE_INT_SINGLE_CHOICE = 9
|
const val TYPE_INT_SINGLE_CHOICE = 9
|
||||||
const val TYPE_INPUT_PROFILE = 10
|
const val TYPE_INPUT_PROFILE = 10
|
||||||
const val TYPE_STRING_INPUT = 11
|
const val TYPE_STRING_INPUT = 11
|
||||||
const val TYPE_SPINBOX = 12
|
|
||||||
|
|
||||||
const val FASTMEM_COMBINED = "fastmem_combined"
|
const val FASTMEM_COMBINED = "fastmem_combined"
|
||||||
|
|
||||||
|
@ -229,6 +228,13 @@ abstract class SettingsItem(
|
||||||
|
|
||||||
override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset()
|
override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset()
|
||||||
}
|
}
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.ENABLE_RAII,
|
||||||
|
titleId = R.string.enable_raii,
|
||||||
|
descriptionId = R.string.enable_raii_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.FRAME_INTERPOLATION,
|
BooleanSetting.FRAME_INTERPOLATION,
|
||||||
|
@ -379,22 +385,6 @@ abstract class SettingsItem(
|
||||||
warningMessage = R.string.warning_resolution
|
warningMessage = R.string.warning_resolution
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE,
|
|
||||||
titleId = R.string.enable_input_overlay_auto_hide,
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
|
||||||
SpinBoxSetting(
|
|
||||||
IntSetting.INPUT_OVERLAY_AUTO_HIDE,
|
|
||||||
titleId = R.string.overlay_auto_hide,
|
|
||||||
descriptionId = R.string.overlay_auto_hide_description,
|
|
||||||
min = 1,
|
|
||||||
max = 999,
|
|
||||||
valueHint = R.string.seconds
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
|
@ -826,4 +816,3 @@ abstract class SettingsItem(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,41 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.model.view
|
|
||||||
|
|
||||||
import androidx.annotation.StringRes
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.AbstractByteSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.AbstractFloatSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.AbstractIntSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.AbstractSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.AbstractShortSetting
|
|
||||||
|
|
||||||
class SpinBoxSetting(
|
|
||||||
setting: AbstractSetting,
|
|
||||||
@StringRes titleId: Int = 0,
|
|
||||||
titleString: String = "",
|
|
||||||
@StringRes descriptionId: Int = 0,
|
|
||||||
descriptionString: String = "",
|
|
||||||
val valueHint: Int,
|
|
||||||
val min: Int,
|
|
||||||
val max: Int
|
|
||||||
) : SettingsItem(setting, titleId, titleString, descriptionId, descriptionString) {
|
|
||||||
override val type = TYPE_SPINBOX
|
|
||||||
|
|
||||||
fun getSelectedValue(needsGlobal: Boolean = false) =
|
|
||||||
when (setting) {
|
|
||||||
is AbstractByteSetting -> setting.getByte(needsGlobal).toInt()
|
|
||||||
is AbstractShortSetting -> setting.getShort(needsGlobal).toInt()
|
|
||||||
is AbstractIntSetting -> setting.getInt(needsGlobal)
|
|
||||||
is AbstractFloatSetting -> setting.getFloat(needsGlobal).toInt()
|
|
||||||
else -> 0
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setSelectedValue(value: Int) =
|
|
||||||
when (setting) {
|
|
||||||
is AbstractByteSetting -> setting.setByte(value.toByte())
|
|
||||||
is AbstractShortSetting -> setting.setShort(value.toShort())
|
|
||||||
is AbstractFloatSetting -> setting.setFloat(value.toFloat())
|
|
||||||
else -> (setting as AbstractIntSetting).setInt(value)
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui
|
package org.yuzu.yuzu_emu.features.settings.ui
|
||||||
|
|
||||||
|
@ -61,10 +61,6 @@ class SettingsAdapter(
|
||||||
SliderViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
SliderViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsItem.TYPE_SPINBOX -> {
|
|
||||||
SpinBoxViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsItem.TYPE_SUBMENU -> {
|
SettingsItem.TYPE_SUBMENU -> {
|
||||||
SubmenuViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
SubmenuViewHolder(ListItemSettingBinding.inflate(inflater), this)
|
||||||
}
|
}
|
||||||
|
@ -195,14 +191,6 @@ class SettingsAdapter(
|
||||||
position
|
position
|
||||||
).show(fragment.childFragmentManager, SettingsDialogFragment.TAG)
|
).show(fragment.childFragmentManager, SettingsDialogFragment.TAG)
|
||||||
}
|
}
|
||||||
fun onSpinBoxClick(item: SpinBoxSetting, position: Int) {
|
|
||||||
SettingsDialogFragment.newInstance(
|
|
||||||
settingsViewModel,
|
|
||||||
item,
|
|
||||||
SettingsItem.TYPE_SPINBOX,
|
|
||||||
position
|
|
||||||
).show(fragment.childFragmentManager, SettingsDialogFragment.TAG)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun onSubmenuClick(item: SubmenuSetting) {
|
fun onSubmenuClick(item: SubmenuSetting) {
|
||||||
val action = SettingsNavigationDirections.actionGlobalSettingsFragment(item.menuKey, null)
|
val action = SettingsNavigationDirections.actionGlobalSettingsFragment(item.menuKey, null)
|
||||||
|
|
|
@ -14,7 +14,6 @@ import android.text.TextWatcher
|
||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import androidx.appcompat.app.AlertDialog
|
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.fragment.app.DialogFragment
|
import androidx.fragment.app.DialogFragment
|
||||||
import androidx.fragment.app.activityViewModels
|
import androidx.fragment.app.activityViewModels
|
||||||
|
@ -23,7 +22,6 @@ import com.google.android.material.slider.Slider
|
||||||
import org.yuzu.yuzu_emu.R
|
import org.yuzu.yuzu_emu.R
|
||||||
import org.yuzu.yuzu_emu.databinding.DialogEditTextBinding
|
import org.yuzu.yuzu_emu.databinding.DialogEditTextBinding
|
||||||
import org.yuzu.yuzu_emu.databinding.DialogSliderBinding
|
import org.yuzu.yuzu_emu.databinding.DialogSliderBinding
|
||||||
import org.yuzu.yuzu_emu.databinding.DialogSpinboxBinding
|
|
||||||
import org.yuzu.yuzu_emu.features.input.NativeInput
|
import org.yuzu.yuzu_emu.features.input.NativeInput
|
||||||
import org.yuzu.yuzu_emu.features.input.model.AnalogDirection
|
import org.yuzu.yuzu_emu.features.input.model.AnalogDirection
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.AnalogInputSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.AnalogInputSetting
|
||||||
|
@ -32,7 +30,6 @@ import org.yuzu.yuzu_emu.features.settings.model.view.IntSingleChoiceSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
|
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SpinBoxSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.StringInputSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.StringInputSetting
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting
|
import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting
|
||||||
import org.yuzu.yuzu_emu.utils.ParamPackage
|
import org.yuzu.yuzu_emu.utils.ParamPackage
|
||||||
|
@ -49,7 +46,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
|
|
||||||
private lateinit var sliderBinding: DialogSliderBinding
|
private lateinit var sliderBinding: DialogSliderBinding
|
||||||
private lateinit var stringInputBinding: DialogEditTextBinding
|
private lateinit var stringInputBinding: DialogEditTextBinding
|
||||||
private lateinit var spinboxBinding: DialogSpinboxBinding
|
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
|
@ -146,76 +142,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
.create()
|
.create()
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingsItem.TYPE_SPINBOX -> {
|
|
||||||
spinboxBinding = DialogSpinboxBinding.inflate(layoutInflater)
|
|
||||||
val item = settingsViewModel.clickedItem as SpinBoxSetting
|
|
||||||
|
|
||||||
val currentValue = item.getSelectedValue()
|
|
||||||
spinboxBinding.editValue.setText(currentValue.toString())
|
|
||||||
spinboxBinding.textInputLayout.hint = getString(item.valueHint)
|
|
||||||
|
|
||||||
val dialog = MaterialAlertDialogBuilder(requireContext())
|
|
||||||
.setTitle(item.title)
|
|
||||||
.setView(spinboxBinding.root)
|
|
||||||
.setPositiveButton(android.R.string.ok, this)
|
|
||||||
.setNegativeButton(android.R.string.cancel, defaultCancelListener)
|
|
||||||
.create()
|
|
||||||
|
|
||||||
val updateButtonState = { enabled: Boolean ->
|
|
||||||
dialog.setOnShowListener { dialogInterface ->
|
|
||||||
(dialogInterface as AlertDialog).getButton(DialogInterface.BUTTON_POSITIVE)?.isEnabled = enabled
|
|
||||||
}
|
|
||||||
if (dialog.isShowing) {
|
|
||||||
dialog.getButton(DialogInterface.BUTTON_POSITIVE)?.isEnabled = enabled
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
val updateValidity = { value: Int ->
|
|
||||||
val isValid = value in item.min..item.max
|
|
||||||
if (isValid) {
|
|
||||||
spinboxBinding.textInputLayout.error = null
|
|
||||||
} else {
|
|
||||||
spinboxBinding.textInputLayout.error = getString(
|
|
||||||
if (value < item.min) R.string.value_too_low else R.string.value_too_high,
|
|
||||||
if (value < item.min) item.min else item.max
|
|
||||||
)
|
|
||||||
}
|
|
||||||
updateButtonState(isValid)
|
|
||||||
}
|
|
||||||
|
|
||||||
spinboxBinding.buttonDecrement.setOnClickListener {
|
|
||||||
val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
|
|
||||||
val newValue = current - 1
|
|
||||||
spinboxBinding.editValue.setText(newValue.toString())
|
|
||||||
updateValidity(newValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
spinboxBinding.buttonIncrement.setOnClickListener {
|
|
||||||
val current = spinboxBinding.editValue.text.toString().toIntOrNull() ?: currentValue
|
|
||||||
val newValue = current + 1
|
|
||||||
spinboxBinding.editValue.setText(newValue.toString())
|
|
||||||
updateValidity(newValue)
|
|
||||||
}
|
|
||||||
|
|
||||||
spinboxBinding.editValue.addTextChangedListener(object : TextWatcher {
|
|
||||||
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {}
|
|
||||||
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {}
|
|
||||||
override fun afterTextChanged(s: Editable?) {
|
|
||||||
val value = s.toString().toIntOrNull()
|
|
||||||
if (value != null) {
|
|
||||||
updateValidity(value)
|
|
||||||
} else {
|
|
||||||
spinboxBinding.textInputLayout.error = getString(R.string.invalid_value)
|
|
||||||
updateButtonState(false)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
updateValidity(currentValue)
|
|
||||||
|
|
||||||
dialog
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsItem.TYPE_STRING_INPUT -> {
|
SettingsItem.TYPE_STRING_INPUT -> {
|
||||||
stringInputBinding = DialogEditTextBinding.inflate(layoutInflater)
|
stringInputBinding = DialogEditTextBinding.inflate(layoutInflater)
|
||||||
val item = settingsViewModel.clickedItem as StringInputSetting
|
val item = settingsViewModel.clickedItem as StringInputSetting
|
||||||
|
@ -355,14 +281,6 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener
|
||||||
sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value)
|
sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value)
|
||||||
}
|
}
|
||||||
|
|
||||||
is SpinBoxSetting -> {
|
|
||||||
val spinBoxSetting = settingsViewModel.clickedItem as SpinBoxSetting
|
|
||||||
val value = spinboxBinding.editValue.text.toString().toIntOrNull()
|
|
||||||
if (value != null && value in spinBoxSetting.min..spinBoxSetting.max) {
|
|
||||||
spinBoxSetting.setSelectedValue(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
is StringInputSetting -> {
|
is StringInputSetting -> {
|
||||||
val stringInputSetting = settingsViewModel.clickedItem as StringInputSetting
|
val stringInputSetting = settingsViewModel.clickedItem as StringInputSetting
|
||||||
stringInputSetting.setSelectedValue(
|
stringInputSetting.setSelectedValue(
|
||||||
|
|
|
@ -97,7 +97,6 @@ class SettingsFragmentPresenter(
|
||||||
MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl)
|
MenuTag.SECTION_RENDERER -> addGraphicsSettings(sl)
|
||||||
MenuTag.SECTION_PERFORMANCE_STATS -> addPerformanceOverlaySettings(sl)
|
MenuTag.SECTION_PERFORMANCE_STATS -> addPerformanceOverlaySettings(sl)
|
||||||
MenuTag.SECTION_SOC_OVERLAY -> addSocOverlaySettings(sl)
|
MenuTag.SECTION_SOC_OVERLAY -> addSocOverlaySettings(sl)
|
||||||
MenuTag.SECTION_INPUT_OVERLAY -> addInputOverlaySettings(sl)
|
|
||||||
MenuTag.SECTION_AUDIO -> addAudioSettings(sl)
|
MenuTag.SECTION_AUDIO -> addAudioSettings(sl)
|
||||||
MenuTag.SECTION_INPUT -> addInputSettings(sl)
|
MenuTag.SECTION_INPUT -> addInputSettings(sl)
|
||||||
MenuTag.SECTION_INPUT_PLAYER_ONE -> addInputPlayer(sl, 0)
|
MenuTag.SECTION_INPUT_PLAYER_ONE -> addInputPlayer(sl, 0)
|
||||||
|
@ -157,14 +156,6 @@ class SettingsFragmentPresenter(
|
||||||
menuKey = MenuTag.SECTION_SOC_OVERLAY
|
menuKey = MenuTag.SECTION_SOC_OVERLAY
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
add(
|
|
||||||
SubmenuSetting(
|
|
||||||
titleId = R.string.input_overlay_options,
|
|
||||||
iconId = R.drawable.ic_controller,
|
|
||||||
descriptionId = R.string.input_overlay_options_description,
|
|
||||||
menuKey = MenuTag.SECTION_INPUT_OVERLAY
|
|
||||||
)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
add(
|
add(
|
||||||
SubmenuSetting(
|
SubmenuSetting(
|
||||||
|
@ -273,13 +264,6 @@ class SettingsFragmentPresenter(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addInputOverlaySettings(sl: ArrayList<SettingsItem>) {
|
|
||||||
sl.apply {
|
|
||||||
add(BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.key)
|
|
||||||
add(IntSetting.INPUT_OVERLAY_AUTO_HIDE.key)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addSocOverlaySettings(sl: ArrayList<SettingsItem>) {
|
private fun addSocOverlaySettings(sl: ArrayList<SettingsItem>) {
|
||||||
sl.apply {
|
sl.apply {
|
||||||
add(HeaderSetting(R.string.stats_overlay_customization))
|
add(HeaderSetting(R.string.stats_overlay_customization))
|
||||||
|
@ -462,6 +446,7 @@ class SettingsFragmentPresenter(
|
||||||
add(IntSetting.RENDERER_SAMPLE_SHADING_FRACTION.key)
|
add(IntSetting.RENDERER_SAMPLE_SHADING_FRACTION.key)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.veil_renderer))
|
add(HeaderSetting(R.string.veil_renderer))
|
||||||
|
add(BooleanSetting.ENABLE_RAII.key)
|
||||||
add(BooleanSetting.RENDERER_EARLY_RELEASE_FENCES.key)
|
add(BooleanSetting.RENDERER_EARLY_RELEASE_FENCES.key)
|
||||||
add(IntSetting.DMA_ACCURACY.key)
|
add(IntSetting.DMA_ACCURACY.key)
|
||||||
add(BooleanSetting.BUFFER_REORDER_DISABLE.key)
|
add(BooleanSetting.BUFFER_REORDER_DISABLE.key)
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.features.settings.ui.viewholder
|
|
||||||
|
|
||||||
import android.view.View
|
|
||||||
import org.yuzu.yuzu_emu.R
|
|
||||||
import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.model.view.SpinBoxSetting
|
|
||||||
import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter
|
|
||||||
import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible
|
|
||||||
|
|
||||||
class SpinBoxViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) :
|
|
||||||
SettingViewHolder(binding.root, adapter) {
|
|
||||||
private lateinit var setting: SpinBoxSetting
|
|
||||||
|
|
||||||
override fun bind(item: SettingsItem) {
|
|
||||||
setting = item as SpinBoxSetting
|
|
||||||
binding.textSettingName.text = setting.title
|
|
||||||
binding.textSettingDescription.setVisible(item.description.isNotEmpty())
|
|
||||||
binding.textSettingDescription.text = setting.description
|
|
||||||
binding.textSettingValue.setVisible(true)
|
|
||||||
binding.textSettingValue.text = setting.getSelectedValue().toString()
|
|
||||||
|
|
||||||
binding.buttonClear.setVisible(setting.clearable)
|
|
||||||
binding.buttonClear.setOnClickListener {
|
|
||||||
adapter.onClearClick(setting, bindingAdapterPosition)
|
|
||||||
}
|
|
||||||
|
|
||||||
setStyle(setting.isEditable, binding)
|
|
||||||
}
|
|
||||||
override fun onClick(clicked: View) {
|
|
||||||
if (setting.isEditable) {
|
|
||||||
adapter.onSpinBoxClick(setting, bindingAdapterPosition)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
override fun onLongClick(clicked: View): Boolean {
|
|
||||||
if (setting.isEditable) {
|
|
||||||
return adapter.onLongClick(setting, bindingAdapterPosition)
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -96,9 +96,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
private var perfStatsUpdater: (() -> Unit)? = null
|
private var perfStatsUpdater: (() -> Unit)? = null
|
||||||
private var socUpdater: (() -> Unit)? = null
|
private var socUpdater: (() -> Unit)? = null
|
||||||
|
|
||||||
val handler = Handler(Looper.getMainLooper())
|
|
||||||
private var isOverlayVisible = true
|
|
||||||
|
|
||||||
private var _binding: FragmentEmulationBinding? = null
|
private var _binding: FragmentEmulationBinding? = null
|
||||||
|
|
||||||
private val binding get() = _binding!!
|
private val binding get() = _binding!!
|
||||||
|
@ -455,10 +452,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
/**
|
/**
|
||||||
* Ask user if they want to launch with default settings when custom settings fail
|
* Ask user if they want to launch with default settings when custom settings fail
|
||||||
*/
|
*/
|
||||||
private suspend fun askUserToLaunchWithDefaultSettings(
|
private suspend fun askUserToLaunchWithDefaultSettings(gameTitle: String, errorMessage: String): Boolean {
|
||||||
gameTitle: String,
|
|
||||||
errorMessage: String
|
|
||||||
): Boolean {
|
|
||||||
return suspendCoroutine { continuation ->
|
return suspendCoroutine { continuation ->
|
||||||
requireActivity().runOnUiThread {
|
requireActivity().runOnUiThread {
|
||||||
MaterialAlertDialogBuilder(requireContext())
|
MaterialAlertDialogBuilder(requireContext())
|
||||||
|
@ -734,8 +728,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
updateShowStatsOverlay()
|
updateShowStatsOverlay()
|
||||||
updateSocOverlay()
|
updateSocOverlay()
|
||||||
|
|
||||||
initializeOverlayAutoHide()
|
|
||||||
|
|
||||||
// Re update binding when the specs values get initialized properly
|
// Re update binding when the specs values get initialized properly
|
||||||
binding.inGameMenu.getHeaderView(0).apply {
|
binding.inGameMenu.getHeaderView(0).apply {
|
||||||
val titleView = findViewById<TextView>(R.id.text_game_title)
|
val titleView = findViewById<TextView>(R.id.text_game_title)
|
||||||
|
@ -925,11 +917,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
updatePauseMenuEntry(emulationState.isPaused)
|
updatePauseMenuEntry(emulationState.isPaused)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the overlay auto-hide setting is changed while paused,
|
|
||||||
// we need to reinitialize the auto-hide timer
|
|
||||||
initializeOverlayAutoHide()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun resetInputOverlay() {
|
private fun resetInputOverlay() {
|
||||||
|
@ -937,7 +924,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
IntSetting.OVERLAY_OPACITY.reset()
|
IntSetting.OVERLAY_OPACITY.reset()
|
||||||
binding.surfaceInputOverlay.post {
|
binding.surfaceInputOverlay.post {
|
||||||
binding.surfaceInputOverlay.resetLayoutVisibilityAndPlacement()
|
binding.surfaceInputOverlay.resetLayoutVisibilityAndPlacement()
|
||||||
binding.surfaceInputOverlay.resetIndividualControlScale()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1560,7 +1546,6 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
.setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int ->
|
.setNeutralButton(R.string.slider_default) { _: DialogInterface?, _: Int ->
|
||||||
setControlScale(50)
|
setControlScale(50)
|
||||||
setControlOpacity(100)
|
setControlOpacity(100)
|
||||||
binding.surfaceInputOverlay.resetIndividualControlScale()
|
|
||||||
}
|
}
|
||||||
.show()
|
.show()
|
||||||
}
|
}
|
||||||
|
@ -1741,61 +1726,4 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||||
private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!)
|
private val perfStatsUpdateHandler = Handler(Looper.myLooper()!!)
|
||||||
private val socUpdateHandler = Handler(Looper.myLooper()!!)
|
private val socUpdateHandler = Handler(Looper.myLooper()!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun startOverlayAutoHideTimer(seconds: Int) {
|
|
||||||
handler.removeCallbacksAndMessages(null)
|
|
||||||
|
|
||||||
handler.postDelayed({
|
|
||||||
if (isOverlayVisible) {
|
|
||||||
hideOverlay()
|
|
||||||
}
|
|
||||||
}, seconds * 1000L)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun handleScreenTap(isLongTap: Boolean) {
|
|
||||||
val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt()
|
|
||||||
val shouldProceed = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean() && BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean()
|
|
||||||
|
|
||||||
if (!shouldProceed) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// failsafe
|
|
||||||
if (autoHideSeconds == 0) {
|
|
||||||
showOverlay()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!isOverlayVisible && !isLongTap) {
|
|
||||||
showOverlay()
|
|
||||||
}
|
|
||||||
|
|
||||||
startOverlayAutoHideTimer(autoHideSeconds)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun initializeOverlayAutoHide() {
|
|
||||||
val autoHideSeconds = IntSetting.INPUT_OVERLAY_AUTO_HIDE.getInt()
|
|
||||||
val autoHideEnabled = BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean()
|
|
||||||
val showOverlay = BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()
|
|
||||||
|
|
||||||
if (autoHideEnabled && showOverlay) {
|
|
||||||
showOverlay()
|
|
||||||
startOverlayAutoHideTimer(autoHideSeconds)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun showOverlay() {
|
|
||||||
if (!isOverlayVisible) {
|
|
||||||
isOverlayVisible = true
|
|
||||||
ViewUtils.showView(binding.surfaceInputOverlay, 500)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun hideOverlay() {
|
|
||||||
if (isOverlayVisible) {
|
|
||||||
isOverlayVisible = false
|
|
||||||
ViewUtils.hideView(binding.surfaceInputOverlay, 500)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay
|
package org.yuzu.yuzu_emu.overlay
|
||||||
|
|
||||||
|
@ -13,8 +13,6 @@ import android.graphics.Rect
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.graphics.drawable.VectorDrawable
|
import android.graphics.drawable.VectorDrawable
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.Handler
|
|
||||||
import android.os.Looper
|
|
||||||
import android.util.AttributeSet
|
import android.util.AttributeSet
|
||||||
import android.view.HapticFeedbackConstants
|
import android.view.HapticFeedbackConstants
|
||||||
import android.view.MotionEvent
|
import android.view.MotionEvent
|
||||||
|
@ -54,12 +52,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
private var dpadBeingConfigured: InputOverlayDrawableDpad? = null
|
private var dpadBeingConfigured: InputOverlayDrawableDpad? = null
|
||||||
private var joystickBeingConfigured: InputOverlayDrawableJoystick? = null
|
private var joystickBeingConfigured: InputOverlayDrawableJoystick? = null
|
||||||
|
|
||||||
private var scaleDialog: OverlayScaleDialog? = null
|
|
||||||
private var touchStartX = 0f
|
|
||||||
private var touchStartY = 0f
|
|
||||||
private var hasMoved = false
|
|
||||||
private val moveThreshold = 20f
|
|
||||||
|
|
||||||
private lateinit var windowInsets: WindowInsets
|
private lateinit var windowInsets: WindowInsets
|
||||||
|
|
||||||
var layout = OverlayLayout.Landscape
|
var layout = OverlayLayout.Landscape
|
||||||
|
@ -262,44 +254,23 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
) {
|
) {
|
||||||
buttonBeingConfigured = button
|
buttonBeingConfigured = button
|
||||||
buttonBeingConfigured!!.onConfigureTouch(event)
|
buttonBeingConfigured!!.onConfigureTouch(event)
|
||||||
touchStartX = event.getX(pointerIndex)
|
|
||||||
touchStartY = event.getY(pointerIndex)
|
|
||||||
hasMoved = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) {
|
MotionEvent.ACTION_MOVE -> if (buttonBeingConfigured != null) {
|
||||||
val moveDistance = kotlin.math.sqrt(
|
|
||||||
(event.getX(pointerIndex) - touchStartX).let { it * it } +
|
|
||||||
(event.getY(pointerIndex) - touchStartY).let { it * it }
|
|
||||||
)
|
|
||||||
|
|
||||||
if (moveDistance > moveThreshold) {
|
|
||||||
hasMoved = true
|
|
||||||
buttonBeingConfigured!!.onConfigureTouch(event)
|
buttonBeingConfigured!!.onConfigureTouch(event)
|
||||||
invalidate()
|
invalidate()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
MotionEvent.ACTION_UP,
|
MotionEvent.ACTION_UP,
|
||||||
MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) {
|
MotionEvent.ACTION_POINTER_UP -> if (buttonBeingConfigured === button) {
|
||||||
if (!hasMoved) {
|
// Persist button position by saving new place.
|
||||||
showScaleDialog(
|
|
||||||
buttonBeingConfigured,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
fingerPositionX,
|
|
||||||
fingerPositionY
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
saveControlPosition(
|
saveControlPosition(
|
||||||
buttonBeingConfigured!!.overlayControlData.id,
|
buttonBeingConfigured!!.overlayControlData.id,
|
||||||
buttonBeingConfigured!!.bounds.centerX(),
|
buttonBeingConfigured!!.bounds.centerX(),
|
||||||
buttonBeingConfigured!!.bounds.centerY(),
|
buttonBeingConfigured!!.bounds.centerY(),
|
||||||
individuaScale = buttonBeingConfigured!!.overlayControlData.individualScale,
|
|
||||||
layout
|
layout
|
||||||
)
|
)
|
||||||
}
|
|
||||||
buttonBeingConfigured = null
|
buttonBeingConfigured = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -316,46 +287,23 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
) {
|
) {
|
||||||
dpadBeingConfigured = dpad
|
dpadBeingConfigured = dpad
|
||||||
dpadBeingConfigured!!.onConfigureTouch(event)
|
dpadBeingConfigured!!.onConfigureTouch(event)
|
||||||
touchStartX = event.getX(pointerIndex)
|
|
||||||
touchStartY = event.getY(pointerIndex)
|
|
||||||
hasMoved = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) {
|
MotionEvent.ACTION_MOVE -> if (dpadBeingConfigured != null) {
|
||||||
val moveDistance = kotlin.math.sqrt(
|
|
||||||
(event.getX(pointerIndex) - touchStartX).let { it * it } +
|
|
||||||
(event.getY(pointerIndex) - touchStartY).let { it * it }
|
|
||||||
)
|
|
||||||
|
|
||||||
if (moveDistance > moveThreshold) {
|
|
||||||
hasMoved = true
|
|
||||||
dpadBeingConfigured!!.onConfigureTouch(event)
|
dpadBeingConfigured!!.onConfigureTouch(event)
|
||||||
invalidate()
|
invalidate()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
MotionEvent.ACTION_UP,
|
MotionEvent.ACTION_UP,
|
||||||
MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) {
|
MotionEvent.ACTION_POINTER_UP -> if (dpadBeingConfigured === dpad) {
|
||||||
if (!hasMoved) {
|
// Persist button position by saving new place.
|
||||||
// This was a click, show scale dialog for dpad
|
|
||||||
showScaleDialog(
|
|
||||||
null,
|
|
||||||
dpadBeingConfigured,
|
|
||||||
null,
|
|
||||||
fingerPositionX,
|
|
||||||
fingerPositionY
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
// This was a move, save position
|
|
||||||
saveControlPosition(
|
saveControlPosition(
|
||||||
OverlayControl.COMBINED_DPAD.id,
|
OverlayControl.COMBINED_DPAD.id,
|
||||||
dpadBeingConfigured!!.bounds.centerX(),
|
dpadBeingConfigured!!.bounds.centerX(),
|
||||||
dpadBeingConfigured!!.bounds.centerY(),
|
dpadBeingConfigured!!.bounds.centerY(),
|
||||||
individuaScale = dpadBeingConfigured!!.individualScale,
|
|
||||||
layout
|
layout
|
||||||
)
|
)
|
||||||
}
|
|
||||||
dpadBeingConfigured = null
|
dpadBeingConfigured = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,43 +317,21 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
) {
|
) {
|
||||||
joystickBeingConfigured = joystick
|
joystickBeingConfigured = joystick
|
||||||
joystickBeingConfigured!!.onConfigureTouch(event)
|
joystickBeingConfigured!!.onConfigureTouch(event)
|
||||||
touchStartX = event.getX(pointerIndex)
|
|
||||||
touchStartY = event.getY(pointerIndex)
|
|
||||||
hasMoved = false
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) {
|
MotionEvent.ACTION_MOVE -> if (joystickBeingConfigured != null) {
|
||||||
val moveDistance = kotlin.math.sqrt(
|
|
||||||
(event.getX(pointerIndex) - touchStartX).let { it * it } +
|
|
||||||
(event.getY(pointerIndex) - touchStartY).let { it * it }
|
|
||||||
)
|
|
||||||
|
|
||||||
if (moveDistance > moveThreshold) {
|
|
||||||
hasMoved = true
|
|
||||||
joystickBeingConfigured!!.onConfigureTouch(event)
|
joystickBeingConfigured!!.onConfigureTouch(event)
|
||||||
invalidate()
|
invalidate()
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
MotionEvent.ACTION_UP,
|
MotionEvent.ACTION_UP,
|
||||||
MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) {
|
MotionEvent.ACTION_POINTER_UP -> if (joystickBeingConfigured != null) {
|
||||||
if (!hasMoved) {
|
|
||||||
showScaleDialog(
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
joystickBeingConfigured,
|
|
||||||
fingerPositionX,
|
|
||||||
fingerPositionY
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
saveControlPosition(
|
saveControlPosition(
|
||||||
joystickBeingConfigured!!.prefId,
|
joystickBeingConfigured!!.prefId,
|
||||||
joystickBeingConfigured!!.bounds.centerX(),
|
joystickBeingConfigured!!.bounds.centerX(),
|
||||||
joystickBeingConfigured!!.bounds.centerY(),
|
joystickBeingConfigured!!.bounds.centerY(),
|
||||||
individuaScale = joystickBeingConfigured!!.individualScale,
|
|
||||||
layout
|
layout
|
||||||
)
|
)
|
||||||
}
|
|
||||||
joystickBeingConfigured = null
|
joystickBeingConfigured = null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -681,116 +607,24 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
invalidate()
|
invalidate()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun saveControlPosition(
|
private fun saveControlPosition(id: String, x: Int, y: Int, layout: OverlayLayout) {
|
||||||
id: String,
|
|
||||||
x: Int,
|
|
||||||
y: Int,
|
|
||||||
individuaScale: Float,
|
|
||||||
layout: OverlayLayout
|
|
||||||
) {
|
|
||||||
val windowSize = getSafeScreenSize(context, Pair(measuredWidth, measuredHeight))
|
val windowSize = getSafeScreenSize(context, Pair(measuredWidth, measuredHeight))
|
||||||
val min = windowSize.first
|
val min = windowSize.first
|
||||||
val max = windowSize.second
|
val max = windowSize.second
|
||||||
val overlayControlData = NativeConfig.getOverlayControlData()
|
val overlayControlData = NativeConfig.getOverlayControlData()
|
||||||
val data = overlayControlData.firstOrNull { it.id == id }
|
val data = overlayControlData.firstOrNull { it.id == id }
|
||||||
val newPosition = Pair((x - min.x).toDouble() / max.x, (y - min.y).toDouble() / max.y)
|
val newPosition = Pair((x - min.x).toDouble() / max.x, (y - min.y).toDouble() / max.y)
|
||||||
|
|
||||||
when (layout) {
|
when (layout) {
|
||||||
OverlayLayout.Landscape -> data?.landscapePosition = newPosition
|
OverlayLayout.Landscape -> data?.landscapePosition = newPosition
|
||||||
OverlayLayout.Portrait -> data?.portraitPosition = newPosition
|
OverlayLayout.Portrait -> data?.portraitPosition = newPosition
|
||||||
OverlayLayout.Foldable -> data?.foldablePosition = newPosition
|
OverlayLayout.Foldable -> data?.foldablePosition = newPosition
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
data?.individualScale = individuaScale
|
|
||||||
|
|
||||||
NativeConfig.setOverlayControlData(overlayControlData)
|
NativeConfig.setOverlayControlData(overlayControlData)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setIsInEditMode(editMode: Boolean) {
|
fun setIsInEditMode(editMode: Boolean) {
|
||||||
inEditMode = editMode
|
inEditMode = editMode
|
||||||
if (!editMode) {
|
|
||||||
scaleDialog?.dismiss()
|
|
||||||
scaleDialog = null
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private fun showScaleDialog(
|
|
||||||
button: InputOverlayDrawableButton?,
|
|
||||||
dpad: InputOverlayDrawableDpad?,
|
|
||||||
joystick: InputOverlayDrawableJoystick?,
|
|
||||||
x: Int, y: Int
|
|
||||||
) {
|
|
||||||
val overlayControlData = NativeConfig.getOverlayControlData()
|
|
||||||
// prevent dialog from being spam opened
|
|
||||||
scaleDialog?.dismiss()
|
|
||||||
|
|
||||||
|
|
||||||
when {
|
|
||||||
button != null -> {
|
|
||||||
val buttonData =
|
|
||||||
overlayControlData.firstOrNull { it.id == button.overlayControlData.id }
|
|
||||||
if (buttonData != null) {
|
|
||||||
scaleDialog =
|
|
||||||
OverlayScaleDialog(context, button.overlayControlData) { newScale ->
|
|
||||||
saveControlPosition(
|
|
||||||
button.overlayControlData.id,
|
|
||||||
button.bounds.centerX(),
|
|
||||||
button.bounds.centerY(),
|
|
||||||
individuaScale = newScale,
|
|
||||||
layout
|
|
||||||
)
|
|
||||||
refreshControls()
|
|
||||||
}
|
|
||||||
|
|
||||||
scaleDialog?.showDialog(x,y, button.bounds.width(), button.bounds.height())
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dpad != null -> {
|
|
||||||
val dpadData =
|
|
||||||
overlayControlData.firstOrNull { it.id == OverlayControl.COMBINED_DPAD.id }
|
|
||||||
if (dpadData != null) {
|
|
||||||
scaleDialog = OverlayScaleDialog(context, dpadData) { newScale ->
|
|
||||||
saveControlPosition(
|
|
||||||
OverlayControl.COMBINED_DPAD.id,
|
|
||||||
dpad.bounds.centerX(),
|
|
||||||
dpad.bounds.centerY(),
|
|
||||||
newScale,
|
|
||||||
layout
|
|
||||||
)
|
|
||||||
|
|
||||||
refreshControls()
|
|
||||||
}
|
|
||||||
|
|
||||||
scaleDialog?.showDialog(x,y, dpad.bounds.width(), dpad.bounds.height())
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
joystick != null -> {
|
|
||||||
val joystickData = overlayControlData.firstOrNull { it.id == joystick.prefId }
|
|
||||||
if (joystickData != null) {
|
|
||||||
scaleDialog = OverlayScaleDialog(context, joystickData) { newScale ->
|
|
||||||
saveControlPosition(
|
|
||||||
joystick.prefId,
|
|
||||||
joystick.bounds.centerX(),
|
|
||||||
joystick.bounds.centerY(),
|
|
||||||
individuaScale = newScale,
|
|
||||||
layout
|
|
||||||
)
|
|
||||||
|
|
||||||
refreshControls()
|
|
||||||
}
|
|
||||||
|
|
||||||
scaleDialog?.showDialog(x,y, joystick.bounds.width(), joystick.bounds.height())
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Applies and saves all default values for the overlay
|
* Applies and saves all default values for the overlay
|
||||||
|
@ -830,24 +664,12 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
val overlayControlData = NativeConfig.getOverlayControlData()
|
val overlayControlData = NativeConfig.getOverlayControlData()
|
||||||
overlayControlData.forEach {
|
overlayControlData.forEach {
|
||||||
it.enabled = OverlayControl.from(it.id)?.defaultVisibility == true
|
it.enabled = OverlayControl.from(it.id)?.defaultVisibility == true
|
||||||
it.individualScale = OverlayControl.from(it.id)?.defaultIndividualScaleResource!!
|
|
||||||
}
|
}
|
||||||
NativeConfig.setOverlayControlData(overlayControlData)
|
NativeConfig.setOverlayControlData(overlayControlData)
|
||||||
|
|
||||||
refreshControls()
|
refreshControls()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun resetIndividualControlScale() {
|
|
||||||
val overlayControlData = NativeConfig.getOverlayControlData()
|
|
||||||
overlayControlData.forEach { data ->
|
|
||||||
val defaultControlData = OverlayControl.from(data.id) ?: return@forEach
|
|
||||||
data.individualScale = defaultControlData.defaultIndividualScaleResource
|
|
||||||
}
|
|
||||||
NativeConfig.setOverlayControlData(overlayControlData)
|
|
||||||
NativeConfig.saveGlobalConfig()
|
|
||||||
refreshControls()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun defaultOverlayPositionByLayout(layout: OverlayLayout) {
|
private fun defaultOverlayPositionByLayout(layout: OverlayLayout) {
|
||||||
val overlayControlData = NativeConfig.getOverlayControlData()
|
val overlayControlData = NativeConfig.getOverlayControlData()
|
||||||
for (data in overlayControlData) {
|
for (data in overlayControlData) {
|
||||||
|
@ -1038,9 +860,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat()
|
scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat()
|
||||||
scale /= 100f
|
scale /= 100f
|
||||||
|
|
||||||
// Apply individual scale
|
|
||||||
scale *= overlayControlData.individualScale
|
|
||||||
|
|
||||||
// Initialize the InputOverlayDrawableButton.
|
// Initialize the InputOverlayDrawableButton.
|
||||||
val defaultStateBitmap = getBitmap(context, defaultResId, scale)
|
val defaultStateBitmap = getBitmap(context, defaultResId, scale)
|
||||||
val pressedStateBitmap = getBitmap(context, pressedResId, scale)
|
val pressedStateBitmap = getBitmap(context, pressedResId, scale)
|
||||||
|
@ -1103,20 +922,11 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
// Resources handle for fetching the initial Drawable resource.
|
// Resources handle for fetching the initial Drawable resource.
|
||||||
val res = context.resources
|
val res = context.resources
|
||||||
|
|
||||||
// Get the dpad control data for individual scale
|
|
||||||
val overlayControlData = NativeConfig.getOverlayControlData()
|
|
||||||
val dpadData = overlayControlData.firstOrNull { it.id == OverlayControl.COMBINED_DPAD.id }
|
|
||||||
|
|
||||||
// Decide scale based on button ID and user preference
|
// Decide scale based on button ID and user preference
|
||||||
var scale = 0.25f
|
var scale = 0.25f
|
||||||
scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat()
|
scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat()
|
||||||
scale /= 100f
|
scale /= 100f
|
||||||
|
|
||||||
// Apply individual scale
|
|
||||||
if (dpadData != null) {
|
|
||||||
scale *= dpadData.individualScale
|
|
||||||
}
|
|
||||||
|
|
||||||
// Initialize the InputOverlayDrawableDpad.
|
// Initialize the InputOverlayDrawableDpad.
|
||||||
val defaultStateBitmap =
|
val defaultStateBitmap =
|
||||||
getBitmap(context, defaultResId, scale)
|
getBitmap(context, defaultResId, scale)
|
||||||
|
@ -1190,9 +1000,6 @@ class InputOverlay(context: Context, attrs: AttributeSet?) :
|
||||||
scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat()
|
scale *= (IntSetting.OVERLAY_SCALE.getInt() + 50).toFloat()
|
||||||
scale /= 100f
|
scale /= 100f
|
||||||
|
|
||||||
// Apply individual scale
|
|
||||||
scale *= overlayControlData.individualScale
|
|
||||||
|
|
||||||
// Initialize the InputOverlayDrawableJoystick.
|
// Initialize the InputOverlayDrawableJoystick.
|
||||||
val bitmapOuter = getBitmap(context, resOuter, scale)
|
val bitmapOuter = getBitmap(context, resOuter, scale)
|
||||||
val bitmapInnerDefault = getBitmap(context, defaultResInner, 1.0f)
|
val bitmapInnerDefault = getBitmap(context, defaultResInner, 1.0f)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay
|
package org.yuzu.yuzu_emu.overlay
|
||||||
|
|
||||||
|
@ -42,8 +42,6 @@ class InputOverlayDrawableDpad(
|
||||||
val width: Int
|
val width: Int
|
||||||
val height: Int
|
val height: Int
|
||||||
|
|
||||||
var individualScale: Float = 1.0f
|
|
||||||
|
|
||||||
private val defaultStateBitmap: BitmapDrawable
|
private val defaultStateBitmap: BitmapDrawable
|
||||||
private val pressedOneDirectionStateBitmap: BitmapDrawable
|
private val pressedOneDirectionStateBitmap: BitmapDrawable
|
||||||
private val pressedTwoDirectionsStateBitmap: BitmapDrawable
|
private val pressedTwoDirectionsStateBitmap: BitmapDrawable
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay
|
package org.yuzu.yuzu_emu.overlay
|
||||||
|
|
||||||
|
@ -51,8 +51,6 @@ class InputOverlayDrawableJoystick(
|
||||||
val width: Int
|
val width: Int
|
||||||
val height: Int
|
val height: Int
|
||||||
|
|
||||||
var individualScale: Float = 1.0f
|
|
||||||
|
|
||||||
private var opacity: Int = 0
|
private var opacity: Int = 0
|
||||||
|
|
||||||
private var virtBounds: Rect
|
private var virtBounds: Rect
|
||||||
|
|
|
@ -1,124 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay
|
|
||||||
|
|
||||||
import android.app.Dialog
|
|
||||||
import android.content.Context
|
|
||||||
import android.view.Gravity
|
|
||||||
import android.view.LayoutInflater
|
|
||||||
import android.view.WindowManager
|
|
||||||
import android.widget.TextView
|
|
||||||
import com.google.android.material.button.MaterialButton
|
|
||||||
import com.google.android.material.slider.Slider
|
|
||||||
import org.yuzu.yuzu_emu.R
|
|
||||||
import org.yuzu.yuzu_emu.overlay.model.OverlayControlData
|
|
||||||
|
|
||||||
class OverlayScaleDialog(
|
|
||||||
context: Context,
|
|
||||||
private val overlayControlData: OverlayControlData,
|
|
||||||
private val onScaleChanged: (Float) -> Unit
|
|
||||||
) : Dialog(context) {
|
|
||||||
|
|
||||||
private var currentScale = overlayControlData.individualScale
|
|
||||||
private val originalScale = overlayControlData.individualScale
|
|
||||||
private lateinit var scaleValueText: TextView
|
|
||||||
private lateinit var scaleSlider: Slider
|
|
||||||
|
|
||||||
init {
|
|
||||||
setupDialog()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun setupDialog() {
|
|
||||||
val view = LayoutInflater.from(context).inflate(R.layout.dialog_overlay_scale, null)
|
|
||||||
setContentView(view)
|
|
||||||
|
|
||||||
window?.setBackgroundDrawable(null)
|
|
||||||
|
|
||||||
window?.apply {
|
|
||||||
attributes = attributes.apply {
|
|
||||||
flags = flags and WindowManager.LayoutParams.FLAG_DIM_BEHIND.inv()
|
|
||||||
flags = flags or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scaleValueText = view.findViewById(R.id.scaleValueText)
|
|
||||||
scaleSlider = view.findViewById(R.id.scaleSlider)
|
|
||||||
val resetButton = view.findViewById<MaterialButton>(R.id.resetButton)
|
|
||||||
val confirmButton = view.findViewById<MaterialButton>(R.id.confirmButton)
|
|
||||||
val cancelButton = view.findViewById<MaterialButton>(R.id.cancelButton)
|
|
||||||
|
|
||||||
scaleValueText.text = String.format("%.1fx", currentScale)
|
|
||||||
scaleSlider.value = currentScale
|
|
||||||
|
|
||||||
scaleSlider.addOnChangeListener { _, value, input ->
|
|
||||||
if (input) {
|
|
||||||
currentScale = value
|
|
||||||
scaleValueText.text = String.format("%.1fx", currentScale)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
scaleSlider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
|
|
||||||
override fun onStartTrackingTouch(slider: Slider) {
|
|
||||||
// pass
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun onStopTrackingTouch(slider: Slider) {
|
|
||||||
onScaleChanged(currentScale)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
resetButton.setOnClickListener {
|
|
||||||
currentScale = 1.0f
|
|
||||||
scaleSlider.value = 1.0f
|
|
||||||
scaleValueText.text = String.format("%.1fx", currentScale)
|
|
||||||
onScaleChanged(currentScale)
|
|
||||||
}
|
|
||||||
|
|
||||||
confirmButton.setOnClickListener {
|
|
||||||
overlayControlData.individualScale = currentScale
|
|
||||||
//slider value is already saved on touch dispatch but just to be sure
|
|
||||||
onScaleChanged(currentScale)
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
// both cancel button and back gesture should revert the scale change
|
|
||||||
cancelButton.setOnClickListener {
|
|
||||||
onScaleChanged(originalScale)
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
|
|
||||||
setOnCancelListener {
|
|
||||||
onScaleChanged(originalScale)
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun showDialog(anchorX: Int, anchorY: Int, anchorHeight: Int, anchorWidth: Int) {
|
|
||||||
show()
|
|
||||||
|
|
||||||
show()
|
|
||||||
|
|
||||||
// TODO: this calculation is a bit rough, improve it later on
|
|
||||||
window?.let { window ->
|
|
||||||
val layoutParams = window.attributes
|
|
||||||
layoutParams.gravity = Gravity.TOP or Gravity.START
|
|
||||||
|
|
||||||
val density = context.resources.displayMetrics.density
|
|
||||||
val dialogWidthPx = (320 * density).toInt()
|
|
||||||
val dialogHeightPx = (400 * density).toInt() // set your estimated dialog height
|
|
||||||
|
|
||||||
val screenHeight = context.resources.displayMetrics.heightPixels
|
|
||||||
|
|
||||||
|
|
||||||
layoutParams.x = anchorX + anchorWidth / 2 - dialogWidthPx / 2
|
|
||||||
layoutParams.y = anchorY + anchorHeight / 2 - dialogHeightPx / 2
|
|
||||||
layoutParams.width = dialogWidthPx
|
|
||||||
|
|
||||||
|
|
||||||
window.attributes = layoutParams
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay.model
|
package org.yuzu.yuzu_emu.overlay.model
|
||||||
|
|
||||||
|
@ -12,144 +12,126 @@ enum class OverlayControl(
|
||||||
val defaultVisibility: Boolean,
|
val defaultVisibility: Boolean,
|
||||||
@IntegerRes val defaultLandscapePositionResources: Pair<Int, Int>,
|
@IntegerRes val defaultLandscapePositionResources: Pair<Int, Int>,
|
||||||
@IntegerRes val defaultPortraitPositionResources: Pair<Int, Int>,
|
@IntegerRes val defaultPortraitPositionResources: Pair<Int, Int>,
|
||||||
@IntegerRes val defaultFoldablePositionResources: Pair<Int, Int>,
|
@IntegerRes val defaultFoldablePositionResources: Pair<Int, Int>
|
||||||
val defaultIndividualScaleResource: Float,
|
|
||||||
) {
|
) {
|
||||||
BUTTON_A(
|
BUTTON_A(
|
||||||
"button_a",
|
"button_a",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_A_X, R.integer.BUTTON_A_Y),
|
Pair(R.integer.BUTTON_A_X, R.integer.BUTTON_A_Y),
|
||||||
Pair(R.integer.BUTTON_A_X_PORTRAIT, R.integer.BUTTON_A_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_A_X_PORTRAIT, R.integer.BUTTON_A_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_A_X_FOLDABLE, R.integer.BUTTON_A_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_A_X_FOLDABLE, R.integer.BUTTON_A_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_B(
|
BUTTON_B(
|
||||||
"button_b",
|
"button_b",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_B_X, R.integer.BUTTON_B_Y),
|
Pair(R.integer.BUTTON_B_X, R.integer.BUTTON_B_Y),
|
||||||
Pair(R.integer.BUTTON_B_X_PORTRAIT, R.integer.BUTTON_B_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_B_X_PORTRAIT, R.integer.BUTTON_B_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_B_X_FOLDABLE, R.integer.BUTTON_B_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_B_X_FOLDABLE, R.integer.BUTTON_B_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_X(
|
BUTTON_X(
|
||||||
"button_x",
|
"button_x",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_X_X, R.integer.BUTTON_X_Y),
|
Pair(R.integer.BUTTON_X_X, R.integer.BUTTON_X_Y),
|
||||||
Pair(R.integer.BUTTON_X_X_PORTRAIT, R.integer.BUTTON_X_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_X_X_PORTRAIT, R.integer.BUTTON_X_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_X_X_FOLDABLE, R.integer.BUTTON_X_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_X_X_FOLDABLE, R.integer.BUTTON_X_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_Y(
|
BUTTON_Y(
|
||||||
"button_y",
|
"button_y",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_Y_X, R.integer.BUTTON_Y_Y),
|
Pair(R.integer.BUTTON_Y_X, R.integer.BUTTON_Y_Y),
|
||||||
Pair(R.integer.BUTTON_Y_X_PORTRAIT, R.integer.BUTTON_Y_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_Y_X_PORTRAIT, R.integer.BUTTON_Y_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_Y_X_FOLDABLE, R.integer.BUTTON_Y_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_Y_X_FOLDABLE, R.integer.BUTTON_Y_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_PLUS(
|
BUTTON_PLUS(
|
||||||
"button_plus",
|
"button_plus",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_PLUS_X, R.integer.BUTTON_PLUS_Y),
|
Pair(R.integer.BUTTON_PLUS_X, R.integer.BUTTON_PLUS_Y),
|
||||||
Pair(R.integer.BUTTON_PLUS_X_PORTRAIT, R.integer.BUTTON_PLUS_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_PLUS_X_PORTRAIT, R.integer.BUTTON_PLUS_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_PLUS_X_FOLDABLE, R.integer.BUTTON_PLUS_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_PLUS_X_FOLDABLE, R.integer.BUTTON_PLUS_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_MINUS(
|
BUTTON_MINUS(
|
||||||
"button_minus",
|
"button_minus",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_MINUS_X, R.integer.BUTTON_MINUS_Y),
|
Pair(R.integer.BUTTON_MINUS_X, R.integer.BUTTON_MINUS_Y),
|
||||||
Pair(R.integer.BUTTON_MINUS_X_PORTRAIT, R.integer.BUTTON_MINUS_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_MINUS_X_PORTRAIT, R.integer.BUTTON_MINUS_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_MINUS_X_FOLDABLE, R.integer.BUTTON_MINUS_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_MINUS_X_FOLDABLE, R.integer.BUTTON_MINUS_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_HOME(
|
BUTTON_HOME(
|
||||||
"button_home",
|
"button_home",
|
||||||
false,
|
false,
|
||||||
Pair(R.integer.BUTTON_HOME_X, R.integer.BUTTON_HOME_Y),
|
Pair(R.integer.BUTTON_HOME_X, R.integer.BUTTON_HOME_Y),
|
||||||
Pair(R.integer.BUTTON_HOME_X_PORTRAIT, R.integer.BUTTON_HOME_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_HOME_X_PORTRAIT, R.integer.BUTTON_HOME_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_HOME_X_FOLDABLE, R.integer.BUTTON_HOME_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_HOME_X_FOLDABLE, R.integer.BUTTON_HOME_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_CAPTURE(
|
BUTTON_CAPTURE(
|
||||||
"button_capture",
|
"button_capture",
|
||||||
false,
|
false,
|
||||||
Pair(R.integer.BUTTON_CAPTURE_X, R.integer.BUTTON_CAPTURE_Y),
|
Pair(R.integer.BUTTON_CAPTURE_X, R.integer.BUTTON_CAPTURE_Y),
|
||||||
Pair(R.integer.BUTTON_CAPTURE_X_PORTRAIT, R.integer.BUTTON_CAPTURE_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_CAPTURE_X_PORTRAIT, R.integer.BUTTON_CAPTURE_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_CAPTURE_X_FOLDABLE, R.integer.BUTTON_CAPTURE_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_CAPTURE_X_FOLDABLE, R.integer.BUTTON_CAPTURE_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_L(
|
BUTTON_L(
|
||||||
"button_l",
|
"button_l",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_L_X, R.integer.BUTTON_L_Y),
|
Pair(R.integer.BUTTON_L_X, R.integer.BUTTON_L_Y),
|
||||||
Pair(R.integer.BUTTON_L_X_PORTRAIT, R.integer.BUTTON_L_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_L_X_PORTRAIT, R.integer.BUTTON_L_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_L_X_FOLDABLE, R.integer.BUTTON_L_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_L_X_FOLDABLE, R.integer.BUTTON_L_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_R(
|
BUTTON_R(
|
||||||
"button_r",
|
"button_r",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_R_X, R.integer.BUTTON_R_Y),
|
Pair(R.integer.BUTTON_R_X, R.integer.BUTTON_R_Y),
|
||||||
Pair(R.integer.BUTTON_R_X_PORTRAIT, R.integer.BUTTON_R_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_R_X_PORTRAIT, R.integer.BUTTON_R_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_R_X_FOLDABLE, R.integer.BUTTON_R_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_R_X_FOLDABLE, R.integer.BUTTON_R_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_ZL(
|
BUTTON_ZL(
|
||||||
"button_zl",
|
"button_zl",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_ZL_X, R.integer.BUTTON_ZL_Y),
|
Pair(R.integer.BUTTON_ZL_X, R.integer.BUTTON_ZL_Y),
|
||||||
Pair(R.integer.BUTTON_ZL_X_PORTRAIT, R.integer.BUTTON_ZL_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_ZL_X_PORTRAIT, R.integer.BUTTON_ZL_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_ZL_X_FOLDABLE, R.integer.BUTTON_ZL_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_ZL_X_FOLDABLE, R.integer.BUTTON_ZL_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_ZR(
|
BUTTON_ZR(
|
||||||
"button_zr",
|
"button_zr",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_ZR_X, R.integer.BUTTON_ZR_Y),
|
Pair(R.integer.BUTTON_ZR_X, R.integer.BUTTON_ZR_Y),
|
||||||
Pair(R.integer.BUTTON_ZR_X_PORTRAIT, R.integer.BUTTON_ZR_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_ZR_X_PORTRAIT, R.integer.BUTTON_ZR_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_ZR_X_FOLDABLE, R.integer.BUTTON_ZR_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_ZR_X_FOLDABLE, R.integer.BUTTON_ZR_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_STICK_L(
|
BUTTON_STICK_L(
|
||||||
"button_stick_l",
|
"button_stick_l",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_STICK_L_X, R.integer.BUTTON_STICK_L_Y),
|
Pair(R.integer.BUTTON_STICK_L_X, R.integer.BUTTON_STICK_L_Y),
|
||||||
Pair(R.integer.BUTTON_STICK_L_X_PORTRAIT, R.integer.BUTTON_STICK_L_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_STICK_L_X_PORTRAIT, R.integer.BUTTON_STICK_L_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_STICK_L_X_FOLDABLE, R.integer.BUTTON_STICK_L_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_STICK_L_X_FOLDABLE, R.integer.BUTTON_STICK_L_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
BUTTON_STICK_R(
|
BUTTON_STICK_R(
|
||||||
"button_stick_r",
|
"button_stick_r",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.BUTTON_STICK_R_X, R.integer.BUTTON_STICK_R_Y),
|
Pair(R.integer.BUTTON_STICK_R_X, R.integer.BUTTON_STICK_R_Y),
|
||||||
Pair(R.integer.BUTTON_STICK_R_X_PORTRAIT, R.integer.BUTTON_STICK_R_Y_PORTRAIT),
|
Pair(R.integer.BUTTON_STICK_R_X_PORTRAIT, R.integer.BUTTON_STICK_R_Y_PORTRAIT),
|
||||||
Pair(R.integer.BUTTON_STICK_R_X_FOLDABLE, R.integer.BUTTON_STICK_R_Y_FOLDABLE),
|
Pair(R.integer.BUTTON_STICK_R_X_FOLDABLE, R.integer.BUTTON_STICK_R_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
STICK_L(
|
STICK_L(
|
||||||
"stick_l",
|
"stick_l",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.STICK_L_X, R.integer.STICK_L_Y),
|
Pair(R.integer.STICK_L_X, R.integer.STICK_L_Y),
|
||||||
Pair(R.integer.STICK_L_X_PORTRAIT, R.integer.STICK_L_Y_PORTRAIT),
|
Pair(R.integer.STICK_L_X_PORTRAIT, R.integer.STICK_L_Y_PORTRAIT),
|
||||||
Pair(R.integer.STICK_L_X_FOLDABLE, R.integer.STICK_L_Y_FOLDABLE),
|
Pair(R.integer.STICK_L_X_FOLDABLE, R.integer.STICK_L_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
STICK_R(
|
STICK_R(
|
||||||
"stick_r",
|
"stick_r",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.STICK_R_X, R.integer.STICK_R_Y),
|
Pair(R.integer.STICK_R_X, R.integer.STICK_R_Y),
|
||||||
Pair(R.integer.STICK_R_X_PORTRAIT, R.integer.STICK_R_Y_PORTRAIT),
|
Pair(R.integer.STICK_R_X_PORTRAIT, R.integer.STICK_R_Y_PORTRAIT),
|
||||||
Pair(R.integer.STICK_R_X_FOLDABLE, R.integer.STICK_R_Y_FOLDABLE),
|
Pair(R.integer.STICK_R_X_FOLDABLE, R.integer.STICK_R_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
),
|
),
|
||||||
COMBINED_DPAD(
|
COMBINED_DPAD(
|
||||||
"combined_dpad",
|
"combined_dpad",
|
||||||
true,
|
true,
|
||||||
Pair(R.integer.COMBINED_DPAD_X, R.integer.COMBINED_DPAD_Y),
|
Pair(R.integer.COMBINED_DPAD_X, R.integer.COMBINED_DPAD_Y),
|
||||||
Pair(R.integer.COMBINED_DPAD_X_PORTRAIT, R.integer.COMBINED_DPAD_Y_PORTRAIT),
|
Pair(R.integer.COMBINED_DPAD_X_PORTRAIT, R.integer.COMBINED_DPAD_Y_PORTRAIT),
|
||||||
Pair(R.integer.COMBINED_DPAD_X_FOLDABLE, R.integer.COMBINED_DPAD_Y_FOLDABLE),
|
Pair(R.integer.COMBINED_DPAD_X_FOLDABLE, R.integer.COMBINED_DPAD_Y_FOLDABLE)
|
||||||
1.0f
|
|
||||||
);
|
);
|
||||||
|
|
||||||
fun getDefaultPositionForLayout(layout: OverlayLayout): Pair<Double, Double> {
|
fun getDefaultPositionForLayout(layout: OverlayLayout): Pair<Double, Double> {
|
||||||
|
@ -191,8 +173,7 @@ enum class OverlayControl(
|
||||||
defaultVisibility,
|
defaultVisibility,
|
||||||
getDefaultPositionForLayout(OverlayLayout.Landscape),
|
getDefaultPositionForLayout(OverlayLayout.Landscape),
|
||||||
getDefaultPositionForLayout(OverlayLayout.Portrait),
|
getDefaultPositionForLayout(OverlayLayout.Portrait),
|
||||||
getDefaultPositionForLayout(OverlayLayout.Foldable),
|
getDefaultPositionForLayout(OverlayLayout.Foldable)
|
||||||
defaultIndividualScaleResource
|
|
||||||
)
|
)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.overlay.model
|
package org.yuzu.yuzu_emu.overlay.model
|
||||||
|
|
||||||
|
@ -8,8 +8,7 @@ data class OverlayControlData(
|
||||||
var enabled: Boolean,
|
var enabled: Boolean,
|
||||||
var landscapePosition: Pair<Double, Double>,
|
var landscapePosition: Pair<Double, Double>,
|
||||||
var portraitPosition: Pair<Double, Double>,
|
var portraitPosition: Pair<Double, Double>,
|
||||||
var foldablePosition: Pair<Double, Double>,
|
var foldablePosition: Pair<Double, Double>
|
||||||
var individualScale: Float
|
|
||||||
) {
|
) {
|
||||||
fun positionFromLayout(layout: OverlayLayout): Pair<Double, Double> =
|
fun positionFromLayout(layout: OverlayLayout): Pair<Double, Double> =
|
||||||
when (layout) {
|
when (layout) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
package org.yuzu.yuzu_emu.utils
|
package org.yuzu.yuzu_emu.utils
|
||||||
|
|
||||||
|
@ -170,8 +170,7 @@ object DirectoryInitialization {
|
||||||
buttonEnabled,
|
buttonEnabled,
|
||||||
Pair(landscapeXPosition, landscapeYPosition),
|
Pair(landscapeXPosition, landscapeYPosition),
|
||||||
Pair(portraitXPosition, portraitYPosition),
|
Pair(portraitXPosition, portraitYPosition),
|
||||||
Pair(foldableXPosition, foldableYPosition),
|
Pair(foldableXPosition, foldableYPosition)
|
||||||
OverlayControl.map[buttonId]?.defaultIndividualScaleResource ?: 1.0f
|
|
||||||
)
|
)
|
||||||
overlayControlDataMap[buttonId] = controlData
|
overlayControlDataMap[buttonId] = controlData
|
||||||
setOverlayData = true
|
setOverlayData = true
|
||||||
|
|
|
@ -19,7 +19,6 @@ import org.yuzu.yuzu_emu.adapters.GameAdapter
|
||||||
import androidx.core.view.doOnNextLayout
|
import androidx.core.view.doOnNextLayout
|
||||||
import org.yuzu.yuzu_emu.YuzuApplication
|
import org.yuzu.yuzu_emu.YuzuApplication
|
||||||
import androidx.preference.PreferenceManager
|
import androidx.preference.PreferenceManager
|
||||||
import androidx.core.view.WindowInsetsCompat
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CarouselRecyclerView encapsulates all carousel logic for the games UI.
|
* CarouselRecyclerView encapsulates all carousel logic for the games UI.
|
||||||
|
@ -206,8 +205,8 @@ class CarouselRecyclerView @JvmOverloads constructor(
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
useCustomDrawingOrder = true
|
useCustomDrawingOrder = true
|
||||||
|
|
||||||
val insets = rootWindowInsets?.let { WindowInsetsCompat.toWindowInsetsCompat(it, this) }
|
val insets = rootWindowInsets
|
||||||
val bottomInset = insets?.getInsets(WindowInsetsCompat.Type.systemBars())?.bottom ?: 0
|
val bottomInset = insets?.getInsets(android.view.WindowInsets.Type.systemBars())?.bottom ?: 0
|
||||||
val internalFactor = resources.getFraction(R.fraction.carousel_card_size_factor, 1, 1)
|
val internalFactor = resources.getFraction(R.fraction.carousel_card_size_factor, 1, 1)
|
||||||
val userFactor = preferences.getFloat(CAROUSEL_CARD_SIZE_FACTOR, internalFactor).coerceIn(
|
val userFactor = preferences.getFloat(CAROUSEL_CARD_SIZE_FACTOR, internalFactor).coerceIn(
|
||||||
0f,
|
0f,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <common/logging/log.h>
|
#include <common/logging/log.h>
|
||||||
#include <input_common/main.h>
|
#include <input_common/main.h>
|
||||||
|
@ -103,7 +103,6 @@ void AndroidConfig::ReadOverlayValues() {
|
||||||
ReadDoubleSetting(std::string("foldable\\x_position"));
|
ReadDoubleSetting(std::string("foldable\\x_position"));
|
||||||
control_data.foldable_position.second =
|
control_data.foldable_position.second =
|
||||||
ReadDoubleSetting(std::string("foldable\\y_position"));
|
ReadDoubleSetting(std::string("foldable\\y_position"));
|
||||||
control_data.individual_scale = static_cast<float>(ReadDoubleSetting(std::string("individual_scale")));
|
|
||||||
AndroidSettings::values.overlay_control_data.push_back(control_data);
|
AndroidSettings::values.overlay_control_data.push_back(control_data);
|
||||||
}
|
}
|
||||||
EndArray();
|
EndArray();
|
||||||
|
@ -256,7 +255,6 @@ void AndroidConfig::SaveOverlayValues() {
|
||||||
control_data.foldable_position.first);
|
control_data.foldable_position.first);
|
||||||
WriteDoubleSetting(std::string("foldable\\y_position"),
|
WriteDoubleSetting(std::string("foldable\\y_position"),
|
||||||
control_data.foldable_position.second);
|
control_data.foldable_position.second);
|
||||||
WriteDoubleSetting(std::string("individual_scale"), static_cast<double>(control_data.individual_scale));
|
|
||||||
}
|
}
|
||||||
EndArray();
|
EndArray();
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,6 @@ namespace AndroidSettings {
|
||||||
std::pair<double, double> landscape_position;
|
std::pair<double, double> landscape_position;
|
||||||
std::pair<double, double> portrait_position;
|
std::pair<double, double> portrait_position;
|
||||||
std::pair<double, double> foldable_position;
|
std::pair<double, double> foldable_position;
|
||||||
float individual_scale;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct Values {
|
struct Values {
|
||||||
|
@ -80,15 +79,6 @@ namespace AndroidSettings {
|
||||||
Settings::Category::Overlay,
|
Settings::Category::Overlay,
|
||||||
Settings::Specialization::Paired, true,
|
Settings::Specialization::Paired, true,
|
||||||
true};
|
true};
|
||||||
Settings::Setting<bool> enable_input_overlay_auto_hide{linkage, false,
|
|
||||||
"enable_input_overlay_auto_hide",
|
|
||||||
Settings::Category::Overlay,
|
|
||||||
Settings::Specialization::Default, true,
|
|
||||||
true,};
|
|
||||||
|
|
||||||
Settings::Setting<u32> input_overlay_auto_hide{linkage, 5, "input_overlay_auto_hide",
|
|
||||||
Settings::Category::Overlay,
|
|
||||||
Settings::Specialization::Default, true, true, &enable_input_overlay_auto_hide};
|
|
||||||
Settings::Setting<bool> perf_overlay_background{linkage, false, "perf_overlay_background",
|
Settings::Setting<bool> perf_overlay_background{linkage, false, "perf_overlay_background",
|
||||||
Settings::Category::Overlay,
|
Settings::Category::Overlay,
|
||||||
Settings::Specialization::Default, true,
|
Settings::Specialization::Default, true,
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
|
@ -369,9 +369,7 @@ jobjectArray Java_org_yuzu_yuzu_1emu_utils_NativeConfig_getOverlayControlData(JN
|
||||||
env->NewObject(Common::Android::GetOverlayControlDataClass(),
|
env->NewObject(Common::Android::GetOverlayControlDataClass(),
|
||||||
Common::Android::GetOverlayControlDataConstructor(),
|
Common::Android::GetOverlayControlDataConstructor(),
|
||||||
Common::Android::ToJString(env, control_data.id), control_data.enabled,
|
Common::Android::ToJString(env, control_data.id), control_data.enabled,
|
||||||
jlandscapePosition, jportraitPosition, jfoldablePosition,
|
jlandscapePosition, jportraitPosition, jfoldablePosition);
|
||||||
control_data.individual_scale);
|
|
||||||
|
|
||||||
env->SetObjectArrayElement(joverlayControlDataArray, i, jcontrolData);
|
env->SetObjectArrayElement(joverlayControlDataArray, i, jcontrolData);
|
||||||
}
|
}
|
||||||
return joverlayControlDataArray;
|
return joverlayControlDataArray;
|
||||||
|
@ -420,12 +418,9 @@ void Java_org_yuzu_yuzu_1emu_utils_NativeConfig_setOverlayControlData(
|
||||||
env,
|
env,
|
||||||
env->GetObjectField(jfoldablePosition, Common::Android::GetPairSecondField())));
|
env->GetObjectField(jfoldablePosition, Common::Android::GetPairSecondField())));
|
||||||
|
|
||||||
float individual_scale = static_cast<float>(env->GetFloatField(
|
|
||||||
joverlayControlData, Common::Android::GetOverlayControlDataIndividualScaleField()));
|
|
||||||
|
|
||||||
AndroidSettings::values.overlay_control_data.push_back(AndroidSettings::OverlayControlData{
|
AndroidSettings::values.overlay_control_data.push_back(AndroidSettings::OverlayControlData{
|
||||||
Common::Android::GetJString(env, jidString), enabled, landscape_position,
|
Common::Android::GetJString(env, jidString), enabled, landscape_position,
|
||||||
portrait_position, foldable_position, individual_scale});
|
portrait_position, foldable_position});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 38 KiB |
Binary file not shown.
Before Width: | Height: | Size: 438 KiB |
|
@ -1,74 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="320dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:cardCornerRadius="16dp"
|
|
||||||
app:cardElevation="8dp"
|
|
||||||
app:cardBackgroundColor="#CC222222">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="12dp">
|
|
||||||
|
|
||||||
<com.google.android.material.textview.MaterialTextView
|
|
||||||
android:id="@+id/scaleValueText"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="1.0x"
|
|
||||||
android:textAppearance="?attr/textAppearanceBody1"
|
|
||||||
android:gravity="center"
|
|
||||||
android:layout_marginBottom="4dp"
|
|
||||||
android:textColor="#FFFFFF"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
|
|
||||||
<com.google.android.material.slider.Slider
|
|
||||||
android:id="@+id/scaleSlider"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:valueFrom="0.5"
|
|
||||||
android:valueTo="4.0"
|
|
||||||
android:stepSize="0.1"
|
|
||||||
android:value="1.0"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
app:trackColorActive="@color/eden_border_gradient_start"
|
|
||||||
app:trackColorInactive="@color/eden_border_gradient_end"
|
|
||||||
app:tickColor="@color/eden_border_gradient_start"/>
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:gravity="end">
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/resetButton"
|
|
||||||
style="@style/Widget.Material3.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/reset"
|
|
||||||
android:layout_marginEnd="4dp" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/cancelButton"
|
|
||||||
style="@style/Widget.Material3.Button.TextButton"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@android:string/cancel"
|
|
||||||
android:layout_marginEnd="4dp" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/confirmButton"
|
|
||||||
style="@style/Widget.Material3.Button"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:backgroundTint="@color/eden_button_secondary_bg"
|
|
||||||
android:textColor="@color/eden_border_gradient_end"
|
|
||||||
android:text="@string/confirm" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
|
|
@ -1,55 +0,0 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_centerVertical="true"
|
|
||||||
android:layout_marginTop="32dp"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:paddingLeft="@dimen/spacing_large"
|
|
||||||
android:paddingRight="@dimen/spacing_large">
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/button_decrement"
|
|
||||||
style="@style/Widget.Material3.Button.IconButton.Filled"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:contentDescription="@string/decrement"
|
|
||||||
android:text="-" />
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputLayout
|
|
||||||
android:id="@+id/text_input_layout"
|
|
||||||
style="@style/Widget.Material3.TextInputLayout.OutlinedBox"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_marginLeft="@dimen/spacing_medlarge"
|
|
||||||
android:layout_marginRight="@dimen/spacing_medlarge"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:hint="Value">
|
|
||||||
|
|
||||||
<com.google.android.material.textfield.TextInputEditText
|
|
||||||
android:id="@+id/edit_value"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:inputType="number"
|
|
||||||
android:textAlignment="textStart"
|
|
||||||
tools:text="0" />
|
|
||||||
|
|
||||||
</com.google.android.material.textfield.TextInputLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/button_increment"
|
|
||||||
style="@style/Widget.Material3.Button.IconButton.Filled"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:contentDescription="@string/increment"
|
|
||||||
android:text="+" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
|
@ -64,6 +64,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">امتدادات GPU</string>
|
<string name="veil_extensions">امتدادات GPU</string>
|
||||||
<string name="veil_renderer">العارض</string>
|
<string name="veil_renderer">العارض</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">طريقة لإدارة الموارد تلقائيًا في فولكان تضمن الإفراج الصحيح عن الموارد عندما لا تكون هناك حاجة إليها، ولكن قد تسبب تعطل الألعاب المجمعة.</string>
|
||||||
<string name="veil_misc">وحدة المعالجة المركزية والذاكرة</string>
|
<string name="veil_misc">وحدة المعالجة المركزية والذاكرة</string>
|
||||||
<string name="eden_veil">حجاب عدن</string>
|
<string name="eden_veil">حجاب عدن</string>
|
||||||
<string name="eden_veil_description">إعدادات تجريبية لتحسين الأداء والقدرة. قد تسبب هذه الإعدادات شاشات سوداء أو مشاكل أخرى في اللعبة.</string>
|
<string name="eden_veil_description">إعدادات تجريبية لتحسين الأداء والقدرة. قد تسبب هذه الإعدادات شاشات سوداء أو مشاكل أخرى في اللعبة.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">پاشکۆکانی GPU</string>
|
<string name="veil_extensions">پاشکۆکانی GPU</string>
|
||||||
<string name="veil_renderer">رێندرەر</string>
|
<string name="veil_renderer">رێندرەر</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">ڕێگایەکی بەڕێوەبردنی سەرچاوەکان بە خۆکار لە ڤولکان کە دڵنیای دەکاتەوە لە ئازادکردنی گونجاوی سەرچاوەکان کاتێک کە چیتر پێویستیان نییە، بەڵام لەوانەیە ببێتە هۆی کەوتنی یارییە کۆکراوەکان.</string>
|
||||||
<string name="veil_misc">CPU و بیرگە</string>
|
<string name="veil_misc">CPU و بیرگە</string>
|
||||||
<string name="eden_veil">حجاب عدن</string>
|
<string name="eden_veil">حجاب عدن</string>
|
||||||
<string name="eden_veil_description">ڕێکخستنە تاقیکارییەکان بۆ باشترکردنی کارایی و توانا. ئەم ڕێکخستنانە لەوانەیە ببێتە هۆی شاشە ڕەشەکان یان کێشەیتری یاری.</string>
|
<string name="eden_veil_description">ڕێکخستنە تاقیکارییەکان بۆ باشترکردنی کارایی و توانا. ئەم ڕێکخستنانە لەوانەیە ببێتە هۆی شاشە ڕەشەکان یان کێشەیتری یاری.</string>
|
||||||
|
|
|
@ -64,6 +64,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Rozšíření GPU</string>
|
<string name="veil_extensions">Rozšíření GPU</string>
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Metoda automatické správy prostředků ve Vulkanu, která zajišťuje správné uvolnění prostředků, když již nejsou potřeba, ale může způsobit pády v balených hrách.</string>
|
||||||
<string name="veil_misc">CPU a paměť</string>
|
<string name="veil_misc">CPU a paměť</string>
|
||||||
<string name="eden_veil">Edenův závoj</string>
|
<string name="eden_veil">Edenův závoj</string>
|
||||||
<string name="eden_veil_description">Experimentální nastavení pro zlepšení výkonu a schopností. Tato nastavení mohou způsobit černé obrazovky nebo další herní problémy.</string>
|
<string name="eden_veil_description">Experimentální nastavení pro zlepšení výkonu a schopností. Tato nastavení mohou způsobit černé obrazovky nebo další herní problémy.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU-Erweiterungen</string>
|
<string name="veil_extensions">GPU-Erweiterungen</string>
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Eine Methode zur automatischen Ressourcenverwaltung in Vulkan, die eine ordnungsgemäße Freigabe von Ressourcen gewährleistet, wenn sie nicht mehr benötigt werden, aber bei gebündelten Spielen Abstürze verursachen kann.</string>
|
||||||
<string name="veil_misc">CPU und Speicher</string>
|
<string name="veil_misc">CPU und Speicher</string>
|
||||||
<string name="eden_veil">Edens Schleier</string>
|
<string name="eden_veil">Edens Schleier</string>
|
||||||
<string name="eden_veil_description">Experimentelle Einstellungen zur Verbesserung der Leistung und Funktionalität. Diese Einstellungen können schwarze Bildschirme oder andere Spielprobleme verursachen.</string>
|
<string name="eden_veil_description">Experimentelle Einstellungen zur Verbesserung der Leistung und Funktionalität. Diese Einstellungen können schwarze Bildschirme oder andere Spielprobleme verursachen.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Extensiones de GPU</string>
|
<string name="veil_extensions">Extensiones de GPU</string>
|
||||||
<string name="veil_renderer">Renderizador</string>
|
<string name="veil_renderer">Renderizador</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Un método de gestión automática de recursos en Vulkan que garantiza la liberación adecuada de recursos cuando ya no son necesarios, pero puede causar fallos en juegos empaquetados.</string>
|
||||||
<string name="veil_misc">CPU y memoria</string>
|
<string name="veil_misc">CPU y memoria</string>
|
||||||
<string name="eden_veil">Velo de Edén</string>
|
<string name="eden_veil">Velo de Edén</string>
|
||||||
<string name="eden_veil_description">Configuraciones experimentales para mejorar el rendimiento y la capacidad. Estas configuraciones pueden causar pantallas negras u otros problemas en el juego.</string>
|
<string name="eden_veil_description">Configuraciones experimentales para mejorar el rendimiento y la capacidad. Estas configuraciones pueden causar pantallas negras u otros problemas en el juego.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">افزونههای GPU</string>
|
<string name="veil_extensions">افزونههای GPU</string>
|
||||||
<string name="veil_renderer">رندرر</string>
|
<string name="veil_renderer">رندرر</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">روشی برای مدیریت خودکار منابع در ولکان که تضمین میکند منابع به درستی آزاد شوند وقتی دیگر مورد نیاز نیستند، اما ممکن است باعث کرش شدن بازیهای بستهبندی شده شود.</string>
|
||||||
<string name="veil_misc">پردازنده و حافظه</string>
|
<string name="veil_misc">پردازنده و حافظه</string>
|
||||||
<string name="eden_veil">پرده عدن</string>
|
<string name="eden_veil">پرده عدن</string>
|
||||||
<string name="eden_veil_description">تنظیمات آزمایشی برای بهبود عملکرد و قابلیت. این تنظیمات ممکن است باعث نمایش صفحه سیاه یا سایر مشکلات بازی شود.</string>
|
<string name="eden_veil_description">تنظیمات آزمایشی برای بهبود عملکرد و قابلیت. این تنظیمات ممکن است باعث نمایش صفحه سیاه یا سایر مشکلات بازی شود.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Extensions GPU</string>
|
<string name="veil_extensions">Extensions GPU</string>
|
||||||
<string name="veil_renderer">Rendu</string>
|
<string name="veil_renderer">Rendu</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Une méthode de gestion automatique des ressources dans Vulkan qui assure la libération correcte des ressources lorsqu\'elles ne sont plus nécessaires, mais peut provoquer des plantages dans les jeux regroupés.</string>
|
||||||
<string name="veil_misc">CPU et mémoire</string>
|
<string name="veil_misc">CPU et mémoire</string>
|
||||||
<string name="eden_veil">Voile d\'Eden</string>
|
<string name="eden_veil">Voile d\'Eden</string>
|
||||||
<string name="eden_veil_description">Paramètres expérimentaux pour améliorer les performances et les capacités. Ces paramètres peuvent causer des écrans noirs ou d\'autres problèmes de jeu.</string>
|
<string name="eden_veil_description">Paramètres expérimentaux pour améliorer les performances et les capacités. Ces paramètres peuvent causer des écrans noirs ou d\'autres problèmes de jeu.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">הרחבות GPU</string>
|
<string name="veil_extensions">הרחבות GPU</string>
|
||||||
<string name="veil_renderer">רנדרר</string>
|
<string name="veil_renderer">רנדרר</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">שיטה לניהול אוטומטי של משאבים ב-Vulkan המבטיחה שחרור נכון של משאבים כאשר הם כבר לא נחוצים, אך עלולה לגרום לקריסות במשחקים מאוגדים.</string>
|
||||||
<string name="veil_misc">מעבד וזיכרון</string>
|
<string name="veil_misc">מעבד וזיכרון</string>
|
||||||
<string name="eden_veil">עדן וייל</string>
|
<string name="eden_veil">עדן וייל</string>
|
||||||
<string name="eden_veil_description">הגדרות ניסיוניות לשיפור ביצועים ויכולות. הגדרות אלו עלולות לגרום למסכים שחורים או לבעיות אחרות במשחק.</string>
|
<string name="eden_veil_description">הגדרות ניסיוניות לשיפור ביצועים ויכולות. הגדרות אלו עלולות לגרום למסכים שחורים או לבעיות אחרות במשחק.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU kiterjesztések</string>
|
<string name="veil_extensions">GPU kiterjesztések</string>
|
||||||
<string name="veil_renderer">Megjelenítő</string>
|
<string name="veil_renderer">Megjelenítő</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">A Vulkan erőforrás-kezelési módszere, amely biztosítja az erőforrások megfelelő felszabadítását, ha már nincs rájuk szükség, de csomagolt játékok összeomlását okozhatja.</string>
|
||||||
<string name="veil_misc">CPU és memória</string>
|
<string name="veil_misc">CPU és memória</string>
|
||||||
<string name="eden_veil">Eden Fátyla</string>
|
<string name="eden_veil">Eden Fátyla</string>
|
||||||
<string name="eden_veil_description">Kísérleti beállítások a teljesítmény és képesség javításához. Ezek a beállítások fekete képernyőket vagy más játékproblémákat okozhatnak.</string>
|
<string name="eden_veil_description">Kísérleti beállítások a teljesítmény és képesség javításához. Ezek a beállítások fekete képernyőket vagy más játékproblémákat okozhatnak.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Ekstensi GPU</string>
|
<string name="veil_extensions">Ekstensi GPU</string>
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Metode manajemen sumber daya otomatis di Vulkan yang memastikan pelepasan sumber daya yang tepat ketika tidak lagi diperlukan, tetapi dapat menyebabkan crash pada game yang dibundel.</string>
|
||||||
<string name="veil_misc">CPU dan Memori</string>
|
<string name="veil_misc">CPU dan Memori</string>
|
||||||
<string name="eden_veil">Eden\'s Veil</string>
|
<string name="eden_veil">Eden\'s Veil</string>
|
||||||
<string name="eden_veil_description">Pengaturan eksperimental untuk meningkatkan kinerja dan kemampuan. Pengaturan ini dapat menyebabkan layar hitam atau masalah game lainnya.</string>
|
<string name="eden_veil_description">Pengaturan eksperimental untuk meningkatkan kinerja dan kemampuan. Pengaturan ini dapat menyebabkan layar hitam atau masalah game lainnya.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Estensioni GPU</string>
|
<string name="veil_extensions">Estensioni GPU</string>
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Un metodo di gestione automatica delle risorse in Vulkan che garantisce il corretto rilascio delle risorse quando non sono più necessarie, ma può causare crash nei giochi in bundle.</string>
|
||||||
<string name="veil_misc">CPU e Memoria</string>
|
<string name="veil_misc">CPU e Memoria</string>
|
||||||
<string name="eden_veil">Velo di Eden</string>
|
<string name="eden_veil">Velo di Eden</string>
|
||||||
<string name="eden_veil_description">Impostazioni sperimentali per migliorare prestazioni e capacità. Queste impostazioni possono causare schermate nere o altri problemi di gioco.</string>
|
<string name="eden_veil_description">Impostazioni sperimentali per migliorare prestazioni e capacità. Queste impostazioni possono causare schermate nere o altri problemi di gioco.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU拡張機能</string>
|
<string name="veil_extensions">GPU拡張機能</string>
|
||||||
<string name="veil_renderer">レンダラー</string>
|
<string name="veil_renderer">レンダラー</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Vulkanにおける自動リソース管理の方法で、不要になったリソースを適切に解放しますが、バンドルされたゲームでクラッシュを引き起こす可能性があります。</string>
|
||||||
<string name="veil_misc">CPUとメモリ</string>
|
<string name="veil_misc">CPUとメモリ</string>
|
||||||
<string name="eden_veil">エデンのベール</string>
|
<string name="eden_veil">エデンのベール</string>
|
||||||
<string name="eden_veil_description">パフォーマンスと機能を向上させる実験的な設定。これらの設定は黒画面やその他のゲームの問題を引き起こす可能性があります。</string>
|
<string name="eden_veil_description">パフォーマンスと機能を向上させる実験的な設定。これらの設定は黒画面やその他のゲームの問題を引き起こす可能性があります。</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU 확장 기능</string>
|
<string name="veil_extensions">GPU 확장 기능</string>
|
||||||
<string name="veil_renderer">렌더러</string>
|
<string name="veil_renderer">렌더러</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Vulkan에서 자동 리소스 관리를 위한 방법으로, 더 이상 필요하지 않은 리소스를 적절히 해제하지만 번들된 게임에서 충돌을 일으킬 수 있습니다.</string>
|
||||||
<string name="veil_misc">CPU 및 메모리</string>
|
<string name="veil_misc">CPU 및 메모리</string>
|
||||||
<string name="eden_veil">에덴의 베일</string>
|
<string name="eden_veil">에덴의 베일</string>
|
||||||
<string name="eden_veil_description">성능 및 기능을 향상시키기 위한 실험적 설정. 이 설정은 검은 화면 또는 기타 게임 문제를 일으킬 수 있습니다.</string>
|
<string name="eden_veil_description">성능 및 기능을 향상시키기 위한 실험적 설정. 이 설정은 검은 화면 또는 기타 게임 문제를 일으킬 수 있습니다.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU-utvidelser</string>
|
<string name="veil_extensions">GPU-utvidelser</string>
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">En metode for automatisk ressurshåndtering i Vulkan som sikrer riktig frigjøring av ressurser når de ikke lenger trengs, men kan føre til krasj i bundlede spill.</string>
|
||||||
<string name="veil_misc">CPU og minne</string>
|
<string name="veil_misc">CPU og minne</string>
|
||||||
<string name="eden_veil">Edens slør</string>
|
<string name="eden_veil">Edens slør</string>
|
||||||
<string name="eden_veil_description">Eksperimentelle innstillinger for å forbedre ytelse og funksjonalitet. Disse innstillingene kan forårsake svarte skjermer eller andre spillproblemer.</string>
|
<string name="eden_veil_description">Eksperimentelle innstillinger for å forbedre ytelse og funksjonalitet. Disse innstillingene kan forårsake svarte skjermer eller andre spillproblemer.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Rozszerzenia GPU</string>
|
<string name="veil_extensions">Rozszerzenia GPU</string>
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Metoda automatycznego zarządzania zasobami w Vulkanie, która zapewnia prawidłowe zwalnianie zasobów, gdy nie są już potrzebne, ale może powodować awarie w pakietowych grach.</string>
|
||||||
<string name="veil_misc">Procesor i pamięć</string>
|
<string name="veil_misc">Procesor i pamięć</string>
|
||||||
<string name="eden_veil">Zasłona Edenu</string>
|
<string name="eden_veil">Zasłona Edenu</string>
|
||||||
<string name="eden_veil_description">Eksperymentalne ustawienia poprawiające wydajność i możliwości. Te ustawienia mogą powodować czarne ekrany lub inne problemy z grą.</string>
|
<string name="eden_veil_description">Eksperymentalne ustawienia poprawiające wydajność i możliwości. Te ustawienia mogą powodować czarne ekrany lub inne problemy z grą.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Extensões da GPU</string>
|
<string name="veil_extensions">Extensões da GPU</string>
|
||||||
<string name="veil_renderer">Renderizador</string>
|
<string name="veil_renderer">Renderizador</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Um método de gerenciamento automático de recursos no Vulkan que garante a liberação adequada de recursos quando não são mais necessários, mas pode causar falhas em jogos empacotados.</string>
|
||||||
<string name="veil_misc">CPU e Memória</string>
|
<string name="veil_misc">CPU e Memória</string>
|
||||||
<string name="eden_veil">Véu do Éden</string>
|
<string name="eden_veil">Véu do Éden</string>
|
||||||
<string name="eden_veil_description">Configurações experimentais para melhorar desempenho e capacidade. Essas configurações podem causar telas pretas ou outros problemas no jogo.</string>
|
<string name="eden_veil_description">Configurações experimentais para melhorar desempenho e capacidade. Essas configurações podem causar telas pretas ou outros problemas no jogo.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Extensões da GPU</string>
|
<string name="veil_extensions">Extensões da GPU</string>
|
||||||
<string name="veil_renderer">Renderizador</string>
|
<string name="veil_renderer">Renderizador</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Um método de gestão automática de recursos no Vulkan que garante a libertação adequada de recursos quando já não são necessários, mas pode causar falhas em jogos empacotados.</string>
|
||||||
<string name="veil_misc">CPU e Memória</string>
|
<string name="veil_misc">CPU e Memória</string>
|
||||||
<string name="eden_veil">Véu do Éden</string>
|
<string name="eden_veil">Véu do Éden</string>
|
||||||
<string name="eden_veil_description">Definições experimentais para melhorar o desempenho e capacidade. Estas definições podem causar ecrãs pretos ou outros problemas no jogo.</string>
|
<string name="eden_veil_description">Definições experimentais para melhorar o desempenho e capacidade. Estas definições podem causar ecrãs pretos ou outros problemas no jogo.</string>
|
||||||
|
|
|
@ -72,6 +72,8 @@
|
||||||
<string name="eden_veil_warning_description">Настройки в Покров Эдема являются экспериментальными и могут вызывать проблемы. Если ваша игра не запускается, отключите все расширения.</string>
|
<string name="eden_veil_warning_description">Настройки в Покров Эдема являются экспериментальными и могут вызывать проблемы. Если ваша игра не запускается, отключите все расширения.</string>
|
||||||
<string name="frame_skipping">В разработке: Пропуск кадров</string>
|
<string name="frame_skipping">В разработке: Пропуск кадров</string>
|
||||||
<string name="frame_skipping_description">Включите или отключите пропуск кадров для повышения производительности за счет уменьшения количества отображаемых кадров. Эта функция находится в разработке и будет включена в будущих версиях.</string>
|
<string name="frame_skipping_description">Включите или отключите пропуск кадров для повышения производительности за счет уменьшения количества отображаемых кадров. Эта функция находится в разработке и будет включена в будущих версиях.</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Метод автоматического управления ресурсами в Vulkan, который обеспечивает правильное освобождение ресурсов при их ненадобности, но может вызывать сбои в бандл-играх.</string>
|
||||||
<string name="frame_interpolation">Улучшенная синхронизация кадров</string>
|
<string name="frame_interpolation">Улучшенная синхронизация кадров</string>
|
||||||
<string name="frame_interpolation_description">Обеспечивает плавную и стабильную подачу кадров за счет синхронизации их времени, уменьшая подтормаживания и неравномерную анимацию. Идеально для игр с нестабильным временем кадров или микро-подтормаживаниями во время игры.</string>
|
<string name="frame_interpolation_description">Обеспечивает плавную и стабильную подачу кадров за счет синхронизации их времени, уменьшая подтормаживания и неравномерную анимацию. Идеально для игр с нестабильным временем кадров или микро-подтормаживаниями во время игры.</string>
|
||||||
<string name="renderer_early_release_fences">Ранний релиз ограждений</string>
|
<string name="renderer_early_release_fences">Ранний релиз ограждений</string>
|
||||||
|
|
|
@ -81,6 +81,8 @@
|
||||||
<string name="descriptor_indexing_description">Побољшава текстуру и руковање међуспремника, као и преводилачки слој Маквелл. Подржани од стране неких Вулкана 1.1 ГПУ-а и сви Вулкан 1.2+ ГПУ.</string>
|
<string name="descriptor_indexing_description">Побољшава текстуру и руковање међуспремника, као и преводилачки слој Маквелл. Подржани од стране неких Вулкана 1.1 ГПУ-а и сви Вулкан 1.2+ ГПУ.</string>
|
||||||
|
|
||||||
<string name="veil_renderer">Рендерер</string>
|
<string name="veil_renderer">Рендерер</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Метод аутоматског управљања ресурсима у Vulkan-у који осигурава правилно ослобађање ресурса када више нису потребни, али може изазвати падове у пакованим играма.</string>
|
||||||
<string name="frame_interpolation">Побољшани оквирни пејсинг</string>
|
<string name="frame_interpolation">Побољшани оквирни пејсинг</string>
|
||||||
<string name="frame_interpolation_description">Осигурава глатку и доследан испоруку оквира синхронизацијом времена између оквира, смањење муцања и неуједначене анимације. Идеално за игре које доживљавају временски оквир нестабилност или микро-штитнике током играња.</string>
|
<string name="frame_interpolation_description">Осигурава глатку и доследан испоруку оквира синхронизацијом времена између оквира, смањење муцања и неуједначене анимације. Идеално за игре које доживљавају временски оквир нестабилност или микро-штитнике током играња.</string>
|
||||||
<string name="renderer_early_release_fences">Ranije oslobađanje ograda</string>
|
<string name="renderer_early_release_fences">Ranije oslobađanje ograda</string>
|
||||||
|
|
|
@ -70,6 +70,8 @@
|
||||||
<string name="eden_veil_description">Експериментальні налаштування для покращення продуктивності та сумісності. Ці налаштування можуть викликати збої, зокрема чорний екран.</string>
|
<string name="eden_veil_description">Експериментальні налаштування для покращення продуктивності та сумісності. Ці налаштування можуть викликати збої, зокрема чорний екран.</string>
|
||||||
<string name="eden_veil_warning_title">Експериментальні налаштування</string>
|
<string name="eden_veil_warning_title">Експериментальні налаштування</string>
|
||||||
<string name="eden_veil_warning_description">Налаштування Завіси Eden є експериментальними та можуть спричинити проблеми. Якщо ваша гра не запускається — вимкніть усі розширення.</string>
|
<string name="eden_veil_warning_description">Налаштування Завіси Eden є експериментальними та можуть спричинити проблеми. Якщо ваша гра не запускається — вимкніть усі розширення.</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Метод автоматичного керування ресурсами у Vulkan, який забезпечує правильне звільнення ресурсів після завершення їх використання, проте він може спричинити збої в ігрових збірниках.</string>
|
||||||
<string name="frame_skipping">В розробці: Пропуск кадрів</string>
|
<string name="frame_skipping">В розробці: Пропуск кадрів</string>
|
||||||
<string name="frame_skipping_description">Увімкніть або вимкніть пропуск кадрів для покращення продуктивності за рахунок зменшення кількості візуалізованих кадрів. Ця функція ще розробляється та буде доступна у майбутніх версіях.</string>
|
<string name="frame_skipping_description">Увімкніть або вимкніть пропуск кадрів для покращення продуктивності за рахунок зменшення кількості візуалізованих кадрів. Ця функція ще розробляється та буде доступна у майбутніх версіях.</string>
|
||||||
<string name="frame_interpolation">Покращена синхронізація кадрів</string>
|
<string name="frame_interpolation">Покращена синхронізація кадрів</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">Tiện ích mở rộng GPU</string>
|
<string name="veil_extensions">Tiện ích mở rộng GPU</string>
|
||||||
<string name="veil_renderer">Trình kết xuất</string>
|
<string name="veil_renderer">Trình kết xuất</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Phương pháp quản lý tài nguyên tự động trong Vulkan đảm bảo giải phóng tài nguyên đúng cách khi không còn cần thiết, nhưng có thể gây ra sự cố trong các trò chơi được đóng gói.</string>
|
||||||
<string name="veil_misc">CPU và Bộ nhớ</string>
|
<string name="veil_misc">CPU và Bộ nhớ</string>
|
||||||
<string name="eden_veil">Mành che của Eden</string>
|
<string name="eden_veil">Mành che của Eden</string>
|
||||||
<string name="eden_veil_description">Cài đặt thử nghiệm để cải thiện hiệu suất và khả năng. Những cài đặt này có thể gây ra màn hình đen hoặc các vấn đề khác trong trò chơi.</string>
|
<string name="eden_veil_description">Cài đặt thử nghiệm để cải thiện hiệu suất và khả năng. Những cài đặt này có thể gây ra màn hình đen hoặc các vấn đề khác trong trò chơi.</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU扩展</string>
|
<string name="veil_extensions">GPU扩展</string>
|
||||||
<string name="veil_renderer">渲染器</string>
|
<string name="veil_renderer">渲染器</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Vulkan中的一种自动资源管理方法,确保在不再需要时正确释放资源,但可能导致捆绑游戏崩溃。</string>
|
||||||
<string name="veil_misc">CPU和内存</string>
|
<string name="veil_misc">CPU和内存</string>
|
||||||
<string name="eden_veil">伊甸之幕</string>
|
<string name="eden_veil">伊甸之幕</string>
|
||||||
<string name="eden_veil_description">实验性设置以提高性能和能力。这些设置可能会导致黑屏或其他游戏问题。</string>
|
<string name="eden_veil_description">实验性设置以提高性能和能力。这些设置可能会导致黑屏或其他游戏问题。</string>
|
||||||
|
|
|
@ -65,6 +65,8 @@
|
||||||
<!-- Eden\'s Veil -->
|
<!-- Eden\'s Veil -->
|
||||||
<string name="veil_extensions">GPU擴充功能</string>
|
<string name="veil_extensions">GPU擴充功能</string>
|
||||||
<string name="veil_renderer">渲染器</string>
|
<string name="veil_renderer">渲染器</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">Vulkan中的一種自動資源管理方法,確保在不再需要時正確釋放資源,但可能導致捆綁遊戲崩潰。</string>
|
||||||
<string name="veil_misc">CPU與記憶體</string>
|
<string name="veil_misc">CPU與記憶體</string>
|
||||||
<string name="eden_veil">伊甸之幕</string>
|
<string name="eden_veil">伊甸之幕</string>
|
||||||
<string name="eden_veil_description">實驗性設定以提高效能和能力。這些設定可能會導致黑屏或其他遊戲問題。</string>
|
<string name="eden_veil_description">實驗性設定以提高效能和能力。這些設定可能會導致黑屏或其他遊戲問題。</string>
|
||||||
|
|
|
@ -180,7 +180,6 @@
|
||||||
<item>@string/resolution_half</item>
|
<item>@string/resolution_half</item>
|
||||||
<item>@string/resolution_three_quarter</item>
|
<item>@string/resolution_three_quarter</item>
|
||||||
<item>@string/resolution_one</item>
|
<item>@string/resolution_one</item>
|
||||||
<item>@string/resolution_five_quarter</item>
|
|
||||||
<item>@string/resolution_three_half</item>
|
<item>@string/resolution_three_half</item>
|
||||||
<item>@string/resolution_two</item>
|
<item>@string/resolution_two</item>
|
||||||
<item>@string/resolution_three</item>
|
<item>@string/resolution_three</item>
|
||||||
|
@ -203,7 +202,6 @@
|
||||||
<item>5</item>
|
<item>5</item>
|
||||||
<item>6</item>
|
<item>6</item>
|
||||||
<item>7</item>
|
<item>7</item>
|
||||||
<item>8</item>
|
|
||||||
</integer-array>
|
</integer-array>
|
||||||
|
|
||||||
<integer-array name="rendererVSyncValues">
|
<integer-array name="rendererVSyncValues">
|
||||||
|
@ -254,15 +252,9 @@
|
||||||
<item>@string/scaling_filter_bilinear</item>
|
<item>@string/scaling_filter_bilinear</item>
|
||||||
<item>@string/scaling_filter_bicubic</item>
|
<item>@string/scaling_filter_bicubic</item>
|
||||||
<item>@string/scaling_filter_gaussian</item>
|
<item>@string/scaling_filter_gaussian</item>
|
||||||
<item>@string/scaling_filter_lanczos</item>
|
|
||||||
<item>@string/scaling_filter_scale_force</item>
|
<item>@string/scaling_filter_scale_force</item>
|
||||||
<item>@string/scaling_filter_fsr</item>
|
<item>@string/scaling_filter_fsr</item>
|
||||||
<item>@string/scaling_filter_area</item>
|
<item>@string/scaling_filter_area</item>
|
||||||
<item>@string/scaling_filter_mmpx</item>
|
|
||||||
<item>@string/scaling_filter_zero_tangent</item>
|
|
||||||
<item>@string/scaling_filter_bspline</item>
|
|
||||||
<item>@string/scaling_filter_mitchell</item>
|
|
||||||
<item>@string/scaling_filter_spline1</item>
|
|
||||||
</string-array>
|
</string-array>
|
||||||
|
|
||||||
<integer-array name="rendererScalingFilterValues">
|
<integer-array name="rendererScalingFilterValues">
|
||||||
|
@ -273,12 +265,6 @@
|
||||||
<item>4</item>
|
<item>4</item>
|
||||||
<item>5</item>
|
<item>5</item>
|
||||||
<item>6</item>
|
<item>6</item>
|
||||||
<item>7</item>
|
|
||||||
<item>8</item>
|
|
||||||
<item>9</item>
|
|
||||||
<item>10</item>
|
|
||||||
<item>11</item>
|
|
||||||
<item>12</item>
|
|
||||||
</integer-array>
|
</integer-array>
|
||||||
|
|
||||||
<string-array name="rendererAntiAliasingNames">
|
<string-array name="rendererAntiAliasingNames">
|
||||||
|
|
|
@ -12,24 +12,6 @@
|
||||||
<string name="app_notification_channel_id" translatable="false">Eden</string>
|
<string name="app_notification_channel_id" translatable="false">Eden</string>
|
||||||
<string name="app_notification_channel_description">Eden Switch emulator notifications</string>
|
<string name="app_notification_channel_description">Eden Switch emulator notifications</string>
|
||||||
<string name="app_notification_running">Eden is Running</string>
|
<string name="app_notification_running">Eden is Running</string>
|
||||||
<string name="seconds">Seconds</string>
|
|
||||||
|
|
||||||
<!-- Spinbox strings -->
|
|
||||||
<string name="increment">Increment</string>
|
|
||||||
<string name="decrement">Decrement</string>
|
|
||||||
<string name="value">Value</string>
|
|
||||||
<string name="value_too_low">Value must be at least %1$d</string>
|
|
||||||
<string name="value_too_high">Value must be at most %1$d</string>
|
|
||||||
<string name="invalid_value">Invalid value</string>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Input Overlay -->
|
|
||||||
<string name="overlay_auto_hide">Overlay Auto Hide</string>
|
|
||||||
<string name="overlay_auto_hide_description">Automatically hide the touch controls overlay after the specified time of inactivity.</string>
|
|
||||||
<string name="enable_input_overlay_auto_hide">Enable Overlay Auto Hide</string>
|
|
||||||
|
|
||||||
<string name="input_overlay_options">Input Overlay</string>
|
|
||||||
<string name="input_overlay_options_description">Configure on-screen controls</string>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Stats Overlay settings -->
|
<!-- Stats Overlay settings -->
|
||||||
|
@ -109,6 +91,8 @@
|
||||||
<string name="sample_shading_fraction_description">The intensity of the sample shading pass. Higher values improve quality more but also reduce performance to a greater extent.</string>
|
<string name="sample_shading_fraction_description">The intensity of the sample shading pass. Higher values improve quality more but also reduce performance to a greater extent.</string>
|
||||||
|
|
||||||
<string name="veil_renderer">Renderer</string>
|
<string name="veil_renderer">Renderer</string>
|
||||||
|
<string name="enable_raii">RAII</string>
|
||||||
|
<string name="enable_raii_description">A method of automatic resource management in Vulkan that ensures proper release of resources when they are no longer needed, but may cause crashes in bundled games.</string>
|
||||||
<string name="frame_interpolation">Enhanced Frame Pacing</string>
|
<string name="frame_interpolation">Enhanced Frame Pacing</string>
|
||||||
<string name="frame_interpolation_description">Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay.</string>
|
<string name="frame_interpolation_description">Ensures smooth and consistent frame delivery by synchronizing the timing between frames, reducing stuttering and uneven animation. Ideal for games that experience frame timing instability or micro-stutters during gameplay.</string>
|
||||||
<string name="renderer_early_release_fences">Release Fences Early</string>
|
<string name="renderer_early_release_fences">Release Fences Early</string>
|
||||||
|
@ -871,7 +855,6 @@
|
||||||
<string name="touchscreen">Touchscreen</string>
|
<string name="touchscreen">Touchscreen</string>
|
||||||
<string name="lock_drawer">Lock drawer</string>
|
<string name="lock_drawer">Lock drawer</string>
|
||||||
<string name="unlock_drawer">Unlock drawer</string>
|
<string name="unlock_drawer">Unlock drawer</string>
|
||||||
<string name="reset">Reset</string>
|
|
||||||
|
|
||||||
<string name="load_settings">Loading settings…</string>
|
<string name="load_settings">Loading settings…</string>
|
||||||
|
|
||||||
|
@ -882,12 +865,12 @@
|
||||||
<string name="abort_button">Abort</string>
|
<string name="abort_button">Abort</string>
|
||||||
<string name="continue_button">Continue</string>
|
<string name="continue_button">Continue</string>
|
||||||
<string name="system_archive_not_found">System Archive Not Found</string>
|
<string name="system_archive_not_found">System Archive Not Found</string>
|
||||||
<string name="system_archive_not_found_message">%s is missing. Please dump your system archives.\nContinuing emulation may result in crashes.</string>
|
<string name="system_archive_not_found_message">%s is missing. Please dump your system archives.\nContinuing emulation may result in crashes and bugs.</string>
|
||||||
<string name="system_archive_general">A system archive</string>
|
<string name="system_archive_general">A system archive</string>
|
||||||
<string name="save_load_error">Save/Load Error</string>
|
<string name="save_load_error">Save/Load Error</string>
|
||||||
<string name="fatal_error">Fatal Error</string>
|
<string name="fatal_error">Fatal Error</string>
|
||||||
<string name="fatal_error_message">A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes.</string>
|
<string name="fatal_error_message">A fatal error occurred. Check the log for details.\nContinuing emulation may result in crashes and bugs.</string>
|
||||||
<string name="performance_warning">Turning off this setting will significantly degrade performance. It"s recommended that you leave this setting enabled.</string>
|
<string name="performance_warning">Turning off this setting will significantly reduce emulation performance! For the best experience, it is recommended that you leave this setting enabled.</string>
|
||||||
<string name="device_memory_inadequate">Device RAM: %1$s\nRecommended: %2$s</string>
|
<string name="device_memory_inadequate">Device RAM: %1$s\nRecommended: %2$s</string>
|
||||||
<string name="memory_formatted">%1$s %2$s</string>
|
<string name="memory_formatted">%1$s %2$s</string>
|
||||||
<string name="no_game_present">No bootable game present!</string>
|
<string name="no_game_present">No bootable game present!</string>
|
||||||
|
@ -958,12 +941,12 @@
|
||||||
<!-- Renderer Accuracy -->
|
<!-- Renderer Accuracy -->
|
||||||
<string name="renderer_accuracy_normal">Normal</string>
|
<string name="renderer_accuracy_normal">Normal</string>
|
||||||
<string name="renderer_accuracy_high">High</string>
|
<string name="renderer_accuracy_high">High</string>
|
||||||
<string name="renderer_accuracy_extreme">Extreme</string>
|
<string name="renderer_accuracy_extreme">Extreme (Slow)</string>
|
||||||
|
|
||||||
<!-- DMA Accuracy -->
|
<!-- DMA Accuracy -->
|
||||||
<string name="dma_accuracy_default">Default</string>
|
<string name="dma_accuracy_default">Default</string>
|
||||||
<string name="dma_accuracy_unsafe">Unsafe</string>
|
<string name="dma_accuracy_unsafe">Unsafe (fast)</string>
|
||||||
<string name="dma_accuracy_safe">Safe</string>
|
<string name="dma_accuracy_safe">Safe (stable)</string>
|
||||||
|
|
||||||
<!-- ASTC Decoding Method -->
|
<!-- ASTC Decoding Method -->
|
||||||
<string name="accelerate_astc">ASTC Decoding Method</string>
|
<string name="accelerate_astc">ASTC Decoding Method</string>
|
||||||
|
@ -994,7 +977,6 @@
|
||||||
<string name="resolution_half">0.5X (360p/540p)</string>
|
<string name="resolution_half">0.5X (360p/540p)</string>
|
||||||
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
|
<string name="resolution_three_quarter">0.75X (540p/810p)</string>
|
||||||
<string name="resolution_one">1X (720p/1080p)</string>
|
<string name="resolution_one">1X (720p/1080p)</string>
|
||||||
<string name="resolution_five_quarter">1.25X (900p/1350p)</string>
|
|
||||||
<string name="resolution_three_half">1.5X (1080p/1620p)</string>
|
<string name="resolution_three_half">1.5X (1080p/1620p)</string>
|
||||||
<string name="resolution_two">2X (1440p/2160p) (Slow)</string>
|
<string name="resolution_two">2X (1440p/2160p) (Slow)</string>
|
||||||
<string name="resolution_three">3X (2160p/3240p) (Slow)</string>
|
<string name="resolution_three">3X (2160p/3240p) (Slow)</string>
|
||||||
|
@ -1010,16 +992,10 @@
|
||||||
<string name="scaling_filter_nearest_neighbor">Nearest Neighbor</string>
|
<string name="scaling_filter_nearest_neighbor">Nearest Neighbor</string>
|
||||||
<string name="scaling_filter_bilinear">Bilinear</string>
|
<string name="scaling_filter_bilinear">Bilinear</string>
|
||||||
<string name="scaling_filter_bicubic">Bicubic</string>
|
<string name="scaling_filter_bicubic">Bicubic</string>
|
||||||
<string name="scaling_filter_spline1">Spline-1</string>
|
|
||||||
<string name="scaling_filter_gaussian">Gaussian</string>
|
<string name="scaling_filter_gaussian">Gaussian</string>
|
||||||
<string name="scaling_filter_lanczos">Lanczos</string>
|
|
||||||
<string name="scaling_filter_scale_force">ScaleForce</string>
|
<string name="scaling_filter_scale_force">ScaleForce</string>
|
||||||
<string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
|
<string name="scaling_filter_fsr">AMD FidelityFX™ Super Resolution</string>
|
||||||
<string name="scaling_filter_area">Area</string>
|
<string name="scaling_filter_area">Area</string>
|
||||||
<string name="scaling_filter_zero_tangent">Zero-Tangent</string>
|
|
||||||
<string name="scaling_filter_bspline">B-Spline</string>
|
|
||||||
<string name="scaling_filter_mitchell">Mitchell</string>
|
|
||||||
<string name="scaling_filter_mmpx">MMPX</string>
|
|
||||||
|
|
||||||
<!-- Anti-Aliasing -->
|
<!-- Anti-Aliasing -->
|
||||||
<string name="anti_aliasing_none">None</string>
|
<string name="anti_aliasing_none">None</string>
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
|
|
@ -191,6 +191,8 @@ static void InitializeReverbEffect(const ReverbInfo::ParameterVersion2& params,
|
||||||
const auto center_delay_time{(5 * delay).to_uint_floor()};
|
const auto center_delay_time{(5 * delay).to_uint_floor()};
|
||||||
state.center_delay_line.Initialize(center_delay_time, 1.0f);
|
state.center_delay_line.Initialize(center_delay_time, 1.0f);
|
||||||
|
|
||||||
|
UpdateReverbEffectParameter(params, state);
|
||||||
|
|
||||||
for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) {
|
for (u32 i = 0; i < ReverbInfo::MaxDelayLines; i++) {
|
||||||
std::ranges::fill(state.fdn_delay_lines[i].buffer, 0);
|
std::ranges::fill(state.fdn_delay_lines[i].buffer, 0);
|
||||||
std::ranges::fill(state.decay_delay_lines[i].buffer, 0);
|
std::ranges::fill(state.decay_delay_lines[i].buffer, 0);
|
||||||
|
|
|
@ -293,7 +293,8 @@ void SinkStream::WaitFreeSpace(std::stop_token stop_token) {
|
||||||
release_cv.wait_for(lk, std::chrono::milliseconds(5),
|
release_cv.wait_for(lk, std::chrono::milliseconds(5),
|
||||||
[this]() { return paused || queued_buffers < max_queue_size; });
|
[this]() { return paused || queued_buffers < max_queue_size; });
|
||||||
if (queued_buffers > max_queue_size + 3) {
|
if (queued_buffers > max_queue_size + 3) {
|
||||||
release_cv.wait(lk, stop_token, [this] { return paused || queued_buffers < max_queue_size; });
|
Common::CondvarWait(release_cv, lk, stop_token,
|
||||||
|
[this] { return paused || queued_buffers < max_queue_size; });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
#include <jni.h>
|
#include <jni.h>
|
||||||
|
@ -46,7 +49,6 @@ static jclass s_overlay_control_data_class;
|
||||||
static jmethodID s_overlay_control_data_constructor;
|
static jmethodID s_overlay_control_data_constructor;
|
||||||
static jfieldID s_overlay_control_data_id_field;
|
static jfieldID s_overlay_control_data_id_field;
|
||||||
static jfieldID s_overlay_control_data_enabled_field;
|
static jfieldID s_overlay_control_data_enabled_field;
|
||||||
static jfieldID s_overlay_control_data_individual_scale_field;
|
|
||||||
static jfieldID s_overlay_control_data_landscape_position_field;
|
static jfieldID s_overlay_control_data_landscape_position_field;
|
||||||
static jfieldID s_overlay_control_data_portrait_position_field;
|
static jfieldID s_overlay_control_data_portrait_position_field;
|
||||||
static jfieldID s_overlay_control_data_foldable_position_field;
|
static jfieldID s_overlay_control_data_foldable_position_field;
|
||||||
|
@ -242,10 +244,6 @@ namespace Common::Android {
|
||||||
return s_overlay_control_data_enabled_field;
|
return s_overlay_control_data_enabled_field;
|
||||||
}
|
}
|
||||||
|
|
||||||
jfieldID GetOverlayControlDataIndividualScaleField() {
|
|
||||||
return s_overlay_control_data_individual_scale_field;
|
|
||||||
}
|
|
||||||
|
|
||||||
jfieldID GetOverlayControlDataLandscapePositionField() {
|
jfieldID GetOverlayControlDataLandscapePositionField() {
|
||||||
return s_overlay_control_data_landscape_position_field;
|
return s_overlay_control_data_landscape_position_field;
|
||||||
}
|
}
|
||||||
|
@ -496,7 +494,7 @@ namespace Common::Android {
|
||||||
reinterpret_cast<jclass>(env->NewGlobalRef(overlay_control_data_class));
|
reinterpret_cast<jclass>(env->NewGlobalRef(overlay_control_data_class));
|
||||||
s_overlay_control_data_constructor =
|
s_overlay_control_data_constructor =
|
||||||
env->GetMethodID(overlay_control_data_class, "<init>",
|
env->GetMethodID(overlay_control_data_class, "<init>",
|
||||||
"(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;F)V");
|
"(Ljava/lang/String;ZLkotlin/Pair;Lkotlin/Pair;Lkotlin/Pair;)V");
|
||||||
s_overlay_control_data_id_field =
|
s_overlay_control_data_id_field =
|
||||||
env->GetFieldID(overlay_control_data_class, "id", "Ljava/lang/String;");
|
env->GetFieldID(overlay_control_data_class, "id", "Ljava/lang/String;");
|
||||||
s_overlay_control_data_enabled_field =
|
s_overlay_control_data_enabled_field =
|
||||||
|
@ -507,8 +505,6 @@ namespace Common::Android {
|
||||||
env->GetFieldID(overlay_control_data_class, "portraitPosition", "Lkotlin/Pair;");
|
env->GetFieldID(overlay_control_data_class, "portraitPosition", "Lkotlin/Pair;");
|
||||||
s_overlay_control_data_foldable_position_field =
|
s_overlay_control_data_foldable_position_field =
|
||||||
env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;");
|
env->GetFieldID(overlay_control_data_class, "foldablePosition", "Lkotlin/Pair;");
|
||||||
s_overlay_control_data_individual_scale_field =
|
|
||||||
env->GetFieldID(overlay_control_data_class, "individualScale", "F");
|
|
||||||
env->DeleteLocalRef(overlay_control_data_class);
|
env->DeleteLocalRef(overlay_control_data_class);
|
||||||
|
|
||||||
const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch");
|
const jclass patch_class = env->FindClass("org/yuzu/yuzu_emu/model/Patch");
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
|
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
@ -64,7 +67,6 @@ jclass GetOverlayControlDataClass();
|
||||||
jmethodID GetOverlayControlDataConstructor();
|
jmethodID GetOverlayControlDataConstructor();
|
||||||
jfieldID GetOverlayControlDataIdField();
|
jfieldID GetOverlayControlDataIdField();
|
||||||
jfieldID GetOverlayControlDataEnabledField();
|
jfieldID GetOverlayControlDataEnabledField();
|
||||||
jfieldID GetOverlayControlDataIndividualScaleField();
|
|
||||||
jfieldID GetOverlayControlDataLandscapePositionField();
|
jfieldID GetOverlayControlDataLandscapePositionField();
|
||||||
jfieldID GetOverlayControlDataPortraitPositionField();
|
jfieldID GetOverlayControlDataPortraitPositionField();
|
||||||
jfieldID GetOverlayControlDataFoldablePositionField();
|
jfieldID GetOverlayControlDataFoldablePositionField();
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -126,7 +123,7 @@ private:
|
||||||
} else if constexpr (Mode == PopMode::WaitWithStopToken) {
|
} else if constexpr (Mode == PopMode::WaitWithStopToken) {
|
||||||
// Wait until the queue is not empty.
|
// Wait until the queue is not empty.
|
||||||
std::unique_lock lock{consumer_cv_mutex};
|
std::unique_lock lock{consumer_cv_mutex};
|
||||||
consumer_cv.wait(lock, stop_token, [this, read_index] {
|
Common::CondvarWait(consumer_cv, lock, stop_token, [this, read_index] {
|
||||||
return read_index != m_write_index.load(std::memory_order::acquire);
|
return read_index != m_write_index.load(std::memory_order::acquire);
|
||||||
});
|
});
|
||||||
if (stop_token.stop_requested()) {
|
if (stop_token.stop_requested()) {
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2012 Gekko Emulator
|
// SPDX-FileCopyrightText: 2012 Gekko Emulator
|
||||||
// SPDX-FileContributor: ShizZy <shizzy247@gmail.com>
|
// SPDX-FileContributor: ShizZy <shizzy247@gmail.com>
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
@ -33,6 +30,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
using u8 = std::uint8_t; ///< 8-bit unsigned byte
|
using u8 = std::uint8_t; ///< 8-bit unsigned byte
|
||||||
using u16 = std::uint16_t; ///< 16-bit unsigned short
|
using u16 = std::uint16_t; ///< 16-bit unsigned short
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "common/assert.h"
|
|
||||||
#include "common/fs/file.h"
|
#include "common/fs/file.h"
|
||||||
#include "common/fs/fs.h"
|
#include "common/fs/fs.h"
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
|
|
|
@ -1,12 +1,8 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <filesystem>
|
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "common/assert.h"
|
|
||||||
#include "common/fs/fs.h"
|
#include "common/fs/fs.h"
|
||||||
#ifdef ANDROID
|
#ifdef ANDROID
|
||||||
#include "common/fs/fs_android.h"
|
#include "common/fs/fs_android.h"
|
||||||
|
|
|
@ -56,16 +56,6 @@
|
||||||
#include "common/host_memory.h"
|
#include "common/host_memory.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
|
||||||
#if defined(__ANDROID__) && __ANDROID_API__ < 30
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
#ifndef MFD_CLOEXEC
|
|
||||||
#define MFD_CLOEXEC 0x0001U
|
|
||||||
#endif
|
|
||||||
static int memfd_create(const char* name, unsigned int flags) {
|
|
||||||
return syscall(__NR_memfd_create, name, flags);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
constexpr size_t PageAlignment = 0x1000;
|
constexpr size_t PageAlignment = 0x1000;
|
||||||
|
|
|
@ -39,17 +39,9 @@ namespace Common::Log {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
/// @brief Trims up to and including the last of ../, ..\, src/, src\ in a string
|
/**
|
||||||
/// do not be fooled this isn't generating new strings on .rodata :)
|
* Interface for logging backends.
|
||||||
constexpr const char* TrimSourcePath(std::string_view source) {
|
*/
|
||||||
const auto rfind = [source](const std::string_view match) {
|
|
||||||
return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size());
|
|
||||||
};
|
|
||||||
auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")});
|
|
||||||
return source.data() + idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @brief Interface for logging backends.
|
|
||||||
class Backend {
|
class Backend {
|
||||||
public:
|
public:
|
||||||
virtual ~Backend() = default;
|
virtual ~Backend() = default;
|
||||||
|
@ -61,7 +53,9 @@ public:
|
||||||
virtual void Flush() = 0;
|
virtual void Flush() = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @brief Backend that writes to stderr and with color
|
/**
|
||||||
|
* Backend that writes to stderr and with color
|
||||||
|
*/
|
||||||
class ColorConsoleBackend final : public Backend {
|
class ColorConsoleBackend final : public Backend {
|
||||||
public:
|
public:
|
||||||
explicit ColorConsoleBackend() = default;
|
explicit ColorConsoleBackend() = default;
|
||||||
|
@ -90,7 +84,9 @@ private:
|
||||||
std::atomic_bool enabled{false};
|
std::atomic_bool enabled{false};
|
||||||
};
|
};
|
||||||
|
|
||||||
/// @brief Backend that writes to a file passed into the constructor
|
/**
|
||||||
|
* Backend that writes to a file passed into the constructor
|
||||||
|
*/
|
||||||
class FileBackend final : public Backend {
|
class FileBackend final : public Backend {
|
||||||
public:
|
public:
|
||||||
explicit FileBackend(const std::filesystem::path& filename) {
|
explicit FileBackend(const std::filesystem::path& filename) {
|
||||||
|
@ -252,14 +248,13 @@ public:
|
||||||
color_console_backend.SetEnabled(enabled);
|
color_console_backend.SetEnabled(enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CanPushEntry(Class log_class, Level log_level) const noexcept {
|
|
||||||
return filter.CheckMessage(log_class, log_level);
|
|
||||||
}
|
|
||||||
|
|
||||||
void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num,
|
void PushEntry(Class log_class, Level log_level, const char* filename, unsigned int line_num,
|
||||||
const char* function, std::string&& message) noexcept {
|
const char* function, std::string&& message) {
|
||||||
|
if (!filter.CheckMessage(log_class, log_level)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
message_queue.EmplaceWait(
|
message_queue.EmplaceWait(
|
||||||
CreateEntry(log_class, log_level, TrimSourcePath(filename), line_num, function, std::move(message)));
|
CreateEntry(log_class, log_level, filename, line_num, function, std::move(message)));
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -373,9 +368,8 @@ void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
|
||||||
unsigned int line_num, const char* function, fmt::string_view format,
|
unsigned int line_num, const char* function, fmt::string_view format,
|
||||||
const fmt::format_args& args) {
|
const fmt::format_args& args) {
|
||||||
if (!initialization_in_progress_suppress_logging) {
|
if (!initialization_in_progress_suppress_logging) {
|
||||||
auto& instance = Impl::Instance();
|
Impl::Instance().PushEntry(log_class, log_level, filename, line_num, function,
|
||||||
if (instance.CanPushEntry(log_class, log_level))
|
fmt::vformat(format, args));
|
||||||
instance.PushEntry(log_class, log_level, filename, line_num, function, fmt::vformat(format, args));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} // namespace Common::Log
|
} // namespace Common::Log
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
// SPDX-FileCopyrightText: 2014 Citra Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -12,20 +9,22 @@ namespace Common::Log {
|
||||||
namespace {
|
namespace {
|
||||||
template <typename It>
|
template <typename It>
|
||||||
Level GetLevelByName(const It begin, const It end) {
|
Level GetLevelByName(const It begin, const It end) {
|
||||||
for (u32 i = 0; i < u32(Level::Count); ++i) {
|
for (u8 i = 0; i < static_cast<u8>(Level::Count); ++i) {
|
||||||
const char* level_name = GetLevelName(Level(i));
|
const char* level_name = GetLevelName(static_cast<Level>(i));
|
||||||
if (Common::ComparePartialString(begin, end, level_name))
|
if (Common::ComparePartialString(begin, end, level_name)) {
|
||||||
return Level(i);
|
return static_cast<Level>(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Level::Count;
|
return Level::Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename It>
|
template <typename It>
|
||||||
Class GetClassByName(const It begin, const It end) {
|
Class GetClassByName(const It begin, const It end) {
|
||||||
for (u32 i = 0; i < u32(Class::Count); ++i) {
|
for (u8 i = 0; i < static_cast<u8>(Class::Count); ++i) {
|
||||||
const char* level_name = GetLogClassName(Class(i));
|
const char* level_name = GetLogClassName(static_cast<Class>(i));
|
||||||
if (Common::ComparePartialString(begin, end, level_name))
|
if (Common::ComparePartialString(begin, end, level_name)) {
|
||||||
return Class(i);
|
return static_cast<Class>(i);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return Class::Count;
|
return Class::Count;
|
||||||
}
|
}
|
||||||
|
@ -230,12 +229,13 @@ void Filter::ParseFilterString(std::string_view filter_view) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Filter::CheckMessage(Class log_class, Level level) const {
|
bool Filter::CheckMessage(Class log_class, Level level) const {
|
||||||
return u8(level) >= u8(class_levels[std::size_t(log_class)]);
|
return static_cast<u8>(level) >=
|
||||||
|
static_cast<u8>(class_levels[static_cast<std::size_t>(log_class)]);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Filter::IsDebug() const {
|
bool Filter::IsDebug() const {
|
||||||
return std::any_of(class_levels.begin(), class_levels.end(), [](const Level& l) {
|
return std::any_of(class_levels.begin(), class_levels.end(), [](const Level& l) {
|
||||||
return u8(l) <= u8(Level::Debug);
|
return static_cast<u8>(l) <= static_cast<u8>(Level::Debug);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,15 @@
|
||||||
|
|
||||||
namespace Common::Log {
|
namespace Common::Log {
|
||||||
|
|
||||||
|
// trims up to and including the last of ../, ..\, src/, src\ in a string
|
||||||
|
constexpr const char* TrimSourcePath(std::string_view source) {
|
||||||
|
const auto rfind = [source](const std::string_view match) {
|
||||||
|
return source.rfind(match) == source.npos ? 0 : (source.rfind(match) + match.size());
|
||||||
|
};
|
||||||
|
auto idx = (std::max)({rfind("src/"), rfind("src\\"), rfind("../"), rfind("..\\")});
|
||||||
|
return source.data() + idx;
|
||||||
|
}
|
||||||
|
|
||||||
/// Logs a message to the global logger, using fmt
|
/// Logs a message to the global logger, using fmt
|
||||||
void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
|
void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
|
||||||
unsigned int line_num, const char* function, fmt::string_view format,
|
unsigned int line_num, const char* function, fmt::string_view format,
|
||||||
|
@ -33,7 +42,7 @@ void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsig
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
#define LOG_TRACE(log_class, ...) \
|
#define LOG_TRACE(log_class, ...) \
|
||||||
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Trace, \
|
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Trace, \
|
||||||
__FILE__, __LINE__, __func__, \
|
Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define LOG_TRACE(log_class, fmt, ...) (void(0))
|
#define LOG_TRACE(log_class, fmt, ...) (void(0))
|
||||||
|
@ -41,21 +50,21 @@ void FmtLogMessage(Class log_class, Level log_level, const char* filename, unsig
|
||||||
|
|
||||||
#define LOG_DEBUG(log_class, ...) \
|
#define LOG_DEBUG(log_class, ...) \
|
||||||
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Debug, \
|
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Debug, \
|
||||||
__FILE__, __LINE__, __func__, \
|
Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
#define LOG_INFO(log_class, ...) \
|
#define LOG_INFO(log_class, ...) \
|
||||||
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Info, \
|
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Info, \
|
||||||
__FILE__, __LINE__, __func__, \
|
Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
#define LOG_WARNING(log_class, ...) \
|
#define LOG_WARNING(log_class, ...) \
|
||||||
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Warning, \
|
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Warning, \
|
||||||
__FILE__, __LINE__, __func__, \
|
Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
#define LOG_ERROR(log_class, ...) \
|
#define LOG_ERROR(log_class, ...) \
|
||||||
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Error, \
|
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Error, \
|
||||||
__FILE__, __LINE__, __func__, \
|
Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
#define LOG_CRITICAL(log_class, ...) \
|
#define LOG_CRITICAL(log_class, ...) \
|
||||||
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Critical, \
|
Common::Log::FmtLogMessage(Common::Log::Class::log_class, Common::Log::Level::Critical, \
|
||||||
__FILE__, __LINE__, __func__, \
|
Common::Log::TrimSourcePath(__FILE__), __LINE__, __func__, \
|
||||||
__VA_ARGS__)
|
__VA_ARGS__)
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2022 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
|
@ -10,13 +7,23 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <version>
|
||||||
|
|
||||||
|
#ifdef __cpp_lib_jthread
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
|
#include <stop_token>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
|
template <typename Condvar, typename Lock, typename Pred>
|
||||||
|
void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token, Pred&& pred) {
|
||||||
|
cv.wait(lk, token, std::forward<Pred>(pred));
|
||||||
|
}
|
||||||
|
|
||||||
template <typename Rep, typename Period>
|
template <typename Rep, typename Period>
|
||||||
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
||||||
std::condition_variable_any cv;
|
std::condition_variable_any cv;
|
||||||
|
@ -28,3 +35,341 @@ bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep,
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <chrono>
|
||||||
|
#include <condition_variable>
|
||||||
|
#include <functional>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <mutex>
|
||||||
|
#include <optional>
|
||||||
|
#include <thread>
|
||||||
|
#include <type_traits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
namespace std {
|
||||||
|
namespace polyfill {
|
||||||
|
|
||||||
|
using stop_state_callback = size_t;
|
||||||
|
|
||||||
|
class stop_state {
|
||||||
|
public:
|
||||||
|
stop_state() = default;
|
||||||
|
~stop_state() = default;
|
||||||
|
|
||||||
|
bool request_stop() {
|
||||||
|
unique_lock lk{m_lock};
|
||||||
|
|
||||||
|
if (m_stop_requested) {
|
||||||
|
// Already set, nothing to do.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mark stop requested.
|
||||||
|
m_stop_requested = true;
|
||||||
|
|
||||||
|
while (!m_callbacks.empty()) {
|
||||||
|
// Get an iterator to the first element.
|
||||||
|
const auto it = m_callbacks.begin();
|
||||||
|
|
||||||
|
// Move the callback function out of the map.
|
||||||
|
function<void()> f;
|
||||||
|
swap(it->second, f);
|
||||||
|
|
||||||
|
// Erase the now-empty map element.
|
||||||
|
m_callbacks.erase(it);
|
||||||
|
|
||||||
|
// Run the callback.
|
||||||
|
if (f) {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool stop_requested() const {
|
||||||
|
unique_lock lk{m_lock};
|
||||||
|
return m_stop_requested;
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_state_callback insert_callback(function<void()> f) {
|
||||||
|
unique_lock lk{m_lock};
|
||||||
|
|
||||||
|
if (m_stop_requested) {
|
||||||
|
// Stop already requested. Don't insert anything,
|
||||||
|
// just run the callback synchronously.
|
||||||
|
if (f) {
|
||||||
|
f();
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert the callback.
|
||||||
|
stop_state_callback ret = ++m_next_callback;
|
||||||
|
m_callbacks.emplace(ret, std::move(f));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
void remove_callback(stop_state_callback cb) {
|
||||||
|
unique_lock lk{m_lock};
|
||||||
|
m_callbacks.erase(cb);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mutable recursive_mutex m_lock;
|
||||||
|
map<stop_state_callback, function<void()>> m_callbacks;
|
||||||
|
stop_state_callback m_next_callback{0};
|
||||||
|
bool m_stop_requested{false};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace polyfill
|
||||||
|
|
||||||
|
class stop_token;
|
||||||
|
class stop_source;
|
||||||
|
struct nostopstate_t {
|
||||||
|
explicit nostopstate_t() = default;
|
||||||
|
};
|
||||||
|
inline constexpr nostopstate_t nostopstate{};
|
||||||
|
|
||||||
|
template <class Callback>
|
||||||
|
class stop_callback;
|
||||||
|
|
||||||
|
class stop_token {
|
||||||
|
public:
|
||||||
|
stop_token() noexcept = default;
|
||||||
|
|
||||||
|
stop_token(const stop_token&) noexcept = default;
|
||||||
|
stop_token(stop_token&&) noexcept = default;
|
||||||
|
stop_token& operator=(const stop_token&) noexcept = default;
|
||||||
|
stop_token& operator=(stop_token&&) noexcept = default;
|
||||||
|
~stop_token() = default;
|
||||||
|
|
||||||
|
void swap(stop_token& other) noexcept {
|
||||||
|
m_stop_state.swap(other.m_stop_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] bool stop_requested() const noexcept {
|
||||||
|
return m_stop_state && m_stop_state->stop_requested();
|
||||||
|
}
|
||||||
|
[[nodiscard]] bool stop_possible() const noexcept {
|
||||||
|
return m_stop_state != nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class stop_source;
|
||||||
|
template <typename Callback>
|
||||||
|
friend class stop_callback;
|
||||||
|
stop_token(shared_ptr<polyfill::stop_state> stop_state) : m_stop_state(std::move(stop_state)) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
shared_ptr<polyfill::stop_state> m_stop_state;
|
||||||
|
};
|
||||||
|
|
||||||
|
class stop_source {
|
||||||
|
public:
|
||||||
|
stop_source() : m_stop_state(make_shared<polyfill::stop_state>()) {}
|
||||||
|
explicit stop_source(nostopstate_t) noexcept {}
|
||||||
|
|
||||||
|
stop_source(const stop_source&) noexcept = default;
|
||||||
|
stop_source(stop_source&&) noexcept = default;
|
||||||
|
stop_source& operator=(const stop_source&) noexcept = default;
|
||||||
|
stop_source& operator=(stop_source&&) noexcept = default;
|
||||||
|
~stop_source() = default;
|
||||||
|
void swap(stop_source& other) noexcept {
|
||||||
|
m_stop_state.swap(other.m_stop_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] stop_token get_token() const noexcept {
|
||||||
|
return stop_token(m_stop_state);
|
||||||
|
}
|
||||||
|
[[nodiscard]] bool stop_possible() const noexcept {
|
||||||
|
return m_stop_state != nullptr;
|
||||||
|
}
|
||||||
|
[[nodiscard]] bool stop_requested() const noexcept {
|
||||||
|
return m_stop_state && m_stop_state->stop_requested();
|
||||||
|
}
|
||||||
|
bool request_stop() noexcept {
|
||||||
|
return m_stop_state && m_stop_state->request_stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
friend class jthread;
|
||||||
|
explicit stop_source(shared_ptr<polyfill::stop_state> stop_state)
|
||||||
|
: m_stop_state(std::move(stop_state)) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
shared_ptr<polyfill::stop_state> m_stop_state;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Callback>
|
||||||
|
class stop_callback {
|
||||||
|
static_assert(is_nothrow_destructible_v<Callback>);
|
||||||
|
static_assert(is_invocable_v<Callback>);
|
||||||
|
|
||||||
|
public:
|
||||||
|
using callback_type = Callback;
|
||||||
|
|
||||||
|
template <typename C>
|
||||||
|
requires constructible_from<Callback, C>
|
||||||
|
explicit stop_callback(const stop_token& st,
|
||||||
|
C&& cb) noexcept(is_nothrow_constructible_v<Callback, C>)
|
||||||
|
: m_stop_state(st.m_stop_state) {
|
||||||
|
if (m_stop_state) {
|
||||||
|
m_callback = m_stop_state->insert_callback(std::move(cb));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template <typename C>
|
||||||
|
requires constructible_from<Callback, C>
|
||||||
|
explicit stop_callback(stop_token&& st,
|
||||||
|
C&& cb) noexcept(is_nothrow_constructible_v<Callback, C>)
|
||||||
|
: m_stop_state(std::move(st.m_stop_state)) {
|
||||||
|
if (m_stop_state) {
|
||||||
|
m_callback = m_stop_state->insert_callback(std::move(cb));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~stop_callback() {
|
||||||
|
if (m_stop_state && m_callback) {
|
||||||
|
m_stop_state->remove_callback(m_callback);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stop_callback(const stop_callback&) = delete;
|
||||||
|
stop_callback(stop_callback&&) = delete;
|
||||||
|
stop_callback& operator=(const stop_callback&) = delete;
|
||||||
|
stop_callback& operator=(stop_callback&&) = delete;
|
||||||
|
|
||||||
|
private:
|
||||||
|
shared_ptr<polyfill::stop_state> m_stop_state;
|
||||||
|
polyfill::stop_state_callback m_callback;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Callback>
|
||||||
|
stop_callback(stop_token, Callback) -> stop_callback<Callback>;
|
||||||
|
|
||||||
|
class jthread {
|
||||||
|
public:
|
||||||
|
using id = thread::id;
|
||||||
|
using native_handle_type = thread::native_handle_type;
|
||||||
|
|
||||||
|
jthread() noexcept = default;
|
||||||
|
|
||||||
|
template <typename F, typename... Args,
|
||||||
|
typename = enable_if_t<!is_same_v<remove_cvref_t<F>, jthread>>>
|
||||||
|
explicit jthread(F&& f, Args&&... args)
|
||||||
|
: m_stop_state(make_shared<polyfill::stop_state>()),
|
||||||
|
m_thread(make_thread(std::forward<F>(f), std::forward<Args>(args)...)) {}
|
||||||
|
|
||||||
|
~jthread() {
|
||||||
|
if (joinable()) {
|
||||||
|
request_stop();
|
||||||
|
join();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
jthread(const jthread&) = delete;
|
||||||
|
jthread(jthread&&) noexcept = default;
|
||||||
|
jthread& operator=(const jthread&) = delete;
|
||||||
|
|
||||||
|
jthread& operator=(jthread&& other) noexcept {
|
||||||
|
m_thread.swap(other.m_thread);
|
||||||
|
m_stop_state.swap(other.m_stop_state);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void swap(jthread& other) noexcept {
|
||||||
|
m_thread.swap(other.m_thread);
|
||||||
|
m_stop_state.swap(other.m_stop_state);
|
||||||
|
}
|
||||||
|
[[nodiscard]] bool joinable() const noexcept {
|
||||||
|
return m_thread.joinable();
|
||||||
|
}
|
||||||
|
void join() {
|
||||||
|
m_thread.join();
|
||||||
|
}
|
||||||
|
void detach() {
|
||||||
|
m_thread.detach();
|
||||||
|
m_stop_state.reset();
|
||||||
|
}
|
||||||
|
|
||||||
|
[[nodiscard]] id get_id() const noexcept {
|
||||||
|
return m_thread.get_id();
|
||||||
|
}
|
||||||
|
[[nodiscard]] native_handle_type native_handle() {
|
||||||
|
return m_thread.native_handle();
|
||||||
|
}
|
||||||
|
[[nodiscard]] stop_source get_stop_source() noexcept {
|
||||||
|
return stop_source(m_stop_state);
|
||||||
|
}
|
||||||
|
[[nodiscard]] stop_token get_stop_token() const noexcept {
|
||||||
|
return stop_source(m_stop_state).get_token();
|
||||||
|
}
|
||||||
|
bool request_stop() noexcept {
|
||||||
|
return get_stop_source().request_stop();
|
||||||
|
}
|
||||||
|
[[nodiscard]] static unsigned int hardware_concurrency() noexcept {
|
||||||
|
return thread::hardware_concurrency();
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
template <typename F, typename... Args>
|
||||||
|
thread make_thread(F&& f, Args&&... args) {
|
||||||
|
if constexpr (is_invocable_v<decay_t<F>, stop_token, decay_t<Args>...>) {
|
||||||
|
return thread(std::forward<F>(f), get_stop_token(), std::forward<Args>(args)...);
|
||||||
|
} else {
|
||||||
|
return thread(std::forward<F>(f), std::forward<Args>(args)...);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
shared_ptr<polyfill::stop_state> m_stop_state;
|
||||||
|
thread m_thread;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace std
|
||||||
|
|
||||||
|
namespace Common {
|
||||||
|
|
||||||
|
template <typename Condvar, typename Lock, typename Pred>
|
||||||
|
void CondvarWait(Condvar& cv, std::unique_lock<Lock>& lk, std::stop_token token, Pred pred) {
|
||||||
|
if (token.stop_requested()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::stop_callback callback(token, [&] {
|
||||||
|
{ std::scoped_lock lk2{*lk.mutex()}; }
|
||||||
|
cv.notify_all();
|
||||||
|
});
|
||||||
|
|
||||||
|
cv.wait(lk, [&] { return pred() || token.stop_requested(); });
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Rep, typename Period>
|
||||||
|
bool StoppableTimedWait(std::stop_token token, const std::chrono::duration<Rep, Period>& rel_time) {
|
||||||
|
if (token.stop_requested()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool stop_requested = false;
|
||||||
|
std::condition_variable cv;
|
||||||
|
std::mutex m;
|
||||||
|
|
||||||
|
std::stop_callback cb(token, [&] {
|
||||||
|
// Wake up the waiting thread.
|
||||||
|
{
|
||||||
|
std::scoped_lock lk{m};
|
||||||
|
stop_requested = true;
|
||||||
|
}
|
||||||
|
cv.notify_one();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Perform the timed wait.
|
||||||
|
std::unique_lock lk{m};
|
||||||
|
return !cv.wait_for(lk, rel_time, [&] { return stop_requested; });
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Common
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -18,9 +18,6 @@
|
||||||
#define TITLE_BAR_FORMAT_RUNNING "@TITLE_BAR_FORMAT_RUNNING@"
|
#define TITLE_BAR_FORMAT_RUNNING "@TITLE_BAR_FORMAT_RUNNING@"
|
||||||
#define IS_DEV_BUILD @IS_DEV_BUILD@
|
#define IS_DEV_BUILD @IS_DEV_BUILD@
|
||||||
#define COMPILER_ID "@CXX_COMPILER@"
|
#define COMPILER_ID "@CXX_COMPILER@"
|
||||||
#define BUILD_AUTO_UPDATE_WEBSITE "@BUILD_AUTO_UPDATE_WEBSITE@"
|
|
||||||
#define BUILD_AUTO_UPDATE_API "@BUILD_AUTO_UPDATE_API@"
|
|
||||||
#define BUILD_AUTO_UPDATE_REPO "@BUILD_AUTO_UPDATE_REPO@"
|
|
||||||
|
|
||||||
namespace Common {
|
namespace Common {
|
||||||
|
|
||||||
|
@ -37,8 +34,4 @@ constexpr const char g_title_bar_format_running[] = TITLE_BAR_FORMAT_RUNNING;
|
||||||
constexpr const char g_compiler_id[] = COMPILER_ID;
|
constexpr const char g_compiler_id[] = COMPILER_ID;
|
||||||
constexpr const bool g_is_dev_build = IS_DEV_BUILD;
|
constexpr const bool g_is_dev_build = IS_DEV_BUILD;
|
||||||
|
|
||||||
constexpr const char g_build_auto_update_website[] = BUILD_AUTO_UPDATE_WEBSITE;
|
|
||||||
constexpr const char g_build_auto_update_api[] = BUILD_AUTO_UPDATE_API;
|
|
||||||
constexpr const char g_build_auto_update_repo[] = BUILD_AUTO_UPDATE_REPO;
|
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
|
@ -21,8 +21,5 @@ extern const char g_title_bar_format_running[];
|
||||||
extern const char g_shader_cache_version[];
|
extern const char g_shader_cache_version[];
|
||||||
extern const char g_compiler_id[];
|
extern const char g_compiler_id[];
|
||||||
extern const bool g_is_dev_build;
|
extern const bool g_is_dev_build;
|
||||||
extern const char g_build_auto_update_website[];
|
|
||||||
extern const char g_build_auto_update_api[];
|
|
||||||
extern const char g_build_auto_update_repo[];
|
|
||||||
|
|
||||||
} // namespace Common
|
} // namespace Common
|
||||||
|
|
|
@ -301,10 +301,6 @@ void TranslateResolutionInfo(ResolutionSetup setup, ResolutionScalingInfo& info)
|
||||||
info.up_scale = 3;
|
info.up_scale = 3;
|
||||||
info.down_shift = 1;
|
info.down_shift = 1;
|
||||||
break;
|
break;
|
||||||
case ResolutionSetup::Res5_4X:
|
|
||||||
info.up_scale = 5;
|
|
||||||
info.down_shift = 2;
|
|
||||||
break;
|
|
||||||
case ResolutionSetup::Res2X:
|
case ResolutionSetup::Res2X:
|
||||||
info.up_scale = 2;
|
info.up_scale = 2;
|
||||||
info.down_shift = 0;
|
info.down_shift = 0;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue