Compare commits
30 Commits
sjkdbsdfjk
...
dmnt2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
397a1f4022 | ||
|
|
2685e8f877 | ||
|
|
a87b437320 | ||
|
|
0d1bfc6a93 | ||
|
|
959f72297d | ||
|
|
057d566ff4 | ||
|
|
be592f0ab3 | ||
|
|
bf68eede05 | ||
|
|
1eed7efd09 | ||
|
|
50f8d4130d | ||
|
|
e4dccd5a5c | ||
|
|
b9530ae80f | ||
|
|
5130185d12 | ||
|
|
db1dfc9755 | ||
|
|
d7de298948 | ||
|
|
363d861011 | ||
|
|
30d75d4e52 | ||
|
|
06b83a58a6 | ||
|
|
1e06c6f752 | ||
|
|
adc41bff70 | ||
|
|
4edb70c8f0 | ||
|
|
9da38715fe | ||
|
|
7157d5167e | ||
|
|
77d83b008a | ||
|
|
69a84ee0a6 | ||
|
|
5b019a81a7 | ||
|
|
83332316aa | ||
|
|
3141019fcd | ||
|
|
4cc9aa691d | ||
|
|
d96ab0df6a |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -37,6 +37,8 @@ CMakeLists.txt.user*
|
||||
# *nix related
|
||||
# Common convention for backup or temporary files
|
||||
*~
|
||||
*.core
|
||||
dtrace-out/
|
||||
|
||||
# Visual Studio CMake settings
|
||||
CMakeSettings.json
|
||||
|
||||
@@ -13,8 +13,6 @@ Copyright: yuzu Emulator Project
|
||||
License: GPL-2.0-or-later
|
||||
|
||||
Files: dist/qt_themes/default/icons/256x256/eden.png
|
||||
dist/qt_themes/default/icons/256x256/eden_named.png
|
||||
dist/Assets.car
|
||||
dist/yuzu.bmp
|
||||
dist/eden.icns
|
||||
dist/eden.ico
|
||||
|
||||
@@ -26,8 +26,9 @@ endif()
|
||||
|
||||
# Needed for FFmpeg w/ VAAPI and DRM
|
||||
if (PLATFORM_OPENBSD)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include")
|
||||
# OpenBSD 7.8 broke libcxx when upgrading, so we must define the PSTL backend manually
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R6/include -D_LIBCPP_PSTL_BACKEND_SERIAL=1")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R6/lib")
|
||||
elseif (PLATFORM_NETBSD)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include")
|
||||
@@ -487,10 +488,6 @@ else()
|
||||
# wow
|
||||
find_package(Boost 1.57.0 CONFIG REQUIRED OPTIONAL_COMPONENTS headers context system fiber filesystem)
|
||||
|
||||
if (CMAKE_SYSTEM_NAME STREQUAL "Linux" OR ANDROID)
|
||||
find_package(gamemode 1.7 MODULE)
|
||||
endif()
|
||||
|
||||
if (ENABLE_OPENSSL)
|
||||
find_package(OpenSSL 1.1.1 REQUIRED)
|
||||
endif()
|
||||
@@ -566,6 +563,7 @@ find_package(VulkanUtilityLibraries)
|
||||
find_package(SimpleIni)
|
||||
find_package(SPIRV-Tools)
|
||||
find_package(sirit)
|
||||
find_package(gamemode)
|
||||
|
||||
if (ARCHITECTURE_x86 OR ARCHITECTURE_x86_64)
|
||||
find_package(xbyak)
|
||||
|
||||
10
README.md
10
README.md
@@ -25,9 +25,9 @@ It is written in C++ with portability in mind, and we actively maintain builds f
|
||||
<img src="https://img.shields.io/discord/1367654015269339267?color=5865F2&label=Eden&logo=discord&logoColor=white"
|
||||
alt="Discord">
|
||||
</a>
|
||||
<a href="https://rvlt.gg/qKgFEAbH">
|
||||
<img src="https://img.shields.io/revolt/invite/qKgFEAbH?color=d61f3a&label=Revolt"
|
||||
alt="Revolt">
|
||||
<a href="https://stt.gg/qKgFEAbH">
|
||||
<img src="https://img.shields.io/revolt/invite/qKgFEAbH?color=d61f3a&label=Stoat"
|
||||
alt="Stoat">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
@@ -52,10 +52,10 @@ Check out our [website](https://eden-emu.dev) for the latest news on exciting fe
|
||||
|
||||
## 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/HstXbPch7X) 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/HstXbPch7X) or [Stoat](https://stt.gg/qKgFEAbH).
|
||||
You can also follow us on [X (Twitter)](https://nitter.poast.org/edenemuofficial) for updates and announcements.
|
||||
|
||||
If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Revolt to learn more about the current state of the emulator.
|
||||
If you would like to contribute, we are open to new developers and pull requests. Please ensure that your work is of a high standard and properly documented. You can also contact any of the developers on Discord or Stoat to learn more about the current state of the emulator.
|
||||
|
||||
See the [sign-up instructions](docs/SIGNUP.md) for information on registration.
|
||||
|
||||
|
||||
81
dist/eden_named.svg
vendored
81
dist/eden_named.svg
vendored
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 37 KiB |
@@ -137,7 +137,7 @@ If your initial configure failed:
|
||||
- Evaluate the error and find any related settings
|
||||
- See the [CPM docs](CPM.md) to see if you may need to forcefully bundle any packages
|
||||
|
||||
Otherwise, feel free to ask for help in Revolt or Discord.
|
||||
Otherwise, feel free to ask for help in Stoat or Discord.
|
||||
|
||||
## Caveats
|
||||
|
||||
|
||||
@@ -77,6 +77,8 @@ For this reason this patch is NOT applied to default on all platforms (for obvio
|
||||
|
||||
Still will not run flawlessly until `mesa-24` is available. Modify CMakeCache.txt with the `.so` of libGL and libGLESv2 by doing the incredibly difficult task of copy pasting them (`cp /boot/system/lib/libGL.so .`)
|
||||
|
||||
If you have `quazip1_qt6_devel`, uninstall it. It may call `Core5Compat` on CMake which is wrongly packaged.
|
||||
|
||||
## OpenBSD
|
||||
|
||||
After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`.
|
||||
@@ -99,11 +101,17 @@ ip6addrctl=YES
|
||||
ip6addrctl_policy=ipv4_prefer
|
||||
```
|
||||
|
||||
System provides a default `g++-10` which doesn't support the current C++ codebase; install `clang-19` with `pkgin install clang-19`. Then build with `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -B build`.
|
||||
System provides a default `g++-10` which doesn't support the current C++ codebase; install `clang-19` with `pkgin install clang-19`. Or install `gcc14` (or `gcc15` with current pkgsrc). Provided that, the following CMake commands may work:
|
||||
|
||||
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -Bbuild`
|
||||
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc14/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc14/bin/g++ -Bbuild`
|
||||
- `cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=/usr/pkg/gcc15/bin/gcc -DCMAKE_CXX_COMPILER=/usr/pkg/gcc15/bin/g++ -Bbuild`
|
||||
|
||||
Make may error out when generating C++ headers of SPIRV shaders, hence it's recommended to use `gmake` over the default system one.
|
||||
|
||||
glslang is not available on NetBSD, to circumvent this simply build glslang by yourself:
|
||||
[parallel/spirv-tools](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/parallel/spirv-tools/index.html) isn't available in binary form and must be build from source.
|
||||
|
||||
Such that glslang is not available on NetBSD, to circumvent this simply build glslang by yourself:
|
||||
```sh
|
||||
pkgin python313
|
||||
git clone --depth=1 https://github.com/KhronosGroup/glslang.git
|
||||
@@ -114,6 +122,8 @@ cmake --build build -- -j`nproc`
|
||||
cmake --install build
|
||||
```
|
||||
|
||||
However, pkgsrc is highly recommended, see [getting pkgsrc](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/doc/pkgsrc.html#getting). You must get `current` not the `2025Q2` version.
|
||||
|
||||
# DragonFlyBSD
|
||||
|
||||
If `libstdc++.so.6` is not found (`GLIBCXX_3.4.30`) then attempt:
|
||||
|
||||
@@ -183,6 +183,8 @@ sudo dnf config-manager --enable crb
|
||||
sudo dnf install qt6-qtbase-private-devel
|
||||
```
|
||||
|
||||
For systems like OpenEuler or derivates, don't forget to also install: `SDL2-devel pkg-config fmt-dev nlohmann-json-dev`.
|
||||
|
||||
* [RPM Fusion](https://rpmfusion.org/Configuration) is required for `ffmpeg-devel`
|
||||
* Fedora 32 or later is required.
|
||||
* Fedora 36+ users with GCC 12 need Clang and should configure CMake with: `cmake -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang -B build`
|
||||
@@ -241,7 +243,7 @@ brew install molten-vk vulkan-loader
|
||||
<details>
|
||||
<summary>FreeBSD</summary>
|
||||
|
||||
As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/jwt-cpp devel/unordered-dense mbedtls3 vulkan-headers quazip-qt6`
|
||||
As root run: `pkg install devel/cmake devel/sdl20 devel/boost-libs devel/catch2 devel/libfmt devel/nlohmann-json devel/ninja devel/nasm devel/autoconf devel/pkgconf devel/qt6-base devel/simpleini net/enet multimedia/ffnvcodec-headers multimedia/ffmpeg audio/opus archivers/liblz4 lang/gcc12 graphics/glslang graphics/vulkan-utility-libraries graphics/spirv-tools www/cpp-httplib devel/unordered-dense mbedtls3 vulkan-headers quazip-qt6`
|
||||
|
||||
If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||
|
||||
@@ -251,7 +253,7 @@ If using FreeBSD 12 or prior, use `devel/pkg-config` instead.
|
||||
<details>
|
||||
<summary>NetBSD</summary>
|
||||
|
||||
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers ffmpeg7 libva nlohmann-json jq libopus qt6 mbedtls3 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1`.
|
||||
For NetBSD +10.1: `pkgin install git cmake boost fmtlib SDL2 catch2 libjwt spirv-headers ffmpeg7 libva nlohmann-json jq libopus qt6 mbedtls3 cpp-httplib lz4 vulkan-headers nasm autoconf enet pkg-config libusb1 libcxx`.
|
||||
|
||||
[Caveats](./Caveats.md#netbsd).
|
||||
|
||||
@@ -320,7 +322,7 @@ pacman -Syuu --needed --noconfirm $packages
|
||||
<summary>HaikuOS</summary>
|
||||
|
||||
```sh
|
||||
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt6_devel qt6_5compat_devel libusb1_devel libz_devel mbedtls3_devel glslang
|
||||
pkgman install git cmake patch libfmt_devel nlohmann_json lz4_devel opus_devel boost1.89_devel vulkan_devel qt6_base_devel qt6_declarative_devel libsdl2_devel ffmpeg7_devel libx11_devel enet_devel catch2_devel quazip1_qt5_devel qt6_5compat_devel mbedtls3_devel glslang qt6_devel
|
||||
```
|
||||
|
||||
[Caveats](./Caveats.md#haikuos).
|
||||
|
||||
874
docs/NvidiaGpu.md
Normal file
874
docs/NvidiaGpu.md
Normal file
@@ -0,0 +1,874 @@
|
||||
# The NVIDIA SM86 (Maxwell) GPU - Instruction set
|
||||
|
||||
<!-- TOC -->
|
||||
[AL2P](#AL2P)
|
||||
[ALD](#ALD)
|
||||
[AST](#AST)
|
||||
[ATOM](#ATOM)
|
||||
[ATOMS](#ATOMS)
|
||||
[B2R](#B2R)
|
||||
[BAR](#BAR)
|
||||
[BFE](#BFE)
|
||||
[BFI](#BFI)
|
||||
[BPT](#BPT)
|
||||
[BRA](#BRA)
|
||||
[BRK](#BRK)
|
||||
[BRX](#BRX)
|
||||
[CAL](#CAL)
|
||||
[CCTL](#CCTL)
|
||||
[CCTLL](#CCTLL)
|
||||
[CONT](#CONT)
|
||||
[CS2R](#CS2R)
|
||||
[CSET](#CSET)
|
||||
[CSETP](#CSETP)
|
||||
[DADD](#DADD)
|
||||
[DEPBAR](#DEPBAR)
|
||||
[DFMA](#DFMA)
|
||||
[DMNMX](#DMNMX)
|
||||
[DMUL](#DMUL)
|
||||
[DSET](#DSET)
|
||||
[DSETP](#DSETP)
|
||||
[EXIT](#EXIT)
|
||||
[F2F](#F2F)
|
||||
[F2I](#F2I)
|
||||
[FADD](#FADD)
|
||||
[FCHK](#FCHK)
|
||||
[FCMP](#FCMP)
|
||||
[FFMA](#FFMA)
|
||||
[FLO](#FLO)
|
||||
[FMNMX](#FMNMX)
|
||||
[FMUL](#FMUL)
|
||||
[FSET](#FSET)
|
||||
[FSETP](#FSETP)
|
||||
[FSWZADD](#FSWZADD)
|
||||
[GETCRSPTR](#GETCRSPTR)
|
||||
[GETLMEMBASE](#GETLMEMBASE)
|
||||
[HADD2](#HADD2)
|
||||
[HFMA2](#HFMA2)
|
||||
[HMUL2](#HMUL2)
|
||||
[HSET2](#HSET2)
|
||||
[HSETP2](#HSETP2)
|
||||
[I2F](#I2F)
|
||||
[I2I](#I2I)
|
||||
[IADD](#IADD)
|
||||
[IADD3](#IADD3)
|
||||
[ICMP](#ICMP)
|
||||
[IDE](#IDE)
|
||||
[IDP](#IDP)
|
||||
[IMAD](#IMAD)
|
||||
[IMADSP](#IMADSP)
|
||||
[IMNMX](#IMNMX)
|
||||
[IMUL](#IMUL)
|
||||
[IPA](#IPA)
|
||||
[ISBERD](#ISBERD)
|
||||
[ISCADD](#ISCADD)
|
||||
[ISET](#ISET)
|
||||
[ISETP](#ISETP)
|
||||
[JCAL](#JCAL)
|
||||
[JMP](#JMP)
|
||||
[JMX](#JMX)
|
||||
[KIL](#KIL)
|
||||
[LD](#LD)
|
||||
[LDC](#LDC)
|
||||
[LDG](#LDG)
|
||||
[LDL](#LDL)
|
||||
[LDS](#LDS)
|
||||
[LEA](#LEA)
|
||||
[LEPC](#LEPC)
|
||||
[LONGJMP](#LONGJMP)
|
||||
[LOP](#LOP)
|
||||
[LOP3](#LOP3)
|
||||
[MEMBAR](#MEMBAR)
|
||||
[MOV](#MOV)
|
||||
[MUFU](#MUFU)
|
||||
[NOP](#NOP)
|
||||
[OUT](#OUT)
|
||||
[P2R](#P2R)
|
||||
[PBK](#PBK)
|
||||
[PCNT](#PCNT)
|
||||
[PEXIT](#PEXIT)
|
||||
[PIXLD](#PIXLD)
|
||||
[PLONGJMP](#PLONGJMP)
|
||||
[POPC](#POPC)
|
||||
[PRET](#PRET)
|
||||
[PRMT](#PRMT)
|
||||
[PSET](#PSET)
|
||||
[PSETP](#PSETP)
|
||||
[R2B](#R2B)
|
||||
[R2P](#R2P)
|
||||
[RAM](#RAM)
|
||||
[RED](#RED)
|
||||
[RET](#RET)
|
||||
[RRO](#RRO)
|
||||
[RTT](#RTT)
|
||||
[S2R](#S2R)
|
||||
[SAM](#SAM)
|
||||
[SEL](#SEL)
|
||||
[SETCRSPTR](#SETCRSPTR)
|
||||
[SETLMEMBASE](#SETLMEMBASE)
|
||||
[SHF](#SHF)
|
||||
[SHFL](#SHFL)
|
||||
[SHL](#SHL)
|
||||
[SHR](#SHR)
|
||||
[SSY](#SSY)
|
||||
[ST](#ST)
|
||||
[STG](#STG)
|
||||
[STL](#STL)
|
||||
[STP](#STP)
|
||||
[STS](#STS)
|
||||
[SUATOM](#SUATOM)
|
||||
[SULD](#SULD)
|
||||
[SURED](#SURED)
|
||||
[SUST](#SUST)
|
||||
[SYNC](#SYNC)
|
||||
[TEX](#TEX)
|
||||
[TLD](#TLD)
|
||||
[TLD4](#TLD4)
|
||||
[TMML](#TMML)
|
||||
[TXA](#TXA)
|
||||
[TXD](#TXD)
|
||||
[TXQ](#TXQ)
|
||||
[VABSDIFF](#VABSDIFF)
|
||||
[VABSDIFF4](#VABSDIFF4)
|
||||
[VADD](#VADD)
|
||||
[VMAD](#VMAD)
|
||||
[VMNMX](#VMNMX)
|
||||
[VOTE](#VOTE)
|
||||
[VSET](#VSET)
|
||||
[VSETP](#VSETP)
|
||||
[VSHL](#VSHL)
|
||||
[VSHR](#VSHR)
|
||||
[XMAD](#XMAD)
|
||||
<!-- /TOC -->
|
||||
|
||||
NOTE: Regenerate TOC with `cat docs/gpu/README.md | grep '#' | cut -d '#' -f 2 | tr -d ' ' | awk '{print "["$1"](#"$1")"}'`.
|
||||
|
||||
The numbers (in binary) represent the opcodes; `-` signifies "don't care".
|
||||
|
||||
# AL2P
|
||||
`1110 1111 1010 0---`
|
||||
|
||||
# ALD
|
||||
`1110 1111 1101 1---`
|
||||
|
||||
# AST
|
||||
`1110 1111 1111 0---`
|
||||
|
||||
# ATOM
|
||||
- **ATOM_cas**: `1110 1110 1111 ----`
|
||||
- **ATOM**: `1110 1101 ---- ----`
|
||||
|
||||
Atomic operation.
|
||||
|
||||
- INC, DEC for U32/S32/U64 does nothing.
|
||||
- ADD, INC, DEC for S64 does nothing.
|
||||
- Only ADD does something for F32.
|
||||
- Only ADD, MIN and MAX does something for F16x2.
|
||||
|
||||
# ATOMS
|
||||
- **ATOMS_cas**: `1110 1110 ---- ----`
|
||||
- **ATOMS**: `1110 1100 ---- ----`
|
||||
|
||||
# B2R
|
||||
`1111 0000 1011 1---`
|
||||
|
||||
# BAR
|
||||
`1111 0000 1010 1---`
|
||||
|
||||
# BFE
|
||||
- **BFE_reg**: `0101 1100 0000 0---`
|
||||
- **BFE_cbuf**: `0100 1100 0000 0---`
|
||||
- **BFE_imm**: `0011 100- 0000 0---`
|
||||
|
||||
Bit Field Extract.
|
||||
|
||||
# BFI
|
||||
- **BFI_reg**: `0101 1011 1111 0---`
|
||||
- **BFI_rc**: `0101 0011 1111 0---`
|
||||
- **BFI_cr**: `0100 1011 1111 0---`
|
||||
- **BFI_imm**: `0011 011- 1111 0---`
|
||||
|
||||
Bit Field Insert.
|
||||
|
||||
# BPT
|
||||
`1110 0011 1010 ----`
|
||||
|
||||
Breakpoint trap.
|
||||
|
||||
# BRA
|
||||
`1110 0010 0100 ----`
|
||||
|
||||
Relative branch.
|
||||
|
||||
# BRK
|
||||
`1110 0011 0100 ----`
|
||||
|
||||
Break.
|
||||
|
||||
# BRX
|
||||
`1110 0010 0101 ----`
|
||||
|
||||
# CAL
|
||||
`1110 0010 0110 ----`
|
||||
|
||||
# CCTL
|
||||
`1110 1111 011- ----`
|
||||
|
||||
Cache Control.
|
||||
|
||||
# CCTLL
|
||||
`1110 1111 100- ----`
|
||||
|
||||
Texture Cache Control.
|
||||
|
||||
# CONT
|
||||
`1110 0011 0101 ----`
|
||||
|
||||
Continue.
|
||||
|
||||
# CS2R
|
||||
`0101 0000 1100 1---`
|
||||
|
||||
Move Special Register to Register.
|
||||
|
||||
# CSET
|
||||
`0101 0000 1001 1---`
|
||||
|
||||
Test Condition Code And Set.
|
||||
|
||||
# CSETP
|
||||
`0101 0000 1010 0---`
|
||||
|
||||
Test Condition Code and Set Predicate.
|
||||
|
||||
# DADD
|
||||
- **DADD_reg**: `0101 1100 0111 0---`
|
||||
- **DADD_cbuf**: `0100 1100 0111 0---`
|
||||
- **DADD_imm**: `0011 100- 0111 0---`
|
||||
|
||||
# DEPBAR
|
||||
`1111 0000 1111 0---`
|
||||
|
||||
# DFMA
|
||||
- **DFMA_reg**: `0101 1011 0111 ----`
|
||||
- **DFMA_rc**: `0101 0011 0111 ----`
|
||||
- **DFMA_cr**: `0100 1011 0111 ----`
|
||||
- **DFMA_imm**: `0011 011- 0111 ----`
|
||||
|
||||
FP64 Fused Mutiply Add.
|
||||
|
||||
# DMNMX
|
||||
- **DMNMX_reg**: `0101 1100 0101 0---`
|
||||
- **DMNMX_cbuf**: `0100 1100 0101 0---`
|
||||
- **DMNMX_imm**: `0011 100- 0101 0---`
|
||||
|
||||
FP64 Minimum/Maximum.
|
||||
|
||||
# DMUL
|
||||
- **DMUL_reg**: `0101 1100 1000 0---`
|
||||
- **DMUL_cbuf**: `0100 1100 1000 0---`
|
||||
- **DMUL_imm**: `0011 100- 1000 0---`
|
||||
|
||||
FP64 Multiply.
|
||||
|
||||
# DSET
|
||||
- **DSET_reg**: `0101 1001 0--- ----`
|
||||
- **DSET_cbuf**: `0100 1001 0--- ----`
|
||||
- **DSET_imm**: `0011 001- 0--- ----`
|
||||
|
||||
FP64 Compare And Set.
|
||||
|
||||
# DSETP
|
||||
- **DSETP_reg**: `0101 1011 1000 ----`
|
||||
- **DSETP_cbuf**: `0100 1011 1000 ----`
|
||||
- **DSETP_imm**: `0011 011- 1000 ----`
|
||||
|
||||
FP64 Compare And Set Predicate.
|
||||
|
||||
# EXIT
|
||||
`1110 0011 0000 ----`
|
||||
|
||||
# F2F
|
||||
- **F2F_reg**: `0101 1100 1010 1---`
|
||||
- **F2F_cbuf**: `0100 1100 1010 1---`
|
||||
- **F2F_imm**: `0011 100- 1010 1---`
|
||||
|
||||
# F2I
|
||||
- **F2I_reg**: `0101 1100 1011 0---`
|
||||
- **F2I_cbuf**: `0100 1100 1011 0---`
|
||||
- **F2I_imm**: `0011 100- 1011 0---`
|
||||
|
||||
# FADD
|
||||
- **FADD_reg**: `0101 1100 0101 1---`
|
||||
- **FADD_cbuf**: `0100 1100 0101 1---`
|
||||
- **FADD_imm**: `0011 100- 0101 1---`
|
||||
- **FADD32I**: `0000 10-- ---- ----`
|
||||
|
||||
FP32 Add.
|
||||
|
||||
# FCHK
|
||||
- **FCHK_reg**: `0101 1100 1000 1---`
|
||||
- **FCHK_cbuf**: `0100 1100 1000 1---`
|
||||
- **FCHK_imm**: `0011 100- 1000 1---`
|
||||
|
||||
Single Precision FP Divide Range Check.
|
||||
|
||||
# FCMP
|
||||
- **FCMP_reg**: `0101 1011 1010 ----`
|
||||
- **FCMP_rc**: `0101 0011 1010 ----`
|
||||
- **FCMP_cr**: `0100 1011 1010 ----`
|
||||
- **FCMP_imm**: `0011 011- 1010 ----`
|
||||
|
||||
FP32 Compare to Zero and Select Source.
|
||||
|
||||
# FFMA
|
||||
- **FFMA_reg**: `0101 1001 1--- ----`
|
||||
- **FFMA_rc**: `0101 0001 1--- ----`
|
||||
- **FFMA_cr**: `0100 1001 1--- ----`
|
||||
- **FFMA_imm**: `0011 001- 1--- ----`
|
||||
- **FFMA32I**: `0000 11-- ---- ----`
|
||||
|
||||
FP32 Fused Multiply and Add.
|
||||
|
||||
# FLO
|
||||
- **FLO_reg**: `0101 1100 0011 0---`
|
||||
- **FLO_cbuf**: `0100 1100 0011 0---`
|
||||
- **FLO_imm**: `0011 100- 0011 0---`
|
||||
|
||||
# FMNMX
|
||||
- **FMNMX_reg**: `0101 1100 0110 0---`
|
||||
- **FMNMX_cbuf**: `0100 1100 0110 0---`
|
||||
- **FMNMX_imm**: `0011 100- 0110 0---`
|
||||
|
||||
FP32 Minimum/Maximum.
|
||||
|
||||
# FMUL
|
||||
- **FMUL_reg**: `0101 1100 0110 1---`
|
||||
- **FMUL_cbuf**: `0100 1100 0110 1---`
|
||||
- **FMUL_imm**: `0011 100- 0110 1---`
|
||||
- **FMUL32I**: `0001 1110 ---- ----`
|
||||
|
||||
FP32 Multiply.
|
||||
|
||||
# FSET
|
||||
- **FSET_reg**: `0101 1000 ---- ----`
|
||||
- **FSET_cbuf**: `0100 1000 ---- ----`
|
||||
- **FSET_imm**: `0011 000- ---- ----`
|
||||
|
||||
FP32 Compare And Set.
|
||||
|
||||
# FSETP
|
||||
- **FSETP_reg**: `0101 1011 1011 ----`
|
||||
- **FSETP_cbuf**: `0100 1011 1011 ----`
|
||||
- **FSETP_imm**: `0011 011- 1011 ----`
|
||||
|
||||
FP32 Compare And Set Predicate.
|
||||
|
||||
# FSWZADD
|
||||
`0101 0000 1111 1---`
|
||||
|
||||
FP32 Add used for FSWZ emulation.
|
||||
|
||||
# GETCRSPTR
|
||||
`1110 0010 1100 ----`
|
||||
|
||||
# GETLMEMBASE
|
||||
`1110 0010 1101 ----`
|
||||
|
||||
# HADD2
|
||||
- **HADD2_reg**: `0101 1101 0001 0---`
|
||||
- **HADD2_cbuf**: `0111 101- 1--- ----`
|
||||
- **HADD2_imm**: `0111 101- 0--- ----`
|
||||
- **HADD2_32I**: `0010 110- ---- ----`
|
||||
|
||||
FP16 Add.
|
||||
|
||||
# HFMA2
|
||||
- **HFMA2_reg**: `0101 1101 0000 0---`
|
||||
- **HFMA2_rc**: `0110 0--- 1--- ----`
|
||||
- **HFMA2_cr**: `0111 0--- 1--- ----`
|
||||
- **HFMA2_imm**: `0111 0--- 0--- ----`
|
||||
- **HFMA2_32I**: `0010 100- ---- ----`
|
||||
|
||||
FP16 Fused Mutiply Add.
|
||||
|
||||
# HMUL2
|
||||
- **HMUL2_reg**: `0101 1101 0000 1---`
|
||||
- **HMUL2_cbuf**: `0111 100- 1--- ----`
|
||||
- **HMUL2_imm**: `0111 100- 0--- ----`
|
||||
- **HMUL2_32I**: `0010 101- ---- ----`
|
||||
|
||||
FP16 Multiply.
|
||||
|
||||
# HSET2
|
||||
- **HSET2_reg**: `0101 1101 0001 1---`
|
||||
- **HSET2_cbuf**: `0111 110- 1--- ----`
|
||||
- **HSET2_imm**: `0111 110- 0--- ----`
|
||||
|
||||
FP16 Compare And Set.
|
||||
|
||||
# HSETP2
|
||||
- **HSETP2_reg**: `0101 1101 0010 0---`
|
||||
- **HSETP2_cbuf**: `0111 111- 1--- ----`
|
||||
- **HSETP2_imm**: `0111 111- 0--- ----`
|
||||
|
||||
FP16 Compare And Set Predicate.
|
||||
|
||||
# I2F
|
||||
- **I2F_reg**: `0101 1100 1011 1---`
|
||||
- **I2F_cbuf**: `0100 1100 1011 1---`
|
||||
- **I2F_imm**: `0011 100- 1011 1---`
|
||||
|
||||
# I2I
|
||||
- **I2I_reg**: `0101 1100 1110 0---`
|
||||
- **I2I_cbuf**: `0100 1100 1110 0---`
|
||||
- **I2I_imm**: `0011 100- 1110 0---`
|
||||
|
||||
# IADD
|
||||
- **IADD_reg**: `0101 1100 0001 0---`
|
||||
- **IADD_cbuf**: `0100 1100 0001 0---`
|
||||
- **IADD_imm**: `0011 100- 0001 0---`
|
||||
|
||||
Integer Addition.
|
||||
|
||||
# IADD3
|
||||
- **IADD3_reg**: `0101 1100 1100 ----`
|
||||
- **IADD3_cbuf**: `0100 1100 1100 ----`
|
||||
- **IADD3_imm**: `0011 100- 1100 ----`
|
||||
- **IADD32I**: `0001 110- ---- ----`
|
||||
|
||||
3-input Integer Addition.
|
||||
|
||||
# ICMP
|
||||
- **ICMP_reg**: `0101 1011 0100 ----`
|
||||
- **ICMP_rc**: `0101 0011 0100 ----`
|
||||
- **ICMP_cr**: `0100 1011 0100 ----`
|
||||
- **ICMP_imm**: `0011 011- 0100 ----`
|
||||
|
||||
Integer Compare to Zero and Select Source.
|
||||
|
||||
# IDE
|
||||
`1110 0011 1001 ----`
|
||||
|
||||
# IDP
|
||||
- **IDP_reg**: `0101 0011 1111 1---`
|
||||
- **IDP_imm**: `0101 0011 1101 1---`
|
||||
|
||||
# IMAD
|
||||
- **IMAD_reg**: `0101 1010 0--- ----`
|
||||
- **IMAD_rc**: `0101 0010 0--- ----`
|
||||
- **IMAD_cr**: `0100 1010 0--- ----`
|
||||
- **IMAD_imm**: `0011 010- 0--- ----`
|
||||
- **IMAD32I**: `1000 00-- ---- ----`
|
||||
|
||||
Integer Multiply And Add.
|
||||
|
||||
# IMADSP
|
||||
- **IMADSP_reg**: `0101 1010 1--- ----`
|
||||
- **IMADSP_rc**: `0101 0010 1--- ----`
|
||||
- **IMADSP_cr**: `0100 1010 1--- ----`
|
||||
- **IMADSP_imm**: `0011 010- 1--- ----`
|
||||
|
||||
Extracted Integer Multiply And Add..
|
||||
|
||||
# IMNMX
|
||||
- **IMNMX_reg**: `0101 1100 0010 0---`
|
||||
- **IMNMX_cbuf**: `0100 1100 0010 0---`
|
||||
- **IMNMX_imm**: `0011 100- 0010 0---`
|
||||
|
||||
Integer Minimum/Maximum.
|
||||
|
||||
# IMUL
|
||||
- **IMUL_reg**: `0101 1100 0011 1---`
|
||||
- **IMUL_cbuf**: `0100 1100 0011 1---`
|
||||
- **IMUL_imm**: `0011 100- 0011 1---`
|
||||
- **IMUL32I**: `0001 1111 ---- ----`
|
||||
|
||||
Integer Multiply.
|
||||
|
||||
# IPA
|
||||
`1110 0000 ---- ----`
|
||||
|
||||
# ISBERD
|
||||
`1110 1111 1101 0---`
|
||||
|
||||
In-Stage-Buffer Entry Read.
|
||||
|
||||
# ISCADD
|
||||
- **ISCADD_reg**: `0101 1100 0001 1---`
|
||||
- **ISCADD_cbuf**: `0100 1100 0001 1---`
|
||||
- **ISCADD_imm**: `0011 100- 0001 1---`
|
||||
- **ISCADD32I**: `0001 01-- ---- ----`
|
||||
|
||||
Scaled Integer Addition.
|
||||
|
||||
# ISET
|
||||
- **ISET_reg**: `0101 1011 0101 ----`
|
||||
- **ISET_cbuf**: `0100 1011 0101 ----`
|
||||
- **ISET_imm**: `0011 011- 0101 ----`
|
||||
|
||||
Integer Compare And Set.
|
||||
|
||||
# ISETP
|
||||
- **ISETP_reg**: `0101 1011 0110 ----`
|
||||
- **ISETP_cbuf**: `0100 1011 0110 ----`
|
||||
- **ISETP_imm**: `0011 011- 0110 ----`
|
||||
|
||||
Integer Compare And Set Predicate.
|
||||
|
||||
# JCAL
|
||||
`1110 0010 0010 ----`
|
||||
|
||||
Absolute Call.
|
||||
|
||||
# JMP
|
||||
`1110 0010 0001 ----`
|
||||
|
||||
Absolute Jump.
|
||||
|
||||
# JMX
|
||||
`1110 0010 0000 ----`
|
||||
|
||||
Absolute Jump Indirect.
|
||||
|
||||
# KIL
|
||||
`1110 0011 0011 ----`
|
||||
|
||||
# LD
|
||||
`100- ---- ---- ----`
|
||||
|
||||
Load from generic Memory.
|
||||
|
||||
# LDC
|
||||
`1110 1111 1001 0---`
|
||||
|
||||
Load Constant.
|
||||
|
||||
# LDG
|
||||
`1110 1110 1101 0---`
|
||||
|
||||
Load from Global Memory.
|
||||
|
||||
# LDL
|
||||
`1110 1111 0100 0---`
|
||||
|
||||
Load within Local Memory Window.
|
||||
|
||||
# LDS
|
||||
`1110 1111 0100 1---`
|
||||
|
||||
Load within Shared Memory Window.
|
||||
|
||||
# LEA
|
||||
- **LEA_hi_reg**: `0101 1011 1101 1---`
|
||||
- **LEA_hi_cbuf**: `0001 10-- ---- ----`
|
||||
- **LEA_lo_reg**: `0101 1011 1101 0---`
|
||||
- **LEA_lo_cbuf**: `0100 1011 1101 ----`
|
||||
- **LEA_lo_imm**: `0011 011- 1101 0---`
|
||||
|
||||
# LEPC
|
||||
`0101 0000 1101 0---`
|
||||
|
||||
# LONGJMP
|
||||
`1110 0011 0001 ----`
|
||||
|
||||
# LOP
|
||||
- **LOP_reg**: `0101 1100 0100 0---`
|
||||
- **LOP_cbuf**: `0100 1100 0100 0---`
|
||||
- **LOP_imm**: `0011 100- 0100 0---`
|
||||
|
||||
# LOP3
|
||||
- **LOP3_reg**: `0101 1011 1110 0---`
|
||||
- **LOP3_cbuf**: `0000 001- ---- ----`
|
||||
- **LOP3_imm**: `0011 11-- ---- ----`
|
||||
- **LOP32I**: `0000 01-- ---- ----`
|
||||
|
||||
# MEMBAR
|
||||
`1110 1111 1001 1---`
|
||||
|
||||
Memory Barrier.
|
||||
|
||||
# MOV
|
||||
- **MOV_reg**: `0101 1100 1001 1---`
|
||||
- **MOV_cbuf**: `0100 1100 1001 1---`
|
||||
- **MOV_imm**: `0011 100- 1001 1---`
|
||||
- **MOV32I**: `0000 0001 0000 ----`
|
||||
|
||||
# MUFU
|
||||
`0101 0000 1000 0---`
|
||||
|
||||
Multi Function Operation.
|
||||
|
||||
# NOP
|
||||
`0101 0000 1011 0---`
|
||||
|
||||
No operation.
|
||||
|
||||
# OUT
|
||||
- **OUT_reg**: `1111 1011 1110 0---`
|
||||
- **OUT_cbuf**: `1110 1011 1110 0---`
|
||||
- **OUT_imm**: `1111 011- 1110 0---`
|
||||
|
||||
# P2R
|
||||
- **P2R_reg**: `0101 1100 1110 1---`
|
||||
- **P2R_cbuf**: `0100 1100 1110 1---`
|
||||
- **P2R_imm**: `0011 1000 1110 1---`
|
||||
|
||||
Move Predicate Register To Register.
|
||||
|
||||
# PBK
|
||||
`1110 0010 1010 ----`
|
||||
|
||||
Pre-break.
|
||||
|
||||
# PCNT
|
||||
`1110 0010 1011 ----`
|
||||
|
||||
Pre-continue.
|
||||
|
||||
# PEXIT
|
||||
`1110 0010 0011 ----`
|
||||
|
||||
Pre-exit.
|
||||
|
||||
# PIXLD
|
||||
`1110 1111 1110 1---`
|
||||
|
||||
# PLONGJMP
|
||||
`1110 0010 1000 ----`
|
||||
|
||||
Pre-long jump.
|
||||
|
||||
# POPC
|
||||
- **POPC_reg**: `0101 1100 0000 1---`
|
||||
- **POPC_cbuf**: `0100 1100 0000 1---`
|
||||
- **POPC_imm**: `0011 100- 0000 1---`
|
||||
|
||||
Population/Bit count.
|
||||
|
||||
# PRET
|
||||
`1110 0010 0111 ----`
|
||||
|
||||
Pre-return from subroutine. Pushes the return address to the CRS stack.
|
||||
|
||||
# PRMT
|
||||
- **PRMT_reg**: `0101 1011 1100 ----`
|
||||
- **PRMT_rc**: `0101 0011 1100 ----`
|
||||
- **PRMT_cr**: `0100 1011 1100 ----`
|
||||
- **PRMT_imm**: `0011 011- 1100 ----`
|
||||
|
||||
# PSET
|
||||
`0101 0000 1000 1---`
|
||||
|
||||
Combine Predicates and Set.
|
||||
|
||||
# PSETP
|
||||
`0101 0000 1001 0---`
|
||||
|
||||
Combine Predicates and Set Predicate.
|
||||
|
||||
# R2B
|
||||
`1111 0000 1100 0---`
|
||||
|
||||
Move Register to Barrier.
|
||||
|
||||
# R2P
|
||||
- **R2P_reg**: `0101 1100 1111 0---`
|
||||
- **R2P_cbuf**: `0100 1100 1111 0---`
|
||||
- **R2P_imm**: `0011 100- 1111 0---`
|
||||
|
||||
Move Register To Predicate/CC Register.
|
||||
|
||||
# RAM
|
||||
`1110 0011 1000 ----`
|
||||
|
||||
# RED
|
||||
`1110 1011 1111 1---`
|
||||
|
||||
Reduction Operation on Generic Memory.
|
||||
|
||||
# RET
|
||||
`1110 0011 0010 ----`
|
||||
|
||||
Return.
|
||||
|
||||
# RRO
|
||||
- **RRO_reg**: `0101 1100 1001 0---`
|
||||
- **RRO_cbuf**: `0100 1100 1001 0---`
|
||||
- **RRO_imm**: `0011 100- 1001 0---`
|
||||
|
||||
# RTT
|
||||
`1110 0011 0110 ----`
|
||||
|
||||
# S2R
|
||||
`1111 0000 1100 1---`
|
||||
|
||||
# SAM
|
||||
`1110 0011 0111 ----`
|
||||
|
||||
# SEL
|
||||
- **SEL_reg**: `0101 1100 1010 0---`
|
||||
- **SEL_cbuf**: `0100 1100 1010 0---`
|
||||
- **SEL_imm**: `0011 100- 1010 0---`
|
||||
|
||||
# SETCRSPTR
|
||||
`1110 0010 1110 ----`
|
||||
|
||||
# SETLMEMBASE
|
||||
`1110 0010 1111 ----`
|
||||
|
||||
# SHF
|
||||
- **SHF_l_reg**: `0101 1011 1111 1---`
|
||||
- **SHF_l_imm**: `0011 011- 1111 1---`
|
||||
- **SHF_r_reg**: `0101 1100 1111 1---`
|
||||
- **SHF_r_imm**: `0011 100- 1111 1---`
|
||||
|
||||
# SHFL
|
||||
`1110 1111 0001 0---`
|
||||
|
||||
# SHL
|
||||
- **SHL_reg**: `0101 1100 0100 1---`
|
||||
- **SHL_cbuf**: `0100 1100 0100 1---`
|
||||
- **SHL_imm**: `0011 100- 0100 1---`
|
||||
|
||||
# SHR
|
||||
- **SHR_reg**: `0101 1100 0010 1---`
|
||||
- **SHR_cbuf**: `0100 1100 0010 1---`
|
||||
- **SHR_imm**: `0011 100- 0010 1---`
|
||||
|
||||
# SSY
|
||||
`1110 0010 1001 ----`
|
||||
|
||||
Set Synchronization Point.
|
||||
|
||||
# ST
|
||||
`101- ---- ---- ----`
|
||||
|
||||
Store to generic Memory.
|
||||
|
||||
# STG
|
||||
`1110 1110 1101 1---`
|
||||
|
||||
Store to global Memory.
|
||||
|
||||
# STL
|
||||
`1110 1111 0101 0---`
|
||||
|
||||
Store within Local or Shared Window.
|
||||
|
||||
# STP
|
||||
`1110 1110 1010 0---`
|
||||
|
||||
Store to generic Memory and Predicate.
|
||||
|
||||
# STS
|
||||
`1110 1111 0101 1---`
|
||||
|
||||
Store within Local or Shared Window.
|
||||
|
||||
# SUATOM
|
||||
- **SUATOM**: `1110 1010 0--- ----`
|
||||
- **SUATOM_cas**: `1110 1010 1--- ----`
|
||||
|
||||
Atomic Op on Surface Memory.
|
||||
|
||||
# SULD
|
||||
`1110 1011 000- ----`
|
||||
|
||||
Surface Load.
|
||||
|
||||
# SURED
|
||||
`1110 1011 010- ----`
|
||||
|
||||
Reduction Op on Surface Memory.
|
||||
|
||||
# SUST
|
||||
`1110 1011 001- ----`
|
||||
|
||||
Surface Store.
|
||||
|
||||
# SYNC
|
||||
`1111 0000 1111 1---`
|
||||
|
||||
# TEX
|
||||
- **TEX**: `1100 0--- ---- ----`
|
||||
- **TEX_b**: `1101 1110 10-- ----`
|
||||
- **TEXS**: `1101 -00- ---- ----`
|
||||
|
||||
Texture Fetch with scalar/non-vec4 source/destinations.
|
||||
|
||||
# TLD
|
||||
- **TLD**: `1101 1100 ---- ----`
|
||||
- **TLD_b**: `1101 1101 ---- ----`
|
||||
- **TLDS**: `1101 -01- ---- ----`
|
||||
|
||||
Texture Load with scalar/non-vec4 source/destinations.
|
||||
|
||||
# TLD4
|
||||
- **TLD4**: `1100 10-- ---- ----`
|
||||
- **TLD4_b**: `1101 1110 11-- ----`
|
||||
- **TLD4S**: `1101 1111 -0-- ----`
|
||||
|
||||
Texture Load 4 with scalar/non-vec4 source/destinations.
|
||||
|
||||
# TMML
|
||||
- **TMML**: `1101 1111 0101 1---`
|
||||
- **TMML_b**: `1101 1111 0110 0---`
|
||||
|
||||
Texture MipMap Level.
|
||||
|
||||
# TXA
|
||||
`1101 1111 0100 0---`
|
||||
|
||||
# TXD
|
||||
- **TXD**: `1101 1110 00-- ----`
|
||||
- **TXD_b**: `1101 1110 01-- ----`
|
||||
|
||||
Texture Fetch With Derivatives.
|
||||
|
||||
# TXQ
|
||||
- **TXQ**: `1101 1111 0100 1---`
|
||||
- **TXQ_b**: `1101 1111 0101 0---`
|
||||
|
||||
Texture Query.
|
||||
|
||||
# VABSDIFF
|
||||
`0101 0100 ---- ----`
|
||||
|
||||
# VABSDIFF4
|
||||
`0101 0000 0--- ----`
|
||||
|
||||
# VADD
|
||||
`0010 00-- ---- ----`
|
||||
|
||||
# VMAD
|
||||
`0101 1111 ---- ----`
|
||||
|
||||
# VMNMX
|
||||
`0011 101- ---- ----`
|
||||
|
||||
# VOTE
|
||||
- **VOTE**: `0101 0000 1101 1---`
|
||||
- **VOTE_vtg**: `0101 0000 1110 0---`
|
||||
|
||||
Vote Across SIMD Thread Group
|
||||
|
||||
# VSET
|
||||
`0100 000- ---- ----`
|
||||
|
||||
# VSETP
|
||||
`0101 0000 1111 0---`
|
||||
|
||||
# VSHL
|
||||
`0101 0111 ---- ----`
|
||||
|
||||
# VSHR
|
||||
`0101 0110 ---- ----`
|
||||
|
||||
# XMAD
|
||||
- **XMAD_reg**: `0101 1011 00-- ----`
|
||||
- **XMAD_rc**: `0101 0001 0--- ----`
|
||||
- **XMAD_cr**: `0100 111- ---- ----`
|
||||
- **XMAD_imm**: `0011 011- 00-- ----`
|
||||
|
||||
Integer Short Multiply Add.
|
||||
@@ -10,4 +10,6 @@ This contains documentation created by developers. This contains build instructi
|
||||
- **[Debug Guidelines](./Debug.md)**
|
||||
- **[CPM - CMake Package Manager](CPMUtil.md)**
|
||||
- **[Platform-Specific Caveats](Caveats.md)**
|
||||
- **[The NVIDIA SM86 (Maxwell) GPU](./NvidiaGpu.md)**
|
||||
- **[User Handbook](./user)**
|
||||
- **[Release Policy](./ReleasePolicy.md)**
|
||||
|
||||
25
docs/ReleasePolicy.md
Normal file
25
docs/ReleasePolicy.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Release Policy
|
||||
|
||||
While releases are usually made at the discretion of the team, we feel that establishing a clearer guideline on how those come to be will help expectations when it comes to features and fixes per version.
|
||||
|
||||
## Release candidates
|
||||
|
||||
Every full release is *preceded* by at least, 3 release candidates. The reasoning is that each week of the month, there will be a release candidate, with the "4th one" being the final full release.
|
||||
|
||||
The main expectation is that the release candidates bring both fixes and, sometimes, new features. But not guarantee a regression-free experience.
|
||||
|
||||
The criteria for choosing a date for a release candidate is at discretion, or "perceived necesity" at any given time.
|
||||
|
||||
## Full release
|
||||
|
||||
A full release means there are *no major* leftover regressions, importantly this means that a grand portion of regressions found between release candidates are swept out before declaring a full release. This doesn't mean a full release is regression-free; but we do a best-effort approach to reduce them for end-users.
|
||||
|
||||
The main expectation is that users can safely upgrade from a stable build to another, with no major regressions.
|
||||
|
||||
## Snapshot/rolling release
|
||||
|
||||
While we don't publish rolling releases, we are aware users may compile from source and/or provide binaries to master builds of the project.
|
||||
|
||||
This is mostly fine since we keep master very stable from major hiccups. However sometimes bugs do slip between tests or reviews - so users are advised to keep that in mind.
|
||||
|
||||
We advise that users also read git logs (`git log --oneline`) before recompiling to get a clearer picture of the changes given into the emulator.
|
||||
154
docs/user/AddingBooleanToggles.md
Normal file
154
docs/user/AddingBooleanToggles.md
Normal file
@@ -0,0 +1,154 @@
|
||||
# User Handbook - Adding Boolean Settings Toggles
|
||||
|
||||
> [!WARNING]
|
||||
> This guide is intended for developers ONLY. If you are not a developer, this likely irrelevant to yourself.
|
||||
>
|
||||
> If you want to add temporary toggles, please refer to **[Adding Debug Knobs](AddingDebugKnobs.md)**
|
||||
|
||||
This guide will walk you through adding a new boolean toggle setting to Eden's configuration across both Qt's (PC) and Kotlin's (Android) UIs.
|
||||
|
||||
## Index
|
||||
|
||||
1. [Step 1 - src/common/settings](#step-1-src-common-settings)
|
||||
2. [Qt's (PC) Steps](#qt-pc-steps)
|
||||
|
||||
* [Step 2 - src/qt_common/config/shared_translation.cpp](#step-2-src-qt_common-config-shared_translation-cpp)
|
||||
3. [ Kotlin's (Android) Steps](#android-steps)
|
||||
|
||||
* [Step 3 - BooleanSetting.kt](#step-3-src-android-app-src-main-java-org-yuzu-yuzu_emu-features-settings-model-booleansetting-kt)
|
||||
* [Step 4 - SettingsItem.kt](#step-4-src-android-app-src-main-java-org-yuzu-yuzu_emu-features-settings-model-view-settingsitem-kt)
|
||||
* [Step 5 - SettingsFragmentPresenter.kt](#step-5-src-android-app-src-main-java-org-yuzu-yuzu_emu-features-settings-ui-settingsfragmentpresenter-kt)
|
||||
* [Step 6 - strings.xml](#step-6-src-android-app-src-main-res-values-strings-xml)
|
||||
4. [Step 7 - Use Your Toggle](#step-7-use-your-toggle)
|
||||
5. [Best Practices](#best-practices)
|
||||
|
||||
---
|
||||
|
||||
## Step 1 - src/common/settings.
|
||||
|
||||
Firstly add your desired toggle inside `setting.h`,
|
||||
Example:
|
||||
|
||||
```
|
||||
SwitchableSetting<bool> your_setting_name{linkage, false, "your_setting_name", Category::RendererExtensions};
|
||||
```
|
||||
|
||||
NOTE - If you wish for your toggle to be on by default then change `false` to `true` after `linkage,`.
|
||||
|
||||
### Remember to add your toggle to the appropriate category, for example:
|
||||
|
||||
Common Categories:
|
||||
|
||||
* Category::Renderer
|
||||
* Category::RendererAdvanced
|
||||
* Category::RendererExtensions
|
||||
* Category::System
|
||||
* Category::Core
|
||||
|
||||
---
|
||||
|
||||
## Qt (PC) Steps
|
||||
|
||||
### Step 2 - src/qt_common/config/shared_translation.cpp
|
||||
|
||||
Now you can add the toggle to the QT (PC) UI inside `shared_translation.cpp`,
|
||||
Find where you wish for it to appear and place it there.
|
||||
Example:
|
||||
|
||||
```
|
||||
INSERT(Settings,
|
||||
your_setting_name,
|
||||
tr("Your Setting Display Name"),
|
||||
tr("Detailed description of what this setting does.\n"
|
||||
"You can use multiple lines.\n"
|
||||
"Explain any caveats or requirements."));
|
||||
```
|
||||
|
||||
### Make sure to:
|
||||
|
||||
* Keep display naming consistant
|
||||
* Put detailed info in the description
|
||||
* Use `\n` for line breaks in descriptions
|
||||
|
||||
---
|
||||
|
||||
## Android Steps
|
||||
|
||||
### Step 3 - src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/BooleanSetting.kt
|
||||
|
||||
Now add it inside `BooleanSetting.kt` where it should be in the settings.
|
||||
Example:
|
||||
|
||||
```
|
||||
RENDERER_YOUR_SETTING_NAME("your_setting_name"),
|
||||
```
|
||||
|
||||
Remember to make sure the naming of the prefix matches the desired category.
|
||||
|
||||
### Step 4 - src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt
|
||||
|
||||
Now you may add the toggle to the Kotlin (Android) UI inside `SettingsItem.kt`.
|
||||
Example:
|
||||
|
||||
```
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.RENDERER_YOUR_SETTING_NAME,
|
||||
titleId = R.string.your_setting_name,
|
||||
descriptionId = R.string.your_setting_name_description
|
||||
)
|
||||
)
|
||||
```
|
||||
|
||||
### Step 5 - src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsFragmentPresenter.kt
|
||||
|
||||
Now add your setting to the correct location inside `SettingsFragmentPresenter.kt` within the right category.
|
||||
Example:
|
||||
|
||||
```
|
||||
add(BooleanSetting.RENDERER_YOUR_SETTING_NAME.key)
|
||||
```
|
||||
|
||||
Remember, placing matters! Settings appear in the order of where you add them.
|
||||
|
||||
### Step 6 - src/android/app/src/main/res/values/strings.xml
|
||||
|
||||
Now add your setting and description to `strings.xml` in the appropriate place.
|
||||
Example:
|
||||
|
||||
```
|
||||
<string name="your_setting_name">Your Setting Display Name</string>
|
||||
<string name="your_setting_name_description">Detailed description of what this setting does. Explain any caveats, requirements, or warnings here.</string>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Step 7 - Use Your Toggle!
|
||||
|
||||
Now the UI part is done find a place in the code for the toggle,
|
||||
And use it to your heart's desire!
|
||||
Example:
|
||||
|
||||
```
|
||||
const bool your_value = Settings::values.your_setting_name.GetValue();
|
||||
|
||||
if (your_value) {
|
||||
// Do something when enabled
|
||||
}
|
||||
```
|
||||
|
||||
If you wish to do something only when the toggle is disabled,
|
||||
Use `if (!your_value) {` instead of `if (your_value) {`.
|
||||
|
||||
---
|
||||
|
||||
## Best Practices
|
||||
|
||||
* Naming - Use clear, descriptive names. Something for both the devs and the users.
|
||||
* Defaults - Choose safe default values (usually false for new features).
|
||||
* Documentation - Write clear descriptions explaining when and why to use the setting.
|
||||
* Categories - Put settings in the appropriate category.
|
||||
* Order - Place related settings near each other.
|
||||
* Testing - Always test on both PC and Android before committing when possible.
|
||||
|
||||
### Thank you for reading, I hope this guide helped you making your toggle!
|
||||
119
docs/user/AddingDebugKnobs.md
Normal file
119
docs/user/AddingDebugKnobs.md
Normal file
@@ -0,0 +1,119 @@
|
||||
# User Handbook - Adding Debug Knobs
|
||||
|
||||
Debug Knobs is a 16-bit integer setting (`debug_knobs`) in the Eden Emulator that serves as a bitmask for gating various testing and debugging features. This allows developers and advanced users to enable or disable specific debug behaviors without requiring deploying of complete but temporary toggles.
|
||||
|
||||
The setting ranges from 0 to 65535 (0x0000 to 0xFFFF), where each bit represents a different debug feature flag.
|
||||
|
||||
## Index
|
||||
|
||||
1. [Advantages](#advantages)
|
||||
2. [Usage](#usage)
|
||||
|
||||
* [Accessing Debug Knobs (dev side)](#accessing-debug-knobs-dev-side)
|
||||
* [Setting Debug Knobs (user side)](#setting-debug-knobs-user-side)
|
||||
* [Bit Manipulation Examples](#bit-manipulation-examples)
|
||||
3. [Examples](#examples)
|
||||
|
||||
* [Example 1: Conditional Debug Logging](#example-1-conditional-debug-logging)
|
||||
* [Example 2: Performance Tuning](#example-2-performance-tuning)
|
||||
* [Example 3: Feature Gating](#example-3-feature-gating)
|
||||
4. [Best Practices](#best-practices)
|
||||
|
||||
---
|
||||
|
||||
## Advantages
|
||||
|
||||
The main advantage is to avoid deploying new disposable toggles (those made only for testing stage, and are disposed once new feature gets good to merge). This empowers devs to be free of all frontend burocracy and hassle of new toggles.
|
||||
|
||||
Common advantages recap:
|
||||
|
||||
* **Fine-Grained Control**: Enable or disable up to 16 individual debug features independently using bit manipulation on a single build
|
||||
* **Runtime Configuration**: Change debug behavior at runtime the same way as new toggles would do
|
||||
* **Safe incremental development**: New debug features can be added while impact can be isolated from previous deployments
|
||||
|
||||
## Usage
|
||||
|
||||
### Accessing Debug Knobs (dev side)
|
||||
|
||||
Use the `Settings::getDebugKnobAt(u8 i)` function to check if a specific bit is set:
|
||||
|
||||
```cpp
|
||||
#include "common/settings.h"
|
||||
|
||||
// Check if bit 0 is set
|
||||
bool feature_enabled = Settings::getDebugKnobAt(0);
|
||||
|
||||
// Check if bit 15 is set
|
||||
bool another_feature = Settings::getDebugKnobAt(15);
|
||||
```
|
||||
|
||||
The function returns `true` if the specified bit (0-15) is set in the `debug_knobs` value, `false` otherwise.
|
||||
|
||||
### Setting Debug Knobs (user side)
|
||||
|
||||
Developers must inform which knobs are tied to each functionality to be tested.
|
||||
|
||||
The debug knobs value can be set through:
|
||||
|
||||
1. **Desktop UI**: In the Debug configuration tab, there's a spinbox for "Debug knobs" (0-65535)
|
||||
2. **Android UI**: Available as an integer setting in the Debug section
|
||||
3. **Configuration Files**: Set the `debug_knobs` value in the emulator's configuration
|
||||
|
||||
### Bit Manipulation Examples
|
||||
|
||||
To enable specific features, calculate the decimal value by setting the appropriate bits:
|
||||
|
||||
* **Enable only bit 0**: Value = 1 (2^0)
|
||||
* **Enable only bit 1**: Value = 2 (2^1)
|
||||
* **Enable bits 0 and 1**: Value = 3 (2^0 + 2^1)
|
||||
* **Enable bit 15**: Value = 32768 (2^15)
|
||||
|
||||
## Examples
|
||||
|
||||
### Example 1: Conditional Debug Logging
|
||||
|
||||
```cpp
|
||||
void SomeFunction() {
|
||||
if (Settings::getDebugKnobAt(0)) {
|
||||
LOG_DEBUG(Common, "Debug feature 0 is enabled");
|
||||
// Additional debug code here
|
||||
}
|
||||
|
||||
if (Settings::getDebugKnobAt(1)) {
|
||||
LOG_DEBUG(Common, "Debug feature 1 is enabled");
|
||||
// Different debug behavior
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Example 2: Performance Tuning
|
||||
|
||||
```cpp
|
||||
bool UseOptimizedPath() {
|
||||
// Skip optimization if debug bit 2 is set for testing
|
||||
return !Settings::getDebugKnobAt(2);
|
||||
}
|
||||
```
|
||||
|
||||
### Example 3: Feature Gating
|
||||
|
||||
```cpp
|
||||
void ExperimentalFeature() {
|
||||
static constexpr u8 EXPERIMENTAL_FEATURE_BIT = 3;
|
||||
|
||||
if (!Settings::getDebugKnobAt(EXPERIMENTAL_FEATURE_BIT)) {
|
||||
// Fallback to stable implementation
|
||||
StableImplementation();
|
||||
return;
|
||||
}
|
||||
|
||||
// Experimental implementation
|
||||
ExperimentalImplementation();
|
||||
}
|
||||
```
|
||||
|
||||
## Best Practices
|
||||
|
||||
* This setting is intended for development and testing purposes only
|
||||
* Knobs must be unwired before PR creation
|
||||
* The setting is per-game configurable, allowing different debug setups for different titles
|
||||
@@ -1,28 +0,0 @@
|
||||
# Setting Controller Profiles By Game
|
||||
|
||||
Use this guide when you want to set up specific controller profiles for specific games. This can be useful for certain games like *Captain Toad Treasure Tracker* where a blue dot appears in the middle of the screen when you have docked mode enabled, but not handheld mode.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Setting-Controller-Profiles-By-Game-2b057c2edaf681658a57f0c199cb6083) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden Emulator set up and fully configured
|
||||
- Controller Profile Created
|
||||
- See [*Configuring Controller Profiles*](./ControllerProfiles.md) for instructions on how to do this if needed.
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
1. *Right-Click* the game you want to apply the profile to in the main window and select **Properties.**
|
||||
2. Navigate to the **Input Profiles** tab in the window that appears. Drop down on *Player 1 profile* (or whatever player profile you want to apply it to) and select the profile you want.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: You may have to resize the window to see all tabs, or press the arrows by the tabs to see **Input Profiles**.
|
||||
|
||||
</aside>
|
||||
1. Click **OK** to apply the profile mapping.
|
||||
2. Launch the game and confirm that the profile is applied, regardless of what the global configuration is.
|
||||
@@ -12,9 +12,38 @@ Use this guide for when you want to configure specific controller settings to be
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
### Steps
|
||||
1. Launch Eden and wait for it to load.
|
||||
2. Navigate to *Emulation > Configure…*
|
||||
3. Select **Controls** from the left-hand menu and configure your controller for the way you want it to be in game.
|
||||
4. Select **New** and enter a name for the profile in the box that appears. Press **OK** to save the profile settings.
|
||||
5. Select **OK** to close the settings menu.
|
||||
5. Select **OK** to close the settings menu.
|
||||
|
||||
## Setting Controller Profiles By Game
|
||||
|
||||
Use this guide when you want to set up specific controller profiles for specific games. This can be useful for certain games like *Captain Toad Treasure Tracker* where a blue dot appears in the middle of the screen when you have docked mode enabled, but not handheld mode.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Setting-Controller-Profiles-By-Game-2b057c2edaf681658a57f0c199cb6083) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden Emulator set up and fully configured
|
||||
- Controller Profile Created
|
||||
- See [*Configuring Controller Profiles*](./ControllerProfiles.md) for instructions on how to do this if needed.
|
||||
|
||||
---
|
||||
|
||||
### Steps
|
||||
|
||||
1. *Right-Click* the game you want to apply the profile to in the main window and select **Properties.**
|
||||
2. Navigate to the **Input Profiles** tab in the window that appears. Drop down on *Player 1 profile* (or whatever player profile you want to apply it to) and select the profile you want.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: You may have to resize the window to see all tabs, or press the arrows by the tabs to see **Input Profiles**.
|
||||
|
||||
</aside>
|
||||
1. Click **OK** to apply the profile mapping.
|
||||
2. Launch the game and confirm that the profile is applied, regardless of what the global configuration is.
|
||||
|
||||
@@ -90,3 +90,22 @@ The OpenGL backend would invoke behaviour that would result in swarst/LLVMpipe w
|
||||
### HaikuOS compatibility
|
||||
|
||||
HaikuOS bundles a Mesa library that doesn't support full core OpenGL 4.6 (required by the emulator). This leads to HaikuOS being one of the few computer platforms where Vulkan is the only available option for users. If OpenGL is desired, Mesa has to be built manually from source. For debugging purpouses `lavapipe` is recommended over the GPU driver; there is in-kernel support for NVIDIA cards through.
|
||||
|
||||
### Fixes for Windows 10 and above having "Device loss"
|
||||
|
||||
Run the following batch script *inside* the Eden folder:
|
||||
```cmd
|
||||
@echo off
|
||||
pushd "%~dp0"
|
||||
if exist "%temp%\FixFullScreen.reg" (
|
||||
del %temp%\FixFullScreen.reg
|
||||
)
|
||||
set str_path="%cd:\=\\%\\eden.exe"
|
||||
echo Windows Registry Editor Version 5.00 >> %temp%\FixFullScreen.reg
|
||||
echo. >> %temp%\FixFullScreen.reg
|
||||
echo [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers] >> %temp%\FixFullScreen.reg
|
||||
echo %str_path%="~ DISABLEDXMAXIMIZEDWINDOWEDMODE HIGHDPIAWARE" >> %temp%\FixFullScreen.reg
|
||||
regedit /s %temp%\FixFullScreen.reg
|
||||
del %temp%\FixFullScreen.reg
|
||||
exit /b
|
||||
```
|
||||
|
||||
@@ -3,7 +3,7 @@ Use this guide when you want to use the Steam Deck's native gyro functionality f
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Getting-Gyro-Motion-Controls-Working-on-Steam-Deck-2b057c2edaf681a1aaade35db6e0fd1b) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
## Steamdeck
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
@@ -13,7 +13,7 @@ Use this guide when you want to use the Steam Deck's native gyro functionality f
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
### Steps
|
||||
|
||||
1. Go into Steam Deck's Desktop Mode, and use the shortcut to launch EmuDeck.
|
||||
2. Install [SteamDeckGyroDSU](https://github.com/kmicki/SteamDeckGyroDSU/releases) by going to *3rd Party Tools > Gyroscope* and clicking **Install.**
|
||||
@@ -4,15 +4,13 @@ Use this guide when you want to manually import save files for use in the Eden e
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Importing-Saves-Into-Eden-2b057c2edaf681fe968df8d63821ccae) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden emulator already set up and configured.
|
||||
- The save file(s) you want to import
|
||||
|
||||
---
|
||||
## Desktop
|
||||
|
||||
## Steps
|
||||
### Steps
|
||||
1. Open Eden and wait for it to load.
|
||||
2. Start the game and create a save file to establish the directories.
|
||||
3. *Right-Click* the game for which you want to load a save in.
|
||||
@@ -25,4 +23,8 @@ Use this guide when you want to manually import save files for use in the Eden e
|
||||
|
||||
</aside>
|
||||
7. Close the file explorer as it is no longer needed.
|
||||
8. Launch the game in Eden and verify that the save data appears through whatever method the game implements.
|
||||
8. Launch the game in Eden and verify that the save data appears through whatever method the game implements.
|
||||
|
||||
## Android
|
||||
|
||||
TBD
|
||||
@@ -1,4 +1,4 @@
|
||||
# Installing Atmosphere Mods
|
||||
# User Handbook - Installing Atmosphere Mods
|
||||
|
||||
Use this guide for when you want to install an Atmosphere-based mod for use in Eden.
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Working with Updates/DLC in Eden
|
||||
# User Handbook - Working with Updates/DLC in Eden
|
||||
|
||||
Use this guide when you want to install Updates or DLC for your games in Eden.
|
||||
|
||||
296
docs/user/Multiplayer.md
Normal file
296
docs/user/Multiplayer.md
Normal file
@@ -0,0 +1,296 @@
|
||||
# Multiplayer
|
||||
Use this guide to answer questions regarding and to start using the multiplayer functionality of Eden.
|
||||
|
||||
## Multiplayer FAQ
|
||||
This FAQ will serve as a general quick question and answer simple questions.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Multiplayer-FAQ-2c357c2edaf680fca2e9ce59969a220f) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Can Eden Play Games with a Switch Console?
|
||||
No - The only emulator that has this kind of functionality is *Ryujinx* and it's forks. This solution requires loading a custom module on a modded switch console to work.
|
||||
|
||||
### Can I Play Online Games?
|
||||
No - This would require hijacking requests to Nintendo's official servers to a custom server infrastructure built to emulate that functionality. This is how services like [*Pretendo*](https://pretendo.network/) operate. As such, you would not be able to play “Online”, you can however play multiplayer games.
|
||||
|
||||
### What's the Difference Between Online and Multiplayer?
|
||||
I have chosen the wording carefully here for a reason.
|
||||
|
||||
- Online: Games that connect to Nintendo's Official servers and allow games/functionality using that communication method are unsupported on any emulator currently (for obvious reasons).
|
||||
- Multiplayer: The ability to play with multiple players on separate systems. This is supported for games that support LDN Local Wireless.
|
||||
|
||||
The rule of thumb here is simple: If a game supports the ability to communicate without a server (Local Wireless, LAN, etc.) you will be able to play with other users. If it requires a server to function - it will not. You will need to look up if your title support Local Wireless/LAN play as an option.
|
||||
|
||||
### How Does Multiplayer Work on Eden Exactly?
|
||||
Eden's multiplayer works by emulating the Switch's local wireless (LDN) system, then tunneling that traffic over the internet through “rooms” that act like lobbies. Each player runs their own instance of the emulator, and as long as everyone joins the same room and the game supports local wireless multiplayer, the emulated consoles see each other as if they were on the same local network. This design avoids typical one-save netplay issues because every user keeps an independent save and console state while only the in-game wireless packets are forwarded through the room server. In practice, you pick or host a room, configure your network interface/port forwarding if needed, then launch any LDN-capable game; from the game's perspective it is just doing standard local wireless, while the emulator handles discovery and communication over the internet or LAN.
|
||||
|
||||
### What Do I Need to Do?
|
||||
That depends entirely on what your goal is and your level of technical ability, you have a 2 options on how to proceed.
|
||||
|
||||
1. Join a Public Lobby.
|
||||
1. If you just want to play *Mario Kart 8 Deluxe* with other people and don't care how it works or about latency - this is the option for you. See the *Joining a Multiplayer Room* section for instructions on how to do this.
|
||||
2. Host Your Own Room.
|
||||
1. This option will require you to be comfortable with accessing your router's configuration, altering firewall rules, and troubleshooting when things (inevitably) don't work out perfectly on the first try. Use this option if you want to control the room entirely, are concerned about latency issues, or just want to run something for your friends. See the *Hosting a Multiplayer Room* section for next steps*.*
|
||||
|
||||
### Can Other Platforms Play Together?
|
||||
Yes - the platform you choose to run the emulator on does not matter. Steam Deck users can play with Windows users, Android users can play with MacOS users, etc. Furthermore different emulators can play together as well (Eden/Citron/Ryubing, etc.) - but be you may want to all go to the same one if you are having issues.
|
||||
|
||||
### What Pitfalls Should I Look Out For?
|
||||
While it would be nice if everything always worked perfectly - that is not reality. Here are some things you should watch out for when attempting to play multiplayer.
|
||||
|
||||
1. Emulator Version Mismatches
|
||||
1. Occasionally updates to the emulator of choice alter how the LDN functionality is handled. In these situations, unexpected behavior can occur when trying to establish LDN connections. This is a good first step to check if you are having issues playing a game together, but can join the same lobby without issue.
|
||||
2. Game Version Mismatches
|
||||
1. It is best practice to have the game version be identical to each other in order to ensure that there is no difference in how the programs are handling the LDN logic. Games are black boxes that the dev team cannot see into to ensure the logic handling operates the same way. For this reason, it is highly advised that the game versions match across all the players. This would be a good 2nd step to check if you are having issues playing a game together, but can join the same lobby without issue.
|
||||
3. Latency
|
||||
1. Because this implementation is emulating a LAN/Local Wireless connection - it is extremely sensitive to network latency and drops. Eden has done a good job of trying to account for this and not immediately drop users out - but it is not infallible. If latency is a concern or becomes an issue - consider hosting a room.
|
||||
|
||||
---
|
||||
|
||||
## Joining a Multiplayer Room
|
||||
Use this when you need to connect to a multiplayer room for LDN functionality inside of Eden. This does not cover how to host a room, only joining existing ones.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Access-Your-Multiplayer-Room-Externally-2c357c2edaf681c0ab2ce2ee624d809d) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and functioning
|
||||
- Multiplayer Options Configured in Eden Settings
|
||||
- Network Access
|
||||
|
||||
## Steps
|
||||
There are 2 primary methods that you can use to connect to an existing room, depending on how the room is hosted.
|
||||
|
||||
- Joining a Public Lobby
|
||||
- This option allows you to view publicly hosted lobbies and join them easily. Use this option if you just want to join a room and play quickly.
|
||||
- Directly Connecting to a Room
|
||||
- Use this option if the hosted room is not on the public lobby list (private, internal network only, etc.)
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE:*** Just because a lobby appears on the public lobby list, does not mean that the hoster has properly configured the necessary port forwarding/firewall rules to allow a connection. If you cannot connect to a lobby, move onto another entry as the issue is probably not on your end. Start looking at your environment if you are unable to connect to multiple/any lobbies.
|
||||
|
||||
</aside>
|
||||
|
||||
### Joining a Public Lobby
|
||||
1. Open Eden and navigate to *Multiplayer → Browse Public Game Lobby*.
|
||||
2. The **Public Room Browser** will now open and display a list of publicly accessible rooms. Find one you want to connect to and double click it.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: Just because a room is set for a specific game, does not mean that you ***have*** to play that game in that lobby. It is generally good practice to do so, but there is no enforcement of that.
|
||||
|
||||
</aside>
|
||||
3. You will now see a window showing everyone on the lobby, or an error message.
|
||||
|
||||
### Direct Connecting to a Room
|
||||
If the hoster has not made the lobby public, or you don't want to find it in the public game browser - use this option to connect.
|
||||
|
||||
1. Open Eden and navigate to *Multiplayer → Direct Connect*.
|
||||
2. Enter the *Server Address, Port*, *Nickname* (what your user will be called in the room), and a *Password* (if the hoster set one, otherwise leave it blank) and hit **Connect.**
|
||||
3. You will now see a window showing everyone on the lobby, or an error message.
|
||||
|
||||
---
|
||||
|
||||
# Hosting a Multiplayer Room
|
||||
Use this guide for when you want to host a multiplayer lobby to play with others in Eden. In order to have someone access the room from outside your local network, see the *Access Your Multiplayer Room Externally* section for next steps.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Hosting-a-Multiplayer-Room-2c357c2edaf6819481dbe8a99926cea2) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and Functioning
|
||||
- Network Access
|
||||
- Ability to allow programs through the firewall on your device.
|
||||
|
||||
## Steps
|
||||
1. Open Eden and navigate to *Emulation → Multiplayer → Create Room.*
|
||||
2. Fill out the following information in the popup dialog box.
|
||||
|
||||
|
||||
| **Option** | **Acceptable Values** | **Default** | **Description** |
|
||||
| --- | --- | --- | --- |
|
||||
| Room Name | *Any string between 4 - 20 characters.* | *None* | Controls the name of the room and how it would appear in the Public Game Lobby/Room screen. |
|
||||
| Username | *Any string between 4 - 20 characters.* | *None* | Controls the name your user will appear as to the other users in the room. |
|
||||
| Preferred Game | *Any Game from your Game List.* | The first game on your game list | What game will the lobby be playing? You are not forced to play the game you choose and can switch games without needing to recreate the room. |
|
||||
| Password | *None or any string* | *None* | What password do you want to secure the room with, if any. |
|
||||
| Max Players | 2 - 16 | 8 | How many players do you want to allow in the room at a time? |
|
||||
| Port | 1024 - 65535 | 24872 | What port do you want to run the lobby on? Could technically be any port number, but it's best to choose an uncommon port to avoid potential conflicts. See [*Well-Known Ports*](https://en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers#Well-known_ports) for more information on ports commonly used. |
|
||||
| Room Description | *None or any string* | *None* | An optional message that elaborates on what the room is for, or for a makeshift message of the day presented to users in the lobby. |
|
||||
| Load Previous Ban List | [Checked, Unchecked] | Checked | Tells Eden to load the list containing users you have banned before. |
|
||||
| Room Type | [Public, Unlisted] | Public | Specifies whether you want the server to appear in the public game lobby browser |
|
||||
3. Click **Host Room** to start the room server. You may get a notice to allow the program through the firewall from your operating system. Allow it and then users can attempt to connect to your room.
|
||||
|
||||
---
|
||||
|
||||
# Access Your Multiplayer Room Externally
|
||||
Quite often the person with whom you want to play is located off of your internal network (LAN). If you want to host a room and play with them you will need to get your devices to communicate with each other. This guide will go over your options on how to do this so that you can play together.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Access-Your-Multiplayer-Room-Externally-2c357c2edaf681c0ab2ce2ee624d809d) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and Functioning
|
||||
- Network Access
|
||||
|
||||
## Options
|
||||
|
||||
### Port Forwarding
|
||||
|
||||
- **Difficulty Level**: High
|
||||
|
||||
<aside>
|
||||
|
||||
Use this option if you want the greatest performance/lowest latency, don't want to install any software, and have the ability to modify your networking equipment's configuration (most notably - your router). Avoid this option if you cannot modify your router's configuration or are uncomfortable with looking up things on your own.
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
Port forwarding is a networking technique that directs incoming traffic arriving at a specific port on a router or firewall to a designated device and port inside a private local network. When an external client contacts the public IP address of the router on that port, the router rewrites the packet's destination information (IP address and sometimes port number) and forwards it to the internal host that is listening on the corresponding service. This allows services such as web servers, game servers, or remote desktop sessions hosted behind NAT (Network Address Translation) to be reachable from the wider Internet despite the devices themselves having non-routable private addresses.
|
||||
|
||||
The process works by creating a static mapping—often called a “port-forward rule”—in the router's configuration. The rule specifies three pieces of data: the external (public) port, the internal (private) IP address of the target machine, and the internal port on which that machine expects the traffic. When a packet arrives, the router checks its NAT table, matches the external port to a rule, and then translates the packet's destination to the internal address before sending it onward. Responses from the internal host are similarly rewritten so they appear to come from the router's public IP, completing the bidirectional communication loop. This mechanism enables seamless access to services inside a protected LAN without exposing the entire network.
|
||||
|
||||
For our purposes we would pick the port we want to expose (*e.g. 24872*) and we would access our router's configuration and create a port-forward rule to send the traffic from an external connection to your local machine over our specified port (*24872)*. The exact way to do so, varies greatly by router manufacturer - and sometimes require contacting your ISP to do so depending on your agreement. You can look up your router on [*portforward.com*](https://portforward.com/router.htm) which may have instructions on how to do so for your specific equipment. If it is not there, you will have to use Google/ChatGPT to determine the steps for your equipment.
|
||||
|
||||
|
||||
### Use a Tunnelling Service
|
||||
- **Difficulty Level**: Easy
|
||||
|
||||
<aside>
|
||||
|
||||
Use this option if you don't want to have to worry about other users machine/configuration settings, but also cannot do port forwarding. This will still require that you as the hoster install a program and sign up for an account - but will prevent you from having to deal with port forwards or networking equipment. Avoid this option if there is not a close relay and you are getting issues with latency.
|
||||
|
||||
</aside>
|
||||
|
||||
|
||||
Using a Tunnelling service may be the solution to avoid port forward, but also avoid worrying about your users setup. A tunnelling service works by having a lightweight client run on the machine that hosts the game server. That client immediately opens an **outbound** encrypted connection (typically over TLS/QUIC) to a relay node operated by the tunnel provider's cloud infrastructure. Because outbound traffic is almost always allowed through NAT routers and ISP firewalls, the tunnel can be established even when the host sits behind carrier-grade NAT or a strict firewall. The tunnel provider then assigns a public address (e.g., `mygame.playit.gg:12345`). When a remote player connects to that address, the traffic reaches the the tunnel provider relay, which forwards it through the already-established tunnel back to the client on the private network, and finally onto the local game server's port. In effect, the server appears to the Internet as if it were listening on the public address, while the host never needs to configure port-forwarding rules or expose its own IP directly.
|
||||
|
||||
For our purposes we would spawn the listener for the port that way chose when hosting our room. The user would connect to our assigned public address/port combination, and it would be routed to our machine. The tunnel must remain active for as long as you want the connection to remain open. Closing the terminal will kill the tunnel and disconnect the users.
|
||||
|
||||
**Recommended Services:**
|
||||
- [*Playit.GG*](https://playit.gg/)
|
||||
|
||||
|
||||
### Use a VPN Service
|
||||
|
||||
- **Difficulty**: Easy
|
||||
|
||||
<aside>
|
||||
|
||||
Use this option if you don't want to use a tunnelling service, or don't want to manage the overhead of the playit gg solution, don't want to send data through the relay, or any other reason. Avoid this method if you do not want to have to manage VPN installation/configuration for your users.
|
||||
|
||||
</aside>
|
||||
|
||||
The VPN solution is a good compromise between the tunnelling solution and port forwarding. You do not have to port forward or touch your networking equipment at all - but also don't need to send all your data connections through a 3rd party relay. The big downside is that you will have to ensure all of your users have your VPN solution installed *and* that they have a valid configuration. When looking for a solution, it is advised to find one that uses the WireGuard protocol for speed, and does not require communication with a server beyond the initial handshake.
|
||||
|
||||
**Recommended Services:**
|
||||
- [*Tailscale*](https://tailscale.com/)
|
||||
- [*ZeroTier*](https://www.zerotier.com/)
|
||||
- *Self-hosted VPN Solution*
|
||||
- This is so far out of the scope of this document it has a different postal code.
|
||||
|
||||
*Check with the provider you select on the sign up and installation process specific to that provider.*
|
||||
|
||||
---
|
||||
|
||||
# Finding the Server Information for a Multiplayer Room
|
||||
Use this guide when you need to determine the connection information for the Public Multiplayer Lobby you are connected to.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Finding-the-Server-Information-for-a-Multiplayer-Room-2c557c2edaf6809e94e8ed3429b9eb26) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden set up and configured
|
||||
- Internet Access
|
||||
|
||||
## Steps
|
||||
|
||||
### Method 1: Grabbing the Address from the Log File
|
||||
1. Open Eden and Connect to the room you want to identify.
|
||||
1. See the *Joining a Multiplayer Room* section for instructions on how to do so if you need them.
|
||||
2. Go to *File → Open Eden Folder*, then open the **config** folder.
|
||||
3. Open the the **qt-config.ini** file in a text editor.
|
||||
4. Search for the following keys:
|
||||
1. `Multiplayer\ip=`
|
||||
2. `Multiplayer\port=`
|
||||
5. Copy the Server Address and Port.
|
||||
|
||||
### Method 2: Using a Web Browser
|
||||
1. Obtain the name of the room you want the information for.
|
||||
2. Open a Web Browser.
|
||||
3. Navigate to [`https://api.ynet-fun.xyz/lobby`](https://api.ynet-fun.xyz/lobby)
|
||||
4. Press *Ctrl + F* and search for the name of your room.
|
||||
5. Look for and copy the Server Address and Port.
|
||||
|
||||
### Method 3: Using a Terminal (PowerShell or CURL)
|
||||
1. Obtain the name of the room you want the information for.
|
||||
2. Open the terminal supported by your operating system.
|
||||
3. Run one of the following commands, replacing *<Name>* with the name of the server from step 1.
|
||||
|
||||
### PowerShell Command [Windows Users]
|
||||
|
||||
```powershell
|
||||
# Calls the API to get the address and port information
|
||||
(Invoke-RestMethod -Method Get -Uri "https://api.ynet-fun.xyz/lobby").rooms | Where-Object {$_.Name -eq '<NAME>'} | Select address,port | ConvertTo-Json
|
||||
|
||||
# Example Output
|
||||
#{
|
||||
# "address": "118.208.233.90",
|
||||
# "port": 5001
|
||||
#}
|
||||
```
|
||||
|
||||
### CURL Command [MacOS/Linux Users] **Requires jq*
|
||||
|
||||
```bash
|
||||
# Calls the API to get the address and port information
|
||||
curl -s "https://api.ynet-fun.xyz/lobby" | jq '.rooms[] | select(.name == "<NAME>") | {address, port}'
|
||||
|
||||
# Example Output
|
||||
#{
|
||||
# "address": "118.208.233.90",
|
||||
# "port": 5001
|
||||
#}
|
||||
```
|
||||
|
||||
4. Copy the Server Address and Port.
|
||||
|
||||
---
|
||||
|
||||
# Multiplayer for Local Co-Op Games
|
||||
Use this guide when you want to play with a friend on a different system for games that only support local co-op.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Multiplayer-for-Local-Co-Op-Games-2c657c2edaf680c59975ec6b52022a2d) for a version of this guide with images & visual elements.**
|
||||
|
||||
Occasionally you will want to play a game with a friend on a game that does not support LDN multiplayer, and only offer local co-op (multiple controllers connected to a single console), such as with *New Super Mario Bros. U Deluxe.* Emulation solutions have developed 2 primary methods for handling these cases.
|
||||
|
||||
1. Netplay: Netplay lets two or more players run the same game on their own computers while sharing each other's controller inputs over the internet, so everyone sees the same game world in sync. One player hosts the session, and the others join as guests, sending their button presses back and forth to keep the gameplay coordinated.
|
||||
1. This is a huge over-simplification of how it works, but gives you an idea
|
||||
2. Low-Latency remote desktop solutions: Using a service like *Parsec*, the host shares his screen to a remote party with an input device connected. This device sends inputs to the host machine.
|
||||
|
||||
In either situation at its core, we are emulating an input device on the host machine, so the game believes 2 controllers are connected. No current Switch emulator has a Netplay offering, so we use Parsec to accomplish this for us.
|
||||
|
||||
### Pre-Requisites
|
||||
- Eden Set Up and Fully Configured
|
||||
- A [*Parsec*](https://parsec.app/) Account
|
||||
- Parsec is free to use for personal, non-commercial use. For instructions on how to set up an account and install the client you should refer to the Parsec documentation on it's site.
|
||||
- Parsec client installed on your machine and remote (friend's) machine
|
||||
|
||||
## Steps
|
||||
|
||||
<aside>
|
||||
|
||||
This guide will assume you are the one hosting the game and go over things *Parsec* specific at a high level, as their system is subject to change. Follow *Parsec's* documentation where needed.
|
||||
|
||||
</aside>
|
||||
|
||||
1. Launch Parsec on the host machine.
|
||||
2. Connect to the other player in Parsec. You will know it is successful when the other player can see the host's screen.
|
||||
1. If you are the one hosting the game, you will have your friend initiate the remote connection you will accept.
|
||||
2. If you are joining a game, you will have to send a connection request the host will have to accept.
|
||||
3. Verify that the remote player can see the screen and that there is no issues with the connection.
|
||||
4. Launch Eden.
|
||||
5. Navigate to *Emulation → Configure*.
|
||||
6. Select the **Controls** tab.
|
||||
7. Set up your controller, if necessary.
|
||||
8. Select the **Player 2** tab and select the **Connect Controller** checkbox. This enables inputs from another device to be seen as a second controller.
|
||||
9. Dropdown the **Input Device** and select the controller.
|
||||
1. What exactly it shows up as depends on the Parsec settings.
|
||||
10. Set up the remote player's controller.
|
||||
11. Hit **OK** to apply the changes.
|
||||
12. Launch the game you want to play and enter the co-op mode. How this works depends on the game, so you will have to look in the menus or online to find out.
|
||||
@@ -4,21 +4,18 @@ Use this guide to get starting using the Eden emulator.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Eden-Quick-Start-2b057c2edaf6817b9859d8bcdb474017) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
## Windows
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
|
||||
- The [*latest C++ Redistributable*](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-supported-redistributable-version) from Microsoft.
|
||||
- Eden will not even launch without it see [*Eden Fails to Launch*](./EdenFailsToLaunch.md) for more information.
|
||||
- Eden will not even launch without it see [*Eden Fails to Launch*](./Troubleshoot.md) for more information.
|
||||
- Firmware dumped from your console
|
||||
- Keys extracted from your console
|
||||
- Games dumped from your console
|
||||
- Internet Connection
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
### Steps
|
||||
|
||||
1. Download either the *Stable* or *Nightly* Eden application.
|
||||
<aside>
|
||||
@@ -44,4 +41,39 @@ Use this guide to get starting using the Eden emulator.
|
||||
6. Navigate to **Tools → Install Firmware**, *Select **From Folder*** or ***From ZIP*** - depending on how your firmware is stored, navigate to where it is stored and select it.
|
||||
7. Double-Click the main window to add the folder containing your games.
|
||||
8. Go to *Emulation > Configure > Input* and set up your controller of choice. Click **OK** to close the dialog window.
|
||||
9. Double-Click a game to run it.
|
||||
9. Double-Click a game to run it.
|
||||
|
||||
## Steamdeck
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Firmware dumped from your console
|
||||
- Keys extracted from your console
|
||||
- Games dumped from your console
|
||||
- Internet Connection
|
||||
|
||||
### Steps
|
||||
|
||||
1. Access Steam Desktop Mode.
|
||||
2. Download either the *Stable* or *Nightly* Eden AppImage onto your Steam Deck and save it somewhere accessible.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: If you have questions about the requirements, architectures, or general information surrounding what release you need - see the [*Basics Guide*](./Basics.md) and [*Architectures Guide*](./Architectures.md).
|
||||
|
||||
</aside>
|
||||
|
||||
3. Double-Click the Eden executable to launch the program.
|
||||
<aside>
|
||||
|
||||
***NOTE***: The first time you run the AppImage you will get a notification asking you to confirm you want to launch the program. Hit **Continue**.
|
||||
|
||||
</aside>
|
||||
|
||||
4. If you have had a different Switch emulator installed, it will detect and ask if you want to import those settings. Make your selection to close the screen.
|
||||
5. Eden will now launch and notify you about missing Encryption keys. Close the dialog box by hitting **OK**.
|
||||
6. Navigate to **Tools → Install Decryption Keys**, navigate to the folder containing your ***prod.keys*** file and select the file and hit **Open**.
|
||||
7. Navigate to **Tools → Install Firmware →** *Select **From Folder*** or ***From ZIP*** - depending on how your firmware is stored, navigate to where it is stored and select it.
|
||||
8. Double-Click the main window to add the folder containing your games.
|
||||
9. Go to *Emulation > Configure > Input* and set up your controller. Click **OK** to close the dialog window.
|
||||
10. Double-Click a game to run it.
|
||||
@@ -1,42 +0,0 @@
|
||||
# Eden Quick Start
|
||||
|
||||
Use this guide to get starting using the Eden emulator on Steam Deck.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Eden-Quick-Start-2b757c2edaf680d49ffdcda291a32840) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Firmware dumped from your console
|
||||
- Keys extracted from your console
|
||||
- Games dumped from your console
|
||||
- Internet Connection
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
1. Access Steam Desktop Mode.
|
||||
2. Download either the *Stable* or *Nightly* Eden AppImage onto your Steam Deck and save it somewhere accessible.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: If you have questions about the requirements, architectures, or general information surrounding what release you need - see the [*Basics Guide*](./Basics.md) and [*Architectures Guide*](./Architectures.md).
|
||||
|
||||
</aside>
|
||||
|
||||
3. Double-Click the Eden executable to launch the program.
|
||||
<aside>
|
||||
|
||||
***NOTE***: The first time you run the AppImage you will get a notification asking you to confirm you want to launch the program. Hit **Continue**.
|
||||
|
||||
</aside>
|
||||
|
||||
4. If you have had a different Switch emulator installed, it will detect and ask if you want to import those settings. Make your selection to close the screen.
|
||||
5. Eden will now launch and notify you about missing Encryption keys. Close the dialog box by hitting **OK**.
|
||||
6. Navigate to **Tools → Install Decryption Keys**, navigate to the folder containing your ***prod.keys*** file and select the file and hit **Open**.
|
||||
7. Navigate to **Tools → Install Firmware →** *Select **From Folder*** or ***From ZIP*** - depending on how your firmware is stored, navigate to where it is stored and select it.
|
||||
8. Double-Click the main window to add the folder containing your games.
|
||||
9. Go to *Emulation > Configure > Input* and set up your controller. Click **OK** to close the dialog window.
|
||||
10. Double-Click a game to run it.
|
||||
@@ -4,13 +4,35 @@ The "FAQ".
|
||||
|
||||
This handbook is primarily aimed at the end-user - baking useful knowledge for enhancing their emulation experience.
|
||||
|
||||
## Basics
|
||||
|
||||
- **[The Basics](Basics.md)**
|
||||
- **[Quickstart](./QuickStart.md)**
|
||||
- **[Run On macOS](./RunOnMacOS.md)**
|
||||
- **[Audio](Audio.md)**
|
||||
- **[Server hosting](ServerHosting.md)**
|
||||
- **[Graphics](Graphics.md)**
|
||||
- **[Platforms and Architectures](Architectures.md)**
|
||||
- **[Testing](Testing.md)**
|
||||
- **[Data, savefiles and storage](Storage.md)**
|
||||
- **[Data, Savefiles and Storage](Storage.md)**
|
||||
- **[Orphaned Profiles](Orphaned.md)**
|
||||
- **[Troubleshooting](./Troubleshoot.md)**
|
||||
- **[Using Amiibo](./UsingAmiibo.md)**
|
||||
- **[Using Cheats](./UsingCheats.md)**
|
||||
- **[Importing Saves](./ImportingSaves.md)**
|
||||
- **[Add Eden to Steam ROM Manager](./AddEdenToSRM.md)**
|
||||
- **[Add Games to Steam ROM Manager](./AddGamesToSRM.md)**
|
||||
- **[Installing Atmosphere Mods](./InstallingAtmosphereMods.md)**
|
||||
- **[Installing Updates & DLCs](./InstallingUpdatesDLC.md)**
|
||||
- **[Controller Profiles](./ControllerProfiles.md)**
|
||||
- **[Alter Date & Time](./AlterDateTime.md)**
|
||||
|
||||
## Advanced
|
||||
|
||||
- **[How To Access Logs](./HowToAccessLogs.md)**
|
||||
- **[Gyro Controls](./GyroControls.md)**
|
||||
- **[Platforms and Architectures](Architectures.md)**
|
||||
- **[Server hosting](ServerHosting.md)**
|
||||
- **[Command Line](CommandLine.md)**
|
||||
- **[Native Application Development](Native.md)**
|
||||
- **[Adding Boolean Settings Toggles](AddingBooleanToggles.md)**
|
||||
- **[Adding Debug Knobs](./AddingDebugKnobs.md)**
|
||||
- **[Syncthing Guide](./SyncthingGuide.md)**
|
||||
- **[Testing](Testing.md)**
|
||||
|
||||
211
docs/user/SyncthingGuide.md
Normal file
211
docs/user/SyncthingGuide.md
Normal file
@@ -0,0 +1,211 @@
|
||||
# User Handbook - Backing Up/Syncing Eden Game Saves
|
||||
|
||||
Use this guide for when you want to configure automated backup/syncing of your Eden save files using [*Syncthing*](https://syncthing.net/).
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Backing-Up-Syncing-Eden-Game-Saves-2b357c2edaf68000b40cfab2c2c3dc0a) for a version of this guide with images & visual elements.**
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden already installed, configured, and functioning.
|
||||
- Devices to run Syncthing on.
|
||||
- Ability to allow a program to communicate through the firewall of your device.
|
||||
|
||||
## Introduction
|
||||
|
||||
<aside>
|
||||
|
||||
***WARNING***: You should manually back up your save files before proceeding with this guide. If you incorrectly perform the steps, you risk losing them!
|
||||
|
||||
</aside>
|
||||
|
||||
- While this is a de-centralized model without the concepts of a Server/Client, Parent/Child, etc. - For the purposes of these guides, we will borrow from this models terminology to avoid sync conflicts and potential data loss. After the initial setup, all the devices in the sync network are equals and can push & pull files from any other device.
|
||||
- In order for this to work, you should get all of the save files in Eden in the save folder on the Parent.
|
||||
- If you need help doing that, see the ***Importing Saves into Eden*** guide for the platform you elect to act as the Parent, and delete the save files on the "Child" devices.
|
||||
|
||||
### Terminology
|
||||
|
||||
- **Sync Network**: All the devices configured in *Syncthing* to push/pull files.
|
||||
- **Parent**: This will be the device that you elect to push files to the other devices. There can only be one here initially in order to avoid sync conflicts.
|
||||
- **Child**: All the other devices added to the Sync Network. These devices will pull files from the Parent.
|
||||
|
||||
## Overview
|
||||
|
||||
Rather than giving a breakdown of all the platforms and configurations, those will be in the platform’s specific guides - this will serve as a general overview of Syncthing.
|
||||
|
||||
### What is Syncthing Anyway?
|
||||
|
||||
Syncthing is a continuous file synchronization program (in the layman’s - make sure 2 or more systems with the same files are always up to date). This is perfect for game saves where we would want to play on 1 device, save our game, and then continue playing it on another device. This technology is what Epic/Steam/etc. use to allow you to do this on games run through their respective services. Syncthing is an open source implementation of this technology that you control, rather than relying on a 3rd party. This has a few key benefits, most notably - better security, privacy, and speed (when on your LAN).
|
||||
|
||||
### What are some common issues?
|
||||
|
||||
Syncthing is fairly robust and doesn’t have many issues luckily, but there are some things you should watch out for (almost all of them a user issue).
|
||||
|
||||
- Sync conflicts
|
||||
- If for whatever reason you update the same file on 2 different machines, the system does not know which updated file is considered the one to sync across. This results in a ***sync conflict*** where it may not sync the files as you would expect. Worst case scenario, this can result in your save progress being lost if you are not careful. When one of these occurs, it will create a copy of the file and store it with a specific name, like this example, *Paper Mario.sync-conflict-20251102-072925-TZBBN6S.srm.* To resolve this, you must remove the other files and remove the *.sync-conflict-<TIMESTAMP>-<Syncthing Device ID>* from the file name of the file you want to keep.
|
||||
- Accidental Deletions
|
||||
- If you delete a file from one of the devices, it will also remove the file on the other devices when they perform a sync so be careful when doing this.
|
||||
|
||||
## Windows
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden already installed, configured, and functioning.
|
||||
- Ability to allow a program to communicate through the firewall in Windows.
|
||||
- Ability to extract archive (.zip/.7z/.rar) files.
|
||||
|
||||
### Steps
|
||||
|
||||
<aside>
|
||||
|
||||
***WARNING***: You should manually back up your save files before proceeding with this guide. If you incorrectly perform the steps, you risk losing them!
|
||||
|
||||
</aside>
|
||||
|
||||
#### Downloading and Installing *Syncthing*
|
||||
|
||||
1. Download [*Syncthing Tray*](https://martchus.github.io/syncthingtray/#downloads-section).
|
||||
1. While it is available as a command line interface, for most people I would recommend *Syncthing Tray* on Windows. For most people here, you would download the **64-bit (Intel/AMD)** version.
|
||||
2. Open the downloaded archive and extract the **syncthingtray.exe** to wherever you want to store the executable.
|
||||
3. Double-Click the application to run it, select the **Start guided setup** on the splash screen that appears and press **Next**.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: You may get a Windows Defender Smart Screen pop up, this is a known thing, just accept and run anyway.
|
||||
|
||||
</aside>
|
||||
4. It will then look for an existing Syncthing instance to pull settings from, but will likely fail to do so if you are here. Regardless, select the **Yes, continue configuration** option.
|
||||
5. Select ***Start Syncthing application that is built into Syncthing Tray***, this means it will use a built in Syncthing executable rather than relying on an externally provided one. Press **Next** to continue.
|
||||
6. Check the box to start Syncthing Tray on login - as the name implies, this means the program will run automatically whenever you log onto the computer. Press Next to continue.
|
||||
7. You will now be presented with a confirmation window with your selections, confirm they are what you want and hit **Apply** to continue.
|
||||
8. You will now be prompted with a confirmation window and a message to allow it through the firewall. Allow the access through the firewall to close that pop up. The confirmation screen has a QR code and the devices identifier - you will need one of these to add other devices to the sync system.
|
||||
9. *Syncthing/Syncthing Tray* are now installed.
|
||||
|
||||
#### Configuring this Machine as a Parent
|
||||
|
||||
Use this when you want to set this machine as the initial source of truth (push files out to all the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing.**
|
||||
2. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
3. We’ll start by adding the folder with our save files that we want to sync by Pressing **+ Add Folder**.
|
||||
4. A pop-up window will appear, fill in the Folder label field with whatever you want to call it, like Switch Saves.
|
||||
5. Enter the Full folder path to where your save files are stored on this machine.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
6. Ignore the other tabs for now and hit **Save**.
|
||||
7. The folder is now ready to be shared with other devices.
|
||||
|
||||
#### Configuring this Machine as a Child
|
||||
|
||||
Use this when you want to set this machine up as a child (pull files from the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Install Syncthing Tray on the client device following the section above. Copy the child’s ID and store it so it is accessible to the Parent.
|
||||
2. ***ON THE PARENT***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already**.**
|
||||
3. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
4. Navigate down to **+ Add Remote Device**, we are going to add our Child device, so I hope you have its ID handy. If not, go back and get it.
|
||||
5. Add the ID and Name the device, the device may appear as a **nearby device**, in which case you can just click it to pre-populate the Device ID.
|
||||
6. Click the **Sharing** Tab, and check the box next to the folder you set up on the Parent (Switch Saves in my case). Hit **Save.**
|
||||
7. We are done with the parent, now **SWITCH OVER TO THE CHILD.**
|
||||
8. ***ON THE CHILD***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already**.**
|
||||
9. You should now see a connection request from the parent. Hit **+ Add Device** to add the device.
|
||||
10. Hit **Save** to finish adding the device.
|
||||
11. That pop-up will close and you will get notification that the device wants to share a folder now. Hit **Add.**
|
||||
12. Enter the path to the save folder in Eden and hit **Save.**
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
13. *Syncthing* will now pull all the files from the Parent and store them in your local save directory. At this point the files are in sync and alterations to one will affect the other and both can be considered “*Parents*” for other devices you want to add. Repeat these steps for as many devices you want.
|
||||
|
||||
## Linux
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden already installed, configured, and functioning.
|
||||
|
||||
### Step 1: Downloading and Installing Syncthing
|
||||
|
||||
<aside>
|
||||
|
||||
***WARNING***: You should manually back up your save files before proceeding with this guide. If you incorrectly perform the steps, you risk losing them!
|
||||
|
||||
</aside>
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: I am using Linux Mint for my guides, but the steps should translate pretty easily to your distro. I ***hope*** that if you are running Linux you know the basic operations. Steam Deck users should follow the guide specific to that platform.
|
||||
|
||||
</aside>
|
||||
|
||||
1. Download [*Syncthing Tray*](https://flathub.org/en/apps/io.github.martchus.syncthingtray) from the Flatpak store.
|
||||
2. Launch *Syncthing Tray* to run it, select the **Start guided setup** on the splash screen that appears and press **Next**.
|
||||
3. It will then look for an existing *Syncthing* instance to pull settings from, but will likely fail to do so if you are here. Regardless, select the **Yes, continue configuration** option.
|
||||
4. Select ***Start installed Syncthing application via Syncthing Tray***, this means it will use a built in Syncthing executable rather than relying on an externally provided one. Press **Next** to continue.
|
||||
5. You will now be presented with a confirmation window with your selections, confirm they are what you want and hit **Apply** to continue.
|
||||
6. You will now be prompted with a confirmation window that has a QR code and the devices identifier - you will need one of these to add other devices to the sync system.
|
||||
7. *Syncthing/Syncthing Tray* are now installed. Press Finish to close the pop up.
|
||||
<aside>
|
||||
|
||||
***NOTE***: By default due to flatpak sandboxing limitations, Syncthing Tray will not run automatically on login. You can get around this by following the [*instructions here*](https://github.com/flathub/io.github.martchus.syncthingtray).
|
||||
|
||||
</aside>
|
||||
|
||||
### Step 2: Configuring this Machine as a Parent
|
||||
|
||||
Use this when you want to set this machine as the initial source of truth (push files out to all the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing.**
|
||||
1. If you don’t have a taskbar in your distro, you can also reach it directly by opening a web browser to: *http://127.0.0.1:8384/.*
|
||||
2. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
3. We’ll start by adding the folder with our save files that we want to sync by Pressing **+ Add Folder**.
|
||||
4. A pop-up window will appear, fill in the Folder label field with whatever you want to call it, like Switch Saves.
|
||||
5. Enter the Full folder path to where your save files are stored on this machine.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
6. Ignore the other tabs for now and hit **Save**.
|
||||
7. The folder is now ready to be shared with other devices.
|
||||
|
||||
### Step 3: Configuring this Machine as a Child
|
||||
|
||||
Use this when you want to set this machine up as a child (pull files from the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Install Syncthing Tray on the client device following the section above. Copy the child’s ID and store it so it is accessible to the Parent.
|
||||
2. ***ON THE PARENT***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already**.**
|
||||
3. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
4. Navigate down to **+ Add Remote Device**, we are going to add our Child device, so I hope you have its ID handy. If not, go back and get it.
|
||||
5. Add the ID and Name the device, the device may appear as a **nearby device**, in which case you can just click it to pre-populate the Device ID.
|
||||
6. Click the **Sharing** Tab, and check the box next to the folder you set up on the Parent (Switch Saves in my case). Hit **Save.**
|
||||
7. We are done with the parent, now **SWITCH OVER TO THE CHILD.**
|
||||
8. ***ON THE CHILD***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already.
|
||||
9. You should now see a connection request pop-up from the parent. Hit **+ Add Device** to add the device.
|
||||
10. Hit **Save** to finish adding the device.
|
||||
11. That pop-up will close and you will get notification that the device wants to share a folder now. Hit **Add.**
|
||||
12. Enter the path to the save folder in Eden and hit **Save.**
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
13. *Syncthing* will now pull all the files from the Parent and store them in your local save directory. At this point the files are in sync and alterations to one will affect the other and both can be considered “*Parents*” for other devices you want to add. Repeat these steps for as many devices you want.
|
||||
@@ -1,66 +0,0 @@
|
||||
# Backing Up/Syncing Eden Game Saves
|
||||
|
||||
Use this guide for when you want to configure automated backup/syncing of your Eden save files using [*Syncthing*](https://syncthing.net/).
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Backing-Up-Syncing-Eden-Game-Saves-2b357c2edaf68000b40cfab2c2c3dc0a) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden already installed, configured, and functioning.
|
||||
- Devices to run Syncthing on.
|
||||
- Ability to allow a program to communicate through the firewall of your device.
|
||||
|
||||
---
|
||||
|
||||
## Platform Specific Setup Guides
|
||||
|
||||
- [*Windows*](./SyncthingGuide_Windows.md)
|
||||
- *MacOS (Coming Soon)*
|
||||
- *Steam Deck (Coming Soon)*
|
||||
- *Android (Coming Soon)*
|
||||
- [*Linux*](./SyncthingGuide_Linux.md)
|
||||
|
||||
---
|
||||
|
||||
## A Few Notes Before You Proceed
|
||||
|
||||
<aside>
|
||||
|
||||
***WARNING***: You should manually back up your save files before proceeding with this guide. If you incorrectly perform the steps, you risk losing them!
|
||||
|
||||
</aside>
|
||||
|
||||
- While this is a de-centralized model without the concepts of a Server/Client, Parent/Child, etc. - For the purposes of these guides, we will borrow from this models terminology to avoid sync conflicts and potential data loss. After the initial setup, all the devices in the sync network are equals and can push & pull files from any other device.
|
||||
- In order for this to work, you should get all of the save files in Eden in the save folder on the Parent.
|
||||
- If you need help doing that, see the ***Importing Saves into Eden*** guide for the platform you elect to act as the Parent, and delete the save files on the "Child" devices.
|
||||
|
||||
### Terminology
|
||||
|
||||
- **Sync Network**: All the devices configured in *Syncthing* to push/pull files.
|
||||
- **Parent**: This will be the device that you elect to push files to the other devices. There can only be one here initially in order to avoid sync conflicts.
|
||||
- **Child**: All the other devices added to the Sync Network. These devices will pull files from the Parent.
|
||||
|
||||
---
|
||||
|
||||
## Overview
|
||||
|
||||
Rather than giving a breakdown of all the platforms and configurations, those will be in the platform’s specific guides - this will serve as a general overview of Syncthing.
|
||||
|
||||
---
|
||||
|
||||
### What is Syncthing Anyway?
|
||||
|
||||
Syncthing is a continuous file synchronization program (in the layman’s - make sure 2 or more systems with the same files are always up to date). This is perfect for game saves where we would want to play on 1 device, save our game, and then continue playing it on another device. This technology is what Epic/Steam/etc. use to allow you to do this on games run through their respective services. Syncthing is an open source implementation of this technology that you control, rather than relying on a 3rd party. This has a few key benefits, most notably - better security, privacy, and speed (when on your LAN).
|
||||
|
||||
---
|
||||
|
||||
### What are some common issues?
|
||||
|
||||
Syncthing is fairly robust and doesn’t have many issues luckily, but there are some things you should watch out for (almost all of them a user issue).
|
||||
|
||||
- Sync conflicts
|
||||
- If for whatever reason you update the same file on 2 different machines, the system does not know which updated file is considered the one to sync across. This results in a ***sync conflict*** where it may not sync the files as you would expect. Worst case scenario, this can result in your save progress being lost if you are not careful. When one of these occurs, it will create a copy of the file and store it with a specific name, like this example, *Paper Mario.sync-conflict-20251102-072925-TZBBN6S.srm.* To resolve this, you must remove the other files and remove the *.sync-conflict-<TIMESTAMP>-<Syncthing Device ID>* from the file name of the file you want to keep.
|
||||
- Accidental Deletions
|
||||
- If you delete a file from one of the devices, it will also remove the file on the other devices when they perform a sync so be careful when doing this.
|
||||
@@ -1,96 +0,0 @@
|
||||
# Backing Up/Syncing Eden Game Saves
|
||||
|
||||
Use this guide for when you want to configure automated backup/syncing of your Eden save files using [*Syncthing*](https://syncthing.net/) on Linux.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Backing-Up-Syncing-Eden-Game-Saves-2b057c2edaf680fc8a28eba5a05fd7a3) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Read the [*Syncthing General Guide*](./SyncthingGuide_General.md).
|
||||
- Eden already installed, configured, and functioning.
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
<aside>
|
||||
|
||||
***WARNING***: You should manually back up your save files before proceeding with this guide. If you incorrectly perform the steps, you risk losing them!
|
||||
|
||||
</aside>
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: I am using Linux Mint for my guides, but the steps should translate pretty easily to your distro. I ***hope*** that if you are running Linux you know the basic operations. Steam Deck users should follow the guide specific to that platform.
|
||||
|
||||
</aside>
|
||||
|
||||
### Downloading and Installing Syncthing
|
||||
|
||||
1. Download [*Syncthing Tray*](https://flathub.org/en/apps/io.github.martchus.syncthingtray) from the Flatpak store.
|
||||
2. Launch *Syncthing Tray* to run it, select the **Start guided setup** on the splash screen that appears and press **Next**.
|
||||
3. It will then look for an existing *Syncthing* instance to pull settings from, but will likely fail to do so if you are here. Regardless, select the **Yes, continue configuration** option.
|
||||
4. Select ***Start installed Syncthing application via Syncthing Tray***, this means it will use a built in Syncthing executable rather than relying on an externally provided one. Press **Next** to continue.
|
||||
5. You will now be presented with a confirmation window with your selections, confirm they are what you want and hit **Apply** to continue.
|
||||
6. You will now be prompted with a confirmation window that has a QR code and the devices identifier - you will need one of these to add other devices to the sync system.
|
||||
7. *Syncthing/Syncthing Tray* are now installed. Press Finish to close the pop up.
|
||||
<aside>
|
||||
|
||||
***NOTE***: By default due to flatpak sandboxing limitations, Syncthing Tray will not run automatically on login. You can get around this by following the [*instructions here*](https://github.com/flathub/io.github.martchus.syncthingtray).
|
||||
|
||||
</aside>
|
||||
|
||||
---
|
||||
|
||||
### Configuring this Machine as a Parent
|
||||
|
||||
Use this when you want to set this machine as the initial source of truth (push files out to all the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing.**
|
||||
1. If you don’t have a taskbar in your distro, you can also reach it directly by opening a web browser to: *http://127.0.0.1:8384/.*
|
||||
2. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
3. We’ll start by adding the folder with our save files that we want to sync by Pressing **+ Add Folder**.
|
||||
4. A pop-up window will appear, fill in the Folder label field with whatever you want to call it, like Switch Saves.
|
||||
5. Enter the Full folder path to where your save files are stored on this machine.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
6. Ignore the other tabs for now and hit **Save**.
|
||||
7. The folder is now ready to be shared with other devices.
|
||||
|
||||
---
|
||||
|
||||
### Configuring this Machine as a Child
|
||||
|
||||
Use this when you want to set this machine up as a child (pull files from the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Install Syncthing Tray on the client device following the section above. Copy the child’s ID and store it so it is accessible to the Parent.
|
||||
2. ***ON THE PARENT***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already**.**
|
||||
3. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
4. Navigate down to **+ Add Remote Device**, we are going to add our Child device, so I hope you have its ID handy. If not, go back and get it.
|
||||
5. Add the ID and Name the device, the device may appear as a **nearby device**, in which case you can just click it to pre-populate the Device ID.
|
||||
6. Click the **Sharing** Tab, and check the box next to the folder you set up on the Parent (Switch Saves in my case). Hit **Save.**
|
||||
7. We are done with the parent, now **SWITCH OVER TO THE CHILD.**
|
||||
8. ***ON THE CHILD***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already.
|
||||
9. You should now see a connection request pop-up from the parent. Hit **+ Add Device** to add the device.
|
||||
10. Hit **Save** to finish adding the device.
|
||||
11. That pop-up will close and you will get notification that the device wants to share a folder now. Hit **Add.**
|
||||
12. Enter the path to the save folder in Eden and hit **Save.**
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
13. *Syncthing* will now pull all the files from the Parent and store them in your local save directory. At this point the files are in sync and alterations to one will affect the other and both can be considered “*Parents*” for other devices you want to add. Repeat these steps for as many devices you want.
|
||||
@@ -1,95 +0,0 @@
|
||||
# Backing Up/Syncing Eden Game Saves
|
||||
|
||||
Use this guide for when you want to configure automated backup/syncing of your Eden save files using [*Syncthing](https://syncthing.net/)* on Windows.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Backing-Up-Syncing-Eden-Game-Saves-2b057c2edaf680f5aa9cd1c4f97121ce) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Read the [*Syncthing General Guide*](./SyncthingGuide_General.md).
|
||||
- Eden already installed, configured, and functioning.
|
||||
- Ability to allow a program to communicate through the firewall in Windows.
|
||||
- Ability to extract archive (.zip/.7z/.rar) files.
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
<aside>
|
||||
|
||||
***WARNING***: You should manually back up your save files before proceeding with this guide. If you incorrectly perform the steps, you risk losing them!
|
||||
|
||||
</aside>
|
||||
|
||||
### Downloading and Installing *Syncthing*
|
||||
|
||||
1. Download [*Syncthing Tray*](https://martchus.github.io/syncthingtray/#downloads-section).
|
||||
1. While it is available as a command line interface, for most people I would recommend *Syncthing Tray* on Windows. For most people here, you would download the **64-bit (Intel/AMD)** version.
|
||||
2. Open the downloaded archive and extract the **syncthingtray.exe** to wherever you want to store the executable.
|
||||
3. Double-Click the application to run it, select the **Start guided setup** on the splash screen that appears and press **Next**.
|
||||
|
||||
<aside>
|
||||
|
||||
***NOTE***: You may get a Windows Defender Smart Screen pop up, this is a known thing, just accept and run anyway.
|
||||
|
||||
</aside>
|
||||
4. It will then look for an existing Syncthing instance to pull settings from, but will likely fail to do so if you are here. Regardless, select the **Yes, continue configuration** option.
|
||||
5. Select ***Start Syncthing application that is built into Syncthing Tray***, this means it will use a built in Syncthing executable rather than relying on an externally provided one. Press **Next** to continue.
|
||||
6. Check the box to start Syncthing Tray on login - as the name implies, this means the program will run automatically whenever you log onto the computer. Press Next to continue.
|
||||
7. You will now be presented with a confirmation window with your selections, confirm they are what you want and hit **Apply** to continue.
|
||||
8. You will now be prompted with a confirmation window and a message to allow it through the firewall. Allow the access through the firewall to close that pop up. The confirmation screen has a QR code and the devices identifier - you will need one of these to add other devices to the sync system.
|
||||
9. *Syncthing/Syncthing Tray* are now installed.
|
||||
|
||||
---
|
||||
|
||||
### Configuring this Machine as a Parent
|
||||
|
||||
Use this when you want to set this machine as the initial source of truth (push files out to all the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing.**
|
||||
2. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
3. We’ll start by adding the folder with our save files that we want to sync by Pressing **+ Add Folder**.
|
||||
4. A pop-up window will appear, fill in the Folder label field with whatever you want to call it, like Switch Saves.
|
||||
5. Enter the Full folder path to where your save files are stored on this machine.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
6. Ignore the other tabs for now and hit **Save**.
|
||||
7. The folder is now ready to be shared with other devices.
|
||||
|
||||
---
|
||||
|
||||
### Configuring this Machine as a Child
|
||||
|
||||
Use this when you want to set this machine up as a child (pull files from the other devices). Afterwards they will all be equal partners, not a parent/child relationship, this just helps with initial setup.
|
||||
|
||||
1. Install Syncthing Tray on the client device following the section above. Copy the child’s ID and store it so it is accessible to the Parent.
|
||||
2. ***ON THE PARENT***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already**.**
|
||||
3. You will now have a browser window open up to a web GUI to configure *Syncthing*. You will get a pop up about allowing anonymous usage and setting a password, make your selections to close them.
|
||||
4. Navigate down to **+ Add Remote Device**, we are going to add our Child device, so I hope you have its ID handy. If not, go back and get it.
|
||||
5. Add the ID and Name the device, the device may appear as a **nearby device**, in which case you can just click it to pre-populate the Device ID.
|
||||
6. Click the **Sharing** Tab, and check the box next to the folder you set up on the Parent (Switch Saves in my case). Hit **Save.**
|
||||
7. We are done with the parent, now **SWITCH OVER TO THE CHILD.**
|
||||
8. ***ON THE CHILD***: Right-Click the *Syncthing* Tray icon in your taskbar and select **Open Syncthing** if it is not open already**.**
|
||||
9. You should now see a connection request from the parent. Hit **+ Add Device** to add the device.
|
||||
10. Hit **Save** to finish adding the device.
|
||||
11. That pop-up will close and you will get notification that the device wants to share a folder now. Hit **Add.**
|
||||
12. Enter the path to the save folder in Eden and hit **Save.**
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way to do this would be to open Eden, right-click a game that has a save, hit ***Open Save Data Location,*** and then go up 1 directory. It should contain folders with the TitleID of your games.
|
||||
|
||||
It should look similar to this: ..*\nand\user\save\0000000000000000\EC573727F509799675F6E5112C581D7E*
|
||||
|
||||
</aside>
|
||||
|
||||
13. *Syncthing* will now pull all the files from the Parent and store them in your local save directory. At this point the files are in sync and alterations to one will affect the other and both can be considered “*Parents*” for other devices you want to add. Repeat these steps for as many devices you want.
|
||||
@@ -2,6 +2,11 @@
|
||||
|
||||
While this is mainly aimed for testers - normal users can benefit from these guidelines to make their life easier when trying to outline and/or report an issue.
|
||||
|
||||
## Getting logs
|
||||
|
||||
In order to get more information, you can find logs in the following location:
|
||||
|
||||
|
||||
## How to Test a PR Against the Based Master When Issues Arise
|
||||
|
||||
When you're testing a pull request (PR) and encounter unexpected behavior, it's important to determine whether the issue was introduced by the PR or if it already exists in the base code. To do this, compare the behavior against the based master branch.
|
||||
|
||||
@@ -6,3 +6,4 @@ While most of the links mentioned in this guide are relatively "safe"; we urge u
|
||||
|
||||
- [Nightly Eden builds](https://github.com/pflyly/eden-nightly)
|
||||
- [NixOS Eden Flake](https://github.com/Grantimatter/eden-flake)
|
||||
- [ES-DE Frontend Support](https://github.com/GlazedBelmont/es-de-android-custom-systems)
|
||||
|
||||
@@ -1,10 +1,22 @@
|
||||
# Eden Fails to Launch and Does Not Leave Any Logs
|
||||
# User Handbook - Troubleshooting
|
||||
|
||||
## Vulkan initialization error
|
||||
|
||||
- Ensure you have the latest drivers
|
||||
- Uninstall old drivers, for Windows you can use [Display Driver Uninstaller](https://www.guru3d.com/download/display-driver-uninstaller-download/)
|
||||
- Change backend manually in the settings file (set it from `0` to `1` or viceversa).
|
||||
- Disconnect your second monitor, if any
|
||||
|
||||
## This mod only works on an Emulator
|
||||
|
||||
- Enable RNG seed
|
||||
- Set RNG seed to 0
|
||||
|
||||
## Eden Fails to Launch and Does Not Leave Any Logs
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Windows-Eden-Fails-to-Launch-and-Does-Not-Leave-Any-Logs-2b057c2edaf68156b640cf1ac549870a) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
## Error Details
|
||||
### Error Details
|
||||
|
||||
*Behavior*: Program appears not to launch or exits immediately without leaving any log entries.
|
||||
*Platform(s) Affected*:
|
||||
@@ -32,13 +44,11 @@ Faulting package-relative application ID:
|
||||
|
||||
---
|
||||
|
||||
## Causes
|
||||
### Causes
|
||||
|
||||
<aside>
|
||||
|
||||
### Issue 1: Missing C++ Redistributable
|
||||
|
||||
---
|
||||
#### Issue 1: Missing C++ Redistributable
|
||||
|
||||
*Eden requires the latest C++ redistributable from Microsoft in order to run. Like many other programs, it relies on aspects and libraries included in this runtime, without it - the program cannot run.*
|
||||
|
||||
@@ -50,9 +60,7 @@ Faulting package-relative application ID:
|
||||
|
||||
<aside>
|
||||
|
||||
### Issue 2: Corrupted System Files
|
||||
|
||||
---
|
||||
#### Issue 2: Corrupted System Files
|
||||
|
||||
*A corruption of necessary system files can cause odd behaviors when Eden tries to access them. It is a very rare case and you would likely see other programs misbehaving if this is what your issue is, but you can try if you have no other options.*
|
||||
|
||||
@@ -88,4 +96,4 @@ Faulting package-relative application ID:
|
||||
|
||||
8. Reboot your computer.
|
||||
9. Launch Eden and verify it is now working.
|
||||
</aside>
|
||||
</aside>
|
||||
@@ -1,10 +1,14 @@
|
||||
# Using Amiibo with Eden
|
||||
# User Handbook - Using Amiibo
|
||||
|
||||
Use this guide when you want to load Amiibo into your games for use with the Eden emulator.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Using-Amiibo-with-Eden-2b057c2edaf681b1b28ec6be600c6d3e) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
## Android
|
||||
|
||||
TBD
|
||||
|
||||
## Desktop
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
@@ -17,9 +21,7 @@ Use this guide when you want to load Amiibo into your games for use with the Ede
|
||||
|
||||
</aside>
|
||||
|
||||
## Steps
|
||||
|
||||
---
|
||||
### Steps
|
||||
|
||||
1. Launch Eden and launch the game you want to load Amiibo for.
|
||||
<aside>
|
||||
@@ -40,4 +42,4 @@ Use this guide when you want to load Amiibo into your games for use with the Ede
|
||||
</aside>
|
||||
|
||||
5. Upon loading a valid file, you will get a confirmation screen and your bonus content will be unlocked/functionality activated.
|
||||
6. Repeat with any other Amiibo you want to use.
|
||||
6. Repeat with any other Amiibo you want to use.
|
||||
@@ -1,10 +1,10 @@
|
||||
# Using Cheats with Eden
|
||||
# User Handbook - Using Cheats
|
||||
|
||||
Use this guide when you want to add cheats into a game to alter gameplay for use with the Eden emulator.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Using-Cheats-with-Eden-2b057c2edaf6818fab66c276e2304bb4) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
## Android
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
@@ -21,11 +21,7 @@ Another option would be to launch the game in Eden and close it - then go into t
|
||||
|
||||
</aside>
|
||||
|
||||
---
|
||||
|
||||
## Steps
|
||||
|
||||
### Configuring a Cheat
|
||||
### Step 1: Configuring a Cheat
|
||||
|
||||
1. Create a directory somewhere accessible on your phone with the name of the cheat. The name you choose only affects how it is displayed in Eden.
|
||||
2. Create a directory inside of this folder called **cheats.**
|
||||
@@ -52,9 +48,7 @@ Another option would be to launch the game in Eden and close it - then go into t
|
||||
2. You should now see the cheat appear in the **Add-ons** screen.
|
||||
3. Launch the game and confirm that the cheat is applied.
|
||||
|
||||
---
|
||||
|
||||
### Multiple Cheats
|
||||
### Step 2: Multiple Cheats
|
||||
|
||||
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory. You **cannot** install multiple cheats with a single file.
|
||||
|
||||
@@ -79,9 +73,7 @@ Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Wi
|
||||
040E0000 0048A818 52800028
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Enabling/Disabling Cheats
|
||||
### Step 3: Enabling/Disabling Cheats
|
||||
|
||||
Cheats are enabled by default, but can be disabled so they don’t affect gameplay fairly easily using the game properties.
|
||||
|
||||
@@ -89,4 +81,76 @@ Cheats are enabled by default, but can be disabled so they don’t affect gamepl
|
||||
2. Scroll down on the properties until you see **Add-ons**, select this option.
|
||||
3. *Select/Deselect* the name of the cheat you wish to enable/disable.
|
||||
4. Click **OK** to close the window.
|
||||
5. Launch the game to confirm the cheat is/is not active.
|
||||
5. Launch the game to confirm the cheat is/is not active.
|
||||
|
||||
## Desktop
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden Emulator fully set up and configured
|
||||
- The cheat(s) you want to apply
|
||||
- The **Build ID** of the game.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way I have found to find the Build ID is by Right-Clicking the game **IN RYUJINX** and hitting **Manage Cheats**. Your Build ID will be displayed at the top.
|
||||
|
||||
Another option would be to launch the game in Eden and close it - then go into the log and look for a line like this - the first 16 characters if your Build ID. **Make sure that it is the MAIN line**.
|
||||
`[ 27.098382] Loader <Info> core/file_sys/patch_manager.cpp:HasNSOPatch:304: Querying NSO patch existence for build_id=AEE6DCCC06D9C05B42061E2019123A61, name=main`
|
||||
|
||||
</aside>
|
||||
|
||||
### Step 1: Configuring a Cheat
|
||||
|
||||
1. Copy the Hex Code of the cheat into a text file, optionally with the cheat name at the beginning like the example. Here this code will set the timer to 999 in *New Super Mario Bros. U Deluxe.*
|
||||
|
||||
```bash
|
||||
[Time = 999]
|
||||
58000000 00C88A70
|
||||
78001000 00000090
|
||||
64000000 00000000 003E6F00
|
||||
```
|
||||
|
||||
1. Save the file as a **txt** file with the Build ID of the game. For my example, my Build ID is **AEE6DCCC06D9C05B** so my file would be `AEE6DCCC06D9C05B.txt`.
|
||||
2. Launch Eden and wait for the program to load.
|
||||
3. *Right-Click* the game in Eden and select **Open Mod Data Location**. A file explorer window should appear.
|
||||
4. Create a folder inside of the file explorer window with the name of the cheat. This name does not matter and only affects how it appears in the game properties inside of Eden.
|
||||
5. Navigate inside of this folder and create another folder called **cheats.**
|
||||
6. Move the txt file you created earlier into this **cheats** folder. (e.g. `<mod_location>/Time 999/cheats/AEE6DCCC06D9C05B.txt` )
|
||||
7. Go back to Eden and *right-click* the game. Select *Configure Game* and you should now see the cheat you created appear in the **Add-Ons** section with the name of the folder from step 6.
|
||||
8. Launch the game to verify that the cheat is enabled.
|
||||
|
||||
### Step 2: Multiple Cheats
|
||||
|
||||
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory. You **cannot** install multiple cheats with a single file.
|
||||
|
||||
Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Windows or anything that can run Python) that can take a file with multiple cheats and create the files/structure for you with a provided Build ID. To download and run it, see the [GitHub Project](https://github.com/Ninjistix/nxCheat_Splitter) page.
|
||||
|
||||
**Example cheat TXT file with multiple cheats. It must be in this format to work:**
|
||||
```
|
||||
[Super Mario Bros. Wonder - Various] <- Optional
|
||||
|
||||
[♯ 1. Always Star Power]
|
||||
040E0000 00880580 52800035
|
||||
|
||||
[♯ 2. Star Power + Bubble Mode (Invincible)]
|
||||
040E0000 00880580 52800075
|
||||
|
||||
[♯ 3. Can Fast Travel to Any Course and World]
|
||||
040E0000 00935E10 52800036
|
||||
040E0000 0048A528 52800028
|
||||
040E0000 005D9F58 52800028
|
||||
|
||||
[♯ 4. Got All Top of Flag Poles]
|
||||
040E0000 0048A818 52800028
|
||||
```
|
||||
|
||||
### Step 3: Enabling/Disabling Cheats
|
||||
|
||||
Cheats are enabled by default, but can be disabled so they don’t affect gameplay fairly easily using the game properties.
|
||||
|
||||
1. *Right-Click* the game and select *Configure Game*.
|
||||
2. In the **Add-Ons** section, locate the cheat you wish to enable.
|
||||
3. *Select/Deselect* the name of the cheat you wish to enable/disable.
|
||||
4. Click **OK** to close the window.
|
||||
5. Launch the game to confirm the cheat is/is not active.
|
||||
@@ -1,83 +0,0 @@
|
||||
# Using Cheats with Eden
|
||||
|
||||
Use this guide when you want to add cheats into a game to alter gameplay for use with the Eden emulator.
|
||||
|
||||
**Click [Here](https://evilperson1337.notion.site/Using-Cheats-with-Eden-2b057c2edaf6818fab66c276e2304bb4) for a version of this guide with images & visual elements.**
|
||||
|
||||
---
|
||||
|
||||
### Pre-Requisites
|
||||
|
||||
- Eden Emulator fully set up and configured
|
||||
- The cheat(s) you want to apply
|
||||
- The **Build ID** of the game.
|
||||
|
||||
<aside>
|
||||
|
||||
***TIP***: The easiest way I have found to find the Build ID is by Right-Clicking the game **IN RYUJINX** and hitting **Manage Cheats**. Your Build ID will be displayed at the top.
|
||||
|
||||
Another option would be to launch the game in Eden and close it - then go into the log and look for a line like this - the first 16 characters if your Build ID. **Make sure that it is the MAIN line**.
|
||||
`[ 27.098382] Loader <Info> core/file_sys/patch_manager.cpp:HasNSOPatch:304: Querying NSO patch existence for build_id=AEE6DCCC06D9C05B42061E2019123A61, name=main`
|
||||
|
||||
</aside>
|
||||
|
||||
## Steps
|
||||
|
||||
---
|
||||
|
||||
### Configuring a Cheat
|
||||
|
||||
1. Copy the Hex Code of the cheat into a text file, optionally with the cheat name at the beginning like the example. Here this code will set the timer to 999 in *New Super Mario Bros. U Deluxe.*
|
||||
|
||||
```bash
|
||||
[Time = 999]
|
||||
58000000 00C88A70
|
||||
78001000 00000090
|
||||
64000000 00000000 003E6F00
|
||||
```
|
||||
|
||||
1. Save the file as a **txt** file with the Build ID of the game. For my example, my Build ID is **AEE6DCCC06D9C05B** so my file would be `AEE6DCCC06D9C05B.txt`.
|
||||
2. Launch Eden and wait for the program to load.
|
||||
3. *Right-Click* the game in Eden and select **Open Mod Data Location**. A file explorer window should appear.
|
||||
4. Create a folder inside of the file explorer window with the name of the cheat. This name does not matter and only affects how it appears in the game properties inside of Eden.
|
||||
5. Navigate inside of this folder and create another folder called **cheats.**
|
||||
6. Move the txt file you created earlier into this **cheats** folder. (e.g. `<mod_location>/Time 999/cheats/AEE6DCCC06D9C05B.txt` )
|
||||
7. Go back to Eden and *right-click* the game. Select *Configure Game* and you should now see the cheat you created appear in the **Add-Ons** section with the name of the folder from step 6.
|
||||
8. Launch the game to verify that the cheat is enabled.
|
||||
|
||||
### Multiple Cheats
|
||||
|
||||
In order to install multiple cheats, you must repeat the steps above with the new cheat, creating a new directory with the name of the cheat and cheats directory. You **cannot** install multiple cheats with a single file.
|
||||
|
||||
Community Member [Ninjistix](https://github.com/Ninjistix) created a utility (Windows or anything that can run Python) that can take a file with multiple cheats and create the files/structure for you with a provided Build ID. To download and run it, see the [GitHub Project](https://github.com/Ninjistix/nxCheat_Splitter) page.
|
||||
|
||||
**Example cheat TXT file with multiple cheats. It must be in this format to work:**
|
||||
```
|
||||
[Super Mario Bros. Wonder - Various] <- Optional
|
||||
|
||||
[♯ 1. Always Star Power]
|
||||
040E0000 00880580 52800035
|
||||
|
||||
[♯ 2. Star Power + Bubble Mode (Invincible)]
|
||||
040E0000 00880580 52800075
|
||||
|
||||
[♯ 3. Can Fast Travel to Any Course and World]
|
||||
040E0000 00935E10 52800036
|
||||
040E0000 0048A528 52800028
|
||||
040E0000 005D9F58 52800028
|
||||
|
||||
[♯ 4. Got All Top of Flag Poles]
|
||||
040E0000 0048A818 52800028
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### Enabling/Disabling Cheats
|
||||
|
||||
Cheats are enabled by default, but can be disabled so they don’t affect gameplay fairly easily using the game properties.
|
||||
|
||||
1. *Right-Click* the game and select *Configure Game*.
|
||||
2. In the **Add-Ons** section, locate the cheat you wish to enable.
|
||||
3. *Select/Deselect* the name of the cheat you wish to enable/disable.
|
||||
4. Click **OK** to close the window.
|
||||
5. Launch the game to confirm the cheat is/is not active.
|
||||
6
externals/CMakeLists.txt
vendored
6
externals/CMakeLists.txt
vendored
@@ -267,9 +267,11 @@ if (ANDROID AND ARCHITECTURE_arm64)
|
||||
AddJsonPackage(libadrenotools)
|
||||
endif()
|
||||
|
||||
if (UNIX AND NOT APPLE AND NOT TARGET gamemode::headers)
|
||||
AddJsonPackage(gamemode)
|
||||
|
||||
if (gamemode_ADDED)
|
||||
add_library(gamemode INTERFACE)
|
||||
target_include_directories(gamemode INTERFACE gamemode)
|
||||
target_include_directories(gamemode INTERFACE ${gamemode_SOURCE_DIR}/lib)
|
||||
add_library(gamemode::headers ALIAS gamemode)
|
||||
endif()
|
||||
|
||||
|
||||
7
externals/cpmfile.json
vendored
7
externals/cpmfile.json
vendored
@@ -218,5 +218,12 @@
|
||||
"artifact": "MoltenVK-macOS.tar",
|
||||
"hash": "5695b36ca5775819a71791557fcb40a4a5ee4495be6b8442e0b666d0c436bec02aae68cc6210183f7a5c986bdbec0e117aecfad5396e496e9c2fd5c89133a347",
|
||||
"bundled": true
|
||||
},
|
||||
"gamemode": {
|
||||
"repo": "FeralInteractive/gamemode",
|
||||
"sha": "ce6fe122f3",
|
||||
"hash": "e87ec14ed3e826d578ebf095c41580069dda603792ba91efa84f45f4571a28f4d91889675055fd6f042d7dc25b0b9443daf70963ae463e38b11bcba95f4c65a9",
|
||||
"version": "1.7",
|
||||
"find_args": "MODULE"
|
||||
}
|
||||
}
|
||||
|
||||
6
externals/ffmpeg/cpmfile.json
vendored
6
externals/ffmpeg/cpmfile.json
vendored
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"ffmpeg": {
|
||||
"repo": "FFmpeg/FFmpeg",
|
||||
"sha": "ddf443f1e9",
|
||||
"hash": "ded1c313843f23805102565bd3ca92602fb9c2951e059ca5e1a486ab3ef7d589acccf3cde05c5ff0cfc5199c3a261dccb4d2a93254e585824850696fb41a292e",
|
||||
"sha": "5e56937b74",
|
||||
"hash": "9ab0457dcd6ce6359b5053c1662f57910d332f68ca0cca9d4134d858464840917027374de3d97e0863c3a7daaea2fe4f4cd17d1c6d8e7f740f4ad91e71c2932b",
|
||||
"bundled": true
|
||||
},
|
||||
"ffmpeg-ci": {
|
||||
@@ -10,7 +10,7 @@
|
||||
"package": "FFmpeg",
|
||||
"name": "ffmpeg",
|
||||
"repo": "crueter-ci/FFmpeg",
|
||||
"version": "8.0-ddf443f1e9",
|
||||
"version": "8.0.1-5e56937b74",
|
||||
"min_version": "4.1"
|
||||
}
|
||||
}
|
||||
|
||||
376
externals/gamemode/gamemode_client.h
vendored
376
externals/gamemode/gamemode_client.h
vendored
@@ -1,376 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2017-2019, Feral Interactive
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of Feral Interactive nor the names of its contributors
|
||||
may be used to endorse or promote products derived from this software
|
||||
without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
#ifndef CLIENT_GAMEMODE_H
|
||||
#define CLIENT_GAMEMODE_H
|
||||
/*
|
||||
* GameMode supports the following client functions
|
||||
* Requests are refcounted in the daemon
|
||||
*
|
||||
* int gamemode_request_start() - Request gamemode starts
|
||||
* 0 if the request was sent successfully
|
||||
* -1 if the request failed
|
||||
*
|
||||
* int gamemode_request_end() - Request gamemode ends
|
||||
* 0 if the request was sent successfully
|
||||
* -1 if the request failed
|
||||
*
|
||||
* GAMEMODE_AUTO can be defined to make the above two functions apply during static init and
|
||||
* destruction, as appropriate. In this configuration, errors will be printed to stderr
|
||||
*
|
||||
* int gamemode_query_status() - Query the current status of gamemode
|
||||
* 0 if gamemode is inactive
|
||||
* 1 if gamemode is active
|
||||
* 2 if gamemode is active and this client is registered
|
||||
* -1 if the query failed
|
||||
*
|
||||
* int gamemode_request_start_for(pid_t pid) - Request gamemode starts for another process
|
||||
* 0 if the request was sent successfully
|
||||
* -1 if the request failed
|
||||
* -2 if the request was rejected
|
||||
*
|
||||
* int gamemode_request_end_for(pid_t pid) - Request gamemode ends for another process
|
||||
* 0 if the request was sent successfully
|
||||
* -1 if the request failed
|
||||
* -2 if the request was rejected
|
||||
*
|
||||
* int gamemode_query_status_for(pid_t pid) - Query status of gamemode for another process
|
||||
* 0 if gamemode is inactive
|
||||
* 1 if gamemode is active
|
||||
* 2 if gamemode is active and this client is registered
|
||||
* -1 if the query failed
|
||||
*
|
||||
* const char* gamemode_error_string() - Get an error string
|
||||
* returns a string describing any of the above errors
|
||||
*
|
||||
* Note: All the above requests can be blocking - dbus requests can and will block while the daemon
|
||||
* handles the request. It is not recommended to make these calls in performance critical code
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <dlfcn.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
static char internal_gamemode_client_error_string[512] = { 0 };
|
||||
|
||||
/**
|
||||
* Load libgamemode dynamically to dislodge us from most dependencies.
|
||||
* This allows clients to link and/or use this regardless of runtime.
|
||||
* See SDL2 for an example of the reasoning behind this in terms of
|
||||
* dynamic versioning as well.
|
||||
*/
|
||||
static volatile int internal_libgamemode_loaded = 1;
|
||||
|
||||
/* Typedefs for the functions to load */
|
||||
typedef int (*api_call_return_int)(void);
|
||||
typedef const char *(*api_call_return_cstring)(void);
|
||||
typedef int (*api_call_pid_return_int)(pid_t);
|
||||
|
||||
/* Storage for functors */
|
||||
static api_call_return_int REAL_internal_gamemode_request_start = NULL;
|
||||
static api_call_return_int REAL_internal_gamemode_request_end = NULL;
|
||||
static api_call_return_int REAL_internal_gamemode_query_status = NULL;
|
||||
static api_call_return_cstring REAL_internal_gamemode_error_string = NULL;
|
||||
static api_call_pid_return_int REAL_internal_gamemode_request_start_for = NULL;
|
||||
static api_call_pid_return_int REAL_internal_gamemode_request_end_for = NULL;
|
||||
static api_call_pid_return_int REAL_internal_gamemode_query_status_for = NULL;
|
||||
|
||||
/**
|
||||
* Internal helper to perform the symbol binding safely.
|
||||
*
|
||||
* Returns 0 on success and -1 on failure
|
||||
*/
|
||||
__attribute__((always_inline)) static inline int internal_bind_libgamemode_symbol(
|
||||
void *handle, const char *name, void **out_func, size_t func_size, bool required)
|
||||
{
|
||||
void *symbol_lookup = NULL;
|
||||
char *dl_error = NULL;
|
||||
|
||||
/* Safely look up the symbol */
|
||||
symbol_lookup = dlsym(handle, name);
|
||||
dl_error = dlerror();
|
||||
if (required && (dl_error || !symbol_lookup)) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"dlsym failed - %s",
|
||||
dl_error);
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Have the symbol correctly, copy it to make it usable */
|
||||
memcpy(out_func, &symbol_lookup, func_size);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads libgamemode and needed functions
|
||||
*
|
||||
* Returns 0 on success and -1 on failure
|
||||
*/
|
||||
__attribute__((always_inline)) static inline int internal_load_libgamemode(void)
|
||||
{
|
||||
/* We start at 1, 0 is a success and -1 is a fail */
|
||||
if (internal_libgamemode_loaded != 1) {
|
||||
return internal_libgamemode_loaded;
|
||||
}
|
||||
|
||||
/* Anonymous struct type to define our bindings */
|
||||
struct binding {
|
||||
const char *name;
|
||||
void **functor;
|
||||
size_t func_size;
|
||||
bool required;
|
||||
} bindings[] = {
|
||||
{ "real_gamemode_request_start",
|
||||
(void **)&REAL_internal_gamemode_request_start,
|
||||
sizeof(REAL_internal_gamemode_request_start),
|
||||
true },
|
||||
{ "real_gamemode_request_end",
|
||||
(void **)&REAL_internal_gamemode_request_end,
|
||||
sizeof(REAL_internal_gamemode_request_end),
|
||||
true },
|
||||
{ "real_gamemode_query_status",
|
||||
(void **)&REAL_internal_gamemode_query_status,
|
||||
sizeof(REAL_internal_gamemode_query_status),
|
||||
false },
|
||||
{ "real_gamemode_error_string",
|
||||
(void **)&REAL_internal_gamemode_error_string,
|
||||
sizeof(REAL_internal_gamemode_error_string),
|
||||
true },
|
||||
{ "real_gamemode_request_start_for",
|
||||
(void **)&REAL_internal_gamemode_request_start_for,
|
||||
sizeof(REAL_internal_gamemode_request_start_for),
|
||||
false },
|
||||
{ "real_gamemode_request_end_for",
|
||||
(void **)&REAL_internal_gamemode_request_end_for,
|
||||
sizeof(REAL_internal_gamemode_request_end_for),
|
||||
false },
|
||||
{ "real_gamemode_query_status_for",
|
||||
(void **)&REAL_internal_gamemode_query_status_for,
|
||||
sizeof(REAL_internal_gamemode_query_status_for),
|
||||
false },
|
||||
};
|
||||
|
||||
void *libgamemode = NULL;
|
||||
|
||||
/* Try and load libgamemode */
|
||||
libgamemode = dlopen("libgamemode.so.0", RTLD_NOW);
|
||||
if (!libgamemode) {
|
||||
/* Attempt to load unversioned library for compatibility with older
|
||||
* versions (as of writing, there are no ABI changes between the two -
|
||||
* this may need to change if ever ABI-breaking changes are made) */
|
||||
libgamemode = dlopen("libgamemode.so", RTLD_NOW);
|
||||
if (!libgamemode) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"dlopen failed - %s",
|
||||
dlerror());
|
||||
internal_libgamemode_loaded = -1;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Attempt to bind all symbols */
|
||||
for (size_t i = 0; i < sizeof(bindings) / sizeof(bindings[0]); i++) {
|
||||
struct binding *binder = &bindings[i];
|
||||
|
||||
if (internal_bind_libgamemode_symbol(libgamemode,
|
||||
binder->name,
|
||||
binder->functor,
|
||||
binder->func_size,
|
||||
binder->required)) {
|
||||
internal_libgamemode_loaded = -1;
|
||||
return -1;
|
||||
};
|
||||
}
|
||||
|
||||
/* Success */
|
||||
internal_libgamemode_loaded = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect to the real libgamemode
|
||||
*/
|
||||
__attribute__((always_inline)) static inline const char *gamemode_error_string(void)
|
||||
{
|
||||
/* If we fail to load the system gamemode, or we have an error string already, return our error
|
||||
* string instead of diverting to the system version */
|
||||
if (internal_load_libgamemode() < 0 || internal_gamemode_client_error_string[0] != '\0') {
|
||||
return internal_gamemode_client_error_string;
|
||||
}
|
||||
|
||||
/* Assert for static analyser that the function is not NULL */
|
||||
assert(REAL_internal_gamemode_error_string != NULL);
|
||||
|
||||
return REAL_internal_gamemode_error_string();
|
||||
}
|
||||
|
||||
/**
|
||||
* Redirect to the real libgamemode
|
||||
* Allow automatically requesting game mode
|
||||
* Also prints errors as they happen.
|
||||
*/
|
||||
#ifdef GAMEMODE_AUTO
|
||||
__attribute__((constructor))
|
||||
#else
|
||||
__attribute__((always_inline)) static inline
|
||||
#endif
|
||||
int gamemode_request_start(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Assert for static analyser that the function is not NULL */
|
||||
assert(REAL_internal_gamemode_request_start != NULL);
|
||||
|
||||
if (REAL_internal_gamemode_request_start() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
#ifdef GAMEMODE_AUTO
|
||||
__attribute__((destructor))
|
||||
#else
|
||||
__attribute__((always_inline)) static inline
|
||||
#endif
|
||||
int gamemode_request_end(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Assert for static analyser that the function is not NULL */
|
||||
assert(REAL_internal_gamemode_request_end != NULL);
|
||||
|
||||
if (REAL_internal_gamemode_request_end() < 0) {
|
||||
#ifdef GAMEMODE_AUTO
|
||||
fprintf(stderr, "gamemodeauto: %s\n", gamemode_error_string());
|
||||
#endif
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
__attribute__((always_inline)) static inline int gamemode_query_status(void)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_query_status == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"gamemode_query_status missing (older host?)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return REAL_internal_gamemode_query_status();
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
__attribute__((always_inline)) static inline int gamemode_request_start_for(pid_t pid)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_start_for == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"gamemode_request_start_for missing (older host?)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return REAL_internal_gamemode_request_start_for(pid);
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
__attribute__((always_inline)) static inline int gamemode_request_end_for(pid_t pid)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_request_end_for == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"gamemode_request_end_for missing (older host?)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return REAL_internal_gamemode_request_end_for(pid);
|
||||
}
|
||||
|
||||
/* Redirect to the real libgamemode */
|
||||
__attribute__((always_inline)) static inline int gamemode_query_status_for(pid_t pid)
|
||||
{
|
||||
/* Need to load gamemode */
|
||||
if (internal_load_libgamemode() < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (REAL_internal_gamemode_query_status_for == NULL) {
|
||||
snprintf(internal_gamemode_client_error_string,
|
||||
sizeof(internal_gamemode_client_error_string),
|
||||
"gamemode_query_status_for missing (older host?)");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return REAL_internal_gamemode_query_status_for(pid);
|
||||
}
|
||||
|
||||
#endif // CLIENT_GAMEMODE_H
|
||||
@@ -1,5 +1,5 @@
|
||||
let
|
||||
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.05";
|
||||
nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-25.11";
|
||||
pkgs = import nixpkgs { config = {}; overlays = []; };
|
||||
in
|
||||
pkgs.mkShellNoCC {
|
||||
|
||||
@@ -24,7 +24,6 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
||||
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||
<uses-permission android:name="android.permission.VIBRATE" />
|
||||
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" android:required="false" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
|
||||
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
@@ -18,6 +18,7 @@ import android.content.IntentFilter
|
||||
import android.content.res.Configuration
|
||||
import android.graphics.Rect
|
||||
import android.graphics.drawable.Icon
|
||||
import android.hardware.input.InputManager
|
||||
import android.hardware.Sensor
|
||||
import android.hardware.SensorEvent
|
||||
import android.hardware.SensorEventListener
|
||||
@@ -63,11 +64,12 @@ import kotlin.math.roundToInt
|
||||
import org.yuzu.yuzu_emu.utils.ForegroundService
|
||||
import androidx.core.os.BundleCompat
|
||||
|
||||
class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
class EmulationActivity : AppCompatActivity(), SensorEventListener, InputManager.InputDeviceListener {
|
||||
private lateinit var binding: ActivityEmulationBinding
|
||||
|
||||
var isActivityRecreated = false
|
||||
private lateinit var nfcReader: NfcReader
|
||||
private lateinit var inputManager: InputManager
|
||||
|
||||
private var touchDownTime: Long = 0
|
||||
private val maxTapDuration = 500L
|
||||
@@ -140,6 +142,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
nfcReader = NfcReader(this)
|
||||
nfcReader.initialize()
|
||||
|
||||
inputManager = getSystemService(INPUT_SERVICE) as InputManager
|
||||
inputManager.registerInputDeviceListener(this, null)
|
||||
|
||||
foregroundService = Intent(this, ForegroundService::class.java)
|
||||
startForegroundService(foregroundService)
|
||||
|
||||
@@ -206,9 +211,9 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
inputManager.unregisterInputDeviceListener(this)
|
||||
stopForegroundService(this)
|
||||
NativeLibrary.playTimeManagerStop()
|
||||
|
||||
}
|
||||
|
||||
override fun onUserLeaveHint() {
|
||||
@@ -244,8 +249,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
val isPhysicalKeyboard = event.source and InputDevice.SOURCE_KEYBOARD == InputDevice.SOURCE_KEYBOARD &&
|
||||
event.device?.isVirtual == false
|
||||
|
||||
if (event.source and InputDevice.SOURCE_JOYSTICK != InputDevice.SOURCE_JOYSTICK &&
|
||||
event.source and InputDevice.SOURCE_GAMEPAD != InputDevice.SOURCE_GAMEPAD &&
|
||||
val isControllerInput = event.source and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK ||
|
||||
event.source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD
|
||||
|
||||
if (!isControllerInput &&
|
||||
event.source and InputDevice.SOURCE_MOUSE != InputDevice.SOURCE_MOUSE &&
|
||||
!isPhysicalKeyboard
|
||||
) {
|
||||
@@ -256,12 +263,18 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
return super.dispatchKeyEvent(event)
|
||||
}
|
||||
|
||||
if (isControllerInput && event.action == KeyEvent.ACTION_DOWN) {
|
||||
notifyControllerInput()
|
||||
}
|
||||
|
||||
return InputHandler.dispatchKeyEvent(event)
|
||||
}
|
||||
|
||||
override fun dispatchGenericMotionEvent(event: MotionEvent): Boolean {
|
||||
if (event.source and InputDevice.SOURCE_JOYSTICK != InputDevice.SOURCE_JOYSTICK &&
|
||||
event.source and InputDevice.SOURCE_GAMEPAD != InputDevice.SOURCE_GAMEPAD &&
|
||||
val isControllerInput = event.source and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK ||
|
||||
event.source and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD
|
||||
|
||||
if (!isControllerInput &&
|
||||
event.source and InputDevice.SOURCE_KEYBOARD != InputDevice.SOURCE_KEYBOARD &&
|
||||
event.source and InputDevice.SOURCE_MOUSE != InputDevice.SOURCE_MOUSE
|
||||
) {
|
||||
@@ -277,9 +290,54 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
return true
|
||||
}
|
||||
|
||||
if (isControllerInput) {
|
||||
notifyControllerInput()
|
||||
}
|
||||
|
||||
return InputHandler.dispatchGenericMotionEvent(event)
|
||||
}
|
||||
|
||||
private fun notifyControllerInput() {
|
||||
val navHostFragment =
|
||||
supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment
|
||||
val emulationFragment =
|
||||
navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment
|
||||
emulationFragment?.onControllerInputDetected()
|
||||
}
|
||||
|
||||
private fun isGameController(deviceId: Int): Boolean {
|
||||
val device = InputDevice.getDevice(deviceId) ?: return false
|
||||
val sources = device.sources
|
||||
return sources and InputDevice.SOURCE_GAMEPAD == InputDevice.SOURCE_GAMEPAD ||
|
||||
sources and InputDevice.SOURCE_JOYSTICK == InputDevice.SOURCE_JOYSTICK
|
||||
}
|
||||
|
||||
override fun onInputDeviceAdded(deviceId: Int) {
|
||||
if (isGameController(deviceId)) {
|
||||
InputHandler.updateControllerData()
|
||||
val navHostFragment =
|
||||
supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment
|
||||
val emulationFragment =
|
||||
navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment
|
||||
emulationFragment?.onControllerConnected()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onInputDeviceRemoved(deviceId: Int) {
|
||||
InputHandler.updateControllerData()
|
||||
val navHostFragment =
|
||||
supportFragmentManager.findFragmentById(R.id.fragment_container) as? NavHostFragment
|
||||
val emulationFragment =
|
||||
navHostFragment?.childFragmentManager?.fragments?.firstOrNull() as? org.yuzu.yuzu_emu.fragments.EmulationFragment
|
||||
emulationFragment?.onControllerDisconnected()
|
||||
}
|
||||
|
||||
override fun onInputDeviceChanged(deviceId: Int) {
|
||||
if (isGameController(deviceId)) {
|
||||
InputHandler.updateControllerData()
|
||||
}
|
||||
}
|
||||
|
||||
override fun onSensorChanged(event: SensorEvent) {
|
||||
val rotation = this.display?.rotation
|
||||
if (rotation == Surface.ROTATION_90) {
|
||||
@@ -519,8 +577,10 @@ class EmulationActivity : AppCompatActivity(), SensorEventListener {
|
||||
when (event.action) {
|
||||
MotionEvent.ACTION_DOWN -> {
|
||||
touchDownTime = System.currentTimeMillis()
|
||||
// show overlay immediately on touch and cancel timer
|
||||
if (!emulationViewModel.drawerOpen.value) {
|
||||
// show overlay immediately on touch and cancel timer when only auto-hide is enabled
|
||||
if (!emulationViewModel.drawerOpen.value &&
|
||||
BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.getBoolean() &&
|
||||
!BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) {
|
||||
fragment.handler.removeCallbacksAndMessages(null)
|
||||
fragment.showOverlay()
|
||||
}
|
||||
|
||||
@@ -6,10 +6,15 @@
|
||||
|
||||
package org.yuzu.yuzu_emu.adapters
|
||||
|
||||
import android.view.Gravity
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import androidx.constraintlayout.widget.ConstraintLayout
|
||||
import org.yuzu.yuzu_emu.R
|
||||
import org.yuzu.yuzu_emu.databinding.ListItemAddonBinding
|
||||
import org.yuzu.yuzu_emu.model.Patch
|
||||
import org.yuzu.yuzu_emu.model.PatchType
|
||||
import org.yuzu.yuzu_emu.model.AddonViewModel
|
||||
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder
|
||||
|
||||
@@ -27,18 +32,95 @@ class AddonAdapter(val addonViewModel: AddonViewModel) :
|
||||
binding.addonSwitch.performClick()
|
||||
}
|
||||
binding.title.text = model.name
|
||||
binding.version.text = model.version
|
||||
binding.addonSwitch.isChecked = model.enabled
|
||||
|
||||
binding.addonSwitch.setOnCheckedChangeListener(null)
|
||||
binding.addonSwitch.isChecked = model.enabled
|
||||
binding.addonSwitch.setOnCheckedChangeListener { _, checked ->
|
||||
model.enabled = checked
|
||||
}
|
||||
|
||||
val deleteAction = {
|
||||
addonViewModel.setAddonToDelete(model)
|
||||
val isCheat = model.isCheat()
|
||||
val indentPx = if (isCheat) {
|
||||
binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_large)
|
||||
} else {
|
||||
0
|
||||
}
|
||||
(binding.addonCard.layoutParams as? ViewGroup.MarginLayoutParams)?.let {
|
||||
it.marginStart = indentPx
|
||||
binding.addonCard.layoutParams = it
|
||||
}
|
||||
|
||||
if (isCheat) {
|
||||
binding.version.visibility = View.GONE
|
||||
binding.deleteCard.visibility = View.GONE
|
||||
binding.buttonDelete.visibility = View.GONE
|
||||
|
||||
binding.addonSwitch.scaleX = 0.7f
|
||||
binding.addonSwitch.scaleY = 0.7f
|
||||
|
||||
val compactPaddingVertical = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_small)
|
||||
binding.root.setPadding(
|
||||
binding.root.paddingLeft,
|
||||
compactPaddingVertical / 2,
|
||||
binding.root.paddingRight,
|
||||
compactPaddingVertical / 2
|
||||
)
|
||||
|
||||
val innerLayout = binding.addonCard.getChildAt(0) as? ViewGroup
|
||||
innerLayout?.let {
|
||||
val leftPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_large)
|
||||
val smallPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_med)
|
||||
it.setPadding(leftPadding, smallPadding, smallPadding, smallPadding)
|
||||
}
|
||||
|
||||
binding.title.textSize = 14f
|
||||
binding.title.gravity = Gravity.CENTER_VERTICAL
|
||||
|
||||
(binding.title.layoutParams as? ConstraintLayout.LayoutParams)?.let { params ->
|
||||
params.topToTop = ConstraintLayout.LayoutParams.PARENT_ID
|
||||
params.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID
|
||||
params.topMargin = 0
|
||||
binding.title.layoutParams = params
|
||||
}
|
||||
} else {
|
||||
binding.version.visibility = View.VISIBLE
|
||||
binding.version.text = model.version
|
||||
binding.deleteCard.visibility = View.VISIBLE
|
||||
binding.buttonDelete.visibility = View.VISIBLE
|
||||
|
||||
binding.addonSwitch.scaleX = 1.0f
|
||||
binding.addonSwitch.scaleY = 1.0f
|
||||
|
||||
val normalPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_med)
|
||||
binding.root.setPadding(
|
||||
binding.root.paddingLeft,
|
||||
normalPadding,
|
||||
binding.root.paddingRight,
|
||||
normalPadding
|
||||
)
|
||||
|
||||
val innerLayout = binding.addonCard.getChildAt(0) as? ViewGroup
|
||||
innerLayout?.let {
|
||||
val normalInnerPadding = binding.root.context.resources.getDimensionPixelSize(R.dimen.spacing_medlarge)
|
||||
it.setPadding(normalInnerPadding, normalInnerPadding, normalInnerPadding, normalInnerPadding)
|
||||
}
|
||||
|
||||
binding.title.textSize = 16f
|
||||
binding.title.gravity = Gravity.START
|
||||
|
||||
(binding.title.layoutParams as? ConstraintLayout.LayoutParams)?.let { params ->
|
||||
params.topToTop = ConstraintLayout.LayoutParams.PARENT_ID
|
||||
params.bottomToBottom = ConstraintLayout.LayoutParams.UNSET
|
||||
params.topMargin = 0
|
||||
binding.title.layoutParams = params
|
||||
}
|
||||
|
||||
val deleteAction = {
|
||||
addonViewModel.setAddonToDelete(model)
|
||||
}
|
||||
binding.deleteCard.setOnClickListener { deleteAction() }
|
||||
binding.buttonDelete.setOnClickListener { deleteAction() }
|
||||
}
|
||||
binding.deleteCard.setOnClickListener { deleteAction() }
|
||||
binding.buttonDelete.setOnClickListener { deleteAction() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,7 +25,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
||||
RENDERER_FAST_GPU("use_fast_gpu_time"),
|
||||
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
||||
RENDERER_EARLY_RELEASE_FENCES("early_release_fences"),
|
||||
SYNC_MEMORY_OPERATIONS("sync_memory_operations"),
|
||||
BUFFER_REORDER_DISABLE("disable_buffer_reorder"),
|
||||
RENDERER_DEBUG("debug"),
|
||||
@@ -52,11 +51,8 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
||||
SHOW_FW_VERSION("show_firmware_version"),
|
||||
|
||||
SOC_OVERLAY_BACKGROUND("soc_overlay_background"),
|
||||
|
||||
FRAME_INTERPOLATION("frame_interpolation"),
|
||||
// FRAME_SKIPPING("frame_skipping"),
|
||||
|
||||
ENABLE_INPUT_OVERLAY_AUTO_HIDE("enable_input_overlay_auto_hide"),
|
||||
HIDE_OVERLAY_ON_CONTROLLER_INPUT("hide_overlay_on_controller_input"),
|
||||
|
||||
PERF_OVERLAY_BACKGROUND("perf_overlay_background"),
|
||||
SHOW_PERFORMANCE_OVERLAY("show_performance_overlay"),
|
||||
|
||||
@@ -236,21 +236,6 @@ abstract class SettingsItem(
|
||||
|
||||
override fun reset() = BooleanSetting.USE_DOCKED_MODE.reset()
|
||||
}
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.FRAME_INTERPOLATION,
|
||||
titleId = R.string.frame_interpolation,
|
||||
descriptionId = R.string.frame_interpolation_description
|
||||
)
|
||||
)
|
||||
|
||||
// put(
|
||||
// SwitchSetting(
|
||||
// BooleanSetting.FRAME_SKIPPING,
|
||||
// titleId = R.string.frame_skipping,
|
||||
// descriptionId = R.string.frame_skipping_description
|
||||
// )
|
||||
// )
|
||||
|
||||
put(
|
||||
SwitchSetting(
|
||||
@@ -402,6 +387,13 @@ abstract class SettingsItem(
|
||||
valueHint = R.string.seconds
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT,
|
||||
titleId = R.string.hide_overlay_on_controller_input,
|
||||
descriptionId = R.string.hide_overlay_on_controller_input_description
|
||||
)
|
||||
)
|
||||
|
||||
put(
|
||||
SwitchSetting(
|
||||
@@ -704,13 +696,6 @@ abstract class SettingsItem(
|
||||
descriptionId = R.string.renderer_reactive_flushing_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.RENDERER_EARLY_RELEASE_FENCES,
|
||||
titleId = R.string.renderer_early_release_fences,
|
||||
descriptionId = R.string.renderer_early_release_fences_description
|
||||
)
|
||||
)
|
||||
put(
|
||||
SwitchSetting(
|
||||
BooleanSetting.SYNC_MEMORY_OPERATIONS,
|
||||
|
||||
@@ -274,6 +274,7 @@ class SettingsFragmentPresenter(
|
||||
sl.apply {
|
||||
add(BooleanSetting.ENABLE_INPUT_OVERLAY_AUTO_HIDE.key)
|
||||
add(IntSetting.INPUT_OVERLAY_AUTO_HIDE.key)
|
||||
add(BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.key)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -460,10 +461,8 @@ class SettingsFragmentPresenter(
|
||||
add(IntSetting.RENDERER_SAMPLE_SHADING_FRACTION.key)
|
||||
|
||||
add(HeaderSetting(R.string.veil_renderer))
|
||||
add(BooleanSetting.RENDERER_EARLY_RELEASE_FENCES.key)
|
||||
add(IntSetting.DMA_ACCURACY.key)
|
||||
add(BooleanSetting.BUFFER_REORDER_DISABLE.key)
|
||||
add(BooleanSetting.FRAME_INTERPOLATION.key)
|
||||
add(BooleanSetting.RENDERER_FAST_GPU.key)
|
||||
add(IntSetting.FAST_GPU_TIME.key)
|
||||
add(IntSetting.RENDERER_SHADER_BACKEND.key)
|
||||
|
||||
@@ -100,7 +100,7 @@ class AboutFragment : Fragment() {
|
||||
}
|
||||
|
||||
binding.buttonDiscord.setOnClickListener { openLink(getString(R.string.discord_link)) }
|
||||
binding.buttonRevolt.setOnClickListener { openLink(getString(R.string.revolt_link)) }
|
||||
binding.buttonStoat.setOnClickListener { openLink(getString(R.string.stoat_link)) }
|
||||
binding.buttonX.setOnClickListener { openLink(getString(R.string.x_link)) }
|
||||
binding.buttonWebsite.setOnClickListener { openLink(getString(R.string.website_link)) }
|
||||
binding.buttonGithub.setOnClickListener { openLink(getString(R.string.github_link)) }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// SPDX-FileCopyrightText: 2025 Eden Emulator Project
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
package org.yuzu.yuzu_emu.fragments
|
||||
@@ -73,7 +73,7 @@ class AddonsFragment : Fragment() {
|
||||
}
|
||||
|
||||
addonViewModel.addonList.collect(viewLifecycleOwner) {
|
||||
(binding.listAddons.adapter as AddonAdapter).submitList(it)
|
||||
(binding.listAddons.adapter as AddonAdapter).submitList(it.toList())
|
||||
}
|
||||
addonViewModel.showModInstallPicker.collect(
|
||||
viewLifecycleOwner,
|
||||
@@ -127,7 +127,9 @@ class AddonsFragment : Fragment() {
|
||||
|
||||
override fun onDestroy() {
|
||||
super.onDestroy()
|
||||
addonViewModel.onCloseAddons()
|
||||
if (!requireActivity().isChangingConfigurations) {
|
||||
addonViewModel.onCloseAddons()
|
||||
}
|
||||
}
|
||||
|
||||
val installAddon =
|
||||
|
||||
@@ -93,7 +93,6 @@ import org.yuzu.yuzu_emu.utils.collect
|
||||
import org.yuzu.yuzu_emu.utils.CustomSettingsHandler
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.File
|
||||
import kotlin.coroutines.coroutineContext
|
||||
import kotlin.coroutines.resume
|
||||
import kotlin.coroutines.suspendCoroutine
|
||||
|
||||
@@ -106,6 +105,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
val handler = Handler(Looper.getMainLooper())
|
||||
private var isOverlayVisible = true
|
||||
private var controllerInputReceived = false
|
||||
|
||||
private var _binding: FragmentEmulationBinding? = null
|
||||
|
||||
@@ -656,6 +656,12 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
BooleanSetting.SHOW_INPUT_OVERLAY.setBoolean(newState)
|
||||
updateQuickOverlayMenuEntry(newState)
|
||||
binding.surfaceInputOverlay.refreshControls()
|
||||
// Sync view visibility with the setting
|
||||
if (newState) {
|
||||
showOverlay()
|
||||
} else {
|
||||
hideOverlay()
|
||||
}
|
||||
NativeConfig.saveGlobalConfig()
|
||||
true
|
||||
}
|
||||
@@ -1127,14 +1133,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
val actualFps = perfStats[FPS]
|
||||
|
||||
if (BooleanSetting.SHOW_FPS.getBoolean(needsGlobal)) {
|
||||
val enableFrameInterpolation =
|
||||
BooleanSetting.FRAME_INTERPOLATION.getBoolean()
|
||||
// val enableFrameSkipping = BooleanSetting.FRAME_SKIPPING.getBoolean()
|
||||
|
||||
var fpsText = String.format("FPS: %.1f", actualFps)
|
||||
if (enableFrameInterpolation) {
|
||||
fpsText = String.format("eFPS: %.1f", actualFps)
|
||||
}
|
||||
sb.append(fpsText)
|
||||
}
|
||||
|
||||
@@ -1908,7 +1907,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
companion object {
|
||||
fun fromValue(value: Int): AmiiboState =
|
||||
values().firstOrNull { it.value == value } ?: Disabled
|
||||
entries.firstOrNull { it.value == value } ?: Disabled
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1921,7 +1920,7 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
|
||||
companion object {
|
||||
fun fromValue(value: Int): AmiiboLoadResult =
|
||||
values().firstOrNull { it.value == value } ?: Unknown
|
||||
entries.firstOrNull { it.value == value } ?: Unknown
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1978,6 +1977,8 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
fun showOverlay() {
|
||||
if (!isOverlayVisible) {
|
||||
isOverlayVisible = true
|
||||
// Reset controller input flag so controller can hide overlay again
|
||||
controllerInputReceived = false
|
||||
ViewUtils.showView(binding.surfaceInputOverlay, 500)
|
||||
}
|
||||
}
|
||||
@@ -1985,7 +1986,26 @@ class EmulationFragment : Fragment(), SurfaceHolder.Callback {
|
||||
private fun hideOverlay() {
|
||||
if (isOverlayVisible) {
|
||||
isOverlayVisible = false
|
||||
ViewUtils.hideView(binding.surfaceInputOverlay, 500)
|
||||
ViewUtils.hideView(binding.surfaceInputOverlay)
|
||||
}
|
||||
}
|
||||
|
||||
fun onControllerInputDetected() {
|
||||
if (!BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) return
|
||||
if (!BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) return
|
||||
if (controllerInputReceived) return
|
||||
controllerInputReceived = true
|
||||
hideOverlay()
|
||||
}
|
||||
|
||||
fun onControllerConnected() {
|
||||
controllerInputReceived = false
|
||||
}
|
||||
|
||||
fun onControllerDisconnected() {
|
||||
if (!BooleanSetting.HIDE_OVERLAY_ON_CONTROLLER_INPUT.getBoolean()) return
|
||||
if (!BooleanSetting.SHOW_INPUT_OVERLAY.getBoolean()) return
|
||||
controllerInputReceived = false
|
||||
showOverlay()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -28,10 +31,14 @@ class AddonViewModel : ViewModel() {
|
||||
val addonToDelete = _addonToDelete.asStateFlow()
|
||||
|
||||
var game: Game? = null
|
||||
private set
|
||||
|
||||
private val isRefreshing = AtomicBoolean(false)
|
||||
|
||||
fun onOpenAddons(game: Game) {
|
||||
if (this.game?.programId == game.programId && _patchList.value.isNotEmpty()) {
|
||||
return
|
||||
}
|
||||
this.game = game
|
||||
refreshAddons()
|
||||
}
|
||||
@@ -47,8 +54,7 @@ class AddonViewModel : ViewModel() {
|
||||
NativeLibrary.getPatchesForFile(game!!.path, game!!.programId)
|
||||
?: emptyArray()
|
||||
).toMutableList()
|
||||
patchList.sortBy { it.name }
|
||||
_patchList.value = patchList
|
||||
_patchList.value = sortPatchesWithCheatsGrouped(patchList)
|
||||
isRefreshing.set(false)
|
||||
}
|
||||
}
|
||||
@@ -63,7 +69,9 @@ class AddonViewModel : ViewModel() {
|
||||
PatchType.Update -> NativeLibrary.removeUpdate(patch.programId)
|
||||
PatchType.DLC -> NativeLibrary.removeDLC(patch.programId)
|
||||
PatchType.Mod -> NativeLibrary.removeMod(patch.programId, patch.name)
|
||||
PatchType.Cheat -> {}
|
||||
}
|
||||
_patchList.value.clear()
|
||||
refreshAddons()
|
||||
}
|
||||
|
||||
@@ -78,7 +86,7 @@ class AddonViewModel : ViewModel() {
|
||||
if (it.enabled) {
|
||||
null
|
||||
} else {
|
||||
it.name
|
||||
it.getStorageKey()
|
||||
}
|
||||
}.toTypedArray()
|
||||
)
|
||||
@@ -94,4 +102,28 @@ class AddonViewModel : ViewModel() {
|
||||
fun showModNoticeDialog(show: Boolean) {
|
||||
_showModNoticeDialog.value = show
|
||||
}
|
||||
|
||||
private fun sortPatchesWithCheatsGrouped(patches: MutableList<Patch>): MutableList<Patch> {
|
||||
val individualCheats = patches.filter { it.isCheat() }
|
||||
val nonCheats = patches.filter { !it.isCheat() }.sortedBy { it.name }
|
||||
|
||||
val cheatsByParent = individualCheats.groupBy { it.parentName }
|
||||
|
||||
val result = mutableListOf<Patch>()
|
||||
for (patch in nonCheats) {
|
||||
result.add(patch)
|
||||
cheatsByParent[patch.name]?.sortedBy { it.name }?.let { childCheats ->
|
||||
result.addAll(childCheats)
|
||||
}
|
||||
}
|
||||
|
||||
val knownParents = nonCheats.map { it.name }.toSet()
|
||||
for ((parentName, orphanCheats) in cheatsByParent) {
|
||||
if (parentName !in knownParents) {
|
||||
result.addAll(orphanCheats.sortedBy { it.name })
|
||||
}
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -12,5 +15,24 @@ data class Patch(
|
||||
val version: String,
|
||||
val type: Int,
|
||||
val programId: String,
|
||||
val titleId: String
|
||||
)
|
||||
val titleId: String,
|
||||
val parentName: String = "" // For cheats: name of the mod folder containing them
|
||||
) {
|
||||
/**
|
||||
* Returns the storage key used for saving enabled/disabled state.
|
||||
* For cheats with a parent, returns "ParentName::CheatName".
|
||||
*/
|
||||
fun getStorageKey(): String {
|
||||
return if (parentName.isNotEmpty()) {
|
||||
"$parentName::$name"
|
||||
} else {
|
||||
name
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns true if this patch is an individual cheat entry (not a cheat mod).
|
||||
* Individual cheats have type=Cheat and a parent mod name.
|
||||
*/
|
||||
fun isCheat(): Boolean = type == PatchType.Cheat.int && parentName.isNotEmpty()
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -6,7 +9,8 @@ package org.yuzu.yuzu_emu.model
|
||||
enum class PatchType(val int: Int) {
|
||||
Update(0),
|
||||
DLC(1),
|
||||
Mod(2);
|
||||
Mod(2),
|
||||
Cheat(3);
|
||||
|
||||
companion object {
|
||||
fun from(int: Int): PatchType = entries.firstOrNull { it.int == int } ?: Update
|
||||
|
||||
@@ -92,6 +92,11 @@ namespace AndroidSettings {
|
||||
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> hide_overlay_on_controller_input{linkage, false,
|
||||
"hide_overlay_on_controller_input",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true,
|
||||
true};
|
||||
Settings::Setting<bool> perf_overlay_background{linkage, false, "perf_overlay_background",
|
||||
Settings::Category::Overlay,
|
||||
Settings::Specialization::Default, true,
|
||||
|
||||
@@ -1298,7 +1298,10 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env
|
||||
FileSys::VirtualFile update_raw;
|
||||
loader->ReadUpdateRaw(update_raw);
|
||||
|
||||
auto patches = pm.GetPatches(update_raw);
|
||||
// Get build ID for individual cheat enumeration
|
||||
const auto build_id = pm.GetBuildID(update_raw);
|
||||
|
||||
auto patches = pm.GetPatches(update_raw, build_id);
|
||||
jobjectArray jpatchArray =
|
||||
env->NewObjectArray(patches.size(), Common::Android::GetPatchClass(), nullptr);
|
||||
int i = 0;
|
||||
@@ -1308,7 +1311,8 @@ jobjectArray Java_org_yuzu_yuzu_1emu_NativeLibrary_getPatchesForFile(JNIEnv* env
|
||||
Common::Android::ToJString(env, patch.name),
|
||||
Common::Android::ToJString(env, patch.version), static_cast<jint>(patch.type),
|
||||
Common::Android::ToJString(env, std::to_string(patch.program_id)),
|
||||
Common::Android::ToJString(env, std::to_string(patch.title_id)));
|
||||
Common::Android::ToJString(env, std::to_string(patch.title_id)),
|
||||
Common::Android::ToJString(env, patch.parent_name));
|
||||
env->SetObjectArrayElement(jpatchArray, i, jpatch);
|
||||
++i;
|
||||
}
|
||||
|
||||
@@ -220,12 +220,12 @@
|
||||
app:iconPadding="0dp" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
android:id="@+id/button_revolt"
|
||||
android:id="@+id/button_stoat"
|
||||
style="@style/EdenButton.Secondary"
|
||||
android:layout_width="56dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_marginEnd="12dp"
|
||||
app:icon="@drawable/ic_revolt"
|
||||
app:icon="@drawable/ic_stoat"
|
||||
app:iconGravity="textStart"
|
||||
app:iconSize="24dp"
|
||||
app:iconPadding="0dp" />
|
||||
@@ -270,4 +270,4 @@
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -215,12 +215,12 @@
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
style="@style/EdenButton.Secondary"
|
||||
android:id="@+id/button_revolt"
|
||||
android:id="@+id/button_stoat"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="56dp"
|
||||
android:layout_weight="1"
|
||||
android:layout_marginEnd="8dp"
|
||||
app:icon="@drawable/ic_revolt"
|
||||
app:icon="@drawable/ic_stoat"
|
||||
app:iconSize="24dp"
|
||||
app:iconGravity="textStart"
|
||||
app:iconPadding="0dp" />
|
||||
@@ -235,7 +235,7 @@
|
||||
app:icon="@drawable/ic_x"
|
||||
app:iconSize="24dp"
|
||||
app:iconGravity="textStart"
|
||||
app:iconPadding="0dp" />
|
||||
app:iconPadding="0dp" />
|
||||
|
||||
<com.google.android.material.button.MaterialButton
|
||||
style="@style/EdenButton.Secondary"
|
||||
@@ -267,4 +267,4 @@
|
||||
|
||||
</androidx.core.widget.NestedScrollView>
|
||||
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">كثافة تمرير تظليل العينة. تؤدي القيم الأعلى إلى تحسين الجودة بشكل أكبر، ولكنها تقلل أيضًا من الأداء إلى حد كبير.</string>
|
||||
|
||||
<string name="veil_renderer">العارض</string>
|
||||
<string name="frame_interpolation">تحسين سرعة الإطارات</string>
|
||||
<string name="frame_interpolation_description">يضمن تسليمًا سلسًا ومتناسقًا للإطارات من خلال مزامنة التوقيت بينها، مما يقلل من التقطيع وعدم انتظام الحركة. مثالي للألعاب التي تعاني من عدم استقرار في توقيت الإطارات أو تقطع دقيق أثناء اللعب.</string>
|
||||
<string name="renderer_early_release_fences">إطلاق الأسوار مبكرًا</string>
|
||||
<string name="renderer_early_release_fences_description">يساعد في إصلاح مشكلة 0 إطار في الثانية في ألعاب مثل DKCR:HD وSubnautica Below Zero وOri 2، ولكن قد يتسبب في تعطيل التحميل أو الأداء في ألعاب Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">مزامنة عمليات الذاكرة</string>
|
||||
<string name="sync_memory_operations_description">يضمن اتساق البيانات بين عمليات الحوسبة والذاكرة. هذا الخيار قد يحل المشكلات في بعض الألعاب، ولكن قد يقلل الأداء في بعض الحالات. يبدو أن الألعاب التي تستخدم Unreal Engine 4 هي الأكثر تأثرًا.</string>
|
||||
<string name="buffer_reorder_disable">تعطيل إعادة ترتيب المخزن المؤقت</string>
|
||||
@@ -472,8 +468,6 @@
|
||||
<string name="display">الشاشة</string>
|
||||
<string name="processing">تأثيرات بعد المعالجة</string>
|
||||
|
||||
<string name="frame_skipping">قيد التطوير: تخطي الإطارات</string>
|
||||
<string name="frame_skipping_description">تبديل تخطي الإطارات لتحسين الأداء عن طريق تقليل عدد الإطارات المعروضة. هذه الميزة قيد التطوير وسيتم تمكينها في الإصدارات المستقبلية.</string>
|
||||
<string name="renderer_accuracy">مستوى الدقة</string>
|
||||
<string name="renderer_resolution">الدقة (الإرساء/محمول)</string>
|
||||
<string name="renderer_vsync">VSync وضع</string>
|
||||
@@ -884,11 +878,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">لاشيء</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">عادي</string>
|
||||
<string name="renderer_accuracy_high">عالي</string>
|
||||
<string name="renderer_accuracy_extreme">أقصى</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">افتراضي</string>
|
||||
<string name="dma_accuracy_unsafe">غير آمن</string>
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">چڕی تێپەڕاندنی سێبەرکردنی نموونە. بەهای زیاتر کوالێتی باشتر دەکات بەڵام کارایی زیاتر کەم دەکاتەوە.</string>
|
||||
|
||||
<string name="veil_renderer">رێندرەر</string>
|
||||
<string name="frame_interpolation">تحسين توقيت الإطارات</string>
|
||||
<string name="frame_interpolation_description">يضمن تسليمًا سلسًا ومتناسقًا للإطارات من خلال مزامنة التوقيت بينها، مما يقلل من التقطيع وعدم انتظام الحركة. مثالي للألعاب التي تعاني من عدم استقرار في توقيت الإطارات أو تقطع دقيق أثناء اللعب.</string>
|
||||
<string name="renderer_early_release_fences">زێدەکردنی پەرستارەکان زووتر</string>
|
||||
<string name="renderer_early_release_fences_description">یارمەتی دەدات لە چارەسەری 0 FPS لە یارییەکانی وەک DKCR:HD، Subnautica Below Zero و Ori 2، بەڵام ڕەنگە بارکردن یان کارایی لە یارییەکانی Unreal Engine تێکبدات.</string>
|
||||
<string name="sync_memory_operations">هاوبەشیی کردارەکانی بیرگە</string>
|
||||
<string name="sync_memory_operations_description">دڵنیایی داتا لە نێوان کردارەکانی کۆمپیوتەر و بیرگە. ئەم هەڵبژاردە کێشەکان لە هەندێک یاری چارەسەر دەکات، بەڵام لە هەندێک حاڵەت کارایی کەم دەکاتەوە. وا دیارە یارییەکانی Unreal Engine 4 زۆرترین کاریگەریان هەیە.</string>
|
||||
<string name="buffer_reorder_disable">ڕێکخستنەوەی بافر ناچالاک بکە</string>
|
||||
@@ -382,8 +378,6 @@
|
||||
<string name="display">پیشاندان</string>
|
||||
<string name="processing">پاشپڕۆسەکردن</string>
|
||||
|
||||
<string name="frame_skipping">قيد التطوير: تخطي الإطارات</string>
|
||||
<string name="frame_skipping_description">تێپەڕاندنی فرەیمەکان بکە بۆ باشترکردنی کارایی بە کەمکردنەوەی ژمارەی فرەیمە ڕێندرکراوەکان. ئەم تایبەتمەندییە هێشتا کاردەکرێت و لە وەشانە داهاتووەکاندا چالاکدەکرێت.</string>
|
||||
<string name="renderer_accuracy">ئاستی وردبینی</string>
|
||||
<string name="renderer_resolution">ڕوونی (دۆخی دەستی/دۆخی دۆک)</string>
|
||||
<string name="renderer_vsync">دۆخی VSync</string>
|
||||
@@ -629,9 +623,6 @@
|
||||
<string name="renderer_vulkan">ڤوڵکان</string>
|
||||
<string name="renderer_none">هیچ</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">ئاسایی</string>
|
||||
<string name="renderer_accuracy_high">بەرز</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">بنەڕەتی</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">Intenzita průchodu stínování vzorku. Vyšší hodnoty zlepšují kvalitu, ale také výrazněji snižují výkon.</string>
|
||||
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="frame_interpolation">Vylepšené časování snímků</string>
|
||||
<string name="frame_interpolation_description">Zajišťuje plynulé a konzistentní zobrazování snímků synchronizací jejich časování, čímž snižuje trhání a nerovnoměrné animace. Ideální pro hry, které trpí nestabilitou časování snímků nebo mikrotrháním během hraní.</string>
|
||||
<string name="renderer_early_release_fences">Uvolnit ploty brzy</string>
|
||||
<string name="renderer_early_release_fences_description">Pomáhá opravit 0 FPS v hrách jako DKCR:HD, Subnautica Below Zero a Ori 2, ale může narušit načítání nebo výkon v hrách na Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Synchronizace paměťových operací</string>
|
||||
<string name="sync_memory_operations_description">Zajišťuje konzistenci dat mezi výpočetními a paměťovými operacemi. Tato volba by měla opravit problémy v některých hrách, ale může v některých případech snížit výkon. Nejvíce postižené se zdají být hry s Unreal Engine 4.</string>
|
||||
<string name="buffer_reorder_disable">Zakázat přeřazování vyrovnávací paměti</string>
|
||||
@@ -370,8 +366,6 @@
|
||||
<string name="display">Zobrazení</string>
|
||||
<string name="processing">Postprocesing</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Přeskočení snímků</string>
|
||||
<string name="frame_skipping_description">Přepínání přeskočení snímků pro zlepšení výkonu snížením počtu vykreslených snímků. Tato funkce je stále ve vývoji a bude povolena v budoucích verzích.</string>
|
||||
<string name="renderer_accuracy">Úroveň přesnosti</string>
|
||||
<string name="renderer_resolution">Rozlišení (Handheld/Docked)</string>
|
||||
<string name="renderer_vsync">VSync režim</string>
|
||||
@@ -616,9 +610,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Žádné</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normální</string>
|
||||
<string name="renderer_accuracy_high">Vysoká</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Výchozí</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -84,10 +84,6 @@
|
||||
<string name="sample_shading_fraction_description">Die Intensität des Sample-Shading-Durchgangs. Höhere Werte verbessern die Qualität stärker, beeinträchtigen aber auch die Leistung stärker.</string>
|
||||
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="frame_interpolation">Erweiterte Frame-Synchronisation</string>
|
||||
<string name="frame_interpolation_description">Sorgt für eine gleichmäßige und konsistente Frame-Wiedergabe durch Synchronisierung der Frame-Zeiten, was Ruckeln und ungleichmäßige Animationen reduziert. Ideal für Spiele, die unter instabilen Frame-Zeiten oder Mikrorucklern leiden.</string>
|
||||
<string name="renderer_early_release_fences">Zäune früher freigeben</string>
|
||||
<string name="renderer_early_release_fences_description">Behebt 0 FPS in Spielen wie DKCR:HD, Subnautica Below Zero und Ori 2, kann aber Ladezeiten oder Performance in Unreal Engine-Spielen beeinträchtigen.</string>
|
||||
<string name="sync_memory_operations">Speicheroperationen synchronisieren</string>
|
||||
<string name="sync_memory_operations_description">Stellt die Datenkonsistenz zwischen Compute- und Speicheroperationen sicher. Diese Option sollte Probleme in einigen Spielen beheben, kann aber in einigen Fällen die Leistung verringern. Spiele mit Unreal Engine 4 scheinen am stärksten betroffen zu sein.</string>
|
||||
<string name="buffer_reorder_disable">Puffer-Neuanordnung deaktivieren</string>
|
||||
@@ -423,12 +419,6 @@ Wird der Handheld-Modus verwendet, verringert es die Auflösung und erhöht die
|
||||
|
||||
<!-- Graphics settings strings -->
|
||||
<string name="backend">Backend</string>
|
||||
<string name="display">Anzeige</string>
|
||||
<string name="processing">Nachbearbeitung</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Frame Skipping</string>
|
||||
<string name="frame_skipping_description">Aktivieren Sie Frame Skipping, um die Leistung durch Reduzierung der gerenderten Frames zu verbessern. Diese Funktion wird noch entwickelt und in zukünftigen Versionen verfügbar sein.</string>
|
||||
<string name="renderer_accuracy">Genauigkeitsstufe</string>
|
||||
<string name="renderer_resolution">Auflösung (Handheld/Gedockt)</string>
|
||||
<string name="renderer_vsync">VSync-Modus</string>
|
||||
<string name="renderer_screen_layout">Ausrichtung</string>
|
||||
@@ -798,9 +788,6 @@ Wirklich fortfahren?</string>
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Keiner</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Hoch</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Standard</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">La intensidad del paso de sombreado de la muestra. Los valores más altos mejoran más la calidad, pero también reducen el rendimiento en mayor medida.</string>
|
||||
|
||||
<string name="veil_renderer">Renderizador</string>
|
||||
<string name="frame_interpolation">Ritmo de fotogramas mejorado</string>
|
||||
<string name="frame_interpolation_description">Garantiza una entrega de fotogramas fluida y consistente al sincronizar el tiempo entre fotogramas, reduciendo la tartamudez y la animación desigual. Ideal para juegos que experimentan inestabilidad en el tiempo de fotogramas o microtartamudeos durante el juego.</string>
|
||||
<string name="renderer_early_release_fences">Liberar las vallas antes</string>
|
||||
<string name="renderer_early_release_fences_description">Ayuda a arreglar 0 FPS en juegos como DKCR:HD, Subnautica Below Zero y Ori 2, pero puede romper la carga o el rendimiento en juegos de Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Sincronizar operaciones de memoria</string>
|
||||
<string name="sync_memory_operations_description">Garantiza la consistencia de los datos entre las operaciones de computación y memoria. Esta opción debería solucionar problemas en algunos juegos, pero también puede reducir el rendimiento en algunos casos. Los juegos de Unreal Engine 4 a menudo ven los cambios más significativos de los mismos.</string>
|
||||
<string name="buffer_reorder_disable">Desactivar reordenamiento de búfer</string>
|
||||
@@ -446,8 +442,6 @@
|
||||
<string name="display">Pantalla</string>
|
||||
<string name="processing">Postprocesado</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Salto de fotogramas</string>
|
||||
<string name="frame_skipping_description">Activa o desactiva el salto de fotogramas para mejorar el rendimiento reduciendo el número de fotogramas renderizados. Esta función está en desarrollo y se habilitará en futuras versiones.</string>
|
||||
<string name="renderer_accuracy">Nivel de precisión</string>
|
||||
<string name="renderer_resolution">Resolución (Portátil/Sobremesa)</string>
|
||||
<string name="renderer_vsync">Modo VSync</string>
|
||||
@@ -843,11 +837,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Ninguno</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Alto</string>
|
||||
<string name="renderer_accuracy_extreme">Extremo</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Predeterminado</string>
|
||||
<string name="dma_accuracy_unsafe">Inseguro</string>
|
||||
|
||||
@@ -65,12 +65,6 @@
|
||||
<string name="veil_misc">پردازنده و حافظه</string>
|
||||
<string name="eden_veil">پرده عدن</string>
|
||||
<string name="eden_veil_description">تنظیمات آزمایشی برای بهبود عملکرد و قابلیت. این تنظیمات ممکن است باعث نمایش صفحه سیاه یا سایر مشکلات بازی شود.</string>
|
||||
<string name="frame_skipping">در حال توسعه: رد کردن فریمها</string>
|
||||
<string name="frame_skipping_description">با فعال کردن رد کردن فریمها، عملکرد را با کاهش تعداد فریمهای رندر شده بهبود دهید. این قابلیت در حال توسعه است و در نسخههای آینده فعال خواهد شد.</string>
|
||||
<string name="frame_interpolation">زمانبندی پیشرفته فریمها</string>
|
||||
<string name="frame_interpolation_description">ارسال یکنواخت و پایدار فریمها را با همگامسازی زمان بین آنها تضمین میکند، که منجر به کاهش لرزش و انیمیشنهای ناهموار میشود. برای بازیهایی که ناپایداری در زمانبندی فریمها یا میکرو لرزش در حین بازی دارند ایدهآل است</string>
|
||||
<string name="renderer_early_release_fences">رهاسازی حصارها زودتر</string>
|
||||
<string name="renderer_early_release_fences_description">به رفع مشکل 0 فریم بر ثانیه در بازیهایی مانند DKCR:HD، Subnautica Below Zero و Ori 2 کمک میکند، اما ممکن است بارگذاری یا عملکرد بازیهای Unreal Engine را مختل کند.</string>
|
||||
<string name="sync_memory_operations">همگامسازی عملیات حافظه</string>
|
||||
<string name="sync_memory_operations_description">اطمینان از سازگاری دادهها بین عملیات محاسباتی و حافظه. این گزینه ممکن است مشکلات برخی بازیها را رفع کند، اما در برخی موارد ممکن است عملکرد را کاهش دهد. به نظر میرسد بازیهای با Unreal Engine 4 بیشترین تأثیر را داشته باشند.</string>
|
||||
<string name="buffer_reorder_disable">غیرفعال کردن مرتبسازی مجدد بافر</string>
|
||||
@@ -764,11 +758,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">هیچ</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">معمولی</string>
|
||||
<string name="renderer_accuracy_high">زیاد</string>
|
||||
<string name="renderer_accuracy_extreme">افراطی (کند)</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">پیش فرض</string>
|
||||
<string name="dma_accuracy_unsafe">ناایمن (سریع)</string>
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">L\'intensité de la passe d\'ombrage d\'échantillon. Des valeurs plus élevées améliorent davantage la qualité mais réduisent aussi plus fortement les performances.</string>
|
||||
|
||||
<string name="veil_renderer">Rendu</string>
|
||||
<string name="frame_interpolation">Synchronisation avancée des frames</string>
|
||||
<string name="frame_interpolation_description">Assure une diffusion fluide et régulière des frames en synchronisant leur timing, réduisant ainsi les saccades et les animations irrégulières. Idéal pour les jeux souffrant d`instabilité de timing des frames ou de micro-saccades pendant le jeu.</string>
|
||||
<string name="renderer_early_release_fences">Libérer les barrières plus tôt</string>
|
||||
<string name="renderer_early_release_fences_description">Résout les problèmes de 0 FPS dans des jeux comme DKCR:HD, Subnautica Below Zero et Ori 2, mais peut perturber le chargement ou les performances des jeux Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Synchroniser les opérations mémoire</string>
|
||||
<string name="sync_memory_operations_description">Garantit la cohérence des données entre les opérations de calcul et de mémoire. Cette option devrait résoudre les problèmes dans certains jeux, mais peut réduire les performances dans certains cas. Les jeux utilisant Unreal Engine 4 semblent être les plus affectés.</string>
|
||||
<string name="buffer_reorder_disable">Désactiver le réordonnancement du tampon</string>
|
||||
@@ -447,8 +443,6 @@
|
||||
<string name="display">Affichage</string>
|
||||
<string name="processing">Post-traitement</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Saut de frames</string>
|
||||
<string name="frame_skipping_description">Activez ou désactivez le saut d\'images pour améliorer les performances en réduisant le nombre d\'images affichées. Cette fonctionnalité est en cours de développement et sera activée dans les futures versions.</string>
|
||||
<string name="renderer_accuracy">Niveau de précision</string>
|
||||
<string name="renderer_resolution">Résolution (Mode Portable/Mode TV)</string>
|
||||
<string name="renderer_vsync">Mode VSync</string>
|
||||
@@ -856,11 +850,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Aucune</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Haut</string>
|
||||
<string name="renderer_accuracy_extreme">Extrême</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Défaut</string>
|
||||
<string name="dma_accuracy_unsafe">Dangereux</string>
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">עוצמת מעבר ההצללה לדוגמה. ערכים גבוהים יותר משפרים את האיכות יותר אך גם מפחיתים את הביצועים במידה רבה יותר.</string>
|
||||
|
||||
<string name="veil_renderer">רנדרר</string>
|
||||
<string name="frame_interpolation">סנכרון פריימים מתקדם</string>
|
||||
<string name="frame_interpolation_description">מבטיח אספקה חלקה ועקבית של פריימים על ידי סנכרון התזמון ביניהם, מפחית קפיצות ואנימציה לא אחידה. אידיאלי למשחקים עם בעיות בתזמון פריימים או מיקרו-קפיצות במהלך המשחק.</string>
|
||||
<string name="renderer_early_release_fences">שחרר גדרות מוקדם</string>
|
||||
<string name="renderer_early_release_fences_description">עוזר לתקן 0 FPS במשחקים כמו DKCR:HD, Subnautica Below Zero ו-Ori 2, אך עלול לפגוע בטעינה או בביצועים במשחקי Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">סנכרון פעולות זיכרון</string>
|
||||
<string name="sync_memory_operations_description">מבטיח עקביות נתונים בין פעולות חישוב וזיכרון. אפשרות זו אמורה לתקן בעיות במשחקים מסוימים, אך עלולה להפחית ביצועים במקרים מסוימים. נראה שהמשחקים עם Unreal Engine 4 הם המושפעים ביותר.</string>
|
||||
<string name="buffer_reorder_disable">השבת סידור מחדש של חוצץ</string>
|
||||
@@ -406,8 +402,6 @@
|
||||
<string name="display">תצוגה</string>
|
||||
<string name="processing">עיבוד לאחר</string>
|
||||
|
||||
<string name="frame_skipping">בעבודה: דילוג פריימים</string>
|
||||
<string name="frame_skipping_description">החלף דילוג על פריימים כדי לשפר ביצועים על ידי הפחתת מספר הפריימים המוצגים. תכונה זו עדיין בפיתוח ותופעל בגרסאות עתידיות.</string>
|
||||
<string name="renderer_accuracy">רמת דיוק</string>
|
||||
<string name="renderer_resolution">רזולוציה (מעוגן/נייד)</string>
|
||||
<string name="renderer_vsync">מצב VSync</string>
|
||||
@@ -670,9 +664,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">אין שום דבר</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">רגיל</string>
|
||||
<string name="renderer_accuracy_high">גבוה</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">ברירת מחדל</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">A mintavételezés árnyékolási lépés intenzitása. A magasabb értékek jobb minőséget eredményeznek, de nagyobb mértékben csökkentik a teljesítményt.</string>
|
||||
|
||||
<string name="veil_renderer">Megjelenítő</string>
|
||||
<string name="frame_interpolation">Továbbfejlesztett Képkocka-időzítés</string>
|
||||
<string name="frame_interpolation_description">Biztosítja a képkockák sima és egyenletes kézbesítését azok időzítésének szinkronizálásával, csökkentve a megakadásokat és egyenetlen animációkat. Ideális azokhoz a játékokhoz, amelyek képkocka-időzítési instabilitást vagy mikro-reccsenést tapasztalnak játék közben.</string>
|
||||
<string name="renderer_early_release_fences">Korai kerítés-felszabadítás</string>
|
||||
<string name="renderer_early_release_fences_description">Segít javítani a 0 FPS-t olyan játékokban, mint a DKCR:HD, Subnautica Below Zero és az Ori 2, de ronthatja az Unreal Engine játékok betöltését vagy teljesítményét.</string>
|
||||
<string name="sync_memory_operations">Memória-műveletek szinkronizálása</string>
|
||||
<string name="sync_memory_operations_description">Biztosítja az adatok konzisztenciáját a számítási és memória-műveletek között. Ez az opciónak javítania kell néhány játékban előforduló problémát, de bizonyos esetekben csökkentheti a teljesítményt. Az Unreal Engine 4-et használó játékok látszanak a legérintettebbek.</string>
|
||||
<string name="buffer_reorder_disable">Puffer újrarendezés letiltása</string>
|
||||
@@ -401,8 +397,6 @@
|
||||
<string name="display">Kijelző</string>
|
||||
<string name="processing">Utófeldolgozás</string>
|
||||
|
||||
<string name="frame_skipping">Folyamatban: Képkihagyás</string>
|
||||
<string name="frame_skipping_description">Kapcsolja be a képkihagyást a teljesítmény javításához a renderelt képkockák számának csökkentésével. Ez a funkció még fejlesztés alatt áll, és a jövőbeli kiadásokban lesz elérhető.</string>
|
||||
<string name="renderer_accuracy">Pontosság szintje</string>
|
||||
<string name="renderer_resolution">Felbontás (Kézi/Dockolt)</string>
|
||||
<string name="renderer_vsync">VSync mód</string>
|
||||
@@ -765,9 +759,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Nincs</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normál</string>
|
||||
<string name="renderer_accuracy_high">Magas</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Alapértelmezett</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">Intensitas proses pencahayaan sampel. Nilai lebih tinggi meningkatkan kualitas lebih baik tetapi juga mengurangi performa lebih besar.</string>
|
||||
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="frame_interpolation">Penyelarasan Frame Tingkat Lanjut</string>
|
||||
<string name="frame_interpolation_description">Memastikan pengiriman frame yang halus dan konsisten dengan menyinkronkan waktu antar frame, mengurangi stuttering dan animasi tidak rata. Ideal untuk game yang mengalami ketidakstabilan waktu frame atau micro-stutter selama gameplay.</string>
|
||||
<string name="renderer_early_release_fences">Lepas Pagar Lebih Awal</string>
|
||||
<string name="renderer_early_release_fences_description">Membantu memperbaiki 0 FPS di game seperti DKCR:HD, Subnautica Below Zero dan Ori 2, tapi mungkin mengganggu loading atau performa di game Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Sinkronisasi Operasi Memori</string>
|
||||
<string name="sync_memory_operations_description">Memastikan konsistensi data antara operasi komputasi dan memori. Opsi ini seharusnya memperbaiki masalah di beberapa game, tetapi mungkin mengurangi performa dalam beberapa kasus. Game dengan Unreal Engine 4 tampaknya yang paling terpengaruh.</string>
|
||||
<string name="buffer_reorder_disable">Nonaktifkan Penyusunan Ulang Buffer</string>
|
||||
@@ -437,8 +433,6 @@
|
||||
<string name="display">Tampilan</string>
|
||||
<string name="processing">Pascaproses</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Loncatan Frame</string>
|
||||
<string name="frame_skipping_description">Aktifkan atau nonaktifkan frame skipping untuk meningkatkan performa dengan mengurangi jumlah frame yang dirender. Fitur ini masih dalam pengembangan dan akan diaktifkan di rilis mendatang.</string>
|
||||
<string name="renderer_accuracy">Tingkatan Akurasi</string>
|
||||
<string name="renderer_resolution">Resolusi (Handheld/Docked)</string>
|
||||
<string name="renderer_vsync">Mode Sinkronisasi Vertikal</string>
|
||||
@@ -815,9 +809,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Tak ada</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Tinggi</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Bawaan</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">L\'intensità della passata di ombreggiatura campione. Valori più alti migliorano la qualità ma riducono maggiormente le prestazioni.</string>
|
||||
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="frame_interpolation">Sincronizzazione avanzata fotogrammi</string>
|
||||
<string name="frame_interpolation_description">Garantisce una consegna fluida e costante dei fotogrammi sincronizzandone i tempi, riducendo scatti e animazioni irregolari. Ideale per giochi che presentano instabilità nei tempi dei fotogrammi o micro-scatti durante il gameplay.</string>
|
||||
<string name="renderer_early_release_fences">Rilascia le barriere prima</string>
|
||||
<string name="renderer_early_release_fences_description">Risolve problemi di 0 FPS in giochi come DKCR:HD, Subnautica Below Zero e Ori 2, ma potrebbe compromettere caricamento o prestazioni in giochi Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Sincronizza operazioni di memoria</string>
|
||||
<string name="sync_memory_operations_description">Garantisce la coerenza dei dati tra le operazioni di calcolo e memoria. Questa opzione dovrebbe risolvere problemi in alcuni giochi, ma potrebbe ridurre le prestazioni in alcuni casi. I giochi con Unreal Engine 4 sembrano essere i più colpiti.</string>
|
||||
<string name="buffer_reorder_disable">Disabilita riordino buffer</string>
|
||||
@@ -447,8 +443,6 @@
|
||||
<string name="display">Schermo</string>
|
||||
<string name="processing">Post-elaborazione</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Salto fotogrammi</string>
|
||||
<string name="frame_skipping_description">Attiva o disattiva il salto dei fotogrammi per migliorare le prestazioni riducendo il numero di fotogrammi renderizzati. Questa funzionalità è ancora in sviluppo e verrà abilitata nelle versioni future.</string>
|
||||
<string name="renderer_accuracy">Livello di accuratezza</string>
|
||||
<string name="renderer_resolution">Risoluzione (Portatile/Docked)</string>
|
||||
<string name="renderer_vsync">Modalità VSync</string>
|
||||
@@ -856,11 +850,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Nessuna</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normale</string>
|
||||
<string name="renderer_accuracy_high">Alta</string>
|
||||
<string name="renderer_accuracy_extreme">Estrema</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Predefinito</string>
|
||||
<string name="dma_accuracy_unsafe">Non sicura</string>
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">サンプルシェーディング処理の強度。高い値ほど品質は向上しますが、パフォーマンスも大きく低下します。</string>
|
||||
|
||||
<string name="veil_renderer">レンダラー</string>
|
||||
<string name="frame_interpolation">高度なフレーム同期</string>
|
||||
<string name="frame_interpolation_description">フレーム間のタイミングを同期させることで、スムーズで一貫したフレーム配信を確保し、カクつきや不均一なアニメーションを軽減します。フレームタイミングの不安定さやマイクロスタッターが発生するゲームに最適です。</string>
|
||||
<string name="renderer_early_release_fences">フェンスを早期に解放</string>
|
||||
<string name="renderer_early_release_fences_description">DKCR:HD、Subnautica Below Zero、Ori 2などのゲームで0 FPSを修正しますが、Unreal Engineゲームの読み込みやパフォーマンスに影響する可能性があります。</string>
|
||||
<string name="sync_memory_operations">メモリ操作の同期</string>
|
||||
<string name="sync_memory_operations_description">計算処理とメモリ操作間のデータ一貫性を保証します。 このオプションは一部のゲームの問題を修正しますが、場合によってはパフォーマンスが低下する可能性があります。 Unreal Engine 4のゲームが最も影響を受けるようです。</string>
|
||||
<string name="buffer_reorder_disable">バッファの再並べ替えを無効化</string>
|
||||
@@ -401,8 +397,6 @@
|
||||
<string name="display">ディスプレイ</string>
|
||||
<string name="processing">後処理</string>
|
||||
|
||||
<string name="frame_skipping">WIP: フレームスキップ</string>
|
||||
<string name="frame_skipping_description">フレームスキップを切り替えて、レンダリングされるフレーム数を減らしパフォーマンスを向上させます。この機能は開発中であり、今後のリリースで有効になります。</string>
|
||||
<string name="renderer_accuracy">精度</string>
|
||||
<string name="renderer_resolution">解像度(携帯モード/TVモード)</string>
|
||||
<string name="renderer_vsync">垂直同期モード</string>
|
||||
@@ -670,9 +664,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">なし</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">標準</string>
|
||||
<string name="renderer_accuracy_high">高</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">デフォルト</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">샘플 쉐이딩 패스의 강도. 값이 높을수록 품질이 더 향상되지만 성능도 더 크게 저하됩니다.</string>
|
||||
|
||||
<string name="veil_renderer">렌더러</string>
|
||||
<string name="frame_interpolation">향상된 프레임 페이싱</string>
|
||||
<string name="frame_interpolation_description">프레임 간 타이밍을 동기화하여 부드럽고 일관된 프레임 전달을 보장하며, 끊김과 불균일한 애니메이션을 줄입니다. 프레임 타이밍 불안정이나 게임 플레이 중 미세 끊김이 발생하는 게임에 이상적입니다.</string>
|
||||
<string name="renderer_early_release_fences">펜스 조기 해제</string>
|
||||
<string name="renderer_early_release_fences_description">DKCR:HD, Subnautica Below Zero, Ori 2 등의 게임에서 0 FPS 현상을 해결하지만, Unreal Engine 게임의 로딩이나 성능에 문제를 일으킬 수 있습니다.</string>
|
||||
<string name="sync_memory_operations">메모리 작업 동기화</string>
|
||||
<string name="sync_memory_operations_description">컴퓨팅 및 메모리 작업 간 데이터 일관성을 보장합니다. 이 옵션은 일부 게임의 문제를 해결할 수 있지만 경우에 따라 성능이 저하될 수 있습니다. Unreal Engine 4 게임이 가장 큰 영향을 받는 것으로 보입니다.</string>
|
||||
<string name="buffer_reorder_disable">버퍼 재정렬 비활성화</string>
|
||||
@@ -401,8 +397,6 @@
|
||||
<string name="display">디스플레이</string>
|
||||
<string name="processing">후처리</string>
|
||||
|
||||
<string name="frame_skipping">작업 중: 프레임 스킵</string>
|
||||
<string name="frame_skipping_description">렌더링되는 프레임 수를 줄여 성능을 향상시키기 위해 프레임 스킵을 전환합니다. 이 기능은 현재 개발 중이며 향후 출시 버전에서 활성화될 예정입니다.</string>
|
||||
<string name="renderer_accuracy">정확도 수준</string>
|
||||
<string name="renderer_resolution">해상도 (휴대 모드/독 모드)</string>
|
||||
<string name="renderer_vsync">수직동기화 모드</string>
|
||||
@@ -724,9 +718,6 @@
|
||||
<string name="renderer_vulkan">Vulcan</string>
|
||||
<string name="renderer_none">없음</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">보통</string>
|
||||
<string name="renderer_accuracy_high">높음</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">기본값</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">Intensiteten til prøveskyggepasseringen. Høyere verdier forbedrer kvaliteten mer, men reduserer også ytelsen i større grad.</string>
|
||||
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="frame_interpolation">Avansert bildevindu-synkronisering</string>
|
||||
<string name="frame_interpolation_description">Sikrer jevn og konsekvent bildelevering ved å synkronisere tiden mellom bilder, noe som reduserer hakking og ujevn animasjon. Ideelt for spill som opplever ustabil bildetid eller mikro-hakk under spilling.</string>
|
||||
<string name="renderer_early_release_fences">Frigjør gjerder tidlig</string>
|
||||
<string name="renderer_early_release_fences_description">Løser 0 FPS i spill som DKCR:HD, Subnautica Below Zero og Ori 2, men kan forårsake problemer med lasting eller ytelse i Unreal Engine-spill.</string>
|
||||
<string name="sync_memory_operations">Synkroniser minneoperasjoner</string>
|
||||
<string name="sync_memory_operations_description">Sikrer datakonsistens mellom beregnings- og minneoperasjoner. Dette alternativet bør fikse problemer i noen spill, men kan redusere ytelsen i noen tilfeller. Spill med Unreal Engine 4 ser ut til å være de mest berørte.</string>
|
||||
<string name="buffer_reorder_disable">Deaktiver bufferomorganisering</string>
|
||||
@@ -382,8 +378,6 @@
|
||||
<string name="display">Skjerm</string>
|
||||
<string name="processing">Etterbehandling</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Hoppe over bilder</string>
|
||||
<string name="frame_skipping_description">Slå av/på frame skipping for å forbedre ytelsen ved å redusere antall renderte bilder. Denne funksjonen er fortsatt under utvikling og vil bli aktivert i fremtidige versjoner.</string>
|
||||
<string name="renderer_accuracy">Nøyaktighetsnivå</string>
|
||||
<string name="renderer_resolution">Oppløsning (håndholdt/dokket)</string>
|
||||
<string name="renderer_vsync">VSync-modus</string>
|
||||
@@ -642,9 +636,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Ingen</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Høy</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Standard</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">Intensywność przebiegu cieniowania próbki. Wyższe wartości poprawiają jakość, ale także w większym stopniu zmniejszają wydajność.</string>
|
||||
|
||||
<string name="veil_renderer">Renderer</string>
|
||||
<string name="frame_interpolation">Zaawansowana synchronizacja klatek</string>
|
||||
<string name="frame_interpolation_description">Zapewnia płynne i spójne wyświetlanie klatek poprzez synchronizację ich czasu, redukując zacinanie i nierówną animację. Idealne dla gier z niestabilnym czasem klatek lub mikro-zacinaniem podczas rozgrywki.</string>
|
||||
<string name="renderer_early_release_fences">Wcześniejsze zwalnianie zabezpieczeń</string>
|
||||
<string name="renderer_early_release_fences_description">Pomaga naprawić 0 FPS w grach takich jak DKCR:HD, Subnautica Below Zero i Ori 2, ale może zaburzyć ładowanie lub wydajność w grach Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Synchronizuj operacje pamięci</string>
|
||||
<string name="sync_memory_operations_description">Zapewnia spójność danych między operacjami obliczeniowymi i pamięciowymi. Ta opcja powinna naprawiać problemy w niektórych grach, ale może zmniejszyć wydajność w niektórych przypadkach. Gry z Unreal Engine 4 wydają się być najbardziej dotknięte.</string>
|
||||
<string name="buffer_reorder_disable">Wyłącz przestawianie bufora</string>
|
||||
@@ -468,8 +464,6 @@
|
||||
<string name="display">Wyświetlacz</string>
|
||||
<string name="processing">Postprocessing</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Pomijanie klatek</string>
|
||||
<string name="frame_skipping_description">Włącz lub wyłącz pomijanie klatek, aby poprawić wydajność poprzez zmniejszenie liczby renderowanych klatek. Ta funkcja jest wciąż w fazie rozwoju i zostanie włączona w przyszłych wersjach.</string>
|
||||
<string name="renderer_accuracy">Poziom precyzji emulacji</string>
|
||||
<string name="renderer_resolution">Rozdzielczość (Handheld/Zadokowany)</string>
|
||||
<string name="renderer_vsync">Synchronizacja pionowa VSync</string>
|
||||
@@ -880,11 +874,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Żadny</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normalny</string>
|
||||
<string name="renderer_accuracy_high">Wysoki</string>
|
||||
<string name="renderer_accuracy_extreme">Ekstremalne</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">預設</string>
|
||||
<string name="dma_accuracy_unsafe">Niezalecane</string>
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">Fração de Sombreamento de Amostra: Define a intensidade do sample shading. Quanto maior, melhor a qualidade, mas maior o impacto no desempenho.</string>
|
||||
|
||||
<string name="veil_renderer">Renderizador</string>
|
||||
<string name="frame_interpolation">Enhanced Frame Pacing</string>
|
||||
<string name="frame_interpolation_description">Sincronização Melhorada de Quadros: Sincroniza o tempo entre os quadros para uma entrega mais uniforme, reduzindo travamentos e animações irregulares. Útil em jogos que sofrem com microtravamentos ou instabilidade na taxa de frames.</string>
|
||||
<string name="renderer_early_release_fences">Release Fences Early</string>
|
||||
<string name="renderer_early_release_fences_description">Liberar Cercas Antecipadamente: Ajuda a corrigir 0 FPS em jogos como DKCR:HD, Subnautica Below Zero e Ori 2, mas pode prejudicar o carregamento ou o desempenho em jogos feitos com Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Sincronizar Operações de Memória</string>
|
||||
<string name="sync_memory_operations_description">Garante a consistência de dados entre operações de computação e memória. Esta opção pode corrigir problemas em alguns jogos, mas também pode reduzir o desempenho, sendo os jogos da Unreal Engine 4 os mais afetados.</string>
|
||||
<string name="buffer_reorder_disable">Desativar Reordenação de Buffers</string>
|
||||
@@ -446,8 +442,6 @@
|
||||
<string name="display">Tela</string>
|
||||
<string name="processing">Pós-Processamento</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Pular quadros</string>
|
||||
<string name="frame_skipping_description">Ative ou desative o pulo de quadros para melhorar o desempenho reduzindo o número de quadros renderizados. Este recurso ainda está em desenvolvimento e será habilitado em versões futuras.</string>
|
||||
<string name="renderer_accuracy">Nível de precisão</string>
|
||||
<string name="renderer_resolution">Resolução (Portátil/Modo TV)</string>
|
||||
<string name="renderer_vsync">Modo de VSync</string>
|
||||
@@ -844,11 +838,6 @@ uma tentativa de mapeamento automático</string>
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Nenhum</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Alta</string>
|
||||
<string name="renderer_accuracy_extreme">Extrema</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Padrão</string>
|
||||
<string name="dma_accuracy_unsafe">Insegura</string>
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">A intensidade da passagem de sombreamento de amostra. Valores mais elevados melhoram a qualidade, mas também reduzem o desempenho numa maior medida.</string>
|
||||
|
||||
<string name="veil_renderer">Renderizador</string>
|
||||
<string name="frame_interpolation">Sincronização avançada de frames</string>
|
||||
<string name="frame_interpolation_description">Garante uma entrega suave e consistente de frames sincronizando o seu tempo, reduzindo engasgadelas e animações irregulares. Ideal para jogos que experienciam instabilidade no tempo de frames ou micro-engasgadelas durante o jogo.</string>
|
||||
<string name="renderer_early_release_fences">Libertar barreiras antecipadamente</string>
|
||||
<string name="renderer_early_release_fences_description">Ajuda a corrigir 0 FPS em jogos como DKCR:HD, Subnautica Below Zero e Ori 2, mas pode afetar carregamento ou desempenho em jogos Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Sincronizar Operações de Memória</string>
|
||||
<string name="sync_memory_operations_description">Garante a consistência dos dados entre operações de computação e memória. Esta opção deve corrigir problemas em alguns jogos, mas pode reduzir o desempenho nalguns casos. Os jogos com Unreal Engine 4 parecem ser os mais afectados.</string>
|
||||
<string name="buffer_reorder_disable">Desativar reordenação de buffer</string>
|
||||
@@ -405,8 +401,6 @@
|
||||
<string name="display">Ecrã</string>
|
||||
<string name="processing">Pós-processamento</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Saltar frames</string>
|
||||
<string name="frame_skipping_description">Ative ou desative o salto de frames para melhorar o desempenho reduzindo o número de frames renderizados. Esta funcionalidade ainda está em desenvolvimento e será ativada em versões futuras.</string>
|
||||
<string name="renderer_accuracy">Nível de precisão</string>
|
||||
<string name="renderer_resolution">Resolução (Portátil/Ancorado)</string>
|
||||
<string name="renderer_vsync">Modo VSync</string>
|
||||
@@ -777,9 +771,6 @@ uma tentativa de mapeamento automático</string>
|
||||
<string name="renderer_vulkan">Vulcano</string>
|
||||
<string name="renderer_none">Nenhum</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">Alto</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Predefinido</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">Интенсивность прохода сэмплового затенения. Более высокие значения улучшают качество, но и сильнее снижают производительность.</string>
|
||||
|
||||
<string name="veil_renderer">Рендеринг</string>
|
||||
<string name="frame_interpolation">Улучшенная синхронизация кадров</string>
|
||||
<string name="frame_interpolation_description">Обеспечивает плавную и стабильную подачу кадров за счет синхронизации их времени, уменьшая подтормаживания и неравномерную анимацию. Идеально для игр с нестабильным временем кадров или микро-подтормаживаниями во время игры.</string>
|
||||
<string name="renderer_early_release_fences">Ранний релиз ограждений</string>
|
||||
<string name="renderer_early_release_fences_description">Помогает исправить 0 FPS в играх типа DKCR:HD, Subnautica Below Zero и Ori 2, но может нарушить загрузку или производительность в играх на Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Синхронизация операций с памятью</string>
|
||||
<string name="sync_memory_operations_description">Обеспечивает согласованность данных между вычислительными операциями и операциями с памятью. Эта опция должна исправлять проблемы в некоторых играх, но может снижать производительность в некоторых случаях. Наиболее сильно это затрагивает игры на Unreal Engine 4.</string>
|
||||
<string name="buffer_reorder_disable">Отключить переупорядочивание буфера</string>
|
||||
@@ -466,8 +462,6 @@
|
||||
<string name="display">Дисплей</string>
|
||||
<string name="processing">Постобработка</string>
|
||||
|
||||
<string name="frame_skipping">В разработке: Пропуск кадров</string>
|
||||
<string name="frame_skipping_description">Включите или отключите пропуск кадров для повышения производительности за счет уменьшения количества отображаемых кадров. Эта функция находится в разработке и будет включена в будущих версиях.</string>
|
||||
<string name="renderer_accuracy">Уровень точности</string>
|
||||
<string name="renderer_resolution">Разрешение (портативное/в док-станции)</string>
|
||||
<string name="renderer_vsync">Режим верт. синхронизации</string>
|
||||
@@ -878,11 +872,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Никакой</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Нормальная</string>
|
||||
<string name="renderer_accuracy_high">Высокая</string>
|
||||
<string name="renderer_accuracy_extreme">Экстрим</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">По умолчанию</string>
|
||||
<string name="dma_accuracy_unsafe">Небезопасно</string>
|
||||
|
||||
@@ -75,10 +75,6 @@
|
||||
<string name="sample_shading_fraction_description">Интензитет проласка сенчења узорка. Веће вредности побољшавају квалитет више, али такође више смањују перформансе.</string>
|
||||
|
||||
<string name="veil_renderer">Рендерер</string>
|
||||
<string name="frame_interpolation">Побољшани оквирни пејсинг</string>
|
||||
<string name="frame_interpolation_description">Осигурава глатку и доследан испоруку оквира синхронизацијом времена између оквира, смањење муцања и неуједначене анимације. Идеално за игре које доживљавају временски оквир нестабилност или микро-штитнике током играња.</string>
|
||||
<string name="renderer_early_release_fences">Ranije oslobađanje ograda</string>
|
||||
<string name="renderer_early_release_fences_description">Pomaže u popravci 0 FPS u igrama kao što su DKCR:HD, Subnautica Below Zero i Ori 2, ali može oštetiti učitavanje ili performanse u Unreal Engine igrama.</string>
|
||||
<string name="sync_memory_operations">Синхронизација меморијских операција</string>
|
||||
<string name="sync_memory_operations_description">Осигурава конзистентност података између рачунских и меморијских операција. Ова опција би требало да поправи проблеме у неким играма, али може смањити перформансе у неким случајевима. Чини се да су игре са Unreal Engine 4 највише погођене.</string>
|
||||
<string name="buffer_reorder_disable">Онемогући преуређивање бафера</string>
|
||||
@@ -405,8 +401,6 @@
|
||||
<string name="display">Приказ</string>
|
||||
<string name="processing">Постпроцесирање</string>
|
||||
|
||||
<string name="frame_skipping">ВИП: Фрамескип</string>
|
||||
<string name="frame_skipping_description">Пребацивање оквира прескакање да бисте побољшали перформансе смањењем броја пружених оквира. Ова функција се и даље ради и биће омогућена у будућим издањима.</string>
|
||||
<string name="renderer_accuracy">Ниво тачности</string>
|
||||
<string name="renderer_resolution">Резолуција (ручно / прикључено)</string>
|
||||
<string name="renderer_vsync">Всинц мод</string>
|
||||
@@ -775,9 +769,6 @@
|
||||
<string name="renderer_vulkan">Вулкан</string>
|
||||
<string name="renderer_none">Ниједан</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Нормалан</string>
|
||||
<string name="renderer_accuracy_high">Високо</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Подразумевано</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">Інтенсивність проходу затінення зразка. Вищі значення покращують якість, але й сильніше знижують продуктивність.</string>
|
||||
|
||||
<string name="veil_renderer">Візуалізатор</string>
|
||||
<string name="frame_interpolation">Покращена синхронізація кадрів</string>
|
||||
<string name="frame_interpolation_description">Забезпечує плавну та стабільну подачу кадрів шляхом синхронізації їх часу, зменшуючи підвисання та нерівномірну анімацію. Ідеально для ігор з нестабільним часом кадрів або мікро-підвисаннями під час гри.</string>
|
||||
<string name="renderer_early_release_fences">Release fences early</string>
|
||||
<string name="renderer_early_release_fences_description">Це налаштування може бути необхідним для виправлення помилок 0FPS у деяких іграх (зокрема DKCR:HD, Subnautica та Ori 2). Водночас інші ігри, особливо створені на рушії Unreal Engine, можуть працювати некоректно або взагалі не запускатися.</string>
|
||||
<string name="sync_memory_operations">Синхронізація операцій з пам\'яттю</string>
|
||||
<string name="sync_memory_operations_description">Забезпечує узгодженість даних між обчислювальними операціями та операціями з пам\'яттю. Ця опція має виправляти проблеми в деяких іграх, але може знижувати продуктивність у деяких випадках. Ігри на Unreal Engine 4, здається, найбільш постраждалі.</string>
|
||||
<string name="buffer_reorder_disable">Вимкнути переупорядкування буфера</string>
|
||||
@@ -468,8 +464,6 @@
|
||||
<string name="display">Дисплей</string>
|
||||
<string name="processing">Постобробка</string>
|
||||
|
||||
<string name="frame_skipping">В розробці: Пропуск кадрів</string>
|
||||
<string name="frame_skipping_description">Увімкніть або вимкніть пропуск кадрів для покращення продуктивності за рахунок зменшення кількості візуалізованих кадрів. Ця функція ще розробляється та буде доступна у майбутніх версіях.</string>
|
||||
<string name="renderer_accuracy">Рівень точності</string>
|
||||
<string name="renderer_resolution">Роздільна здатність (Портативний/Док)</string>
|
||||
<string name="renderer_vsync">Режим верт. синхронізації</string>
|
||||
@@ -880,11 +874,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Вимкнено</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Нормальна</string>
|
||||
<string name="renderer_accuracy_high">Висока</string>
|
||||
<string name="renderer_accuracy_extreme">Екстремально</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Типово</string>
|
||||
<string name="dma_accuracy_unsafe">Небезпечно</string>
|
||||
|
||||
@@ -76,10 +76,6 @@
|
||||
<string name="sample_shading_fraction_description">Cường độ của bước tô bóng mẫu. Giá trị cao hơn cải thiện chất lượng tốt hơn nhưng cũng giảm hiệu suất nhiều hơn.</string>
|
||||
|
||||
<string name="veil_renderer">Trình kết xuất</string>
|
||||
<string name="frame_interpolation">Đồng bộ khung hình nâng cao</string>
|
||||
<string name="frame_interpolation_description">Đảm bảo cung cấp khung hình mượt mà và ổn định bằng cách đồng bộ hóa thời gian giữa các khung hình, giảm giật lag và hoạt ảnh không đồng đều. Lý tưởng cho các trò chơi gặp vấn đề về thời gian khung hình không ổn định hoặc giật lag nhẹ trong khi chơi.</string>
|
||||
<string name="renderer_early_release_fences">Giải phóng rào chắn sớm</string>
|
||||
<string name="renderer_early_release_fences_description">Giúp sửa lỗi 0 FPS trong các trò chơi như DKCR:HD, Subnautica Below Zero và Ori 2, nhưng có thể ảnh hưởng đến tải hoặc hiệu suất trong trò chơi Unreal Engine.</string>
|
||||
<string name="sync_memory_operations">Đồng bộ hoá thao tác bộ nhớ</string>
|
||||
<string name="sync_memory_operations_description">Đảm bảo tính nhất quán dữ liệu giữa các thao tác tính toán và bộ nhớ. Tùy chọn này nên khắc phục sự cố trong một số trò chơi, nhưng có thể làm giảm hiệu suất trong một số trường hợp. Các trò chơi với Unreal Engine 4 có vẻ bị ảnh hưởng nhiều nhất.</string>
|
||||
<string name="buffer_reorder_disable">Tắt sắp xếp lại bộ đệm</string>
|
||||
@@ -380,8 +376,6 @@
|
||||
<string name="display">Hiển thị</string>
|
||||
<string name="processing">Hậu xử lý</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Bỏ qua khung hình</string>
|
||||
<string name="frame_skipping_description">Bật hoặc tắt bỏ qua khung hình để cải thiện hiệu suất bằng cách giảm số lượng khung hình được kết xuất. Tính năng này đang được phát triển và sẽ được kích hoạt trong các bản phát hành tương lai.</string>
|
||||
<string name="renderer_accuracy">Mức độ chính xác</string>
|
||||
<string name="renderer_resolution">Độ phân giải (Handheld/Docked)</string>
|
||||
<string name="renderer_vsync">Chế độ VSync</string>
|
||||
@@ -642,9 +636,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">Trống</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Trung bình</string>
|
||||
<string name="renderer_accuracy_high">Khỏe</string>
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Mặc định</string>
|
||||
<!-- ASTC Decoding Method -->
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">采样着色处理的强度。值越高,质量改善越多,但性能降低也越明显。</string>
|
||||
|
||||
<string name="veil_renderer">渲染器</string>
|
||||
<string name="frame_interpolation">增强帧同步</string>
|
||||
<string name="frame_interpolation_description">通过同步帧间时间确保流畅一致的帧交付,减少卡顿和不均匀动画。适合存在帧时间不稳定或游戏过程中出现微卡顿的游戏。</string>
|
||||
<string name="renderer_early_release_fences">提前释放围栏</string>
|
||||
<string name="renderer_early_release_fences_description">可修复《大金刚国度:热带寒流》《深海迷航:零度之下》和《奥日2》等游戏中的0 FPS问题,但可能影响Unreal Engine游戏的加载或性能。</string>
|
||||
<string name="sync_memory_operations">同步内存操作</string>
|
||||
<string name="sync_memory_operations_description">确保计算和内存操作之间的数据一致性。 此选项应能修复某些游戏中的问题,但在某些情况下可能会降低性能。 使用Unreal Engine 4的游戏似乎受影响最大。</string>
|
||||
<string name="buffer_reorder_disable">禁用缓冲重排序</string>
|
||||
@@ -443,8 +439,6 @@
|
||||
<string name="display">显示</string>
|
||||
<string name="processing">后处理</string>
|
||||
|
||||
<string name="frame_skipping">开发中:跳帧</string>
|
||||
<string name="frame_skipping_description">启用或禁用跳帧以减少渲染帧数,提高性能。此功能仍在开发中,将在未来版本中启用。</string>
|
||||
<string name="renderer_accuracy">精度等级</string>
|
||||
<string name="renderer_resolution">分辨率 (掌机模式/主机模式)</string>
|
||||
<string name="renderer_vsync">垂直同步模式</string>
|
||||
@@ -852,11 +846,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">无</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">正常</string>
|
||||
<string name="renderer_accuracy_high">高</string>
|
||||
<string name="renderer_accuracy_extreme">极致</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">默认</string>
|
||||
<string name="dma_accuracy_unsafe">不安全</string>
|
||||
|
||||
@@ -98,10 +98,6 @@
|
||||
<string name="sample_shading_fraction_description">採樣著色處理的強度。數值越高,品質改善越多,但效能降低也越明顯。</string>
|
||||
|
||||
<string name="veil_renderer">渲染器</string>
|
||||
<string name="frame_interpolation">增強幀同步</string>
|
||||
<string name="frame_interpolation_description">通過同步幀間時間確保幀傳輸流暢一致,減少卡頓和不均勻動畫。適合存在幀時間不穩定或遊戲過程中出現些微卡頓的遊戲。</string>
|
||||
<string name="renderer_early_release_fences">提前釋放圍欄</string>
|
||||
<string name="renderer_early_release_fences_description">可修復《咚奇剛歸來HD》、《深海迷航:冰點之下》和《聖靈之光2》等遊戲中的0 FPS問題,但可能影響Unreal Engine遊戲的載入或效能。</string>
|
||||
<string name="sync_memory_operations">同步記憶體操作</string>
|
||||
<string name="sync_memory_operations_description">確保計算和記憶體操作之間的資料一致性。 此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。 使用Unreal Engine 4的遊戲似乎受影響最大。</string>
|
||||
<string name="buffer_reorder_disable">停用緩衝區重新排序</string>
|
||||
@@ -443,8 +439,6 @@
|
||||
<string name="display">顯示</string>
|
||||
<string name="processing">後處理</string>
|
||||
|
||||
<string name="frame_skipping">開發中:跳幀</string>
|
||||
<string name="frame_skipping_description">啟用或停用跳幀以減少渲染幀數,提高效能。此功能仍在開發中,將在未來版本中啟用。</string>
|
||||
<string name="renderer_accuracy">準確度層級</string>
|
||||
<string name="renderer_resolution">解析度 (手提/底座)</string>
|
||||
<string name="renderer_vsync">垂直同步</string>
|
||||
@@ -852,11 +846,6 @@
|
||||
<string name="renderer_vulkan">Vulkan</string>
|
||||
<string name="renderer_none">無</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">標準</string>
|
||||
<string name="renderer_accuracy_high">高</string>
|
||||
<string name="renderer_accuracy_extreme">極高</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">預設</string>
|
||||
<string name="dma_accuracy_unsafe">不安全</string>
|
||||
|
||||
@@ -98,9 +98,9 @@
|
||||
</integer-array>
|
||||
|
||||
<string-array name="rendererAccuracyNames">
|
||||
<item>@string/renderer_accuracy_normal</item>
|
||||
<item>@string/renderer_accuracy_low</item>
|
||||
<item>@string/renderer_accuracy_medium</item>
|
||||
<item>@string/renderer_accuracy_high</item>
|
||||
<item>@string/renderer_accuracy_extreme</item>
|
||||
</string-array>
|
||||
|
||||
<integer-array name="rendererAccuracyValues">
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
<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="hide_overlay_on_controller_input">Hide Overlay on Controller Input</string>
|
||||
<string name="hide_overlay_on_controller_input_description">Automatically hide the touch controls overlay when a physical controller is used. Overlay reappears when controller is disconnected.</string>
|
||||
|
||||
<string name="input_overlay_options">Input Overlay</string>
|
||||
<string name="input_overlay_options_description">Configure on-screen controls</string>
|
||||
@@ -105,10 +107,6 @@
|
||||
<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="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="renderer_early_release_fences">Release Fences Early</string>
|
||||
<string name="renderer_early_release_fences_description">Helps fix 0 FPS in games like DKCR:HD, Subnautica Below Zero and Ori 2, but may break loading or performance in Unreal Engine games.</string>
|
||||
<string name="sync_memory_operations">Sync Memory Operations</string>
|
||||
<string name="sync_memory_operations_description">Ensures data consistency between compute and memory operations. This option should fix issues in some games, but may also reduce performance in some cases. Unreal Engine 4 games often see the most significant changes thereof.</string>
|
||||
<string name="buffer_reorder_disable">Disable Buffer Reorder</string>
|
||||
@@ -449,7 +447,7 @@
|
||||
<string name="user_data_export_cancelled">Export cancelled</string>
|
||||
<string name="user_data_import_failed_description">Make sure the user data folders are at the root of the zip folder and contain a config file at config/config.ini and try again.</string>
|
||||
<string name="discord_link" translatable="false">https://discord.gg/HstXbPch7X</string>
|
||||
<string name="revolt_link" translatable="false">https://rvlt.gg/qKgFEAbH</string>
|
||||
<string name="stoat_link" translatable="false">https://stt.gg/qKgFEAbH</string>
|
||||
<string name="x_link" translatable="false">https://nitter.poast.org/edenemuofficial</string>
|
||||
<string name="website_link" translatable="false">https://eden-emu.dev</string>
|
||||
<string name="github_link" translatable="false">https://git.eden-emu.dev/eden-emu</string>
|
||||
@@ -489,8 +487,6 @@
|
||||
<string name="display">Display</string>
|
||||
<string name="processing">Post-Processing</string>
|
||||
|
||||
<string name="frame_skipping">WIP: Frameskip</string>
|
||||
<string name="frame_skipping_description">Toggle frame skipping to improve performance by reducing the number of rendered frames. This feature is still being worked on and will be enabled in future releases.</string>
|
||||
<string name="renderer_accuracy">Accuracy level</string>
|
||||
<string name="renderer_resolution">Resolution (Handheld/Docked)</string>
|
||||
<string name="renderer_vsync">VSync mode</string>
|
||||
@@ -928,9 +924,9 @@
|
||||
<string name="renderer_none">None</string>
|
||||
|
||||
<!-- Renderer Accuracy -->
|
||||
<string name="renderer_accuracy_normal">Normal</string>
|
||||
<string name="renderer_accuracy_high">High</string>
|
||||
<string name="renderer_accuracy_extreme">Extreme</string>
|
||||
<string name="renderer_accuracy_low">Performance</string>
|
||||
<string name="renderer_accuracy_medium">Balanced</string>
|
||||
<string name="renderer_accuracy_high">Accurate</string>
|
||||
|
||||
<!-- DMA Accuracy -->
|
||||
<string name="dma_accuracy_default">Default</string>
|
||||
|
||||
@@ -21,6 +21,15 @@
|
||||
|
||||
namespace AudioCore::Renderer {
|
||||
|
||||
namespace {
|
||||
constexpr f32 BiquadParameterFixedScaleQ14 = 16384.0f; // 1 << 14
|
||||
|
||||
[[nodiscard]] inline s16 ToQ14Clamped(f32 v) {
|
||||
const f32 scaled = std::clamp(v * BiquadParameterFixedScaleQ14, -32768.0f, 32767.0f);
|
||||
return static_cast<s16>(scaled);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
template <typename T, CommandId Id>
|
||||
T& CommandBuffer::GenerateStart(const s32 node_id) {
|
||||
if (size + sizeof(T) >= command_list.size_bytes()) {
|
||||
@@ -259,18 +268,42 @@ void CommandBuffer::GenerateBiquadFilterCommand(const s32 node_id, EffectInfoBas
|
||||
const bool use_float_processing) {
|
||||
auto& cmd{GenerateStart<BiquadFilterCommand, CommandId::BiquadFilter>(node_id)};
|
||||
|
||||
const auto& parameter{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
|
||||
const auto state{reinterpret_cast<VoiceState::BiquadFilterState*>(
|
||||
effect_info.GetStateBuffer() + channel * sizeof(VoiceState::BiquadFilterState))};
|
||||
|
||||
cmd.input = buffer_offset + parameter.inputs[channel];
|
||||
cmd.output = buffer_offset + parameter.outputs[channel];
|
||||
if (behavior->IsEffectInfoVersion2Supported()) {
|
||||
const auto& p{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())};
|
||||
|
||||
cmd.biquad.b = parameter.b;
|
||||
cmd.biquad.a = parameter.a;
|
||||
if (!IsChannelCountValid(p.channel_count) || channel < 0 || channel >= p.channel_count) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Effects use legacy fixed-point format
|
||||
cmd.input = buffer_offset + p.inputs[channel];
|
||||
cmd.output = buffer_offset + p.outputs[channel];
|
||||
|
||||
// Convert float coefficients to Q2.14 fixed-point as expected by the legacy DSP path.
|
||||
cmd.biquad.b[0] = ToQ14Clamped(p.b[0]);
|
||||
cmd.biquad.b[1] = ToQ14Clamped(p.b[1]);
|
||||
cmd.biquad.b[2] = ToQ14Clamped(p.b[2]);
|
||||
cmd.biquad.a[0] = ToQ14Clamped(p.a[0]);
|
||||
cmd.biquad.a[1] = ToQ14Clamped(p.a[1]);
|
||||
} else {
|
||||
const auto& p{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
|
||||
|
||||
if (!IsChannelCountValid(p.channel_count) || channel < 0 || channel >= p.channel_count) {
|
||||
return;
|
||||
}
|
||||
|
||||
cmd.input = buffer_offset + p.inputs[channel];
|
||||
cmd.output = buffer_offset + p.outputs[channel];
|
||||
|
||||
cmd.biquad.b = p.b;
|
||||
cmd.biquad.a = p.a;
|
||||
}
|
||||
|
||||
// Effects always use the fixed-point coefficient path on the DSP.
|
||||
cmd.use_float_coefficients = false;
|
||||
|
||||
cmd.state = memory_pool->Translate(CpuAddr(state),
|
||||
@@ -595,6 +628,15 @@ void CommandBuffer::GenerateCopyMixBufferCommand(const s32 node_id, EffectInfoBa
|
||||
const s16 buffer_offset, const s8 channel) {
|
||||
auto& cmd{GenerateStart<CopyMixBufferCommand, CommandId::CopyMixBuffer>(node_id)};
|
||||
|
||||
if (behavior->IsEffectInfoVersion2Supported()) {
|
||||
const auto& parameter_v2{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter())};
|
||||
cmd.input_index = buffer_offset + parameter_v2.inputs[channel];
|
||||
cmd.output_index = buffer_offset + parameter_v2.outputs[channel];
|
||||
GenerateEnd<CopyMixBufferCommand>(cmd);
|
||||
return;
|
||||
}
|
||||
|
||||
const auto& parameter{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
|
||||
cmd.input_index = buffer_offset + parameter.inputs[channel];
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -361,12 +364,37 @@ void CommandGenerator::GenerateAuxCommand(const s16 buffer_offset, EffectInfoBas
|
||||
void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset,
|
||||
EffectInfoBase& effect_info,
|
||||
const s32 node_id) {
|
||||
const auto& parameter{
|
||||
*reinterpret_cast<BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter())};
|
||||
EffectInfoBase::ParameterState param_state{};
|
||||
s8 channel_count = 0;
|
||||
|
||||
if (render_context.behavior->IsEffectInfoVersion2Supported()) {
|
||||
const auto* parameter =
|
||||
reinterpret_cast<const BiquadFilterInfo::ParameterVersion2*>(effect_info.GetParameter());
|
||||
if (!parameter) {
|
||||
LOG_ERROR(Service_Audio, "Biquad filter parameter is null");
|
||||
return;
|
||||
}
|
||||
param_state = parameter->state;
|
||||
channel_count = parameter->channel_count;
|
||||
} else {
|
||||
const auto* parameter =
|
||||
reinterpret_cast<const BiquadFilterInfo::ParameterVersion1*>(effect_info.GetParameter());
|
||||
if (!parameter) {
|
||||
LOG_ERROR(Service_Audio, "Biquad filter parameter is null");
|
||||
return;
|
||||
}
|
||||
param_state = parameter->state;
|
||||
channel_count = parameter->channel_count;
|
||||
}
|
||||
|
||||
if (channel_count <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (effect_info.IsEnabled()) {
|
||||
bool needs_init{false};
|
||||
|
||||
switch (parameter.state) {
|
||||
switch (param_state) {
|
||||
case EffectInfoBase::ParameterState::Initialized:
|
||||
needs_init = true;
|
||||
break;
|
||||
@@ -375,22 +403,26 @@ void CommandGenerator::GenerateBiquadFilterEffectCommand(const s16 buffer_offset
|
||||
if (render_context.behavior->IsBiquadFilterEffectStateClearBugFixed()) {
|
||||
needs_init = false;
|
||||
} else {
|
||||
needs_init = parameter.state == EffectInfoBase::ParameterState::Updating;
|
||||
needs_init = param_state == EffectInfoBase::ParameterState::Updating;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
LOG_ERROR(Service_Audio, "Invalid biquad parameter state {}",
|
||||
static_cast<u32>(parameter.state));
|
||||
LOG_ERROR(Service_Audio,
|
||||
"Invalid biquad parameter state {}, treating as uninitialized",
|
||||
static_cast<u32>(param_state));
|
||||
needs_init = true;
|
||||
break;
|
||||
}
|
||||
|
||||
for (s8 channel = 0; channel < parameter.channel_count; channel++) {
|
||||
command_buffer.GenerateBiquadFilterCommand(
|
||||
node_id, effect_info, buffer_offset, channel, needs_init,
|
||||
render_context.behavior->UseBiquadFilterFloatProcessing());
|
||||
const bool use_float_processing =
|
||||
render_context.behavior->UseBiquadFilterFloatProcessing();
|
||||
|
||||
for (s8 channel = 0; channel < channel_count; channel++) {
|
||||
command_buffer.GenerateBiquadFilterCommand(node_id, effect_info, buffer_offset, channel,
|
||||
needs_init, use_float_processing);
|
||||
}
|
||||
} else {
|
||||
for (s8 channel = 0; channel < parameter.channel_count; channel++) {
|
||||
for (s8 channel = 0; channel < channel_count; channel++) {
|
||||
command_buffer.GenerateCopyMixBufferCommand(node_id, effect_info, buffer_offset,
|
||||
channel);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -34,14 +37,22 @@ void BiquadFilterInfo::Update(BehaviorInfo::ErrorInfo& error_info,
|
||||
}
|
||||
|
||||
void BiquadFilterInfo::UpdateForCommandGeneration() {
|
||||
if (enabled) {
|
||||
usage_state = UsageState::Enabled;
|
||||
} else {
|
||||
usage_state = UsageState::Disabled;
|
||||
}
|
||||
usage_state = enabled ? UsageState::Enabled : UsageState::Disabled;
|
||||
|
||||
auto params{reinterpret_cast<ParameterVersion1*>(parameter.data())};
|
||||
params->state = ParameterState::Updated;
|
||||
auto* params_v1 = reinterpret_cast<ParameterVersion1*>(parameter.data());
|
||||
auto* params_v2 = reinterpret_cast<ParameterVersion2*>(parameter.data());
|
||||
|
||||
const auto raw_state_v1 = static_cast<u8>(params_v1->state);
|
||||
const auto raw_state_v2 = static_cast<u8>(params_v2->state);
|
||||
|
||||
if (raw_state_v1 <= static_cast<u8>(ParameterState::Updated)) {
|
||||
params_v1->state = ParameterState::Updated;
|
||||
} else if (raw_state_v2 <= static_cast<u8>(ParameterState::Updated)) {
|
||||
params_v2->state = ParameterState::Updated;
|
||||
} else {
|
||||
params_v1->state = ParameterState::Updated;
|
||||
params_v2->state = ParameterState::Updated;
|
||||
}
|
||||
}
|
||||
|
||||
void BiquadFilterInfo::InitializeResultState(EffectResultState& result_state) {}
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -27,10 +30,12 @@ public:
|
||||
struct ParameterVersion2 {
|
||||
/* 0x00 */ std::array<s8, MaxChannels> inputs;
|
||||
/* 0x06 */ std::array<s8, MaxChannels> outputs;
|
||||
/* 0x0C */ std::array<s16, 3> b;
|
||||
/* 0x12 */ std::array<s16, 2> a;
|
||||
/* 0x16 */ s8 channel_count;
|
||||
/* 0x17 */ ParameterState state;
|
||||
/* 0x0C */ u32 padding;
|
||||
/* 0x10 */ std::array<f32, 3> b;
|
||||
/* 0x1C */ std::array<f32, 2> a;
|
||||
/* 0x24 */ s8 channel_count;
|
||||
/* 0x25 */ ParameterState state;
|
||||
/* 0x26 */ u16 reserved;
|
||||
};
|
||||
static_assert(sizeof(ParameterVersion2) <= sizeof(EffectInfoBase::InParameterVersion2),
|
||||
"BiquadFilterInfo::ParameterVersion2 has the wrong size!");
|
||||
|
||||
@@ -181,12 +181,6 @@ if(ANDROID)
|
||||
android/applets/software_keyboard.h)
|
||||
endif()
|
||||
|
||||
if(LINUX AND NOT APPLE)
|
||||
target_sources(common PRIVATE linux/gamemode.cpp linux/gamemode.h)
|
||||
|
||||
target_link_libraries(common PRIVATE gamemode::headers)
|
||||
endif()
|
||||
|
||||
if(ARCHITECTURE_x86_64)
|
||||
target_sources(
|
||||
common
|
||||
|
||||
@@ -515,7 +515,7 @@ namespace Common::Android {
|
||||
s_patch_class = reinterpret_cast<jclass>(env->NewGlobalRef(patch_class));
|
||||
s_patch_constructor = env->GetMethodID(
|
||||
patch_class, "<init>",
|
||||
"(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V");
|
||||
"(ZLjava/lang/String;Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
|
||||
s_patch_enabled_field = env->GetFieldID(patch_class, "enabled", "Z");
|
||||
s_patch_name_field = env->GetFieldID(patch_class, "name", "Ljava/lang/String;");
|
||||
s_patch_version_field = env->GetFieldID(patch_class, "version", "Ljava/lang/String;");
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#include <gamemode_client.h>
|
||||
|
||||
#include "common/linux/gamemode.h"
|
||||
#include "common/logging/log.h"
|
||||
#include "common/settings.h"
|
||||
|
||||
namespace Common::Linux {
|
||||
|
||||
void StartGamemode() {
|
||||
if (Settings::values.enable_gamemode) {
|
||||
if (gamemode_request_start() < 0) {
|
||||
LOG_WARNING(Frontend, "Failed to start gamemode: {}", gamemode_error_string());
|
||||
} else {
|
||||
LOG_INFO(Frontend, "Started gamemode");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void StopGamemode() {
|
||||
if (Settings::values.enable_gamemode) {
|
||||
if (gamemode_request_end() < 0) {
|
||||
LOG_WARNING(Frontend, "Failed to stop gamemode: {}", gamemode_error_string());
|
||||
} else {
|
||||
LOG_INFO(Frontend, "Stopped gamemode");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void SetGamemodeState(bool state) {
|
||||
if (state) {
|
||||
StartGamemode();
|
||||
} else {
|
||||
StopGamemode();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Common::Linux
|
||||
@@ -1,24 +0,0 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
#pragma once
|
||||
|
||||
namespace Common::Linux {
|
||||
|
||||
/**
|
||||
* Start the (Feral Interactive) Linux gamemode if it is installed and it is activated
|
||||
*/
|
||||
void StartGamemode();
|
||||
|
||||
/**
|
||||
* Stop the (Feral Interactive) Linux gamemode if it is installed and it is activated
|
||||
*/
|
||||
void StopGamemode();
|
||||
|
||||
/**
|
||||
* Start or stop the (Feral Interactive) Linux gamemode if it is installed and it is activated
|
||||
* @param state The new state the gamemode should have
|
||||
*/
|
||||
void SetGamemodeState(bool state);
|
||||
|
||||
} // namespace Common::Linux
|
||||
@@ -149,13 +149,16 @@ void UpdateGPUAccuracy() {
|
||||
values.current_gpu_accuracy = values.gpu_accuracy.GetValue();
|
||||
}
|
||||
|
||||
bool IsGPULevelExtreme() {
|
||||
return values.current_gpu_accuracy == GpuAccuracy::Extreme;
|
||||
bool IsGPULevelLow() {
|
||||
return values.current_gpu_accuracy == GpuAccuracy::Low;
|
||||
}
|
||||
|
||||
bool IsGPULevelMedium() {
|
||||
return values.current_gpu_accuracy == GpuAccuracy::Medium;
|
||||
}
|
||||
|
||||
bool IsGPULevelHigh() {
|
||||
return values.current_gpu_accuracy == GpuAccuracy::Extreme ||
|
||||
values.current_gpu_accuracy == GpuAccuracy::High;
|
||||
return values.current_gpu_accuracy == GpuAccuracy::High;
|
||||
}
|
||||
|
||||
bool IsDMALevelDefault() {
|
||||
@@ -271,8 +274,6 @@ const char* TranslateCategory(Category category) {
|
||||
return "Services";
|
||||
case Category::Paths:
|
||||
return "Paths";
|
||||
case Category::Linux:
|
||||
return "Linux";
|
||||
case Category::MaxEnum:
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -333,12 +333,7 @@ struct Values {
|
||||
"shader_backend", Category::Renderer, Specialization::RuntimeList};
|
||||
SwitchableSetting<int> vulkan_device{linkage, 0, "vulkan_device", Category::Renderer,
|
||||
Specialization::RuntimeList};
|
||||
#ifdef __ANDROID__
|
||||
SwitchableSetting<bool> frame_interpolation{linkage, true, "frame_interpolation", Category::Renderer,
|
||||
Specialization::RuntimeList};
|
||||
SwitchableSetting<bool> frame_skipping{linkage, false, "frame_skipping", Category::Renderer,
|
||||
Specialization::RuntimeList};
|
||||
#endif
|
||||
|
||||
SwitchableSetting<bool> use_disk_shader_cache{linkage, true, "use_disk_shader_cache",
|
||||
Category::Renderer};
|
||||
SwitchableSetting<SpirvOptimizeMode, true> optimize_spirv_output{linkage,
|
||||
@@ -419,9 +414,9 @@ struct Values {
|
||||
|
||||
SwitchableSetting<GpuAccuracy, true> gpu_accuracy{linkage,
|
||||
#ifdef ANDROID
|
||||
GpuAccuracy::Normal,
|
||||
GpuAccuracy::Low,
|
||||
#else
|
||||
GpuAccuracy::High,
|
||||
GpuAccuracy::Medium,
|
||||
#endif
|
||||
"gpu_accuracy",
|
||||
Category::RendererAdvanced,
|
||||
@@ -429,7 +424,7 @@ struct Values {
|
||||
true,
|
||||
true};
|
||||
|
||||
GpuAccuracy current_gpu_accuracy{GpuAccuracy::High};
|
||||
GpuAccuracy current_gpu_accuracy{GpuAccuracy::Medium};
|
||||
|
||||
SwitchableSetting<DmaAccuracy, true> dma_accuracy{linkage,
|
||||
DmaAccuracy::Default,
|
||||
@@ -462,15 +457,6 @@ struct Values {
|
||||
Specialization::Default,
|
||||
true,
|
||||
true};
|
||||
#ifdef ANDROID
|
||||
SwitchableSetting<bool> early_release_fences{linkage,
|
||||
false,
|
||||
"early_release_fences",
|
||||
Category::RendererAdvanced,
|
||||
Specialization::Default,
|
||||
true,
|
||||
true};
|
||||
#endif
|
||||
SwitchableSetting<bool> sync_memory_operations{linkage,
|
||||
false,
|
||||
"sync_memory_operations",
|
||||
@@ -621,13 +607,6 @@ struct Values {
|
||||
true,
|
||||
true};
|
||||
|
||||
// Linux
|
||||
SwitchableSetting<bool> enable_gamemode{linkage, true, "enable_gamemode", Category::Linux};
|
||||
#ifdef __unix__
|
||||
SwitchableSetting<bool> gui_force_x11{linkage, false, "gui_force_x11", Category::Linux};
|
||||
Setting<bool> gui_hide_backend_warning{linkage, false, "gui_hide_backend_warning", Category::Linux};
|
||||
#endif
|
||||
|
||||
// Controls
|
||||
InputSetting<std::array<PlayerInput, 10>> players;
|
||||
|
||||
@@ -783,7 +762,8 @@ extern Values values;
|
||||
bool getDebugKnobAt(u8 i);
|
||||
|
||||
void UpdateGPUAccuracy();
|
||||
bool IsGPULevelExtreme();
|
||||
bool IsGPULevelLow();
|
||||
bool IsGPULevelMedium();
|
||||
bool IsGPULevelHigh();
|
||||
|
||||
bool IsDMALevelDefault();
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
|
||||
@@ -44,7 +47,6 @@ enum class Category : u32 {
|
||||
Multiplayer,
|
||||
Services,
|
||||
Paths,
|
||||
Linux,
|
||||
LibraryApplet,
|
||||
MaxEnum,
|
||||
};
|
||||
|
||||
@@ -133,7 +133,7 @@ ENUM(VSyncMode, Immediate, Mailbox, Fifo, FifoRelaxed);
|
||||
ENUM(VramUsageMode, Conservative, Aggressive);
|
||||
ENUM(RendererBackend, OpenGL, Vulkan, Null);
|
||||
ENUM(ShaderBackend, Glsl, Glasm, SpirV);
|
||||
ENUM(GpuAccuracy, Normal, High, Extreme);
|
||||
ENUM(GpuAccuracy, Low, Medium, High);
|
||||
ENUM(DmaAccuracy, Default, Unsafe, Safe);
|
||||
ENUM(CpuBackend, Dynarmic, Nce);
|
||||
ENUM(CpuAccuracy, Auto, Accurate, Unsafe, Paranoid, Debugging);
|
||||
|
||||
@@ -17,6 +17,8 @@ add_library(core STATIC
|
||||
constants.h
|
||||
core.cpp
|
||||
core.h
|
||||
game_settings.cpp
|
||||
game_settings.h
|
||||
core_timing.cpp
|
||||
core_timing.h
|
||||
cpu_manager.cpp
|
||||
@@ -609,6 +611,18 @@ add_library(core STATIC
|
||||
hle/service/caps/caps_u.h
|
||||
hle/service/cmif_serialization.h
|
||||
hle/service/cmif_types.h
|
||||
hle/service/dmnt/cheat_interface.cpp
|
||||
hle/service/dmnt/cheat_interface.h
|
||||
hle/service/dmnt/cheat_parser.cpp
|
||||
hle/service/dmnt/cheat_parser.h
|
||||
hle/service/dmnt/cheat_process_manager.cpp
|
||||
hle/service/dmnt/cheat_process_manager.h
|
||||
hle/service/dmnt/cheat_virtual_machine.cpp
|
||||
hle/service/dmnt/cheat_virtual_machine.h
|
||||
hle/service/dmnt/dmnt.cpp
|
||||
hle/service/dmnt/dmnt.h
|
||||
hle/service/dmnt/dmnt_results.h
|
||||
hle/service/dmnt/dmnt_types.h
|
||||
hle/service/erpt/erpt.cpp
|
||||
hle/service/erpt/erpt.h
|
||||
hle/service/es/es.cpp
|
||||
@@ -1143,11 +1157,6 @@ add_library(core STATIC
|
||||
loader/xci.h
|
||||
memory.cpp
|
||||
memory.h
|
||||
memory/cheat_engine.cpp
|
||||
memory/cheat_engine.h
|
||||
memory/dmnt_cheat_types.h
|
||||
memory/dmnt_cheat_vm.cpp
|
||||
memory/dmnt_cheat_vm.h
|
||||
perf_stats.cpp
|
||||
perf_stats.h
|
||||
reporter.cpp
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "game_settings.h"
|
||||
#include "audio_core/audio_core.h"
|
||||
#include "common/fs/fs.h"
|
||||
#include "common/logging/log.h"
|
||||
@@ -51,12 +52,12 @@
|
||||
#include "core/internal_network/network.h"
|
||||
#include "core/loader/loader.h"
|
||||
#include "core/memory.h"
|
||||
#include "core/memory/cheat_engine.h"
|
||||
#include "core/perf_stats.h"
|
||||
#include "core/reporter.h"
|
||||
#include "core/tools/freezer.h"
|
||||
#include "core/tools/renderdoc.h"
|
||||
#include "hid_core/hid_core.h"
|
||||
#include "hle/service/dmnt/cheat_process_manager.h"
|
||||
#include "network/network.h"
|
||||
#include "video_core/host1x/host1x.h"
|
||||
#include "video_core/renderer_base.h"
|
||||
@@ -276,9 +277,18 @@ struct System::Impl {
|
||||
audio_core = std::make_unique<AudioCore::AudioCore>(system);
|
||||
|
||||
service_manager = std::make_shared<Service::SM::ServiceManager>(kernel);
|
||||
|
||||
// Create cheat_manager BEFORE services, as DMNT::LoopProcess needs it
|
||||
cheat_manager = std::make_unique<Service::DMNT::CheatProcessManager>(system);
|
||||
|
||||
services =
|
||||
std::make_unique<Service::Services>(service_manager, system, stop_event.get_token());
|
||||
|
||||
// Apply any pending cheats that were registered before cheat_manager was initialized
|
||||
if (pending_cheats.has_pending) {
|
||||
ApplyPendingCheats(system);
|
||||
}
|
||||
|
||||
is_powered_on = true;
|
||||
exit_locked = false;
|
||||
exit_requested = false;
|
||||
@@ -292,48 +302,6 @@ struct System::Impl {
|
||||
return SystemResultStatus::Success;
|
||||
}
|
||||
|
||||
|
||||
void LoadOverrides(u64 programId) const {
|
||||
std::string vendor = gpu_core->Renderer().GetDeviceVendor();
|
||||
LOG_INFO(Core, "GPU Vendor: {}", vendor);
|
||||
|
||||
// Reset all per-game flags
|
||||
Settings::values.use_squashed_iterated_blend = false;
|
||||
|
||||
// Insert PC overrides here
|
||||
|
||||
#ifdef ANDROID
|
||||
// Example on how to set a setting based on the program ID and vendor
|
||||
if (programId == 0x010028600EBDA000 && vendor == "Mali") { // Mario 3d World
|
||||
// Settings::values.example = true;
|
||||
}
|
||||
|
||||
// Example array of program IDs
|
||||
const std::array<u64, 10> example_array = {
|
||||
//0xprogramId
|
||||
0x0004000000033400, // Game 1
|
||||
0x0004000000033500 // Game 2
|
||||
// And so on
|
||||
};
|
||||
|
||||
for (auto id : example_array) {
|
||||
if (programId == id) {
|
||||
// Settings::values.example = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
// Ninja Gaiden Ragebound
|
||||
constexpr u64 ngr = 0x0100781020710000ULL;
|
||||
|
||||
if (programId == ngr) {
|
||||
LOG_INFO(Core, "Enabling game specifc override: use_squashed_iterated_blend");
|
||||
Settings::values.use_squashed_iterated_blend = true;
|
||||
}
|
||||
}
|
||||
|
||||
SystemResultStatus Load(System& system, Frontend::EmuWindow& emu_window,
|
||||
const std::string& filepath,
|
||||
Service::AM::FrontendAppletParameters& params) {
|
||||
@@ -384,11 +352,6 @@ struct System::Impl {
|
||||
return init_result;
|
||||
}
|
||||
|
||||
// Initialize cheat engine
|
||||
if (cheat_engine) {
|
||||
cheat_engine->Initialize();
|
||||
}
|
||||
|
||||
// Register with applet manager
|
||||
// All threads are started, begin main process execution, now that we're in the clear
|
||||
applet_manager.CreateAndInsertByFrontendAppletParameters(std::move(process), params);
|
||||
@@ -419,7 +382,8 @@ struct System::Impl {
|
||||
LOG_ERROR(Core, "Failed to find program id for ROM");
|
||||
}
|
||||
|
||||
LoadOverrides(program_id);
|
||||
|
||||
GameSettings::LoadOverrides(program_id, gpu_core->Renderer());
|
||||
if (auto room_member = Network::GetRoomMember().lock()) {
|
||||
Network::GameInfo game_info;
|
||||
game_info.name = name;
|
||||
@@ -455,7 +419,6 @@ struct System::Impl {
|
||||
services.reset();
|
||||
service_manager.reset();
|
||||
fs_controller.Reset();
|
||||
cheat_engine.reset();
|
||||
core_timing.ClearPendingEvents();
|
||||
app_loader.reset();
|
||||
audio_core.reset();
|
||||
@@ -531,7 +494,6 @@ struct System::Impl {
|
||||
bool nvdec_active{};
|
||||
|
||||
Reporter reporter;
|
||||
std::unique_ptr<Memory::CheatEngine> cheat_engine;
|
||||
std::unique_ptr<Tools::Freezer> memory_freezer;
|
||||
std::array<u8, 0x20> build_id{};
|
||||
|
||||
@@ -560,6 +522,18 @@ struct System::Impl {
|
||||
/// Debugger
|
||||
std::unique_ptr<Core::Debugger> debugger;
|
||||
|
||||
/// Cheat Manager (DMNT)
|
||||
std::unique_ptr<Service::DMNT::CheatProcessManager> cheat_manager;
|
||||
|
||||
/// Pending cheats to register after cheat_manager is initialized
|
||||
struct PendingCheats {
|
||||
std::vector<Service::DMNT::CheatEntry> list;
|
||||
std::array<u8, 32> build_id{};
|
||||
u64 main_region_begin{};
|
||||
u64 main_region_size{};
|
||||
bool has_pending{false};
|
||||
} pending_cheats;
|
||||
|
||||
SystemResultStatus status = SystemResultStatus::Success;
|
||||
std::string status_details = "";
|
||||
|
||||
@@ -595,6 +569,61 @@ struct System::Impl {
|
||||
general_channel_event = std::make_unique<Service::Event>(*general_channel_context);
|
||||
general_channel_initialized = true;
|
||||
}
|
||||
|
||||
void ApplyPendingCheats(System& system) {
|
||||
if (!pending_cheats.has_pending || !cheat_manager) {
|
||||
return;
|
||||
}
|
||||
|
||||
LOG_DEBUG(Core, "Applying {} pending cheats", pending_cheats.list.size());
|
||||
|
||||
const auto result = cheat_manager->AttachToApplicationProcess(
|
||||
pending_cheats.build_id, pending_cheats.main_region_begin,
|
||||
pending_cheats.main_region_size);
|
||||
|
||||
if (result.IsError()) {
|
||||
LOG_WARNING(Core, "Failed to attach cheat process: result={}", result.raw);
|
||||
pending_cheats = {};
|
||||
return;
|
||||
}
|
||||
|
||||
LOG_DEBUG(Core, "Cheat process attached successfully");
|
||||
|
||||
for (const auto& entry : pending_cheats.list) {
|
||||
if (entry.cheat_id == 0 && entry.definition.num_opcodes != 0) {
|
||||
LOG_DEBUG(Core, "Setting master cheat '{}' with {} opcodes",
|
||||
entry.definition.readable_name.data(), entry.definition.num_opcodes);
|
||||
const auto set_result = cheat_manager->SetMasterCheat(entry.definition);
|
||||
if (set_result.IsError()) {
|
||||
LOG_WARNING(Core, "Failed to set master cheat: result={}", set_result.raw);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add normal cheats (cheat_id != 0)
|
||||
for (const auto& entry : pending_cheats.list) {
|
||||
if (entry.cheat_id == 0 || entry.definition.num_opcodes == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
u32 assigned_id = 0;
|
||||
LOG_DEBUG(Core, "Adding cheat '{}' (enabled={}, {} opcodes)",
|
||||
entry.definition.readable_name.data(), entry.enabled,
|
||||
entry.definition.num_opcodes);
|
||||
const auto add_result = cheat_manager->AddCheat(assigned_id, entry.enabled,
|
||||
entry.definition);
|
||||
if (add_result.IsError()) {
|
||||
LOG_WARNING(Core,
|
||||
"Failed to add cheat (original_id={} enabled={} name='{}'): result={}",
|
||||
entry.cheat_id, entry.enabled,
|
||||
entry.definition.readable_name.data(), add_result.raw);
|
||||
}
|
||||
}
|
||||
|
||||
// Clear pending cheats
|
||||
pending_cheats = {};
|
||||
}
|
||||
};
|
||||
|
||||
System::System() : impl{std::make_unique<Impl>(*this)} {}
|
||||
@@ -840,11 +869,61 @@ FileSys::VirtualFilesystem System::GetFilesystem() const {
|
||||
return impl->virtual_filesystem;
|
||||
}
|
||||
|
||||
void System::RegisterCheatList(const std::vector<Memory::CheatEntry>& list,
|
||||
void System::RegisterCheatList(const std::vector<Service::DMNT::CheatEntry>& list,
|
||||
const std::array<u8, 32>& build_id, u64 main_region_begin,
|
||||
u64 main_region_size) {
|
||||
impl->cheat_engine = std::make_unique<Memory::CheatEngine>(*this, list, build_id);
|
||||
impl->cheat_engine->SetMainMemoryParameters(main_region_begin, main_region_size);
|
||||
// If cheat_manager is not yet initialized, cache the cheats for later
|
||||
if (!impl->cheat_manager) {
|
||||
impl->pending_cheats.list = list;
|
||||
impl->pending_cheats.build_id = build_id;
|
||||
impl->pending_cheats.main_region_begin = main_region_begin;
|
||||
impl->pending_cheats.main_region_size = main_region_size;
|
||||
impl->pending_cheats.has_pending = true;
|
||||
LOG_INFO(Core, "Cached {} cheats for later registration", list.size());
|
||||
return;
|
||||
}
|
||||
|
||||
// Attach cheat process to the current application process
|
||||
const auto result = impl->cheat_manager->AttachToApplicationProcess(build_id, main_region_begin,
|
||||
main_region_size);
|
||||
if (result.IsError()) {
|
||||
LOG_WARNING(Core, "Failed to attach cheat process: result={}", result.raw);
|
||||
return;
|
||||
}
|
||||
|
||||
// Empty list: nothing more to do
|
||||
if (list.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Set master cheat if present (cheat_id == 0)
|
||||
for (const auto& entry : list) {
|
||||
if (entry.cheat_id == 0 && entry.definition.num_opcodes != 0) {
|
||||
const auto set_result = impl->cheat_manager->SetMasterCheat(entry.definition);
|
||||
if (set_result.IsError()) {
|
||||
LOG_WARNING(Core, "Failed to set master cheat: result={}", set_result.raw);
|
||||
}
|
||||
// Only one master cheat allowed
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Add normal cheats (cheat_id != 0)
|
||||
for (const auto& entry : list) {
|
||||
if (entry.cheat_id == 0 || entry.definition.num_opcodes == 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
u32 assigned_id = 0;
|
||||
const auto add_result = impl->cheat_manager->AddCheat(assigned_id, entry.enabled,
|
||||
entry.definition);
|
||||
if (add_result.IsError()) {
|
||||
LOG_WARNING(Core,
|
||||
"Failed to add cheat (original_id={} enabled={} name='{}'): result={}",
|
||||
entry.cheat_id, entry.enabled,
|
||||
entry.definition.readable_name.data(), add_result.raw);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void System::SetFrontendAppletSet(Service::AM::Frontend::FrontendAppletSet&& set) {
|
||||
@@ -988,6 +1067,15 @@ Tools::RenderdocAPI& System::GetRenderdocAPI() {
|
||||
return *impl->renderdoc_api;
|
||||
}
|
||||
|
||||
Service::DMNT::CheatProcessManager& System::GetCheatManager()
|
||||
{
|
||||
return *impl->cheat_manager;
|
||||
}
|
||||
|
||||
const Service::DMNT::CheatProcessManager& System::GetCheatManager() const {
|
||||
return *impl->cheat_manager;
|
||||
}
|
||||
|
||||
void System::RunServer(std::unique_ptr<Service::ServerManager>&& server_manager) {
|
||||
return impl->kernel.RunServer(std::move(server_manager));
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
#include "common/common_types.h"
|
||||
#include "core/file_sys/vfs/vfs_types.h"
|
||||
#include "core/hle/service/dmnt/dmnt_types.h"
|
||||
#include "core/hle/service/os/event.h"
|
||||
#include "core/hle/service/kernel_helpers.h"
|
||||
|
||||
@@ -45,10 +46,14 @@ enum class ResultStatus : u16;
|
||||
} // namespace Loader
|
||||
|
||||
namespace Core::Memory {
|
||||
struct CheatEntry;
|
||||
class Memory;
|
||||
} // namespace Core::Memory
|
||||
|
||||
namespace Service::DMNT {
|
||||
class CheatProcessManager;
|
||||
struct CheatEntry;
|
||||
}
|
||||
|
||||
namespace Service {
|
||||
|
||||
namespace Account {
|
||||
@@ -339,7 +344,7 @@ public:
|
||||
|
||||
[[nodiscard]] FileSys::VirtualFilesystem GetFilesystem() const;
|
||||
|
||||
void RegisterCheatList(const std::vector<Memory::CheatEntry>& list,
|
||||
void RegisterCheatList(const std::vector<Service::DMNT::CheatEntry>& list,
|
||||
const std::array<u8, 0x20>& build_id, u64 main_region_begin,
|
||||
u64 main_region_size);
|
||||
|
||||
@@ -383,6 +388,9 @@ public:
|
||||
|
||||
[[nodiscard]] Tools::RenderdocAPI& GetRenderdocAPI();
|
||||
|
||||
[[nodiscard]] Service::DMNT::CheatProcessManager& GetCheatManager();
|
||||
[[nodiscard]] const Service::DMNT::CheatProcessManager& GetCheatManager() const;
|
||||
|
||||
void SetExitLocked(bool locked);
|
||||
bool GetExitLocked() const;
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user