mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-09-30 20:21:14 +00:00
Compare commits
22 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f963035133 | |||
| bf236de610 | |||
| 2025483ef3 | |||
| cc5c8635e5 | |||
| eda3fb776f | |||
| d72c2e90b9 | |||
| 6a6b64a83c | |||
| 94723686ea | |||
| cf1cf6b5f5 | |||
| 0a68665a7c | |||
| d06beb71a1 | |||
| 19852c453f | |||
| 9195b1ede4 | |||
| 04243947f1 | |||
| 63b08471ce | |||
| 33093c2207 | |||
| f2983604a1 | |||
| f51932477b | |||
| a0bb051641 | |||
| 494fe96308 | |||
| 391f69d70a | |||
| 968bc20e95 |
+8
-18
@@ -24,20 +24,8 @@ include(CMakeDependentOption)
|
|||||||
include(CTest)
|
include(CTest)
|
||||||
include(CPMUtil)
|
include(CPMUtil)
|
||||||
|
|
||||||
if (NOT DEFINED ARCHITECTURE)
|
if (CXX_GCC AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "14.0")
|
||||||
message(FATAL_ERROR "Architecture didn't make it out of scope, did you delete DetectArchitecture.cmake?")
|
message(FATAL_ERROR "GCC versions older than 14.0 are not supported. Update your system, or use clang/clang++ instead.")
|
||||||
endif()
|
|
||||||
|
|
||||||
# Needed for FFmpeg w/ VAAPI and DRM
|
|
||||||
if (OPENBSD)
|
|
||||||
# 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 (NETBSD)
|
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I${CMAKE_SYSROOT}/usr/X11R7/include -I${CMAKE_SYSROOT}/usr/pkg/include/c++/v1")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L${CMAKE_SYSROOT}/usr/X11R7/lib")
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# NetBSD: Fun for the whole family!
|
# NetBSD: Fun for the whole family!
|
||||||
@@ -85,7 +73,7 @@ option(ENABLE_WERROR "Enable -Werror diagnostics" ON)
|
|||||||
# Lossless Scaling frame generation. Only Android.
|
# Lossless Scaling frame generation. Only Android.
|
||||||
cmake_dependent_option(ENABLE_LSFG "Enable Lossless Scaling frame generation" ON "ANDROID" OFF)
|
cmake_dependent_option(ENABLE_LSFG "Enable Lossless Scaling frame generation" ON "ANDROID" OFF)
|
||||||
|
|
||||||
option(ENABLE_RESHADE "Enable ReShade FX post-processing effects" ON)
|
cmake_dependent_option(ENABLE_RESHADE "Enable ReShade FX post-processing effects" ON "WIN32 OR ANDROID OR APPLE OR LINUX OR FREEBSD" OFF)
|
||||||
|
|
||||||
# non-linux bundled qt are static
|
# non-linux bundled qt are static
|
||||||
if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX))
|
if (YUZU_USE_BUNDLED_QT AND (APPLE OR NOT UNIX))
|
||||||
@@ -276,7 +264,7 @@ cmake_dependent_option(YUZU_USE_BUNDLED_MOLTENVK "Download bundled MoltenVK lib"
|
|||||||
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
option(YUZU_DISABLE_LLVM "Disable LLVM (useful for CI)" OFF)
|
||||||
|
|
||||||
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL OFF)
|
||||||
if (EXT_DEFAULT OR SOLARIS OR OPENBSD)
|
if (EXT_DEFAULT)
|
||||||
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
set(DEFAULT_YUZU_USE_BUNDLED_OPENSSL ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
@@ -309,10 +297,12 @@ if (YUZU_ROOM)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX AND NOT (LINUX OR WIN32))
|
if (UNIX AND NOT (LINUX OR WIN32))
|
||||||
if(CXX_APPLE OR CXX_CLANG)
|
if(CXX_APPLE OR (CXX_CLANG AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "20.0"))
|
||||||
# libc++ has stop_token and jthread as experimental
|
# libc++ has stop_token and jthread as experimental
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexperimental-library")
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-library")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fexperimental-library")
|
||||||
|
elseif(CXX_CLANG)
|
||||||
|
# New clang >=20.0, so do nothing
|
||||||
else()
|
else()
|
||||||
# Uses glibc, mostly?
|
# Uses glibc, mostly?
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_LIBCPP_ENABLE_EXPERIMENTAL=1")
|
||||||
@@ -618,7 +608,7 @@ if (ENABLE_QT)
|
|||||||
|
|
||||||
# Best practice is to ask for all components at once, so they are from the same version
|
# Best practice is to ask for all components at once, so they are from the same version
|
||||||
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent Gui)
|
set(YUZU_QT_COMPONENTS Core Widgets Charts Concurrent Gui)
|
||||||
if (LINUX OR FREEBSD)
|
if (NOT WIN32 AND NOT APPLE)
|
||||||
list(APPEND YUZU_QT_COMPONENTS DBus)
|
list(APPEND YUZU_QT_COMPONENTS DBus)
|
||||||
# yes Qt, we get it
|
# yes Qt, we get it
|
||||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
||||||
|
|||||||
Vendored
+473
-455
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+463
-440
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+457
-440
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+463
-440
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+463
-440
File diff suppressed because it is too large
Load Diff
Vendored
+463
-440
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
Vendored
+463
-440
File diff suppressed because it is too large
Load Diff
Vendored
+456
-439
File diff suppressed because it is too large
Load Diff
+11
-17
@@ -65,7 +65,7 @@ export LIBGL_ALWAYS_SOFTWARE=1
|
|||||||
|
|
||||||
## OmniOS
|
## OmniOS
|
||||||
|
|
||||||
Install `developer/gcc14` on OmniOS using pkgsrc.
|
Install `developer/gcc15` on OmniOS using pkgsrc.
|
||||||
|
|
||||||
Since so many dependencies are missing on `OmniOS`, you may wish to use `-DCPMUTIL_FORCE_BUNDLED=ON` and `-DYUZU_USE_BUNDLED_OPENSSL=OFF`.
|
Since so many dependencies are missing on `OmniOS`, you may wish to use `-DCPMUTIL_FORCE_BUNDLED=ON` and `-DYUZU_USE_BUNDLED_OPENSSL=OFF`.
|
||||||
|
|
||||||
@@ -74,21 +74,15 @@ For OmniOS you are required to build glslang yourself:
|
|||||||
sudo pkg install python-313
|
sudo pkg install python-313
|
||||||
git clone --depth=1 https://github.com/KhronosGroup/glslang.git
|
git clone --depth=1 https://github.com/KhronosGroup/glslang.git
|
||||||
cd glslang
|
cd glslang
|
||||||
python3.13 ./update_glslang_sources.py
|
python3 ./update_glslang_sources.py
|
||||||
cmake -B build -DCMAKE_BUILD_TYPE=Release
|
cmake -B build -DCMAKE_BUILD_TYPE=Release
|
||||||
cmake --build build -- -j `nproc`
|
cmake --build build -- -j`nproc`
|
||||||
cmake --install build
|
cmake --install build
|
||||||
```
|
```
|
||||||
|
|
||||||
It may be tempting to specify `-t glslang`, but this will cause installation to fail. So don't.
|
Use `gmake` to properly build all utilities. You require an X11 server, [this guide](https://web.archive.org/web/20260424200928/https://geekblood.wordpress.com/2017/10/26/installing-x11-and-a-desktop-environment-on-omnios/) details how to attain one, the links to pkgsrc on said guide [are better found here](https://pkgsrc.smartos.org/install-on-illumos/).
|
||||||
|
|
||||||
Using `--parallel` on CMake incorrectly passes `dmake ... -jn` instead of `dmake ... -j n`, this is a bug with OmniOS's CMake, it's recommended to not use this option until it's fixed.
|
For Solaris based OSes, `${CMAKE_SYSTEM_PROCESSOR}` isn't properly set on CMake (it's set to i686 on AMD64, must be `amd64`), you may find issues when building OpenSSL from `openssl-cmake`.
|
||||||
|
|
||||||
You may also need to install `gmake` in order to properly build FFmpeg, this is provided by the `build-essential` package.
|
|
||||||
|
|
||||||
If it wasn't obvious already, you require a X11 server to properly run the emulator within OmniOS, [this guide](https://web.archive.org/web/20260424200928/https://geekblood.wordpress.com/2017/10/26/installing-x11-and-a-desktop-environment-on-omnios/) is a great starting point for that, the links to pkgsrc are outdated so follow [this exemplar](https://pkgsrc.smartos.org/install-on-illumos/) as well.
|
|
||||||
|
|
||||||
For Solaris based OSes, `${CMAKE_SYSTEM_NAME}` isn't properly set on CMake (it's set to i686 on AMD64), you may find issues when building OpenSSL from `openssl-cmake`.
|
|
||||||
|
|
||||||
## HaikuOS
|
## HaikuOS
|
||||||
|
|
||||||
@@ -108,6 +102,8 @@ If you have `quazip1_qt6_devel`, uninstall it. It may call `Core5Compat` on CMak
|
|||||||
|
|
||||||
## OpenBSD
|
## OpenBSD
|
||||||
|
|
||||||
|
OpenSSL 4.0 is available via ports, needs to be pointed to directly via `-DOPENSSL_ROOT_DIR=/usr/local/include/eopenssl40`.
|
||||||
|
|
||||||
System boost doesn't have `context` (as of 7.8); so you may need to specify `-DYUZU_USE_CPM=ON -DBoost_FORCE_BUNDLED=ON`.
|
System boost doesn't have `context` (as of 7.8); so you may need to specify `-DYUZU_USE_CPM=ON -DBoost_FORCE_BUNDLED=ON`.
|
||||||
|
|
||||||
After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`.
|
After configuration, you may need to modify `externals/ffmpeg/CMakeFiles/ffmpeg-build/build.make` to use `-j$(nproc)` instead of just `-j`.
|
||||||
@@ -147,15 +143,13 @@ System provides a default `g++-10` which doesn't support the current C++ codebas
|
|||||||
|
|
||||||
Make may error out when generating C++ headers of SPIRV shaders, hence it's recommended to use `gmake` over the default system one.
|
Make may error out when generating C++ headers of SPIRV shaders, hence it's recommended to use `gmake` over the default system one.
|
||||||
|
|
||||||
[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 built from source.
|
If [parallel/spirv-tools](https://iso.us.netbsd.org/pub/pkgsrc/current/pkgsrc/parallel/spirv-tools/index.html) isn't available in binary, build from source:
|
||||||
|
|
||||||
glslang is not available on NetBSD, to circumvent this simply build glslang by yourself:
|
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkgin python313
|
pkgin install python314
|
||||||
git clone --depth=1 https://github.com/KhronosGroup/glslang.git
|
git clone --depth=1 https://github.com/KhronosGroup/glslang.git
|
||||||
cd glslang
|
cd glslang
|
||||||
python3.13 ./update_glslang_sources.py
|
python3.14 ./update_glslang_sources.py
|
||||||
cmake -B build -DCMAKE_BUILD_TYPE=Release
|
cmake -B build -DCMAKE_BUILD_TYPE=Release
|
||||||
cmake --build build -- -j`nproc`
|
cmake --build build -- -j`nproc`
|
||||||
cmake --install build
|
cmake --install build
|
||||||
@@ -163,7 +157,7 @@ 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.
|
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.
|
||||||
|
|
||||||
`QtCore` on NetBSD is included, but due to misconfigurations(!) we MUST include one of the standard headers that include `bits/c++config.h`, since source_location (required by `QtCore`) isn't properly configured to intake `bits/c++config.h` (none of the experimental library is). This is a bug with NetBSD packaging and not our fault, but alas.
|
`QtCore` on NetBSD is included, but due to misconfigurations you must include `bits/c++config.h`, since source_location (required by `QtCore`) isn't properly configured to intake `bits/c++config.h` (none of the experimental library is).
|
||||||
|
|
||||||
## DragonFlyBSD
|
## DragonFlyBSD
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -213,7 +213,7 @@ First, enable the community repository; [see here](https://wiki.alpinelinux.org/
|
|||||||
# Enable the community repository
|
# Enable the community repository
|
||||||
setup-apkrepos -c
|
setup-apkrepos -c
|
||||||
# Install
|
# Install
|
||||||
apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev qt6-charts-dev libusb-dev libtool boost-dev sdl3-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev jq patch
|
apk add g++ git cmake make mesa-dev qt6-qtbase-dev qt6-qtbase-private-dev libquazip1-qt6 ffmpeg-dev qt6-qtcharts-dev libusb-dev boost-dev sdl3-dev zstd-dev vulkan-utility-libraries spirv-tools-dev openssl-dev nlohmann-json lz4-dev opus-dev enet-dev glslang libtool jq patch
|
||||||
```
|
```
|
||||||
|
|
||||||
</details>
|
</details>
|
||||||
@@ -286,7 +286,7 @@ pkgin install git cmake boost fmtlib SDL3 catch2 libjwt spirv-headers spirv-tool
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
pkg_add -u
|
pkg_add -u
|
||||||
pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl3 libusb1-1.0.29 quazip-qt6
|
pkg_add cmake nasm git boost unzip--iconv autoconf-2.72p0 bash ffmpeg glslang gmake qt6 jq fmt nlohmann-json enet boost vulkan-utility-libraries vulkan-headers spirv-headers spirv-tools catch2 sdl3 libusb1-1.0.29 quazip-qt6 openssl-4.0.2v0
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#openbsd).
|
[Caveats](./Caveats.md#openbsd).
|
||||||
@@ -316,7 +316,7 @@ sudo pkg install git cmake qt6 boost glslang libzip library/lz4 libusb-1 nlohman
|
|||||||
<summary>OmniOS</summary>
|
<summary>OmniOS</summary>
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
sudo pkgin install git cmake autoconf build-essential libusb-1 nasm gcc13
|
sudo pkg install git cmake autoconf build-essential libusb-1 nasm gcc15 ffmpeg lz4 pkg-config unzip bash jq xsvc
|
||||||
```
|
```
|
||||||
|
|
||||||
[Caveats](./Caveats.md#omnios).
|
[Caveats](./Caveats.md#omnios).
|
||||||
|
|||||||
Vendored
+1
-1
@@ -15,7 +15,7 @@
|
|||||||
## Cloning Eden with Git
|
## Cloning Eden with Git
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
git clone --recursive https://git.eden-emu.dev/eden-emu/eden.git
|
git clone --depth=1 https://git.eden-emu.dev/eden-emu/eden.git
|
||||||
```
|
```
|
||||||
|
|
||||||
Eden by default will be cloned into:
|
Eden by default will be cloned into:
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, Scale
|
|||||||
ENUM(AntiAliasing, None, Fxaa, Smaa);
|
ENUM(AntiAliasing, None, Fxaa, Smaa);
|
||||||
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
|
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
|
||||||
ENUM(ConsoleMode, Handheld, Docked);
|
ENUM(ConsoleMode, Handheld, Docked);
|
||||||
ENUM(AppletMode, HLE, LLE, Disabled);
|
ENUM(AppletMode, HLE, LLE);
|
||||||
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
|
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
|
||||||
ENUM(GpuClock, Normal, Boost, Overclock)
|
ENUM(GpuClock, Normal, Boost, Overclock)
|
||||||
ENUM(GpuUnswizzleSize, VerySmall, Small, Normal, Large, VeryLarge)
|
ENUM(GpuUnswizzleSize, VerySmall, Small, Normal, Large, VeryLarge)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <functional>
|
#include <functional>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/file_sys/vfs/vfs_types.h"
|
#include "core/file_sys/vfs/vfs_types.h"
|
||||||
|
|||||||
@@ -16,10 +16,6 @@
|
|||||||
#include "core/hle/service/ro/ro_types.h"
|
#include "core/hle/service/ro/ro_types.h"
|
||||||
#include "core/hle/service/server_manager.h"
|
#include "core/hle/service/server_manager.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
#ifdef HAS_NCE
|
|
||||||
#include "core/arm/nce/patcher.h"
|
|
||||||
#include "core/hle/kernel/k_shared_memory.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
namespace Service::RO {
|
namespace Service::RO {
|
||||||
|
|
||||||
@@ -390,7 +386,7 @@ public:
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result MapManualLoadModuleMemory(Kernel::KernelCore& kernel, u64* out_address, size_t context_id, u64 nro_address,
|
Result MapManualLoadModuleMemory(u64* out_address, size_t context_id, u64 nro_address,
|
||||||
u64 nro_size, u64 bss_address, u64 bss_size) {
|
u64 nro_size, u64 bss_address, u64 bss_size) {
|
||||||
// Get context.
|
// Get context.
|
||||||
ProcessContext* context = this->GetContextById(context_id);
|
ProcessContext* context = this->GetContextById(context_id);
|
||||||
@@ -425,31 +421,7 @@ public:
|
|||||||
R_TRY(context->ValidateNro(std::addressof(nro_info->module_id), std::addressof(rx_size),
|
R_TRY(context->ValidateNro(std::addressof(nro_info->module_id), std::addressof(rx_size),
|
||||||
std::addressof(ro_size), std::addressof(rw_size),
|
std::addressof(ro_size), std::addressof(rw_size),
|
||||||
nro_info->base_address, nro_size, bss_size));
|
nro_info->base_address, nro_size, bss_size));
|
||||||
#ifdef HAS_NCE
|
|
||||||
if (Settings::IsNceEnabled()) {
|
|
||||||
auto* process = context->GetProcess();
|
|
||||||
auto& memory = process->GetMemory();
|
|
||||||
|
|
||||||
std::vector<u8> image(total_size);
|
|
||||||
memory.ReadBlock(nro_info->base_address, image.data(), rx_size);
|
|
||||||
|
|
||||||
Kernel::CodeSet::Segment code{.size = static_cast<u32>(rx_size)};
|
|
||||||
Core::NCE::Patcher patch;
|
|
||||||
patch.PatchText(image, code);
|
|
||||||
patch.RelocateAndCopy(nro_info->base_address, code, image, nullptr);
|
|
||||||
|
|
||||||
const u64 patch_address = nro_info->base_address + total_size;
|
|
||||||
const size_t patch_size = patch.GetSectionSize();
|
|
||||||
constexpr auto permission = Kernel::Svc::MemoryPermission::ReadExecute;
|
|
||||||
|
|
||||||
auto* patch_memory = Kernel::KSharedMemory::Create(kernel);
|
|
||||||
R_TRY(patch_memory->Initialize(kernel, kernel.System().DeviceMemory(), process, permission, permission, patch_size));
|
|
||||||
std::memcpy(patch_memory->GetPointer(), image.data() + total_size, patch_size);
|
|
||||||
R_TRY(process->AddSharedMemory(kernel, patch_memory, patch_address, patch_size));
|
|
||||||
R_TRY(patch_memory->Map(*process, patch_address, patch_size, permission));
|
|
||||||
memory.WriteBlock(nro_info->base_address, image.data(), rx_size);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
// Set NRO perms.
|
// Set NRO perms.
|
||||||
R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size,
|
R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size,
|
||||||
rw_size + bss_size));
|
rw_size + bss_size));
|
||||||
@@ -559,7 +531,7 @@ public:
|
|||||||
Result MapManualLoadModuleMemory(Out<u64> out_load_address, ClientProcessId client_pid,
|
Result MapManualLoadModuleMemory(Out<u64> out_load_address, ClientProcessId client_pid,
|
||||||
u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
||||||
R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid));
|
R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid));
|
||||||
R_RETURN(m_ro->MapManualLoadModuleMemory(system.Kernel(), out_load_address.Get(), m_context_id, nro_address,
|
R_RETURN(m_ro->MapManualLoadModuleMemory(out_load_address.Get(), m_context_id, nro_address,
|
||||||
nro_size, bss_address, bss_size));
|
nro_size, bss_address, bss_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -757,7 +757,7 @@ struct Memory::Impl {
|
|||||||
};
|
};
|
||||||
auto& gpu = system.GPU();
|
auto& gpu = system.GPU();
|
||||||
gpu_device_memory->ApplyOpOnPointer(
|
gpu_device_memory->ApplyOpOnPointer(
|
||||||
p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size, true); });
|
p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size); });
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
|
|||||||
@@ -67,9 +67,7 @@
|
|||||||
#else
|
#else
|
||||||
# define CTX_SP (_UC_MACHINE_SP(ucontext))
|
# define CTX_SP (_UC_MACHINE_SP(ucontext))
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#elif defined(ARCHITECTURE_arm64)
|
||||||
|
|
||||||
#if defined(ARCHITECTURE_arm64)
|
|
||||||
# if defined(__APPLE__)
|
# if defined(__APPLE__)
|
||||||
# define CTX_PC (mctx->__ss.__pc)
|
# define CTX_PC (mctx->__ss.__pc)
|
||||||
# define CTX_SP (mctx->__ss.__sp)
|
# define CTX_SP (mctx->__ss.__sp)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
#include "common/bit_field.h"
|
#include "common/bit_field.h"
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ if (ENABLE_OPENGL)
|
|||||||
target_compile_definitions(qt_common PUBLIC HAS_OPENGL)
|
target_compile_definitions(qt_common PUBLIC HAS_OPENGL)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE)
|
if (LINUX OR FREEBSD)
|
||||||
if (DEFINED Qt6Gui_PRIVATE_INCLUDE_DIRS)
|
if (DEFINED Qt6Gui_PRIVATE_INCLUDE_DIRS)
|
||||||
target_include_directories(qt_common PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
|
target_include_directories(qt_common PRIVATE ${Qt6Gui_PRIVATE_INCLUDE_DIRS})
|
||||||
else()
|
else()
|
||||||
|
|||||||
@@ -342,6 +342,9 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
|
|||||||
"it bypasses such prompts and directly exits the emulation."));
|
"it bypasses such prompts and directly exits the emulation."));
|
||||||
INSERT(UISettings, hide_mouse, tr("Hide mouse on inactivity"),
|
INSERT(UISettings, hide_mouse, tr("Hide mouse on inactivity"),
|
||||||
tr("Hides the mouse after 2.5s of inactivity."));
|
tr("Hides the mouse after 2.5s of inactivity."));
|
||||||
|
INSERT(UISettings, controller_applet_disabled, tr("Disable controller applet"),
|
||||||
|
tr("Forcibly disables the use of the controller applet in emulated programs.\n"
|
||||||
|
"When a program attempts to open the controller applet, it is immediately closed."));
|
||||||
INSERT(UISettings, check_for_updates, tr("Check for updates"),
|
INSERT(UISettings, check_for_updates, tr("Check for updates"),
|
||||||
tr("Whether or not to check for updates upon startup."));
|
tr("Whether or not to check for updates upon startup."));
|
||||||
|
|
||||||
@@ -377,7 +380,6 @@ std::unique_ptr<ComboboxTranslationMap> ComboboxEnumeration(QObject* parent) {
|
|||||||
{
|
{
|
||||||
PAIR(AppletMode, HLE, tr("Custom frontend")),
|
PAIR(AppletMode, HLE, tr("Custom frontend")),
|
||||||
PAIR(AppletMode, LLE, tr("Real applet")),
|
PAIR(AppletMode, LLE, tr("Real applet")),
|
||||||
PAIR(AppletMode, Disabled, tr("Disabled")),
|
|
||||||
}});
|
}});
|
||||||
|
|
||||||
translations->insert({Settings::EnumMetadata<Settings::SpirvOptimizeMode>::Index(),
|
translations->insert({Settings::EnumMetadata<Settings::SpirvOptimizeMode>::Index(),
|
||||||
|
|||||||
@@ -127,6 +127,8 @@ struct Values {
|
|||||||
Setting<bool> hide_mouse{
|
Setting<bool> hide_mouse{
|
||||||
linkage, true, "hideInactiveMouse", Category::UiGeneral, Settings::Specialization::Default,
|
linkage, true, "hideInactiveMouse", Category::UiGeneral, Settings::Specialization::Default,
|
||||||
true, true};
|
true, true};
|
||||||
|
Setting<bool> controller_applet_disabled{linkage, false, "disableControllerApplet",
|
||||||
|
Category::UiGeneral};
|
||||||
// Set when Vulkan is known to crash the application
|
// Set when Vulkan is known to crash the application
|
||||||
bool has_broken_vulkan = false;
|
bool has_broken_vulkan = false;
|
||||||
|
|
||||||
|
|||||||
+3
-13
@@ -226,17 +226,7 @@ struct GPU::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Notify rasterizer that any caches of the specified region should be invalidated
|
/// Notify rasterizer that any caches of the specified region should be invalidated
|
||||||
void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) {
|
void InvalidateRegion(DAddr addr, u64 size) {
|
||||||
VideoCore::RasterizerInterface* rasterizer = renderer->ReadRasterizer();
|
|
||||||
if (preserve_gpu_writes && rasterizer->MustFlushRegion(addr, size, VideoCommon::CacheType::BufferCache)) {
|
|
||||||
const u64 fence = RequestSyncOperation([rasterizer, addr, size] {
|
|
||||||
rasterizer->FlushRegion(addr, size, VideoCommon::CacheType::BufferCache);
|
|
||||||
rasterizer->OnCacheInvalidation(addr, size);
|
|
||||||
});
|
|
||||||
gpu_thread.TickGPU(is_async);
|
|
||||||
WaitForSyncOperation(fence);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
gpu_thread.InvalidateRegion(addr, size);
|
gpu_thread.InvalidateRegion(addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -528,8 +518,8 @@ void GPU::FlushRegion(DAddr addr, u64 size) {
|
|||||||
impl->FlushRegion(addr, size);
|
impl->FlushRegion(addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GPU::InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) {
|
void GPU::InvalidateRegion(DAddr addr, u64 size) {
|
||||||
impl->InvalidateRegion(addr, size, preserve_gpu_writes);
|
impl->InvalidateRegion(addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GPU::OnCPUWrite(DAddr addr, u64 size) {
|
bool GPU::OnCPUWrite(DAddr addr, u64 size) {
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ public:
|
|||||||
void FlushRegion(DAddr addr, u64 size);
|
void FlushRegion(DAddr addr, u64 size);
|
||||||
|
|
||||||
/// Notify rasterizer that any caches of the specified region should be invalidated
|
/// Notify rasterizer that any caches of the specified region should be invalidated
|
||||||
void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes = false);
|
void InvalidateRegion(DAddr addr, u64 size);
|
||||||
|
|
||||||
/// Notify rasterizer that CPU is trying to write this area. It returns true if the area is
|
/// Notify rasterizer that CPU is trying to write this area. It returns true if the area is
|
||||||
/// sensible, false otherwise, addr and size must be a valid combination
|
/// sensible, false otherwise, addr and size must be a valid combination
|
||||||
|
|||||||
@@ -43,26 +43,32 @@ namespace {
|
|||||||
switch (window_type) {
|
switch (window_type) {
|
||||||
case Core::Frontend::WindowSystemType::Headless:
|
case Core::Frontend::WindowSystemType::Headless:
|
||||||
break;
|
break;
|
||||||
#ifdef _WIN32
|
#if defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||||
case Core::Frontend::WindowSystemType::Windows:
|
case Core::Frontend::WindowSystemType::Windows:
|
||||||
extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
|
||||||
break;
|
break;
|
||||||
#elif defined(__APPLE__)
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_METAL_EXT)
|
||||||
case Core::Frontend::WindowSystemType::Cocoa:
|
case Core::Frontend::WindowSystemType::Cocoa:
|
||||||
extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_EXT_METAL_SURFACE_EXTENSION_NAME);
|
||||||
break;
|
break;
|
||||||
#elif defined(__ANDROID__)
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
|
||||||
case Core::Frontend::WindowSystemType::Android:
|
case Core::Frontend::WindowSystemType::Android:
|
||||||
extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
|
||||||
break;
|
break;
|
||||||
#elif defined(__HAIKU__)
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_XCB_KHR)
|
||||||
case Core::Frontend::WindowSystemType::Xcb:
|
case Core::Frontend::WindowSystemType::Xcb:
|
||||||
extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
|
||||||
break;
|
break;
|
||||||
#else
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_XLIB_KHR)
|
||||||
case Core::Frontend::WindowSystemType::X11:
|
case Core::Frontend::WindowSystemType::X11:
|
||||||
extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
|
||||||
case Core::Frontend::WindowSystemType::Wayland:
|
case Core::Frontend::WindowSystemType::Wayland:
|
||||||
extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
|
extensions.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include "core/frontend/emu_window.h"
|
#include "core/frontend/emu_window.h"
|
||||||
#include "video_core/vulkan_common/vulkan_surface.h"
|
#include "video_core/vulkan_common/vulkan_surface.h"
|
||||||
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
#include "video_core/vulkan_common/vulkan_wrapper.h"
|
||||||
|
#include "video_core/vulkan_common/vulkan.h"
|
||||||
|
|
||||||
namespace Vulkan {
|
namespace Vulkan {
|
||||||
|
|
||||||
@@ -17,7 +18,7 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
[[maybe_unused]] const vk::InstanceDispatch& dld = instance.Dispatch();
|
[[maybe_unused]] const vk::InstanceDispatch& dld = instance.Dispatch();
|
||||||
VkSurfaceKHR unsafe_surface = VkSurfaceKHR{};
|
VkSurfaceKHR unsafe_surface = VkSurfaceKHR{};
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(VK_USE_PLATFORM_WIN32_KHR)
|
||||||
if (window_info.type == Core::Frontend::WindowSystemType::Windows) {
|
if (window_info.type == Core::Frontend::WindowSystemType::Windows) {
|
||||||
const HWND hWnd = static_cast<HWND>(window_info.render_surface);
|
const HWND hWnd = static_cast<HWND>(window_info.render_surface);
|
||||||
const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
|
const VkWin32SurfaceCreateInfoKHR win32_ci{VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR,
|
||||||
@@ -30,7 +31,8 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(__APPLE__)
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_METAL_EXT)
|
||||||
if (window_info.type == Core::Frontend::WindowSystemType::Cocoa) {
|
if (window_info.type == Core::Frontend::WindowSystemType::Cocoa) {
|
||||||
const VkMetalSurfaceCreateInfoEXT metal_ci = {
|
const VkMetalSurfaceCreateInfoEXT metal_ci = {
|
||||||
.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT,
|
.sType = VK_STRUCTURE_TYPE_METAL_SURFACE_CREATE_INFO_EXT,
|
||||||
@@ -45,7 +47,8 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(__ANDROID__)
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_ANDROID_KHR)
|
||||||
if (window_info.type == Core::Frontend::WindowSystemType::Android) {
|
if (window_info.type == Core::Frontend::WindowSystemType::Android) {
|
||||||
const VkAndroidSurfaceCreateInfoKHR android_ci{
|
const VkAndroidSurfaceCreateInfoKHR android_ci{
|
||||||
VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, nullptr, 0,
|
VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR, nullptr, 0,
|
||||||
@@ -59,7 +62,8 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#elif defined(__HAIKU__)
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_XCB_KHR)
|
||||||
if (window_info.type == Core::Frontend::WindowSystemType::Xcb) {
|
if (window_info.type == Core::Frontend::WindowSystemType::Xcb) {
|
||||||
const VkXcbSurfaceCreateInfoKHR xcb_ci{
|
const VkXcbSurfaceCreateInfoKHR xcb_ci{
|
||||||
.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
|
.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR,
|
||||||
@@ -76,7 +80,8 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_XLIB_KHR)
|
||||||
if (window_info.type == Core::Frontend::WindowSystemType::X11) {
|
if (window_info.type == Core::Frontend::WindowSystemType::X11) {
|
||||||
const VkXlibSurfaceCreateInfoKHR xlib_ci{
|
const VkXlibSurfaceCreateInfoKHR xlib_ci{
|
||||||
VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0,
|
VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR, nullptr, 0,
|
||||||
@@ -90,6 +95,8 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
|
||||||
if (window_info.type == Core::Frontend::WindowSystemType::Wayland) {
|
if (window_info.type == Core::Frontend::WindowSystemType::Wayland) {
|
||||||
const VkWaylandSurfaceCreateInfoKHR wayland_ci{
|
const VkWaylandSurfaceCreateInfoKHR wayland_ci{
|
||||||
VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0,
|
VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, nullptr, 0,
|
||||||
@@ -105,7 +112,6 @@ vk::SurfaceKHR CreateSurface(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!unsafe_surface) {
|
if (!unsafe_surface) {
|
||||||
LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform");
|
LOG_ERROR(Render_Vulkan, "Presentation not supported on this platform");
|
||||||
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
throw vk::Exception(VK_ERROR_INITIALIZATION_FAILED);
|
||||||
|
|||||||
@@ -1,6 +1,3 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -11,6 +8,7 @@
|
|||||||
|
|
||||||
class QCheckBox;
|
class QCheckBox;
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
|
class QComboBox;
|
||||||
class QDateTimeEdit;
|
class QDateTimeEdit;
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
|
|||||||
@@ -140,12 +140,7 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
|
|||||||
if (combobox_enumerations.contains(type)) {
|
if (combobox_enumerations.contains(type)) {
|
||||||
enumeration = &combobox_enumerations.at(type);
|
enumeration = &combobox_enumerations.at(type);
|
||||||
for (const auto& [id, name] : *enumeration) {
|
for (const auto& [id, name] : *enumeration) {
|
||||||
if (type == Settings::EnumMetadata<Settings::AppletMode>::Index() &&
|
combobox->addItem(name);
|
||||||
id == static_cast<u32>(Settings::AppletMode::Disabled) &&
|
|
||||||
setting.Id() != Settings::values.controller_applet_mode.Id()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
combobox->addItem(name, id);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return combobox;
|
return combobox;
|
||||||
@@ -163,8 +158,9 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
|
|||||||
const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);
|
const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);
|
||||||
combobox->setCurrentIndex(find_index(setting_value));
|
combobox->setCurrentIndex(find_index(setting_value));
|
||||||
|
|
||||||
serializer = [this]() {
|
serializer = [this, enumeration]() {
|
||||||
return std::to_string(combobox->currentData().toUInt());
|
int current = combobox->currentIndex();
|
||||||
|
return std::to_string(enumeration->at(current).first);
|
||||||
};
|
};
|
||||||
|
|
||||||
restore_func = [this, find_index]() {
|
restore_func = [this, find_index]() {
|
||||||
|
|||||||
@@ -1786,7 +1786,7 @@ bool MainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPar
|
|||||||
|
|
||||||
QtCommon::system->SetFrontendAppletSet({
|
QtCommon::system->SetFrontendAppletSet({
|
||||||
std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
|
std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
|
||||||
(Settings::values.controller_applet_mode.GetValue() == Settings::AppletMode::Disabled)
|
(UISettings::values.controller_applet_disabled.GetValue() == true)
|
||||||
? nullptr
|
? nullptr
|
||||||
: std::make_unique<QtControllerSelector>(*this), // Controller Selector
|
: std::make_unique<QtControllerSelector>(*this), // Controller Selector
|
||||||
std::make_unique<QtErrorDisplay>(*this), // Error Display
|
std::make_unique<QtErrorDisplay>(*this), // Error Display
|
||||||
|
|||||||
Reference in New Issue
Block a user